Kubernetesを動かす(3) rook/ceph編
前回はpodの作成テストを行いました。
rook/ceph
ブロックストレージを使用した分散ストレージを作成したいのでrook/cephを導入します。
RBDプロビジョナーが自動で良い感じに冗長化しつつストレージを管理してくれます(ふわふわ)
ストレージの作成
各マシンにSSDを追加します。hyper-vを使ってるので追加してフォーマット
# デバイスを調べる
sudo fdisk -l
# 未フォーマット状態にする
sudo dd if=/dev/zero of=/dev/sdb bs=1M count=100
rook/cephのデプロイ
rook/cephをインストールします。公式クイックスタートガイドの通りにgitをcloneし、rook/cephのオペレーターをデプロイします。
git clone --single-branch --branch v1.12.6 https://github.com/rook/rook.git
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
cephクラスターの作成
ここでストレージ容量やデバイスなどを設定します。
rook/deploy/examplesにあるcluster.yamlを適当な場所にコピーして編集します。
cluster.yaml
cluster.yaml
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
name: rook-ceph
namespace: rook-ceph
spec:
cephVersion:
image: quay.io/ceph/ceph:v17.2.6
allowUnsupported: false
dataDirHostPath: /var/lib/rook
skipUpgradeChecks: false
continueUpgradeAfterChecksEvenIfNotHealthy: false
waitTimeoutForHealthyOSDInMinutes: 10
mon:
count: 3
allowMultiplePerNode: false
mgr:
count: 2
allowMultiplePerNode: false
modules:
- name: pg_autoscaler
enabled: true
dashboard:
enabled: true
ssl: true
monitoring:
enabled: false
metricsDisabled: false
network:
connections:
encryption:
enabled: false
compression:
enabled: false
requireMsgr2: false
crashCollector:
disable: false
logCollector:
enabled: true
periodicity: daily
maxLogSize: 500M
cleanupPolicy:
confirmation: ""
sanitizeDisks:
method: quick
dataSource: zero
iteration: 1
allowUninstallWithVolumes: false
annotations:
labels:
resources:
removeOSDsIfOutAndSafeToRemove: false
storage: # 指定のノードの指定ストレージで動かす
useAllNodes: false
nodes:
- name: "master"
devices:
- name: "/dev/sdb"
- name: "worker1"
devices:
- name: "/dev/sdb"
- name: "worker2"
devices:
- name: "/dev/sdb"
config:
onlyApplyOSDPlacement: false
disruptionManagement:
managePodBudgets: true
osdMaintenanceTimeout: 30
pgHealthCheckTimeout: 0
healthCheck:
daemonHealth:
mon:
disabled: false
interval: 45s
osd:
disabled: false
interval: 60s
status:
disabled: false
interval: 60s
livenessProbe:
mon:
disabled: false
mgr:
disabled: false
osd:
disabled: false
startupProbe:
mon:
disabled: false
mgr:
disabled: false
osd:
disabled: false
マスターノードで動かす場合
可用性を保つにはmon(モニター)の数を3以上の奇数にする必要がありますが、テスト環境などでマスターノードでも動かす場合
kubectl label nodes master node-role.kubernetes.io/mon=
各ノードで上記を実行し、mon(モニター)を動かすノードを指定するタグ(node-role.kubernetes.io/mon)をつけています。さらにcluster.yamlのspecに下記を追加してマスターノードでも動くようにします。
cluster.yaml
placement:
mon:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/mon
operator: Exists
#マスターノードでも動かす
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
保存したら下記でデプロイします。
kubectl apply -f cluster.yaml

立ち上がりました。
ストレージクラスの作成
ceph-storageclass.yaml
など適当な名前でファイルを作成して以下を記述します。
ceph-storageclass.yaml
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
name: my-replicated-pool
namespace: rook-ceph
spec:
replicated:
size: 3
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
pool: my-replicated-pool
imageFormat: "2"
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Retain
allowVolumeExpansion: true
下記でデプロイ
kubectl apply -f ceph-storageclass.yaml
kubectl get storageclass
コマンドで作成したストレージクラスを確認出来ます。
下記でデフォルトのPVCとして登録できます。
kubectl patch storageclass rook-ceph-block -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
次回はこのストレージクラスを使用してcrunkey PGOとpgpool-IIを導入したPostgreSQLのデーターベースクラスタを作成します。