アプリケーションに高い IOPS と低いレイテンシが必要で、データ共有が不要な場合は、ディスクを永続ボリューム (PV) としてアプリケーションにマウントできます。このトピックでは、動的にプロビジョニングされたディスクボリュームをアプリケーションにマウントし、ディスクボリュームを使用してデータを永続化できるかどうかを確認する方法について説明します。
背景情報
ディスクは、分散マルチレプリカメカニズムを使用して低レイテンシ、高パフォーマンス、高耐久性、高信頼性を確保するブロックレベルのストレージデバイスです。ディスクは、高い IOPS と低いレイテンシが必要で、データ共有が不要なアプリケーションに適しています。詳細については、「ストレージの概要」をご参照ください。
Alibaba Cloud Container Compute Service (ACS) は、動的にプロビジョニングされたディスクボリュームのみをサポートしています。ACS は、静的にプロビジョニングされたディスクボリュームをサポートしていません。
前提条件
managed-csiprovisioner コンポーネントが ACS クラスタにインストールされています。
ACS コンソールの ACS クラスタ管理ページに移動します。クラスタ管理ページの左側のナビゲーションウィンドウで、 を選択します。[ストレージ] タブで、managed-csiprovisioner がインストールされているかどうかを確認できます。
制限
ディスクは共有できません。ディスクは 1 つのポッドにのみマウントできます。
ディスクと同じゾーンにあるポッドにのみ、ディスクをマウントできます。
制限事項
デプロイメントではなく、ポッドまたは StatefulSet にディスクをマウントすることをお勧めします。
説明ディスクは 1 つのポッドにのみマウントできます。デプロイメントにディスクをマウントする場合は、デプロイメントのポッドレプリカ数を 1 に設定する必要があります。デプロイメントに複数のポッドを構成する場合、各ポッドに個別のディスクボリュームをマウントすることはできません。また、ポッドのボリュームのマウントおよびマウント解除の優先順位を指定することもできません。デプロイメントのポッドを再起動すると、デプロイメントで使用される更新ポリシーが原因で、再起動されたポッドにディスクがマウントされない場合があります。デプロイメントにディスクをマウントしないことをお勧めします。
動的にプロビジョニングされたディスクボリュームをマウントすると、自動的に作成されるディスクは従量課金方式を使用します。
ディスクの課金ルールの詳細については、「ブロックストレージデバイス」をご参照ください。
ディスクの価格の詳細については、「ブロックストレージデバイスの価格」をご参照ください。
動的にプロビジョニングされたディスクボリュームをアプリケーションにマウントする場合、アプリケーション構成に
securityContext.fsgroupパラメーターが含まれていると、ACS はボリュームがマウントされた後にchmodコマンドとchownコマンドを自動的に実行するため、ボリュームのマウントプロセスが遅くなる可能性があります。説明アプリケーション構成に
securityContext.fsgroupパラメーターを追加すると、ACS はアプリケーションにディスクをマウントするときにボリューム内のファイルの所有権を自動的に変更します。所有権の変更に必要な時間は、ボリューム内のファイルの数によって異なります。ボリュームに多数のファイルが存在する場合、変更プロセスに時間がかかる場合があります。ポッド構成のfsGroupChangePolicyパラメーターをOnRootMismatchに設定できます。このようにすると、ACS はポッドが初めて起動されたときにのみファイルの所有権を変更します。作成後にポッドを更新または再作成する場合、ボリュームのマウントプロセスには所有権の変更は含まれません。上記の 設定 がビジネス要件を満たしていない場合は、init コンテナーを作成し、init コンテナーに関連する操作を実行するための権限を付与することをお勧めします。
動的にプロビジョニングされたディスクボリュームをマウントする
kubectl
ステップ 1:StorageClass を作成する
ACS は、alicloud-disk-topology-alltype という名前のデフォルト StorageClass を提供します。この StorageClass は、優先順位の高い順に、cloud_essd(ESSD)、cloud_ssd(標準 SSD)、cloud_efficiency(Ultra ディスク)のタイプの PV をプロビジョニングするために使用できます。デフォルトの StorageClass がビジネス要件を満たしていない場合は、次の手順を実行してカスタム StorageClass を作成します。
ACS クラスタに接続します。詳細については、「クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する」および「Cloud Shell で kubectl を使用して ACS クラスタを管理する」をご参照ください。
disk-sc.yaml という名前のファイルを作成し、次のテンプレートコンテンツをファイルにコピーします。ビジネス要件に基づいてテンプレートのパラメータを変更します。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-disk-essd provisioner: diskplugin.csi.alibabacloud.com parameters: type: cloud_essd fstype: ext4 performanceLevel: PL1 reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true次の表は、パラメータについて説明しています。
パラメータ
説明
parameters.typeディスクのカテゴリ。有効な値:
cloud_essd_entry: ESSD Entry ディスク。cloud_auto: ESSD AutoPL ディスク。cloud_essd: 企業向け SSD(ESSD)。これがデフォルト値です。cloud_ssd: 標準 SSD。cloud_efficiency: Ultra ディスク。
このパラメータは、上記の値の任意の組み合わせに設定できます。たとえば、このパラメータを
type: cloud_efficiency, cloud_ssd, cloud_essdに設定できます。この場合、システムは指定されたカテゴリのディスクを順番に作成しようとします。ディスクが作成されると、システムは試行を停止します。説明課金とパフォーマンスの要件に基づいてディスクカテゴリを選択できます。詳細については、「ブロックストレージデバイスの価格」および「ブロックストレージのパフォーマンス」をご参照ください。
parameters.fstypeディスクのファイルシステムタイプ。デフォルト値:ext4。有効な値:
ext3、ext4、xfs。parameters.performanceLevelESSD のパフォーマンスレベル(PL)。デフォルト値:
PL1。有効な値:PL0、PL1、PL2、PL3。詳細については、「ESSD」をご参照ください。provisionerドライバのタイプ。この例では、パラメータは
diskplugin.csi.alibabacloud.comに設定されており、Alibaba Cloud が提供する Container Storage Interface(CSI)プラグインが使用されていることを示します。reclaimPolicyディスクの再利用ポリシー。値を
Deleteに設定する必要があります。これは、永続ボリューム要求(PVC)が削除されると、PV とディスクが自動的に削除されることを示します。volumeBindingModeボリュームバインディングモード。クラスタが複数ゾーンにデプロイされている場合は、
WaitForFirstConsumerを使用することをお勧めします。WaitForFirstConsumer: ボリュームがバインドされるまで待機する時間。システムはポッドをスケジュールし、ポッドのゾーン情報に基づいてボリュームを作成します。Immediate: システムはポッドを作成する前にボリュームを作成します。
重要ACK クラスタでディスクボリュームがマウントされた ACS ポッドを使用する場合は、nodeSelector を使用するか、ResourcePolicy を作成してポッドを仮想ノードにスケジュールします。
alibabacloud.com/acs: "true"ポッドラベルを使用してポッドを仮想ノードにスケジュールする場合、WaitForFirstConsumerStorageClass はサポートされていません。allowVolumeExpansionディスクのサイズを自動的に変更するかどうかを指定します。
StorageClass を作成します。
kubectl create -f disk-sc.yamlStorageClass を確認します。
kubectl get sc予期される出力:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE alicloud-disk-essd diskplugin.csi.alibabacloud.com Delete WaitForFirstConsumer true 78s alicloud-disk-topology-alltype diskplugin.csi.alibabacloud.com Delete WaitForFirstConsumer true 23d ......
ステップ 2:PVC を作成する
disk-pvc.yaml という名前のファイルを作成し、次のコンテンツをファイルにコピーします。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOncePod volumeMode: Filesystem resources: requests: storage: 20Gi storageClassName: alicloud-disk-essd次の表は、パラメータについて説明しています。
パラメータ
説明
accessModesアクセスモード。値を ReadWriteOncePod に設定する必要があります。
volumeModeボリュームのモード。有効な値:
Filesystem: ファイルシステムモード。これがデフォルト値です。Block: block gateway: ブロックデバイスモード。
storageポッドに割り当てるストレージ容量を指定します。これはディスクの容量でもあります。
storageClassNamePVC に関連付ける StorageClass の名前。
PVC を作成します。
kubectl create -f disk-pvc.yamlPVC を確認します。
kubectl get pvcvolumeBindingModeパラメータがWaitForFirstConsumerに設定されているため、次の出力は PVC に PV がバインドされていないことを示しています。NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Pending alicloud-disk-essd <unset> 7s
ステップ 3:アプリケーションを作成し、アプリケーションにディスクをマウントする
disk-test.yaml という名前のファイルを作成し、次のコンテンツをファイルにコピーします。
次のコードブロックは、1 つのポッドをプロビジョニングする StatefulSet の構成を指定します。ポッドは、
disk-pvcPVC を使用してストレージリソースを申請します。これはポッドの/dataパスにマウントされます。apiVersion: apps/v1 kind: StatefulSet metadata: name: disk-test spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest ports: - containerPort: 80 volumeMounts: - name: pvc-disk mountPath: /data volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvcStatefulSet を作成し、StatefulSet にディスクをマウントします。
kubectl create -f disk-test.yaml重要StatefulSet のデプロイプロセス中に、システムは StatefulSet 構成で指定された PVC と StorageClass に基づいて、従量課金ディスクと PV を自動的に作成します。
StatefulSet によってプロビジョニングされたポッドがデプロイされているかどうかを確認します。
kubectl get pod | grep disk-test次の出力は、StatefulSet に 1 つのポッドがデプロイされていることを示しています。
disk-test-0 1/1 Running 0 52sPVC を確認します。
kubectl get pvc次の出力は、ディスクタイプの PV が自動的に作成され、PVC にバインドされていることを示しています。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Bound d-uf698s3h14isyj6b**** 20Gi RWOP alicloud-disk-essd <unset> 111sマウントパス内のファイルを表示して、ディスクがマウントされているかどうかを確認します。
kubectl exec disk-test-0 -- df | grep data予期される出力:
/dev/vdb 20466256 24 20449848 1% /data
コンソール
ステップ 1:StorageClass を作成する
ACS は、alicloud-disk-topology-alltype という名前のデフォルト StorageClass を提供します。この StorageClass を使用すると、cloud_essd (ESSD)、cloud_ssd (標準 SSD)、cloud_efficiency (Ultra ディスク) のタイプの PV を優先順位の高い順にプロビジョニングできます。デフォルトの StorageClass がビジネス要件を満たしていない場合は、次の手順を実行してカスタム StorageClass を作成します。
ACS コンソール にログオンします。
[クラスタ] ページで、クラスタの名前をクリックして、クラスタ管理ページに移動します。
クラスタ管理ページの左側のナビゲーションウィンドウで、 を選択します。
StorageClass を作成します。
[StorageClass] ページで、[作成] をクリックします。
[作成] ダイアログボックスで、パラメータを構成し、[作成] をクリックします。
パラメータ
説明
例
[名前]
StorageClass のカスタム名を入力します。名前は、コンソールに表示される形式要件を満たしている必要があります。
alicloud-disk-essd
[PV タイプ]
[クラウドディスク] を選択します。
クラウドディスク
[パラメータ]
デフォルトでは、
typeパラメータが追加されます。このパラメータはディスクカテゴリを指定します。有効な値:cloud_essd_entry: ESSD Entry ディスク。cloud_auto: ESSD AutoPL ディスク。cloud_essd: 企業向け SSD (ESSD)。これがデフォルト値です。cloud_ssd: 標準 SSD。cloud_efficiency: Ultra ディスク。
このパラメータは、上記の値の任意の組み合わせに設定できます。たとえば、このパラメータを
type: cloud_efficiency, cloud_ssd, cloud_essdに設定できます。この場合、システムは指定されたカテゴリのディスクを順番に作成しようとします。ディスクが作成されると、システムは試行を停止します。説明課金とパフォーマンスの要件に基づいてディスクカテゴリを選択できます。詳細については、「ブロックストレージデバイスの価格」および「ブロックストレージのパフォーマンス」をご参照ください。
次のパラメータを追加できます。
fstypeディスクのファイルシステムタイプ。デフォルト値:ext4。有効な値:
ext3、ext4、xfs。performanceLevelESSD のパフォーマンスレベル(PL)。デフォルト値:
PL1。有効な値:PL0、PL1、PL2、およびPL3。詳細については、「ESSD」をご参照ください。
type:cloud_essd
[再利用ポリシー]
ディスクの再利用ポリシー。値は
Deleteに設定する必要があります。これは、永続ボリューム要求 (PVC) が削除されると、PV とディスクが自動的に削除されることを示します。Delete
[バインディングモード]
ボリュームのバインディングモード。クラスターが複数のゾーンにデプロイされている場合は、
WaitForFirstConsumerを使用することをお勧めします。WaitForFirstConsumer: ボリュームがバインドされるまで待機する時間。システムはポッドをスケジュールしてから、ポッドのゾーン情報に基づいてボリュームを作成します。Immediate: システムはポッドを作成する前にボリュームを作成します。
重要ACK クラスターのディスクボリュームがマウントされた ACS ポッドを使用する場合は、nodeSelector を使用するか、ResourcePolicy を作成して仮想ノードにポッドをスケジュールします。
alibabacloud.com/acs: "true"ポッドラベルを使用して仮想ノードにポッドをスケジュールする場合、WaitForFirstConsumerストレージクラスはサポートされていません。WaitForFirstConsumer
ステップ 2:PVC を作成する
クラスタ管理ページの左側のナビゲーションウィンドウで、 を選択します。
[永続ボリュームクレーム] ページで、[作成] をクリックします。
[PVC の作成] ダイアログボックスで、パラメータを構成し、[作成] をクリックします。
パラメータ
説明
例
[PVC タイプ]
[クラウドディスク] を選択します。
クラウドディスク
[名前]
PVC のカスタム名を入力します。名前は、コンソールに表示される形式要件を満たしている必要があります。
disk-pvc
[割り当てモード]
デフォルトでは、[StorageClass を使用する] が選択されています。
StorageClass を使用する
[既存の StorageClass]
PVC に関連付ける StorageClass を選択します。
alicloud-disk-essd
[容量]
ポッドに割り当てるストレージ容量を指定します。これはディスクの容量でもあります。
20Gi
アクセスモード
ReadWriteOnce を選択する必要があります。これは、ボリュームが読み取り/書き込みモードで 1 つのポッドのみにマウントされることを示します。
ReadWriteOnce
PVC を作成した後、[永続ボリューム要求] ページで PVC を表示できます。PVC に関連付けられた StorageClass で
WaitForFirstConsumerバインディングモードが指定されているため、PVC は Pending 状態になり、PV は PVC にマウントされません。
ステップ 3:アプリケーションを作成し、アプリケーションにディスクをマウントする
クラスタ管理ページの左側のナビゲーションウィンドウで、 を選択します。
[StatefulSet] ページの右上隅にある [イメージから作成] をクリックします。
StatefulSet のパラメータを構成し、[作成] をクリックします。
次の表では、いくつかのパラメータについて説明します。その他のパラメータにはデフォルト値を使用します。詳細については、「StatefulSet を使用してステートフル アプリケーションを作成する」をご参照ください。
ウィザードページ
パラメータ
説明
例
[基本情報]
[名前]
StatefulSet のカスタム名を入力します。名前は、コンソールに表示される形式要件を満たしている必要があります。
disk-test
[レプリカ]
StatefulSet によってプロビジョニングされるポッドレプリカの数。
1
[コンテナ]
[イメージ名]
アプリケーションのデプロイに使用されるイメージのアドレス。
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
[必要なリソース]
アプリケーションに必要な vCore の数とメモリ量を指定します。
0.25 vCore と 0.5 GiB のメモリ
[ボリューム]
[PVC を追加] をクリックして、パラメータを構成します。
[マウントソース]: 作成した PVC を選択します。
[コンテナパス]: ディスクをマウントするコンテナパスを指定します。
マウントソース: disk-pvc
コンテナパス: /data
アプリケーションがデプロイされているかどうかを確認します。
[StatefulSet] ページで、作成したアプリケーションの名前をクリックします。
[ポッド] タブで、ポッドが Running 状態かどうかを確認します。
PV と PVC を確認します。
[永続ボリューム] ページで、システムによって作成された PV を表示できます。PV には、マウントされたディスクの ID にちなんだ名前が付けられます。
[永続ボリューム要求] ページで、PVC が Bound 状態であり、上記の PV が PVC にバインドされていることを確認できます。
ディスクに基づいてデータの永続性が有効になっているかどうかを確認する
前の例で作成した StatefulSet は、1 つのポッドをプロビジョニングし、ディスクがポッドにマウントされます。ポッドを削除すると、システムは自動的にポッドを再作成します。元のディスクは新しいポッドにマウントされ、データは引き続きディスク上に存在します。次の手順を実行して、データがディスクに保持されているかどうかをテストします。
マウントパス内のファイルを表示して、ディスク上のファイルを表示できるかどうかを確認します。
kubectl exec disk-test-0 -- ls /data期待される出力:
lost+foundディスクにファイルを作成します。
kubectl exec disk-test-0 -- touch /data/testポッドを削除します。
kubectl delete pod disk-test-0説明ポッドを削除すると、システムは自動的にポッドを再作成します。
新しいポッドを確認します。
kubectl get pod次の出力は、新しいポッドの名前が削除したポッドと同じ名前であることを示しています。
NAME READY STATUS RESTARTS AGE disk-test-0 1/1 Running 0 27s元のディスクがポッドにマウントされているかどうか、およびファイルがまだディスク上に存在するかどうかを確認します。
kubectl exec disk-test-0 -- ls /data次の出力は、
testファイルがまだディスク上に存在することを示しています。lost+found test