TT Lab
はじめる
学ぶ 学習パス コース

CKA — Kubernetes管理者

ストレージの三層を編む

TT Labで続きを見る

目標

StorageClass、PV、PVCの3層を自分で作成して、バインドの条件を体で覚え、StatefulSetがボリュームをどのように扱うかを確認します。

なぜ重要なのか

PVCがPendingである理由は、常に3つのうちのどれかです。クラス名が合わないか、アクセスモードが合わないか、容量が足りないかです。ここに、プロビジョナーがなく、動的な作成ができない場合が加わります。このラボ環境には、実際のCSIドライバーがないため、静的バインドで、これらの条件を1つずつ確認します。実際のデータを書き込むことは不可能ですが、試験で問われることも、ほとんどがオブジェクトのスペックとバインドの状態です。

allowVolumeExpansionのように、あとで変更しても意味のないフィールドを、あらかじめ知っておくことも重要です。falseで作成したクラスから生まれたPVCは、クラスをあとで直しても、拡張できません。

ステップ

  1. ネームスペースcka-storageを作成し、StorageClasscka-fastを作成してください。provisionernfs.csi.k8s.io、reclaimPolicyDelete、volumeBindingModeWaitForFirstConsumer、allowVolumeExpansiontrueです。
  2. StorageClasscka-archiveを作成してください。provisionernfs.csi.k8s.io、reclaimPolicyRetain、volumeBindingModeImmediateです。そしてcka-fastに、アノテーションstorageclass.kubernetes.io/is-default-class: "true"を付けて、デフォルトのクラスにしてください。デフォルトのクラスは、ちょうど1つである必要があります。
  3. PersistentVolumecka-pv-1を作成してください。capacity 2Gi、accessModes[ReadWriteOnce]、persistentVolumeReclaimPolicyRetain、storageClassNamecka-manual、ボリュームソースはhostPath/mnt/cka-dataです。
  4. cka-storageにPVCcka-pvc-1を作成してください。要求1Gi、accessModes[ReadWriteOnce]、storageClassNamecka-manualです。cka-pv-1にBoundされている必要があります。
  5. PersistentVolumecka-pv-rwxを作成してください。capacity 5Gi、accessModes[ReadWriteMany]、storageClassNamecka-shared、ボリュームソースはNFS(server10.0.0.109、path/volume1/k8s)です。そしてPVCcka-pvc-rwx(5Gi、RWX、cka-shared)を作成して、Boundさせてください。
  6. ヘッドレスサービスdb-headless(clusterIP None、port 5432、セレクターapp=db)を作成し、StatefulSetdbを作成してください。serviceNamedb-headless、レプリカ2、イメージnginx:1.27、podManagementPolicyParallel、volumeClaimTemplatesは、名前data(accessModes[ReadWriteOnce]、storageClassNamecka-fast、1Gi)、persistentVolumeClaimRetentionPolicyはwhenDeletedDelete / whenScaledRetainです。PVCdata-db-0とdata-db-1が、自動で作成されている必要があります。
  7. cka-storageにPodvol-demo(イメージnginx:1.27)を作成してください。ボリュームcacheはemptyDirでmediumMemory、sizeLimit128Miで、/cacheにマウントします。ボリュームhostlogsはhostPathのpath/var/log、typeDirectoryで、/hostlogsにreadOnlyでマウントしてください。
  8. PersistentVolumecka-pv-static(capacity 1Gi、accessModes[ReadWriteOnce]、storageClassNameはまったく設定しない、hostPath/mnt/cka-static)を作成し、PVCcka-pvc-static(1Gi、RWO)を、storageClassNameを空文字列で明示して作成し、Boundさせてください。

参考

StorageClassを作成する

ネームスペースcka-storageを作成し、StorageClasscka-fastを作成してください。provisionernfs.csi.k8s.io、reclaimPolicyDelete、volumeBindingModeWaitForFirstConsumer、allowVolumeExpansiontrueです。

