今回の記事ではCephクラスターを作成し、Ceph-CSIを使ってKubernetesのMySQLコンテナにボリュームを割り当てることを目標にします。
Cephクラスターの作成
まず3台のVMを準備しておきます。ネットにつながるようにしておき、相互に通信できるようなネットワークも繋げておきます。
また、OSが入っているドライブのほかにCeph用のドライブも追加しておきます。
今回はテスト環境なのでrootユーザーで実施します。
hostsの設定
(3台すべてに実行)
最初にhostsを登録します。VM名はceph-cluster-1などにしていますがお好みで大丈夫です。
# vim /etc/hosts
192.168.10.10 ceph-cluster-1
192.168.10.11 ceph-cluster-2
192.168.10.12 ceph-cluster-3
必要なパッケージをインストール
(3台すべてに実行)
次に必要なパッケージをインストールします
sudo apt update -y
sudo apt install -y python3 curl docker
ファイアウォールの設定
(3台すべてに実行)
テスト環境であればファイアウォールは無効のままにしておきます。
SSHアクセス設定
(以降1号機のみ)
ブートストラップノード(ceph-cluster-1)から他のノードへのパスワードなしSSHアクセスを設定します。
SSH鍵の生成
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
SSH鍵の配布
ssh-copy-id ceph-cluster-2
ssh-copy-id ceph-cluster-3
#########実行例です コピペは不要です#######
root@ceph-cluster-1:~# ssh-copy-id ceph-cluster-3
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'ceph-cluster-3 (192.168.10.12)' can't be established.
ED25519 key fingerprint is SHA256.......
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes #yesを入力
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@ceph-cluster-3's password: #rootのパスワード 設定していない場合はpasswdで設定する
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'ceph-cluster-3'"
and check to make sure that only the key(s) you wanted were added.
失敗する場合はhostsの設定を再度確認し、それでも失敗する場合はrootパスワードなどを確認してください。
cephadmのインストール
ブートストラップノード(ceph-cluster-1)でcephadmをインストールします
apt install -y cephadm
Cephクラスターのブートストラップ
ブートストラップノードで以下のコマンドを実行します。
sudo cephadm bootstrap --mon-ip 192.168.10.11
成功したら出力が出るので必要であれば控えておきましょう
以下はCLIの実行のために必要ですのでコピペで実行します
apt install -y ceph-common
#fsidはご自身のマシンで出力されたものを使用します
#cephコマンドが使えるか確認します
ceph -s
cephの公開鍵をクラスタに登録
root@ceph-cluster-1:~# ssh-copy-id -f -i /etc/ceph/ceph.pub root@192.168.10.11
root@ceph-cluster-1:~# ssh-copy-id -f -i /etc/ceph/ceph.pub root@192.168.10.12
Cephクラスターにノードを追加する
root@ceph-cluster-1:/#sudo ceph orch host add ceph-cluster-2 192.168.10.11
root@ceph-cluster-1:/#sudo ceph orch host add ceph-cluster-3 192.168.10.12
CephクラスタにOSDを追加する
まずOSDに追加できるドライブが各VMにあるか確認します。なければドライブを追加してください。
OSが入っているドライブはOSDに使えません。
ceph orch device ls
確認できたらすべてOSDに追加します。
sudo ceph orch apply osd --all-available-devices
動作確認
root@ceph-cluster-1:~# ceph -s
cluster:
id: ccff2c7c-9b8a-11ef-bc5f-71ff058f9dd5
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-cluster-1,ceph-cluster-2,ceph-cluster-3 (age 13m)
mgr: ceph-cluster-1.jjzyfg(active, since 13m), standbys: ceph-cluster-2.qhuoau
osd: 3 osds: 3 up (since 8s), 3 in (since 27s)
data:
pools: 1 pools, 1 pgs
objects: 2 objects, 449 KiB
usage: 873 MiB used, 59 GiB / 60 GiB avail
pgs: 1 active+clean
これでCephクラスターの構築が環境です。
Ceph CSIの導入
ここからはkubernetesが導入されている環境と合わせて実施します。
公式ドキュメントを参照しています。バージョンによって異なる作業がある可能性があるのでこちらも参照してください。
rbd poolを作成する
# ceph osd pool create kubernetes
# rbd pool init kubernetes
cephクライアント認証設定
cephにkubernetesというユーザーの作成をしています。先ほどのkubernetesというrbd poolに接続できる権限も追加されています。
root@dev-frn-ceph01:~# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes'
[client.kubernetes]
key = AQDEj+Zl3LsHDhAAm5dD6/eWDiMyv3L2TMMokw==
Ceph-CSIのconfigmapの作成
まずceph mon dumpでクラスターの情報を手に入れます。
root@dev-frn-ceph01:~# ceph mon dump
dumped monmap epoch 3
epoch 3
fsid e21b0280-ba6c-z1ee-854a-h1fc5e44ea2f
last_changed 2024-01-29T09:58:12.533210+0000
created 2024-01-25T10:30:26.833207+0000
min_mon_release 15 (octopus)
0: [v2:192.168.10.10:3300/0,v1:192.168.10.10:6789/0] mon.ceph-cluster-1
1: [v2:192.168.10.11:3300/0,v1:192.168.10.11:6789/0] mon.ceph-cluster-2
2: [v2:192.168.10.12:3300/0,v1:192.168.10.12:6789/0] mon.ceph-cluster-3
configmap
ここではkubernetes環境で実施します。
$ cat <<EOF > csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "e21b0280-ba6c-z1ee-854a-h1fc5e44ea2f",
"monitors": [
"192.168.10.10:6789",
"192.168.10.11:6789",
"192.168.10.12:6789"
]
}
]
metadata:
name: ceph-csi-config
EOF
configmapを以下コマンドで作成します。
kubectl apply -f csi-config-map.yaml
ceph-csi cephx シークレットを作成
先ほどユーザー作成で出力されたkubernetesユーザーのkeyをコピペします。
コピーしていない場合はcephクラスターでceph auth listと入力して必要なユーザーを見つけることもできます。
# ceph auth list
client.kubernetes
key: AQDEj+Zl3LsHDhAAm5dD6/eWDiMyv3L2TMMokw==
caps: [mgr] profile rbd pool=kubernetes
caps: [mon] profile rbd
caps: [osd] profile rbd pool=kubernetes
ユーザーとkeyを入力したらOKです。
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: default
stringData:
userID: kubernetes
userKey: AQDEj+Zl3LsHDhAAm5dD6/eWDiMyv3L2TMMokw==
ceph-csiプラグインの設定
ここはあまりよくわからないので公式ドキュメントからそのまま引用します。
以下を実行すればOKです。
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
$ kubectl apply -f csi-rbdplugin-provisioner.yaml
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml
$ kubectl apply -f csi-rbdplugin.yaml
ストレージクラスの作成
ストレージクラスを作成します。名前はgeneralとしておきました。
# cat <<EOF > csi-rbd-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: general
provisioner: rbd.csi.ceph.com
parameters:
clusterID: e21b0280-ba6c-z1ee-854a-h1fc5e44ea2f
pool: kubernetes
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
EOF
# kubectl apply -f csi-rbd-sc.yaml
PersistentVolumeClaimを作成する
お試しでPVCを作成してみます。
# cat <<EOF > raw-block-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: raw-block-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
resources:
requests:
storage: 1Gi
storageClassName: general
EOF
# kubectl apply -f raw-block-pvc.yaml
PVCがうまく作成できればKubernetesにCephを組み込むことに成功しました。
PVCをpodにバインドしたりいろいろ試してみましょう。
openstack-helmの事例
少し特殊ですがストレージクラスをgeneralとしたのには、openstack-helmの構築スクリプトではストレージクラスがgeneralという名前前提だったからです。
以前の記事ではnfsを使っていましたがcephでも構築できるようになりました。(ただしcinderの構築はしていないのでVMはローカルですが、、、)
root@dev-dtc2-poc test(keystone)# kubectl get pvc -n openstack
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
glance-images Bound pvc-788b0957-e275-44d1-b9d7-1ffc2fdcbf35 2Gi RWO general 245d
mysql-data-mariadb-server-0 Bound pvc-0a0abde9-85b4-46fc-9604-5bef9c748660 5Gi RWO general 251d
rabbitmq-data-rabbitmq-rabbitmq-0 Bound pvc-8f4f8795-ed26-4c08-9199-6cc58347df95 768Mi RWO general 245d
rabbitmq-data-rabbitmq-rabbitmq-1 Bound pvc-1b29778a-801b-4fd7-93cf-46e6d05bbea2 768Mi RWO general 245d
このようにglance-imageやDB、MQなどをcephに入れることが出来ました。
また今度cephとcinderを組み合わせてみようと思います。