アプリケーションで高IOPSと低レイテンシが必要であるが、データ共有は必要ない場合は、ディスクを永続ボリューム(PV)としてアプリケーションにマウントできます。このトピックでは、動的にプロビジョニングされたディスクボリュームをアプリケーションにマウントし、ディスクボリュームを使用してデータを永続化できるかどうかを確認する方法について説明します。
背景情報
ディスクは、分散マルチレプリカメカニズムを使用して低レイテンシ、高パフォーマンス、高耐久性、高信頼性を確保するブロックレベルのストレージデバイスです。ディスクは、高IOPSと低レイテンシが必要であるが、データ共有は必要ないアプリケーションに適しています。詳細については、ストレージの概要を参照してください。
Alibaba Cloud Container Compute Service(ACS)は、動的にプロビジョニングされたディスクボリュームのみをサポートしています。ACSは、静的にプロビジョニングされたディスクボリュームをサポートしていません。
前提条件
managed-csiprovisionerの最新バージョンがAlibaba Cloud Container Compute Service(ACS)クラスターにインストールされていること。
ACSコンソールのACSクラスター管理ページに移動します。クラスター管理ページの左側のナビゲーションペインで、
を選択します。ストレージタブで、managed-csiprovisionerがインストールされているかどうかを確認できます。制限
ディスクは共有できません。ディスクは1つのポッドにのみマウントできます。
ディスクと同じゾーンにあるポッドにのみディスクをマウントできます。
制限事項
ディスクはデプロイメントではなく、ポッドまたはステートフルセットにマウントすることをお勧めします。
説明ディスクは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
(ウルトラディスク) のタイプの 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
次の表にパラメータを示します。
パラメータ
説明
type
ディスクのカテゴリ。有効な値:
cloud_essd_entry
: ESSD エントリーディスク。cloud_auto
: ESSD AutoPL ディスク。cloud_essd
: エンタープライズ SSD (ESSD)。これがデフォルト値です。cloud_ssd
: 標準 SSD。cloud_efficiency
: ウルトラディスク。
このパラメータには、上記の値の任意の組み合わせを設定できます。たとえば、このパラメータを
type: cloud_efficiency, cloud_ssd, cloud_essd
に設定できます。この場合、システムは指定されたカテゴリのディスクを順番に作成しようとします。ディスクが作成されると、システムは試行を停止します。説明課金とパフォーマンスの要件に基づいてディスクカテゴリを選択できます。詳細については、「ブロックストレージデバイスの価格」および「ブロックストレージのパフォーマンス」を参照してください。
fstype
ディスクのファイルシステムタイプ。デフォルト値: ext4。有効な値:
ext3
、ext4
、xfs
。performanceLevel
ESSD のパフォーマンスレベル (PL)。デフォルト値:
PL1
。有効な値:PL0
、PL1
、PL2
、PL3
。詳細については、「ESSD」を参照してください。provisioner
ドライバのタイプ。この例では、パラメータは
diskplugin.csi.alibabacloud.com
に設定されています。これは、Alibaba Cloud が提供する Container Storage Interface (CSI) プラグインが使用されていることを示します。reclaimPolicy
ディスクの再利用ポリシー。値は
Delete
に設定する必要があります。これは、永続ボリュームクレーム (PVC) が削除されると PV とディスクが自動的に削除されることを示します。volumeBindingMode
ディスクのバインディングモード。値は
WaitForFirstConsumer
に設定する必要があります。これは、PVC を使用するポッドが作成されるまで、PV のバインディングとプロビジョニングが遅延されることを示します。ポッドがノードにスケジュールされると、ノードがデプロイされているゾーンにディスクが作成され、PV としてプロビジョニングされます。allowVolumeExpansion
ディスクのサイズを自動的に変更するかどうかを指定します。
StorageClass を作成します。
kubectl create -f disk-sc.yaml
StorageClass を確認します。
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
ポッドに割り当てるストレージ容量を指定します。これはディスクの容量でもあります。
storageClassName
PVC に関連付ける StorageClass の名前。
PVC を作成します。
kubectl create -f disk-pvc.yaml
PVC を確認します。
kubectl get pvc
volumeBindingMode
パラメータが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-pvc
PVC を使用してストレージリソースを申請し、これはポッドの/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-pvc
StatefulSet を作成し、ディスクを 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 52s
PVC を確認します。
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
(ウルトラディスク) のタイプの PV を優先順位の高い順にプロビジョニングするために使用できます。デフォルトの StorageClass がビジネス要件を満たしていない場合は、次の手順を実行してカスタム StorageClass を作成します。
ACS コンソール にログインします。
クラスタ で、クラスタの ID をクリックしてクラスタ管理ページに移動します。
クラスタ管理ページの左側のナビゲーションペインで、
を選択します。StorageClass を作成します。
Storageclass ページで、作成 をクリックします。
作成ダイアログボックスで、パラメータを構成し、作成 をクリックします。
パラメータ
説明
例
名前
StorageClass のカスタム名を入力します。名前は、コンソールに表示される形式要件を満たしている必要があります。
alicloud-disk-essd
PV タイプ
クラウドディスク を選択します。
クラウドディスク
パラメータ
デフォルトでは、
type
パラメータが追加されます。このパラメータはディスクカテゴリを指定します。有効な値:cloud_essd_entry
: ESSD エントリーディスク。cloud_auto
: ESSD AutoPL ディスク。cloud_essd
: エンタープライズ SSD (ESSD)。これがデフォルト値です。cloud_ssd
: 標準 SSD。cloud_efficiency
: ウルトラディスク。
このパラメータには、上記の値の任意の組み合わせを設定できます。たとえば、このパラメータを
type: cloud_efficiency, cloud_ssd, cloud_essd
に設定できます。この場合、システムは指定されたカテゴリのディスクを順番に作成しようとします。ディスクが作成されると、システムは試行を停止します。説明課金とパフォーマンスの要件に基づいてディスクカテゴリを選択できます。詳細については、「ブロックストレージデバイスの価格」および「ブロックストレージのパフォーマンス」を参照してください。
次のパラメータを追加できます。
fstype
ディスクのファイルシステムタイプ。デフォルト値: ext4。有効な値:
ext3
、ext4
、xfs
。performanceLevel
ESSD のパフォーマンスレベル (PL)。デフォルト値:
PL1
。有効な値:PL0
、PL1
、PL2
、PL3
。詳細については、「ESSD」を参照してください。
type:cloud_essd
再利用ポリシー
ディスクの再利用ポリシー。値は
Delete
に設定する必要があります。これは、永続ボリュームクレーム (PVC) が削除されると PV とディスクが自動的に削除されることを示します。削除
バインディングモード
ディスクのバインディングモード。値は
WaitForFirstConsumer
に設定する必要があります。これは、PVC を使用するポッドが作成されるまで、PV のバインディングとプロビジョニングが遅延されることを示します。ポッドがノードにスケジュールされると、ノードがデプロイされているゾーンにディスクが作成され、PV としてプロビジョニングされます。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 は保留中状態になり、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 ページで、作成したアプリケーションの名前をクリックします。
ポッド タブで、ポッドが実行中状態かどうかを確認します。
PV と PVC を確認します。
永続ボリューム ページで、システムによって作成された PV を表示できます。PV には、マウントされたディスクの ID にちなんだ名前が付けられます。
永続ボリュームクレーム ページで、PVC がバインド状態であり、上記の 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