Kubernetesを動かす(3) rook/ceph編

前回はpodの作成テストを行いました。

rook/ceph

ブロックストレージを使用した分散ストレージを作成したいのでrook/cephを導入します。

公式サイト rook

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

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に下記を追加してマスターノードでも動くようにします。

  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など適当な名前でファイルを作成して以下を記述します。

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のデーターベースクラスタを作成します。

Kubernetes,rook/ceph