この記事を読んでできるようになること
- kubernetes 上から Proxmox 上の Ceph を PV として利用する
この記事を読んでもできないこと
- kubernetes 上から Proxmox 上の Ceph を S3互換のストレージ として利用する
お断り
これは個人的な備忘録として作業中のメモを整理したものです。筆者はあまり詳しくないため誤った、もしくは推奨されていない操作を行っている可能性があります。 内容が更新されている可能性があるため、公式ドキュメントを確認することをオススメします
- https://rook.io/docs/rook/latest-release/Getting-Started/intro/
- https://pve.proxmox.com/wiki/Deploy_Hyper-Converged_Ceph_Cluster
以下常体で記載
モチベーション
Rook を使うことで kubernetes 上に Ceph を利用できるが、Proxmox も各 VM やイメージの保存先として Ceph を構築する機能を提供してくれている。 Proxmoxがわざわざ用意してくれているのに、それを使わないのはもったいない
Rookをインストール
参考: https://rook.io/docs/rook/latest-release/Helm-Charts/operator-chart/
ひとまずRookのオペレーターをインストールする。Helmを使う場合は下のように実行する
helm repo add rook-release https://charts.rook.io/releasehelm install --create-namespace --namespace rook-ceph rook-ceph rook-release/rook-ceph今回はArgoCDを使った
argocd app create --file apps/rook.yamlしばらくするとRookのオペレーターが起動したことを確認できる
kubectl get pod -n rook-ceph起動していることを確認できればRookのインストールは完了
Ceph接続情報の取得
参考: https://rook.io/docs/rook/latest-release/CRDs/Cluster/external-cluster/
CephをProxmoxから利用できる状態となっていて、cephfsが有効になっていることを前提にする。 まずRookがPVを作成するpoolを作成する。このpoolという概念もよく分かっていないが、雰囲気からしてこのpoolがブロックデバイス的な何かを切り出す設定なのだと思う
Web UIからCeph->Poolsを開いてCreateを押し、Rookから利用するpoolを作成する。設定は好きなもので問題ないと思う

もしくはProxmoxのホスト上でコマンドを実行する
pveceph pool create k8s-pv-pool --pg_autoscale_mode-onFYI: コマンドオプション
作成が完了したら次のコマンドをProxmoxのホスト上で実行する。必要があれば--dry-runオプションをつけて実行することで動作チェックができる
wget https://raw.githubusercontent.com/rook/rook/release-1.13/deploy/examples/create-external-cluster-resources.pypython3 create-external-cluster-resources.py --namespace rook-ceph-external --rbd-data-pool-name k8s-pv-pool --format bash --skip-monitoring-endpoint --v2-port-enable出力されたコマンドは次に使うのでメモしておく
Cephクラスターのデプロイ
kubectlが使えるホスト上で、つまりクラスターへの操作権限があるホスト上で、先ほど得られたコマンドを実行する
export NAMESPACE=rook-ceph-external...export RGW_POOL_PREFIX=defaultその後次のコマンドも実行する。いろいろ作成されたログが流れると思う
wget https://raw.githubusercontent.com/rook/rook/release-1.13/deploy/examples/import-external-cluster.sh. import-external-cluster.shこの時点でstorageClassが作成されてはいるが現状まだ利用できないので、外部に接続する用のCephクラスターをデプロイする
wget https://raw.githubusercontent.com/rook/rook/release-1.13/deploy/charts/rook-ceph-cluster/values-external.yamlhelm install --create-namespace --namespace $NAMESPACE rook-ceph-cluster --set operatorNamespace=rook-ceph rook-release/rook-ceph-cluster -f values-external.yaml今回はArgoCDを使った。下に私が使ったマニフェストを貼るが、若干パラメーターが異なるため適時修正が必要だと思う
argocd app create --file rook/ceph-external-cluster.yamlargocd app sync argocd/rook-ceph-external-clusterここまでの作業がうまくいっていれば、Proxmox上のCephをRookを通じて利用できるようになっている
動作チェック
次の2つのマニフェストを作成する
test-pvc.yaml
# https://github.com/rook/rook/blob/release-1.13/deploy/examples/csi/rbd/pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata: name: rbd-pvcspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: ceph-rbdtest-pod.yaml
# Ref: https://github.com/rook/rook/blob/release-1.13/deploy/examples/csi/rbd/pod.yamlapiVersion: v1kind: Podmetadata: name: csirbd-demo-podspec: containers: - name: web-server image: nginx volumeMounts: - name: mypvc mountPath: /var/lib/www/html volumes: - name: mypvc persistentVolumeClaim: claimName: rbd-pvc readOnly: false上2つのマニフェストをapplyする
kubectl apply -f test-pvc.yaml -f test-pod.yamlkubectl get podNAME READY STATUS RESTARTS AGEcsirbd-demo-pod 1/1 Running 0 14s適当なファイルをpvcがマウントされているディレクトリに作成してみる
kubectl exec -it csirbd-demo-pod -- echo "Hello World" > /var/lib/www/html/index.htmlPodを消して再度起動し、先ほど書き込んだ内容が保持されていることを確認する
kubectl delete -f test-pod.yamlkubectl apply -f test-pod.yamlkubectl exec -it csirbd-demo-pod -- cat /var/lib/www/html/index.html作成したリソースを削除する
kubectl delete -f test-pvc.yaml -f test-pod.yaml終わりに
以上でRookを使ってProxmox上のCephを利用できるようになっているはずだ。kubernetesを組む場合のデータの永続化の手段として使われることが多い(気がする)local-path-provisionerや、nfs-provisionerと比較して耐障害性が必要な場合、や分散ストレージの言葉のカッコよさに惹かれて、 利用するのが良いと思う。