NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

CAPX Kubernetes クラスタで Nutanix Volumes PV を作成してみる。

CAPX(Cluster API Provider Nutanix Cloud Infrastructure)の Workload Cluster で、Nutanix Volumes の Persistent Volume(PV)を作成してみます。

下記の投稿で作成した環境を利用します。

今回の内容です。

ドキュメントは、下記のあたりです。

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 文字列を指定します。

gist.github.com

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 を指定しています。
  • 各パラメータは、できるだけデフォルト値を指定しています。

gist.github.com

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 の名前を指定します。

gist.github.com

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 にマウントします。

gist.github.com

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

以上。

©2023 gowatana
クリエイティブ・コモンズ・ライセンスこの 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。