💭

Rook/Cephクラスタのデプロイまでの流れ

2020/12/31に公開

はじめに

本記事はRookと仲間たち、クラウドネイティブなストレージの Advent Calendar 2020 8日目を後からこっそり埋めたものです。PVC-based Rook/Cephクラスタをデプロイすると、どういう目的のどういうPodがどのように生えてくるかを簡単にまとめました。

環境

  • ソフトウェア
    • OS: Ubuntu 18.04/amd64
    • Rook: v1.5.4
    • kubernetes: v1.18.3
    • host名: ubuntu1804
  • ハードウェア
    • OSD用のディスク: /dev/sdb (5GB以上)

デプロイ方法

operatorまでをdeploy

まずはここにあるcommon.yaml, crds.yaml、operator.yamlを順番にapplyします。

common.yamlにはRook/Cephの動作に必要なServiceAccountなどが入っています。crds.yamlにはRook/Ceph用のCustom Resource Definitionが入っています。operator.yamlにはoperatorのdeployments、およびoperatorの設定を記載するConfigMapが入っています。

ここまででrook-ceph namespace以下にoepratorが作られます。今後すべてのリソースはこのrook-ceph namespace以下に作られます。

$ kubectl apply -f common.yaml
...
$ kubectl apply -f crds.yaml
...
$ kubectl apply -f operator.yaml
...
$ kubectl -n rook-ceph get pod
NAME                                  READY   STATUS    RESTARTS   AGE
rook-ceph-operator-656644b5d4-424cv   1/1     Running   0          72s
$ 

rook-ceph-operatorはrook/ceph:v1.5.4というRookのコンテナを使います。

基本的にこれ以降作られるすべてのリソースはoperatorが作ります。

OSD用のblock PVを用意

PVC-based Rook/Cephクラスタではblock PVをOSDとして使いますのでその準備が必要です。検証環境では以下のyamlをapplyします。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: manual
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: local-osd
  labels:
    type: local-osd
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Block
  local:
    path: /dev/sdb
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - ubuntu1804

host名はubuntu1804になります。ご自身の環境では適宜読み替えてください。

ここは別にRook固有の話ではないですが、いちおうPVができているかを確認します。

$ kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
local-osd   5Gi        RWO            Retain           Available           manual                  1s
$ 

Rook/Cephクラスタを作る

個々のCephクラスタに対応するCustom ResourceであるCephCluster をapplyします。Rookリポジトリのcommon.yamlなどと同じディレクトリにcluster-on-pvc.yamlというファイルがあるのですが、コメントが大量にあったりちょっと試すにはいろいろ余計な設定が合ったりと面倒なのでシンプルなyamlを用意しました。

以下のマニフェストはMON1つ、MGR1つ、OSD1つです。別記事で紹介するかもしれないdashboardやcrash-collectorという機能は使いません。

apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  dataDirHostPath: /var/lib/rook
  mon:
    count: 1
    allowMultiplePerNode: false
  cephVersion:
    image: ceph/ceph:v15.2.8
    allowUnsupported: false
  skipUpgradeChecks: false
  continueUpgradeAfterChecksEvenIfNotHealthy: false
  dashboard:
    enabled: false
    ssl: true
  network:
    hostNetwork: false
  crashCollector:
    disable: true
  storage:
    storageClassDeviceSets:
    - name: set1
      count: 1
      portable: false
      tuneSlowDeviceClass: true
      placement:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - rook-ceph-osd
                - key: app
                  operator: In
                  values:
                  - rook-ceph-osd-prepare
              topologyKey: kubernetes.io/hostname
      resources:
      volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          resources:
            requests:
              storage: 5Gi
          storageClassName: manual
          volumeMode: Block
          accessModes:
            - ReadWriteOnce

ではapplyした後podをリストします。

$ kubectl -n rook-ceph get pod
...
NAME                                            READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-9qjqt                          3/3     Running     3          32m
csi-cephfsplugin-provisioner-c68f789b8-4b58m    6/6     Running     6          32m
csi-rbdplugin-6vrv5                             3/3     Running     3          32m
csi-rbdplugin-provisioner-6c75466c49-kmqrw      6/6     Running     6          32m
rook-ceph-mgr-a-684cff5777-hbtjq                1/1     Running     0          4m3s
rook-ceph-mon-a-8648b75589-5zm47                1/1     Running     0          4m25s
rook-ceph-operator-656644b5d4-48tdz             1/1     Running     1          20m
rook-ceph-osd-0-6b87f56745-wkvzh                1/1     Running     0          55s
rook-ceph-osd-prepare-set1-data-0-vr562-f2m2g   0/1     Completed   5          4m1s
$ 

クラスタ作成が完了するまでに以下のようにpodが生成されていきます。

  1. csi-cephfs-*ceph-rbdplugin-*
  2. rook-ceph-mon-*
  3. rook-ceph-mgr-*
  4. rook-ceph-osd-prepare-*
  5. rook-ceph-osd-*

マニフェストのapply直後にkubectl get pod -wを実行するとわかりやすいです。

各Podの役割

それぞれのpodの簡単な説明をします。csi-*というのは個々のRook/CephクラスタからCephFSやRBDなどを切り出すためのCSIドライバです。csi-cephfs-*はCephFSに、csi-rbd-*はRBDに対応します。このPodが使うコンテナはRookではなくCephプロジェクトが公式に提供するCeph CSIドライバであるceph-csiのコンテナです。

rook-ceph-mon-*rook-ceph-mgr-*はそれぞれMON,MGRに対応します。最初にMONを作るのは当然ながらこいつを作ってはじめてCephクラスタができあがるからです。これらのPodが使うコンテナもRookが提供するものではなくCephプロジェクトが提供するCephのコンテナです。

rook-ceph-osd-prepare-*はOSDを初期化するためのPodです。こいつがOSDを初期化して正常終了した後はrook-ceph-osd-*が立ち上がってOSDとして動作します。これらは俗にOSD prepare Pod, OSD podなどど呼ばれます。OSD prepare PodとOSD podは一つのOSDについて2つ、ペアで存在します。つまりOSDが10個ある環境ではOSD prepare PodとOSD podがそれぞれ10個存在します。OSD prepare PodとOSD PodもCephプロジェクトが提供するCephコンテナを使います。

Rook operatorはOSD prepare podはJob経由で、OSD podはdeployments経由で作ります。

まとめ

Rook/Cephの主だったPodの起動順序、役割、コンテナイメージは次の通りです。

起動順 名前 役割 コンテナイメージ
1 rook-ceph-operator クラスタ全体の管理、以下全Podの管理 Rookプロジェクトが提供するrook/cephコンテナ
2 csi-* CSIドライバ。クラスタからPVを切り出す Cephプロジェクトが提供する各種コンテナ
3 rook-ceph-{mon mgr} CephクラスタのMON,MGRデーモン
4 rook-ceph-osd{-prepare,} CephクラスタのOSD初期化、およびOSDデーモン 同上

おわりに

Rook/Cephクラスタのデプロイの流れについて自分の頭を整理するためにいろいろまとめてみました。Rook/Cephユーザのかたにもそうでないかたにも何か得るものがあれば幸いです。

Discussion