CAPX(Cluster API Provider Nutanix Cloud Infrastructure)の Workload Cluster で、Nutanix Volumes の Persistent Volume(PV)を作成してみます。
下記の投稿で作成した環境を利用します。
今回の内容です。
- 1. Kubernetes クラスタへの接続
- 2. Secret の作成
- 3. StorageClass の作成
- 4. PVC / PV の作成
- 5. PV をマウントする Pod の作成
- リソース オブジェクトの削除
ドキュメントは、下記のあたりです。
- CSI Volume Driver 2.6
https://portal.nutanix.com/page/documents/details?targetId=CSI-Volume-Driver-v2_6:CSI-Volume-Driver-v2_6
1. Kubernetes クラスタへの接続
まず、Kubernetes に接続します。前回の投稿で取得した kubeconfig を、KUBECONFIG 環境変数に設定しておきます。
# export KUBECONFIG=$(pwd)/kubeconfig.capx02
PV を作成する Kubernetes クラスタに接続できるようになっています。
# kubectl get nodes NAME STATUS ROLES AGE VERSION capx02-kcp-764l5 Ready control-plane 23d v1.26.7 capx02-wmd-ckhs7-xbbd7 Ready <none> 23d v1.26.7
CAPX の Workload Cluster では、デフォルトでは StorageClass が作成されていません。
# kubectl get sc No resources found
2. Secret の作成
Nutanix クラスタの接続情報をもつ Secret リソースを作成します。
Prism Elemnt への接続情報を、base64 コマンドでエンコーディングしておきます。今回の例では、下記のように指定しています。
- クラスタ VIP アドレス: 192.168.20.50
- ポート番号: 9440
- ユーザ: admin
- パスワード: nutanix/4
# echo -n "192.168.20.50:9440:admin:nutanix/4u" | base64 MTkyLjE2OC4yMC41MDo5NDQwOmFkbWluOm51dGFuaXgvNHU=
下記のように YAML ファイルを作成します。
ntnx-secret.yml
- L5: Secret の名前は ntnx-secret にしています。
- L8: key には、さきほど生成した Base64 文字列を指定します。
kubectl で、YAML ファイルを適用します。
# kubectl apply -f ntnx-secret.yml secret/ntnx-secret created
3. StorageClass の作成
下記のように YAML ファイルを作成します。
sc-volumes.yml
- L5: StorageClass の名前は sc-volumes にしています。
- L7: デフォルトの StorageClass にします。
- L12-17: さきほど作成した Secret の Namespace と名前を指定しています。
- L11-30: parameters 配下の値は、Strings として指定する必要があります。そのため、数値や Boolean(true / false)であっても、クオートで囲っています。
- L23: storageType で NutanixVolumes を指定しています。
- 各パラメータは、できるだけデフォルト値を指定しています。
kubectl で、YAML ファイルを適用します。
# kubectl apply -f sc-volumes.yml storageclass.storage.k8s.io/sc-volumes created
デフォルトの StorageClass が作成されました。
# kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE sc-volumes (default) csi.nutanix.com Delete Immediate true 2s
4. PVC / PV の作成
下記のように YAML ファイルを作成します。
pvc-volumes-01.yml
- L5: PVC の名前は pvc-volumes-01 にしています。
- L12: StorageClass の名前を指定します。
kubectl で、YAML ファイルを適用します。
# kubectl apply -f pvc-volumes-01.yml persistentvolumeclaim/pvc-volumes-01 created
デフォルトの PVC が作成されました。少し待つと、PV も動的プロビジョニングで自動作成されます。
# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-volumes-01 Bound pvc-35c8e573-8ddf-4e2a-a99a-0264cca4cc00 3Gi RWO sc-volumes 13s
5. PV をマウントする Pod の作成
PV をマウントする Pod を作成して、様子を見てみます。
5-1. Pod の作成
下記のように、PV をマウントする Pod の YAML を作成します。
pod-01.yml
- L5: Pod の名前は pod-01 です。
- L15: コンテナ イメージは、RHEL 9 の UBI です。
- L9-12, L18-20: PVC(pvc-volumes-01)にひもづく PV を、/mnt/vol-01 にマウントします。
kubectl で、YAML ファイルを適用します。
# kubectl apply -f pod-01.yml pod/pod-01 created
Pod が起動されました。
# kubectl get pod pod-01 NAME READY STATUS RESTARTS AGE pod-01 1/1 Running 0 50s
Pod 内で df コマンドを実行すると、/mnt/vol-01 にボリューム(/dev/sdb)がマウントされています。
# kubectl exec pod-01 -- df Filesystem 1K-blocks Used Available Use% Mounted on overlay 40458684 6668624 33773676 17% / tmpfs 65536 0 65536 0% /dev /dev/sdb 3135488 54952 3080536 2% /mnt/vol-01 /dev/sda1 40458684 6668624 33773676 17% /etc/hosts shm 65536 0 65536 0% /dev/shm tmpfs 3834332 12 3834320 1% /run/secrets/kubernetes.io/serviceaccount tmpfs 1968364 0 1968364 0% /proc/acpi tmpfs 1968364 0 1968364 0% /proc/scsi tmpfs 1968364 0 1968364 0% /sys/firmware
5-2. Prism Element から見た PV
Prism Elemnt の「ストレージ」→「テーブル」→「Volume Group」を開くと、PV(pvc-35c8e573-8ddf-4e2a-a99a-0264cca4cc00)と同名の Nutanix Volumes VG が作成されていることがわかります。VG の「Update」画面を開くと、「説明」欄に関連する Kubernetes リソース オブジェクトが記述されています。
- PVC:pvc-volumes-01
- NS:default
- POD:pod-01
- SA:default
5-3. Prism Central から見た PV
Prism Central で「Infrastructure」→「仮想インフラ」→「Volume Groups」を開き、PV と同名の VG の画面をひらくと、ダッシュボードに「Description」(説明)が表示されます。そして、マウス オーバーすると Description の全文が確認できます。
5-4. Pod の再作成(データ永続化の様子)
Pod にマウントされている PV に、データを書き込んでおきます。
# kubectl exec pod-01 -- bash -c "date > /mnt/vol-01/test.txt"
/mnt/vol-01 ディレクトリ配下の test.txt ファイルに、date コマンドの結果が書き込まれました。
# kubectl exec pod-01 -- cat /mnt/vol-01/test.txt Sun Feb 18 05:14:10 UTC 2024
Pod を削除します。PV を利用していない場合は、Pod のコンテナとともに test.txt ファイルも削除されます。
# kubectl delete pod pod-01 pod "pod-01" deleted
Pod が削除されました。
# kubectl get pod No resources found in default namespace.
test.txt が保存された PV は残っています。
# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-volumes-01 Bound pvc-35c8e573-8ddf-4e2a-a99a-0264cca4cc00 3Gi RWO sc-volumes 40m
あらためて、同じ PV をマウントする Pod を作成します。
# kubectl apply -f pod-01.yml pod/pod-01 configured # kubectl get pod NAME READY STATUS RESTARTS AGE pod-01 1/1 Running 0 13s
再作成された Pod も PV をマウントしているため、test.txt ファイルを引き続き利用できます。
# kubectl exec pod-01 -- cat /mnt/vol-01/test.txt Sun Feb 18 05:14:10 UTC 2024
リソース オブジェクトの削除
まず、Pod を削除します。
# kubectl delete -f pod-01.yml pod "pod-01" deleted
PVC を削除します。
# kubectl delete -f pvc-volumes-01.yml persistentvolumeclaim "pvc-volumes-01" deleted
PVC を削除して少し待つと、PV も削除されます。
# kubectl get pvc No resources found in default namespace. # kubectl get pv No resources found
StorageClass を削除します。
# kubectl delete -f sc-volumes.yml storageclass.storage.k8s.io "sc-volumes" deleted
最後に、Secret を削除します。
# kubectl delete -f ntnx-secret.yml secret "ntnx-secret" deleted
以上。