Rook Ceph

Rook Cephは、Kubernetes上で動作する分散ストレージシステムです。PersistentVolumeを提供し、StatefulSetなどの永続化が必要なアプリケーションに対応します。

Rook Cephを使用すると、Kubernetes内で自己管理型の分散ストレージを構築できます。

概要

Rook Cephの主な特徴:

  • Kubernetes-native な分散ストレージ
  • 自動的なストレージのプロビジョニング
  • Block、File、Object ストレージのサポート
  • 高可用性とデータの冗長性
  • スナップショット機能

前提条件

  • Kubernetes 1.22以上
  • 各ワーカーノードに未使用のディスク(推奨)
  • 最低3つのワーカーノード(高可用性のため)

インストール

1. Rook Operatorのインストール

# クローン
git clone --single-branch --branch v1.13.0 https://github.com/rook/rook.git
cd rook/deploy/examples

# CRDとOperatorをデプロイ
kubectl create -f crds.yaml
kubectl create -f common.yaml
kubectl create -f operator.yaml

2. Cephクラスターの作成

# Cephクラスターの作成
kubectl create -f cluster.yaml

3. デプロイの確認

# Podの確認
kubectl get pods -n rook-ceph

# Cephクラスターの状態確認
kubectl get cephcluster -n rook-ceph

StorageClassの作成

Block Storage(RBD)

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
  clusterID: rook-ceph
  pool: replicapool
  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/controller-expand-secret-name: rook-csi-rbd-provisioner
  csi.storage.k8s.io/controller-expand-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
  csi.storage.k8s.io/fstype: ext4
allowVolumeExpansion: true
reclaimPolicy: Delete

File Storage(CephFS)

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-cephfs
provisioner: rook-ceph.cephfs.csi.ceph.com
parameters:
  clusterID: rook-ceph
  fsName: myfs
  pool: myfs-data0
  csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner
  csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
  csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
allowVolumeExpansion: true
reclaimPolicy: Delete

PVCの作成と使用

PersistentVolumeClaimの作成

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: rook-ceph-block
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

Podでの使用

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: test-container
    image: nginx
    volumeMounts:
    - name: my-volume
      mountPath: /data
  volumes:
  - name: my-volume
    persistentVolumeClaim:
      claimName: my-pvc

Cephダッシュボード

ダッシュボードへのアクセス

# Port Forward
kubectl port-forward -n rook-ceph svc/rook-ceph-mgr-dashboard 7000:7000

# パスワードの取得
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode

ブラウザで https://localhost:7000 を開き、ユーザー名 admin と取得したパスワードでログインします。

モニタリング

クラスターの状態確認

# Cephツールを使用
kubectl exec -n rook-ceph -it deploy/rook-ceph-tools -- bash

# Cephステータス
ceph status

# OSDの状態
ceph osd status

# 容量確認
ceph df

トラブルシューティング

一般的な問題

Podが起動しない場合:ノードにディスクが正しく認識されているか確認してください。

# ログの確認
kubectl logs -n rook-ceph deploy/rook-ceph-operator

# OSDの状態確認
kubectl get pods -n rook-ceph -l app=rook-ceph-osd

クリーンアップ

# Rook Cephの完全削除
kubectl delete -f cluster.yaml
kubectl delete -f operator.yaml
kubectl delete -f common.yaml
kubectl delete -f crds.yaml

# データの削除(各ノードで実行)
sudo rm -rf /var/lib/rook

参考リンク