2020年版 Kubernetes CSIプラグインのテスト
このBlogでは過去にもKubernetesとDRBD SDSの設定方法を紹介していますが、OSやパッケージのバージョンが変わったために、そのままでは動作しなくなりました。本Blogでは入手可能な最新のCSIプラグインを使って、DRBDで冗長化したストレージをKubernetesから利用する方法を紹介します。
1.ソフトウェアのバージョン
OS Ubuntu 20.04 LTS
Kubernetes 1.17.11
DRBD 9.0.24
LINSTOR 1.3.0
LINSTORとKubernetesのインストール方法は別のベージで紹介していますので、そちらを参照ください。
2.CSIプラグインのインストール
LINBITのCSIプラグインの開発者からの情報ではここにあります。開発中のCSIプラグインはKubernetes 1.17に対応していますが、1.18でも動作するそうです。今後のKubernetesやLINSTORのバージョンアップで、プラグインも更新されるので、このサイトは時々確認されることを勧めます。yamlファイルをダウンロードして、kubectlコマンドでプラグインをインストールします。
kbadm@node1:~$ wget https://github.com/piraeusdatastore/linstor-csi/blob/master/examples/k8s/deploy/linstor-csi-dev.yaml kbadm@node1:~$ kubectl apply -f linstor-csi-dev.yaml statefulset.apps/linstor-csi-controller created serviceaccount/linstor-csi-controller-sa created clusterrole.rbac.authorization.k8s.io/linstor-csi-provisioner-role created clusterrolebinding.rbac.authorization.k8s.io/linstor-csi-provisioner-binding created clusterrole.rbac.authorization.k8s.io/linstor-csi-attacher-role created clusterrolebinding.rbac.authorization.k8s.io/linstor-csi-attacher-binding created clusterrole.rbac.authorization.k8s.io/linstor-csi-resizer-role created clusterrolebinding.rbac.authorization.k8s.io/linstor-csi-resizer-binding created daemonset.apps/linstor-csi-node created serviceaccount/linstor-csi-node-sa created clusterrole.rbac.authorization.k8s.io/linstor-csi-driver-registrar-role created csidriver.storage.k8s.io/linstor.csi.linbit.com created clusterrolebinding.rbac.authorization.k8s.io/linstor-csi-driver-registrar-binding created clusterrole.rbac.authorization.k8s.io/linstor-csi-snapshotter-role created
インストールが終わったら、linstor-csiのpodが起動しているか確認します。
kbadm@node1:~$ kubectl get all -n kube-system NAME READY STATUS RESTARTS AGE pod/cilium-26qmg 1/1 Running 1 32m pod/cilium-9h99q 1/1 Running 1 32m pod/cilium-operator-6f659d6699-pw69s 1/1 Running 1 32m pod/cilium-operator-6f659d6699-qqvkn 1/1 Running 1 32m pod/cilium-rtmsv 1/1 Running 1 32m pod/coredns-6955765f44-q9tgm 1/1 Running 1 33m pod/coredns-6955765f44-xdcn7 1/1 Running 1 33m pod/etcd-node1 1/1 Running 1 33m pod/kube-apiserver-node1 1/1 Running 1 33m pod/kube-controller-manager-node1 1/1 Running 1 33m pod/kube-proxy-2s4hx 1/1 Running 1 33m pod/kube-proxy-pbl4k 1/1 Running 1 33m pod/kube-proxy-qjjms 1/1 Running 1 33m pod/kube-scheduler-node1 1/1 Running 1 33m pod/linstor-csi-controller-0 0/5 ContainerCreating 0 18s pod/linstor-csi-node-c27d6 0/2 ContainerCreating 0 18s pod/linstor-csi-node-g4284 0/2 ContainerCreating 0 18s
全てのpodがRunningになれば正常です。
pod/linstor-csi-controller-0 5/5 Running 0 51s pod/linstor-csi-node-c27d6 2/2 Running 0 51s pod/linstor-csi-node-g4284 2/2 Running 0 51s
3.動作テスト
StorageClass、PVCの順番に作成して、最後にストレージにアクセスするPODを作成します。
StorageClassを定義します。two-replica-sc.yamlというファイルを作成して内容は次になります。
kbadm@node1:~$ cat two-replica-sc.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: two-replica provisioner: linstor.csi.linbit.com parameters: autoPlace: "2" storagePool: "linstor-pool"
定義ファイルからStorageClassを作成します。
kbadm@node1:~$ kubectl apply -f two-replica-sc.yaml storageclass.storage.k8s.io/two-replica created
次にPVCを定義します。
my-first-volume-pvc.yaml というファイルを作成して内容は次になります。
kbadm@node1:~$ cat my-first-volume-pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: my-first-volume annotations: volume.beta.kubernetes.io/storage-class: two-replica spec: accessModes: - ReadWriteOnce resources: requests: storage: 500Mi
定義ファイルからPVCを作成します。
kbadm@node1:~$ kubectl apply -f my-first-volume-pvc.yaml persistentvolumeclaim/my-first-volume created kbadm@node1:~$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE my-first-volume Bound pvc-5a4a75eb-0... 500Mi RWO two-replica 13s
PVCが作成されたら、LINSTORでリソースが定義されたかlinstorコマンドで確認します。
kbadm@node1:~$ linstor resource list +--------------------------------------------------------------------------------------+ | ResourceName | Node | Port | Usage | Conns | State | CreatedOn | |======================================================================================| | pvc-5a4a75eb-05ef-4a19-.... | node1 | 7000 | Unused | Ok | UpToDate | 2020-09-... | | pvc-5a4a75eb-05ef-4a19-.... | node2 | 7000 | Unused | Ok | UpToDate | 2020-09-... | +--------------------------------------------------------------------------------------+
テスト用のPODとしてFedoraを起動します。Fedoraの定義はfedora.yaml というファイルを作成して内容は次になります。
apiVersion: v1 kind: Pod metadata: name: fedora namespace: default spec: containers: - name: fedora image: fedora command: [/bin/bash] args: ["-c", "while true; do sleep 10; done"] volumeMounts: - name: default-my-first-volume mountPath: /data ports: - containerPort: 80 volumes: - name: default-my-first-volume persistentVolumeClaim: claimName: "my-first-volume"
PODを起動しましょう。
kbadm@node1:~$ kubectl apply -f fedora.yaml pod/fedora created kubectl get pods NAME READY STATUS RESTARTS AGE fedora 1/1 Running 0 20s
PODにログインして/dataにストレージがマウントされているかどうかを確認します。
kbadm@node1:~$ kubectl exec fedora -it /bin/bash [root@fedora /]# df Filesystem 1K-blocks Used Available Use% Mounted on overlay 9219412 4936940 3794436 57% / tmpfs 65536 0 65536 0% /dev tmpfs 1017640 0 1017640 0% /sys/fs/cgroup /dev/drbd1000 491456 2318 459245 1% /data /dev/mapper/ubuntu--vg-ubuntu--lv 9219412 4936940 3794436 57% /etc/hosts shm 65536 0 65536 0% /dev/shm tmpfs 1017640 12 1017628 1% /run/secrets/kube... tmpfs 1017640 0 1017640 0% /proc/acpi tmpfs 1017640 0 1017640 0% /proc/scsi tmpfs 1017640 0 1017640 0% /sys/firmware
/dev/drbd1000が/dataにマウントされていることが判りました。
この/dataに何かデータを作成して、別のホストにPODが移動してもデータに参照できるか確認してみてください。