KubernetesにCephを組み込む方法:3つのVMとCeph CSIでボリュームを作成する

今回の記事では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が導入されている環境と合わせて実施します。

Block Devices and Kubernetes — Ceph Documentation

公式ドキュメントを参照しています。バージョンによって異なる作業がある可能性があるのでこちらも参照してください。

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を組み合わせてみようと思います。

タイトルとURLをコピーしました