ストレージの三層を編む
目標
StorageClass、PV、PVCの3層を自分で作成して、バインドの条件を体で覚え、StatefulSetがボリュームをどのように扱うかを確認します。
なぜ重要なのか
PVCがPendingである理由は、常に3つのうちのどれかです。クラス名が合わないか、アクセスモードが合わないか、容量が足りないかです。ここに、プロビジョナーがなく、動的な作成ができない場合が加わります。このラボ環境には、実際のCSIドライバーがないため、静的バインドで、これらの条件を1つずつ確認します。実際のデータを書き込むことは不可能ですが、試験で問われることも、ほとんどがオブジェクトのスペックとバインドの状態です。
allowVolumeExpansionのように、あとで変更しても意味のないフィールドを、あらかじめ知っておくことも重要です。falseで作成したクラスから生まれたPVCは、クラスをあとで直しても、拡張できません。
ステップ
- ネームスペース
cka-storageを作成し、StorageClasscka-fastを作成してください。provisionernfs.csi.k8s.io、reclaimPolicyDelete、volumeBindingModeWaitForFirstConsumer、allowVolumeExpansiontrueです。 - StorageClass
cka-archiveを作成してください。provisionernfs.csi.k8s.io、reclaimPolicyRetain、volumeBindingModeImmediateです。そしてcka-fastに、アノテーションstorageclass.kubernetes.io/is-default-class: "true"を付けて、デフォルトのクラスにしてください。デフォルトのクラスは、ちょうど1つである必要があります。 - PersistentVolume
cka-pv-1を作成してください。capacity 2Gi、accessModes[ReadWriteOnce]、persistentVolumeReclaimPolicyRetain、storageClassNamecka-manual、ボリュームソースはhostPath/mnt/cka-dataです。 cka-storageにPVCcka-pvc-1を作成してください。要求1Gi、accessModes[ReadWriteOnce]、storageClassNamecka-manualです。cka-pv-1にBoundされている必要があります。- PersistentVolume
cka-pv-rwxを作成してください。capacity 5Gi、accessModes[ReadWriteMany]、storageClassNamecka-shared、ボリュームソースはNFS(server10.0.0.109、path/volume1/k8s)です。そしてPVCcka-pvc-rwx(5Gi、RWX、cka-shared)を作成して、Boundさせてください。 - ヘッドレスサービス
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が、自動で作成されている必要があります。 cka-storageにPodvol-demo(イメージnginx:1.27)を作成してください。ボリュームcacheはemptyDirでmediumMemory、sizeLimit128Miで、/cacheにマウントします。ボリュームhostlogsはhostPathのpath/var/log、typeDirectoryで、/hostlogsにreadOnlyでマウントしてください。- PersistentVolume
cka-pv-static(capacity 1Gi、accessModes[ReadWriteOnce]、storageClassNameはまったく設定しない、hostPath/mnt/cka-static)を作成し、PVCcka-pvc-static(1Gi、RWO)を、storageClassNameを空文字列で明示して作成し、Boundさせてください。
参考
- ステップ6のPVCは、プロビジョナーがないため、Pendingのままになります。正常であり、採点はPVCオブジェクトが作成されたかどうかを見ます。
kubectl get pvc -n cka-storageで、STATUSとVOLUMEの列を一緒に見ると、バインドの状態が一目でわかります。- よくあるミス1: PVの回収ポリシーのフィールドを、
reclaimPolicyと書いてしまうことです。PVではpersistentVolumeReclaimPolicyです。 - よくあるミス2: ステップ8で、
storageClassNameを省略してしまうことです。省略すると、デフォルトのクラスであるcka-fastが注入されて、バインドされません。
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させてください。
フィールドを省略するのと、空文字列で明示するのは別物です。前者はデフォルト値が注入され、後者は拒否です。