provisionerは文字列で、ドライバーが実際になくても、オブジェクトは作成されます。reclaimPolicy、volumeBindingMode、allowVolumeExpansionは、StorageClassの最上位のフィールドで、parametersの中ではありません。

2つ目のクラスとデフォルトクラスの指定

StorageClasscka-archiveを作成してください。provisionernfs.csi.k8s.io、reclaimPolicyRetain、volumeBindingModeImmediateです。そしてcka-fastに、アノテーションstorageclass.kubernetes.io/is-default-class: "true"を付けて、デフォルトのクラスにしてください。デフォルトのクラスは、ちょうど1つである必要があります。

デフォルトのクラスは、アノテーションで決めます。デフォルトが2つ以上あると、どれが使われるか予測できないので、ちょうど1つである必要があります。

PersistentVolumeを直接作成する

PersistentVolumecka-pv-1を作成してください。capacity 2Gi、accessModes[ReadWriteOnce]、persistentVolumeReclaimPolicyRetain、storageClassNamecka-manual、ボリュームソースはhostPath/mnt/cka-dataです。

PVはクラスタースコープです。回収ポリシーのフィールド名が、StorageClassと違う点に注意してください。

静的バインドを確認する

cka-storageにPVCcka-pvc-1を作成してください。要求1Gi、accessModes[ReadWriteOnce]、storageClassNamecka-manualです。cka-pv-1にBoundされている必要があります。

バインドの条件は、クラス名の一致、アクセスモードの包含、容量の充足の3つです。1つだけずれても、静かにPendingのままになります。

RWXボリュームを作成する

PersistentVolumecka-pv-rwxを作成してください。capacity 5Gi、accessModes[ReadWriteMany]、storageClassNamecka-shared、ボリュームソースはNFS(server10.0.0.109、path/volume1/k8s)です。そしてPVCcka-pvc-rwx(5Gi、RWX、cka-shared)を作成して、Boundさせてください。

PVとPVCのaccessModesが互いに合ってはじめて、結び付きます。NFSのボリュームソースは、serverとpathの2つのフィールドを要求します。

volumeClaimTemplatesでPVCを自動作成する

ヘッドレスサービスdb-headless(clusterIP None、port 5432、セレクターapp=db)を作成し、StatefulSetdbを作成してください。serviceNamedb-headless、レプリカ2、イメージnginx:1.27、podManagementPolicyParallel、volumeClaimTemplatesは、名前data(accessModes[ReadWriteOnce]、storageClassNamecka-fast、1Gi)、persistentVolumeClaimRetentionPolicyはwhenDeletedDelete / whenScaledRetainです。PVCdata-db-0とdata-db-1が、自動で作成されている必要があります。

PVCの名前は、テンプレート名とPod名が組み合わされて決まります。最初のPodがReadyにならなければ、次のPodが作成されないというデフォルトの動作を、変更する必要があります。

emptyDirとhostPathのマウント

cka-storageにPodvol-demo(イメージnginx:1.27)を作成してください。ボリュームcacheはemptyDirでmediumMemory、sizeLimit128Miで、/cacheにマウントします。ボリュームhostlogsはhostPathのpath/var/log、typeDirectoryで、/hostlogsにreadOnlyでマウントしてください。

ボリュームの定義はspec.volumes、マウントはコンテナのvolumeMountsです。メモリベースのemptyDirは、mediumフィールドで指定します。

総合: デフォルトのStorageClassを拒否する

PersistentVolumecka-pv-static(capacity 1Gi、accessModes[ReadWriteOnce]、storageClassNameはまったく設定しない、hostPath/mnt/cka-static)を作成し、PVCcka-pvc-static(1Gi、RWO)を、storageClassNameを空文字列で明示して作成し、Boundさせてください。

フィールドを省略するのと、空文字列で明示するのは別物です。前者はデフォルト値が注入され、後者は拒否です。