静的プロビジョニングに加えて、動的プロビジョニングを使用して、永続ボリュームクレーム (PVC) とStorageClassesに基づいて永続ボリューム (PV) を自動的に予約するようにシステムを構成できます。 動的プロビジョニングにより、アプリケーションの自動およびオンデマンドのボリューム作成が可能になります。 これにより、Container Service for Kubernetes (ACK) クラスターのストレージインフラストラクチャ構成の複雑さが軽減されます。
制限事項
ディスクが存在するゾーン以外のゾーンにデプロイされたポッドにはディスクをマウントできません。
マルチアタッチ機能が無効になっているディスクは、1つのポッドにのみマウントできます。
ポッドを起動する前に、ディスクのタイプがクラスターで使用されているElastic Compute Service (ECS) インスタンスタイプと一致している必要があります。 ディスクタイプとECSインスタンスタイプのマッチングルールの詳細については、「インスタンスファミリー」をご参照ください。
重要クラスター内のECSインスタンスの課金方法を従量課金からサブスクリプションに変更した場合、ディスクの課金方法をサブスクリプションに変更することはできません。 それ以外の場合、ディスクはクラスターにマウントされません。 ストレージ容量ユニット (SCU) を購入して、ストレージコストを削減できます。 SCUの詳細については、「SCUの概要」をご参照ください。
前提条件
Container Storage Interface (CSI) プラグインが最新バージョンに更新されました。 CSIバージョンの詳細については、「プラグインのインストール」をご参照ください。
Linuxカーネルバージョンが4.9より前のCentOS 7.9イメージまたはその他のOSイメージを使用するノードがクラスターに含まれており、xfsファイルシステムを使用してデータを永続化する場合 (fstypeパラメーターが
xfs
に設定されている場合) 、CSIプラグインを1.24.7以降に更新しないでください。 4.9より前のLinuxカーネルバージョンは、CSI 1.24.7以降と互換性がありません。 この場合、CSIプラグインを1.24.7以降にアップデートすると、xfsファイルシステムがマウントされているポッドが起動しないことがあります。 他のファイルシステムは影響を受けません。 この問題を解決するには、チケットを起票します。CSIプラグインを1.26.4に更新する場合、csi-pluginとcsi-provisionerの両方を更新する必要があります。
使用上の注意
アプリケーションをデプロイすると、システムは自動的にディスクを購入し、指定されたStorageClassに基づいてPVをプロビジョニングします。 すでにディスクがある場合は、静的ディスクボリュームの使用を推奨します。
ディスクを購入する際、指定したディスクサイズは、個々のディスクに対応する容量範囲を超えることはできません。 詳細については、「ボリュームとしての Alibaba Cloud ディスクの使用」をご参照ください。
システムがポッドを再作成すると、ポッドにマウントされた元のディスクが再マウントされます。 再作成中にシステムがポッドを元のゾーンにスケジュールできなかった場合、ポッドは保留状態のままになります。
動的プロビジョニングは、従量課金ディスクのみをサポートします。 ディスクの課金可能な項目の詳細については、「ブロックストレージデバイスの課金」をご参照ください。 ディスクの料金の詳細については、Elastic Compute Service製品ページをご覧ください。
ACKコンソールまたはkubectlを使用して、StorageClass、PVC、およびアプリケーションを作成できます。
ACKコンソールで動的にプロビジョニングされたディスクボリュームを使用する
ステップ1: StorageClassの作成
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
StorageClassesページの右上隅にある [作成] をクリックします。
[作成] ダイアログボックスで、StorageClassのパラメーターを設定します。
次の表に、主要なパラメーターを示します。
パラメーター
説明
名前
StorageClassの名前。
PVタイプ
[クラウドディスク] または [NAS] を選択できます。 この例では、[クラウドディスク] が選択されています。
パラメーター
ディスクの種類 デフォルトでは、typeパラメーターが追加され、cloud_essdに設定されます。 typeパラメータの有効値:
cloud_efficiency
: ウルトラディスク。cloud_auto
: ESSD AutoPLディスク。cloud_ssd
: 標準SSD。cloud_essd
: ESSD。cloud_essd_entry
: ESSDエントリディスク。
1つ以上の値を指定できます。 たとえば、このパラメーターを
type: cloud_efficiency, cloud_ssd, cloud_essd
に設定できます。 指定されたタイプのディスクを順番に作成しようとします。 ディスクが作成されると、システムは試行を停止します。説明ECSインスタンスでサポートされるディスクタイプは、インスタンスタイプによって異なります。 詳細については、「EBSに関するFAQ」をご参照ください。
再利用ポリシー
ディスクの再利用ポリシー。 デフォルト値:
Delete
。 有効な値:削除
: PVCが削除されると、関連するPVとディスクも削除されます。保持
: PVCが削除されると、関連するPVとディスクは保持されます。 PVとディスクデータは手動でのみ削除できます。
データセキュリティの要件が高い場合は、ユーザーエラーによるデータ損失を防ぐために、保持ポリシーを使用することを推奨します。
バインディングモード
ディスクのバインドモード。 デフォルト値:
Immediate
。 有効な値:Immediate
: StorageClassを使用するPVCが作成されると、ディスクが作成されます。 このようにして、ディスクを使用するポッドを作成する前に、ディスクが作成され、PVがプロビジョニングされます。WaitForFirstConsumer
: PVCを使用するポッドが作成されるまで、PVのバインドとプロビジョニングを遅延させます。 ポッドがノードにスケジュールされると、ノードがデプロイされ、PVとしてプロビジョニングされるゾーンにディスクが作成されます。
設定が完了したら、[作成] をクリックします。
StorageClassが作成されると、StorageClassesリストに表示されます。
手順 2: PVC の作成
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[ボリュームクレームの永続化] ページの右上隅にある [作成] をクリックします。
[PVCの作成] ダイアログボックスで、PVCのパラメーターを設定します。
パラメーター
説明
PVCタイプ
クラウドディスク、NAS、またはOSSを選択できます。 この例では、クラウドディスクが選択されています。
名前
PVCの名前。 名前は名前空間内で一意である必要があります。
割り当てモード
この例では、[StorageClassを使用] が選択されています。これは、StorageClassを使用してPVを動的にプロビジョニングすることを示します。
既存のストレージクラス
PVを動的にプロビジョニングするには、既存のStorageClassを選択します。
容量
PVCが主張する容量。
アクセスモード
ReadWriteOnce
のみを使用できます。 詳細については、「kubectlを使用して動的にプロビジョニングされたディスクボリュームを使用する」をご参照ください。[作成] をクリックします。
PVCが作成されると、PVCがPVCリストに表示されます。 PVCはPVに結合される。
ステップ3: アプリケーションのデプロイ
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
StatefulSetsページの右上隅にある [画像から作成] をクリックします。
アプリケーションパラメーターを設定します。
この例では、ボリュームパラメーターの設定方法を示します。 その他のパラメーターの詳細については、「イメージを使用した StatefulSet アプリケーションの作成」をご参照ください。
ACKクラスター用にローカルストレージボリュームとクラウドストレージボリュームを設定できます。 この例では、[クラウドストレージ] が選択されています。 作成したディスクボリュームをコンテナーの /tmpパスにマウントします。 ディスクボリュームがマウントされた後、/tmpパスに生成されたコンテナデータがディスクボリュームに格納されます。
その他のパラメーターを設定し、[作成] をクリックします。
アプリケーションの作成後、ボリュームを使用してアプリケーションデータを保存できます。
kubectlを使用して動的にプロビジョニングされたディスクボリュームを使用する
ステップ1: StorageClassの作成
マルチゾーンクラスターの場合、実際のシナリオに基づいて次の方法を選択してStorageClassesを作成できます。
遅延PVC-PVバインディング
遅延PVC-PVバインドモードは、既存のディスクが使用するECSインスタンスのゾーンに属していない場合に適用されます。 次の例では、storage-class-csi-wffc.yamlという名前のファイルを使用してStorageClassを作成します。
storage-class-wffc.yamlという名前のファイルを作成し、次のコードをファイルにコピーします。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-disk-wait-for-first-consumer provisioner: diskplugin.csi.alibabacloud.com parameters: type: cloud_auto,cloud_essd,cloud_ssd # The system attempts to create a disk of the specified types in sequence. The actual types of disks that are created depend on the instance types of the ECS instances to which the disks are mounted and the disk types supported by the zones where the ECS instances are deployed. fstype: ext4 diskTags: "a:b,b:c" encrypted: "false" performanceLevel: PL1 volumeExpandAutoSnapshot: "forced" # This parameter takes effect only when the type parameter is set to cloud_essd. provisionedIops: "40000" burstingEnabled: "false" volumeBindingMode: WaitForFirstConsumer reclaimPolicy: Retain allowVolumeExpansion: true
パラメーター
説明
メタデータ
name
StorageClassの名前。 名前は小文字で始まる必要があり、小文字、数字、ピリオド (.) 、およびハイフン (-) のみを使用できます。
provisioner
このパラメーターを
diskplugin.csi.alibabacloud.com
に設定します。 これは、Alibaba Cloudディスクのプロビジョニングプラグインを使用してStorageClassを作成することを示します。パラメーター
詳細については、「パラメーター」をご参照ください。
volumeBindingMode
ディスクのバインドモード。 デフォルト値:
Immediate
。 値をWaitForFirstConsumer
に設定することもできます。Immediate
: StorageClassを使用するPVCが作成されると、ディスクが作成されます。 このようにして、ディスクを使用するポッドを作成する前に、ディスクが作成され、PVがプロビジョニングされます。WaitForFirstConsumer
: PVCを使用するポッドが作成されるまで、PVのバインドとプロビジョニングを遅延させます。 ポッドがノードにスケジュールされると、ノードがデプロイされ、PVとしてプロビジョニングされるゾーンにディスクが作成されます。
reclaimPolicy
ディスクの再利用ポリシー。 デフォルト値:
Delete
。 値を[保持]
に設定することもできます。削除
: PVCが削除されると、関連するPVとディスクも削除されます。保持
: PVCが削除されると、関連するPVとディスクは保持されます。 PVとディスクデータは手動でのみ削除できます。
データセキュリティの要件が高い場合は、ユーザーエラーによるデータ損失を防ぐために、保持ポリシーを使用することを推奨します。
allowVolumeExpansion
このパラメーターをtrueに設定すると、ディスクのサイズを自動的に変更できます。
次のコマンドを実行してStorageClassを作成します。
kubectl apply -f storage-class-wffc.yaml
作成したStorageClassを表示します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
ポッドを作成する前にディスクを作成する
storage-class-immediate.yamlという名前のファイルを作成し、次のコードをファイルにコピーします。
apiVersion: storage.k8s.io/v1 kind: StorageClass メタデータ: 名前: alicloud-disk-immediate provisioner: diskplugin.csi.alibabacloud.com パラメータ: type: cloud_essd,cloud_ssd,cloud_efficiency# システムは、指定されたタイプのディスクを順番に作成しようとします。 作成されるディスクの実際のタイプは、ディスクがマウントされているECSインスタンスのインスタンスタイプと、ECSインスタンスがデプロイされているゾーンでサポートされているディスクタイプによって異なります。 regionId: cn-beijing zoneId: cn-beijing-b encrypted: "false" reclaimPolicy: Retain allowVolumeExpansion: true volumeBindingMode: 即時
パラメーター
説明
メタデータ
name
StorageClassの名前。 名前は小文字で始まる必要があり、小文字、数字、ピリオド (.) 、およびハイフン (-) のみを使用できます。
provisioner
このパラメーターを
diskplugin.csi.alibabacloud.com
に設定します。 これは、Alibaba Cloudディスクのプロビジョニングプラグインを使用してStorageClassを作成することを示します。パラメーター
詳細については、「パラメーター」をご参照ください。
reclaimPolicy
ディスクの再利用ポリシー。 デフォルト値:
Delete
。 値を[保持]
に設定することもできます。削除
: PVCが削除されると、関連するPVとディスクも削除されます。保持
: PVCが削除されると、関連するPVとディスクは保持されます。 PVとディスクデータは手動でのみ削除できます。
データセキュリティの要件が高い場合は、
[保持]
ポリシーを使用して、ユーザーエラーによるデータ損失を防ぐことを推奨します。allowVolumeExpansion
このパラメーターを
true
に設定すると、ディスクのサイズを自動的に変更できます。volumeBindingMode
ディスクのバインドモード。 デフォルト値:
Immediate
。 値をWaitForFirstConsumer
に設定することもできます。Immediate
: StorageClassを使用するPVCが作成されると、ディスクが作成されます。 このようにして、ディスクを使用するポッドを作成する前に、ディスクが作成され、PVがプロビジョニングされます。WaitForFirstConsumer
: PVCを使用するポッドが作成されるまで、PVのバインドとプロビジョニングを遅延させます。 ポッドがノードにスケジュールされると、ノードがデプロイされ、PVとしてプロビジョニングされるゾーンにディスクが作成されます。
次のコマンドを実行してStorageClassを作成します。
kubectl apply -f storage-class-immediate.yaml
作成したStorageClassを表示します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
手順 2: PVC の作成
pvc-disk.yamlという名前のファイルを作成し、次のコードをファイルにコピーします。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 25Gi storageClassName: alicloud-disk-wait-for-first-consumer
パラメーター
説明
name
PVCの名前。
accessModes
PVCのアクセスモード。
volumeMode
ディスクのボリュームモード。 有効な値:
[ファイルシステム]
および[ブロック]
このパラメーターはオプションです。 デフォルト値: Filesystem。storageClassName
PVCに関連付けるStorageClassの名前。
ストレージ
PVCが主張するディスクサイズ。 最小容量は20 GiBです。
使用可能なアクセスモードは、StorageClassのmultiAttachパラメーターとPVCのvolumeModeパラメーターによって異なります。 次の表では、仕様について説明します。
パラメーター設定
アクセスモード
multiAttach
volumeMode
ReadWriteOnce
ReadOnlyMany
ReadWriteMany
Any
ファイルシステム
ブロック
次のコマンドを実行してPVCを作成します。
kubectl create -f pvc-disk.yaml
作成したPVCを表示します。
ACKコンソールのクラスター詳細ページの左側のナビゲーションウィンドウで、
を選択します。 作成したPVCは、[ボリュームクレームの永続化] ページで確認できます。
ステップ3: アプリケーションの作成
次のコマンドを実行して、MySQLアプリケーションのルートパスワードを設定するためのシークレットを作成します。 運用環境で作業している場合は、必ずパスワードを変更してください。
kubectl create secret generic mysql-pass --from-literal=password=mypassword
mysql.yamlという名前のファイルを作成し、次のコードをファイルにコピーします。
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: selector: matchLabels: app: mysql serviceName: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: pvc-disk mountPath: /var/lib/mysql volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvc
パラメーター
説明
mountPath
ディスクがマウントされるパス。
claimName
アプリケーションにマウントされているPVCの名前。
次のコマンドを実行してアプリケーションを作成し、PVCをアプリケーションにマウントします。
kubectl create -f mysql.yaml
アプリケーションを表示します。
ACKコンソールのクラスター詳細ページの左側のナビゲーションウィンドウで、
を選択します。 作成したアプリケーションは、StatefulSetsページで表示できます。
動的にプロビジョニングされたディスクボリュームを使用してデータを永続化できるかどうかのテスト
ポッドが削除されて再作成された後も、ポッドは削除される前に書き込まれたデータを保存します。 次の手順を実行して、データがディスクに永続化されているかどうかをテストします。
次のコマンドを実行して、新しいディスクが
/var/lib /MySQL
パスにマウントされているかどうかを確認して、ディスクがmysqlアプリケーションにマウントされていることを確認します。kubectl exec mysql-0 -- df -h /var/lib/mysql
期待される出力:
Filesystem Size Used Avail Use% Mounted on /dev/vdd 25G 213M 25G 1% /var/lib/mysql
ディスクにファイルを作成します。
次のコマンドを実行して、
/var/lib/mysql
パスにtest-persistent
という名前のファイルを作成します。kubectl exec mysql-0 -- touch /var/lib/mysql/test-persistent
次のコマンドを実行して、ファイルが作成されていることを確認します。
kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent
期待される出力:
/var/lib/mysql/test-persistent
次のコマンドを実行して、
mysql-0
という名前のポッドを削除します。kubectl delete pod mysql-0
期待される出力:
pod "mysql-0" deleted
ポッドの削除後もファイルがまだ存在するかどうかをテストします。
次のコマンドを実行して、ポッドが期待どおりに実行されるかどうかを確認します。
kubectl get pod mysql-0
期待される出力:
NAME READY STATUS RESTARTS AGE mysql-0 1/1 Running 0 12s
次のコマンドを実行して、作成されたファイルを照会します。
kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent
期待される出力:
/var/lib/mysql/test-persistent
test-persistent
ファイルはまだ存在します。 これは、データが動的にプロビジョニングされたディスクに保持されることを示します。
関連ドキュメント
ディスクボリュームのデータセキュリティを強化する方法の詳細については、「Best practices for data security of disk volumes」をご参照ください。
ディスクをリアルタイムで監視する方法の詳細については、「csi-pluginを使用したノード側のストレージリソースの監視」をご参照ください。
ディスクサイズがビジネス要件を満たしていない場合、またはディスクがいっぱいになっている場合にディスクのサイズを変更する方法の詳細については、「ディスクボリュームのサイズ変更」をご参照ください。
StatefulSetsの永続ストレージを有効にする方法の詳細については、「永続ストレージをサポートするStatefulSetの有効化」をご参照ください。
ディスクボリュームの使用時にエラーが発生した場合は、「ディスクボリュームに関するよくある質問」をご参照ください。
ポッドまたはゾーン間でストレージを共有する場合は、Apsara File storage NAS (NAS) ボリュームの使用を推奨します。 詳細は、「NASボリューム」をご参照ください。