Rook/Cephクラスタのデプロイまでの流れ
はじめに
本記事は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が生成されていきます。
-
csi-cephfs-*
やceph-rbdplugin-*
rook-ceph-mon-*
rook-ceph-mgr-*
rook-ceph-osd-prepare-*
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