ディスクボリュームは、高い I/O と低レイテンシーの要件を持つが、データ共有を必要としないアプリケーションに適しています。既存のディスクを静的にプロビジョニングされたボリュームとして Pod にマウントし、永続ストレージとして使用できます。このトピックでは、静的にプロビジョニングされたディスクボリュームの使用方法と、ストレージが永続的であることを確認する方法について説明します。
シナリオ
ディスクは、次のシナリオに適しています。
高いディスク I/O スループットを必要とし、データ共有を必要としないアプリケーションを作成したい場合。アプリケーションは MySQL や Redis などのストレージサービスを使用できます。
高速でログを書き込みたい場合。
Pod のライフサイクルとは独立した方法でデータを永続化したい場合。
既存のディスクがある場合、静的にプロビジョニングされたボリュームとして Pod にマウントできます。この方法では、手動で永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成する必要があります。これにより、コンテナーが開始する前に PV が準備できていることが保証されます。詳細については、「ブロックストレージボリューム」をご参照ください。
前提条件
Container Storage Interface (CSI) プラグインがクラスターにインストールされている。
説明クラスター管理ページの左側のナビゲーションウィンドウで、 を選択します。[ストレージ] タブで、csi-plugin および csi-provisioner コンポーネントのインストール状況を確認します。CSI プラグインをアップグレードして特定の機能を使用する方法については、「CSI プラグインのアップグレード」をご参照ください。
クラスターが FlexVolume コンポーネントを使用している場合、FlexVolume は非推奨であるため、CSI プラグインに移行する必要があります。詳細については、「FlexVolume から CSI への移行」をご参照ください。
マウントするディスクが次の要件を満たしている。
ディスクの課金方法が従量課金であり、ディスクが [利用可能] 状態である。
ディスクが ECS ノードと同じゾーンにあり、ディスクタイプが ECS インスタンスタイプと互換性がある。
重要ディスクはゾーンをまたいでマウントすることはできません。一部のディスクタイプは、特定の ECS インスタンスタイプにアタッチできません。Pod がスケジュールされる ECS ノードのゾーンとインスタンスタイプが、既存のディスクと互換性があることを確認してください。そうしないと、ディスクのマウントに失敗します。ディスクタイプと ECS インスタンスタイプの互換性の詳細については、「インスタンスファミリー」をご参照ください。
使用上の注意
ディスクは非共有ストレージです。ディスクでマルチアタッチが有効になっていない場合、一度に 1 つの Pod にしかマウントできません。マルチアタッチの詳細については、「NVMe ディスクのマルチアタッチ機能と予約機能の使用」をご参照ください。
ディスクは、ディスクと同じゾーンにある Pod にのみマウントできます。ゾーンをまたいだマウントはサポートされていません。
Pod が再構築されると、元のディスクが再マウントされます。他の制約により Pod を元のゾーンにスケジュールできない場合、ディスクをマウントできないため、Pod は Pending 状態のままになります。
ディスクは、Deployment ではなく、StatefulSet または個別の Pod にマウントすることをお勧めします。
説明マルチアタッチが無効になっている場合、ディスクは 1 つの Pod にしかマウントできません。ディスクを Deployment にマウントする場合は、レプリカ数を 1 に設定する必要があります。Pod ごとに個別のボリュームを設定したり、マウントとアンマウントの優先順位を保証したりすることはできません。さらに、Deployment のアップグレードポリシーにより、新しい Pod が再起動時にディスクのマウントに失敗する可能性があります。したがって、ディスクを Deployment にマウントすることはお勧めしません。
ディスクボリュームを使用する際に、アプリケーションの YAML ファイルで
securityContext.fsgroupを設定すると、マウント完了後に kubelet がchmodおよびchownコマンドを実行します。これにより、マウント時間が増加します。説明securityContext.fsgroupを設定すると、ディスクのマウント時にボリューム内のファイルの所有者が自動的に変更されます。これにより、ファイルの数によっては準備時間が増加する場合があります。バージョン 1.20 以降の Kubernetes クラスターでは、fsGroupChangePolicyをOnRootMismatchに設定できます。これにより、コンテナーが初めて起動するときにのみファイル所有者が変更されるようになります。その後の Pod のアップグレードや再構築では、マウント時間は影響を受けません。これがニーズに合わない場合は、initContainer を使用して権限を調整することをお勧めします。
kubectl を使用して静的にプロビジョニングされたディスクボリュームをマウントする
ステップ 1: PV の作成
クラスターに接続します。詳細については、「kubectl を使用してクラスターに接続する」または「CloudShell または Workbench で kubectl を使用してクラスターに接続する」をご参照ください。
次のテンプレートに基づいて、disk-pv.yaml という名前のファイルを作成します。
YAML ファイル内の次のプレースホルダーを置き換えます。
<YOUR-DISK-ID>: 既存のディスクの ID。例:d-uf628m33r5rsbi******。<YOUR-DISK-SIZE>: 既存のディスクのサイズ。例:20Gi。<YOUR-DISK-ZONE-ID>: 既存のディスクが配置されているゾーン。例:cn-shanghai-f。<YOUR-DISK-CATEGORY>: 既存のディスクのタイプ。例:cloud_essd。次のリストは、さまざまなディスクタイプの値を示しています。
ESSD Entry ディスク:
cloud_essd_entryESSD AutoPL ディスク:
cloud_autoESSD:
cloud_essd標準 SSD:
cloud_ssdUltra ディスク:
cloud_efficiencyゾーン冗長ディスク:
cloud_regional_disk_auto(設定も調整する必要があります。詳細については、「nodeAffinity パラメーターの説明」をご参照ください。)
apiVersion: v1 kind: PersistentVolume metadata: name: "<YOUR-DISK-ID>" annotations: csi.alibabacloud.com/volume-topology: '{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node.csi.alibabacloud.com/disktype.<YOUR-DISK-CATEGORY>","operator":"In","values":["available"]}]}]}' spec: capacity: storage: "<YOUR-DISK-SIZE>" claimRef: apiVersion: v1 kind: PersistentVolumeClaim namespace: default name: disk-pvc accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain csi: driver: diskplugin.csi.alibabacloud.com volumeHandle: "<YOUR-DISK-ID>" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.diskplugin.csi.alibabacloud.com/zone operator: In values: - "<YOUR-DISK-ZONE-ID>" storageClassName: alicloud-disk-topology-alltype volumeMode: Filesystem次の表に、パラメーターを示します。
パラメーター
説明
csi.alibabacloud.com/volume-topologyアノテーション。ディスクを正常にマウントするために必要な追加のノード制約を設定するために使用されます。Pod がこのディスクタイプをサポートする ECS ノードにスケジュールされるように、ディスクタイプを指定することをお勧めします。
claimRefPV にバインドできる PVC を指定します。PV を任意の PVC にバインドできるようにするには、この設定を削除します。
accessModesアクセスモード。
ReadWriteOnceのみがサポートされています。これは、ボリュームが単一の Pod によって読み取り/書き込みとしてマウントできることを意味します。persistentVolumeReclaimPolicyPV の再利用ポリシー。
Delete: PVC が削除されると、PV とディスクも削除されます。Retain: PVC が削除されても、PV とディスクは削除されません。手動で削除する必要があります。
driver値は
diskplugin.csi.alibabacloud.comで、Alibaba Cloud ディスク CSI プラグインが使用されることを示します。nodeAffinityノードアフィニティ設定。ディスクはゾーンをまたいでマウントすることはできません。この設定により、Pod がディスクと同じゾーンの ECS ノードにスケジュールされることが保証されます。
ゾーン冗長ディスクの場合は、ディスクがリージョン内の任意のゾーンにマウントできるように、次の内容に変更します。
コード内の
<YOUR-DISK-REGION-ID>はディスクが配置されているリージョンです。たとえば、cn-shanghaiです。nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/region operator: In values: - "<YOUR-DISK-REGION-ID>"storageClassNameこの設定は、静的にプロビジョニングされたボリュームには意味がありません。対応する StorageClass を事前に作成する必要はありません。ただし、この設定項目の値が PV と PVC で同じであることを確認する必要があります。
PV を作成します。
kubectl create -f disk-pv.yamlPV が作成されたことを確認します。
kubectl get pv期待される出力:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE d-uf628m33r5rsbi****** 20Gi RWO Retain Available default/disk-pvc disk <unset> 1m36s
ステップ 2: PVC の作成
次のテンプレートに基づいて、disk-pvc.yaml という名前のファイルを作成します。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: "<YOUR-DISK-SIZE>" storageClassName: alicloud-disk-topology-alltype volumeName: "<YOUR-DISK-ID>"次の表に、パラメーターを示します。
パラメーター
説明
accessModesアクセスモード。
ReadWriteOnceのみがサポートされています。これは、ボリュームが単一の Pod によって読み取り/書き込みとしてマウントできることを意味します。storagePod に割り当てるストレージ容量。値はディスクの容量を超えることはできません。
storageClassNameこの設定は、静的にプロビジョニングされたボリュームには意味がありません。対応する StorageClass を事前に作成する必要はありません。ただし、この設定項目の値が PV と PVC で同じであることを確認する必要があります。
volumeNamePVC にバインドできる PV を指定します。PVC を任意の PV にバインドできるようにするには、このパラメーターを削除します。
PVC を作成します。
kubectl create -f disk-pvc.yamlPVC が作成されたことを確認します。
kubectl get pvc期待される出力は、PVC が PV に関連付けられていることを示しています。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Bound d-uf628m33r5rsbi****** 20Gi RWO disk <unset> 64s
ステップ 3: アプリケーションを作成してディスクをマウントする
次のテンプレートに基づいて、disk-test.yaml という名前のファイルを作成します。
次の YAML の例では、1 つの Pod を持つ StatefulSet を作成します。Pod は
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: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: pvc-disk mountPath: /data volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvcStatefulSet を作成し、ディスクをマウントします。
kubectl create -f disk-test.yamlStatefulSet 内の Pod のステータスを確認します。
kubectl get pod -l app=nginxStatefulSet のレプリカ数が 1 であるため、期待される出力では 1 つの Pod が作成されたことが示されます。
NAME READY STATUS RESTARTS AGE disk-test-0 1/1 Running 0 14sマウントパスを確認して、ディスクがマウントされていることを確認します。
kubectl exec disk-test-0 -- df -h /data期待される出力:
Filesystem Size Used Avail Use% Mounted on /dev/vdb 20G 24K 20G 1% /data
コンソールで静的にプロビジョニングされたディスクボリュームをマウントする
ステップ 1: 永続ボリューム (PV) の作成
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[永続ボリューム] ページで、[作成] をクリックします。
表示されるダイアログボックスで、パラメーターを設定し、[作成] をクリックします。
パラメーター
説明
例
PV タイプ
[ディスク] を選択します。
ディスク
アクセスモード
[ReadWriteOnce] のみがサポートされています。
ReadWriteOnce
ディスク ID
[ディスクの選択] をクリックし、マウントするディスクを選択します。ディスクはノードと同じリージョンおよびゾーンにある必要があります。
d-uf628m33r5rsbi******
ファイルシステムタイプ
ディスクにデータを保存するために使用するファイルシステムタイプを選択します。サポートされているタイプには、[ext4]、[ext3]、[xfs]、[vfat] があります。デフォルト値は [ext4] です。
ext4
PV が作成された後、[永続ボリューム] ページで表示できます。
ステップ 2: 永続ボリューム要求 (PVC) の作成
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[永続ボリューム要求] ページで、[作成] をクリックします。
表示されるダイアログボックスで、パラメーターを設定し、[作成] をクリックします。
パラメーター
説明
例
ストレージ要求タイプ
[ディスク] を選択します。
ディスク
名前
PVC のカスタム名を入力します。フォーマット要件については、インターフェイスのプロンプトをご参照ください。
diks-pvc
割り当てモード
[既存ボリューム] を選択します。
既存ボリューム
既存ボリューム
ステップ 1 で作成した PV を選択します。
d-uf690053kttkprgx****, 20Gi
合計容量
Pod に割り当てるストレージ容量。値はディスクの容量を超えることはできません。
20Gi
PVC が作成された後、[永続ボリューム要求] ページで表示できます。PVC は PV (ディスクボリューム) にバインドされます。
ステップ 3: アプリケーションを作成してディスクをマウントする
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[StatefulSet] ページの右上隅にある [イメージから作成] をクリックします。
StatefulSet のパラメーターを設定し、[作成] をクリックします。
次の表に、主要なパラメーターを示します。必要に応じて他のパラメーターを設定します。詳細については、「StatefulSet の作成」をご参照ください。
設定ページ
パラメーター
説明
例
基本情報
アプリケーション名
StatefulSet のカスタム名を入力します。フォーマット要件については、インターフェイスのプロンプトをご参照ください。
disk-test
レプリカ数
StatefulSet のレプリカ数を設定します。
1
コンテナー設定
イメージ名
アプリケーションのデプロイに使用するイメージのアドレスを入力します。
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
必須リソース
必要な vCPU、メモリ、およびエフェメラルストレージリソースを設定します。
CPU: 0.25 コア
メモリ: 512 MiB
エフェメラルストレージ: 設定しない
ボリューム
[既存の要求を追加] をクリックします。次に、パラメーターを設定します。
マウントソース: ステップ 2 で作成した PVC を選択します。
コンテナーパス: ディスクをマウントするコンテナーパスを入力します。
マウントソース: disk-pvc
コンテナーパス: /data
アプリケーションのステータスを確認します。
[StatefulSet] ページで、アプリケーション名をクリックします。
[Pod] タブで、Pod が実行中状態であることを確認します。
kubectl を使用してディスク上のデータの永続性を確認する
前の例で作成した StatefulSet には、マウントされたディスクを持つ 1 つの Pod が含まれています。この Pod が削除されると、新しい Pod が自動的に作成され、元のディスクが新しい Pod に再マウントされます。ディスク上のデータは保持されます。次のようにして、ディスクのデータの永続性を確認できます。
ディスクのマウントパス内のデータを確認します。
kubectl exec disk-test-0 -- ls /data期待される出力:
lost+foundディスクにファイルを書き込みます。
kubectl exec disk-test-0 -- touch /data/testPod を削除します。
kubectl delete pod disk-test-0説明StatefulSet 内の Pod を削除すると、システムは自動的に新しい Pod を作成します。
新しい Pod のステータスを確認します。
kubectl get pod -l app=nginx期待される出力は、新しい Pod が削除された Pod と同じ名前であることを示しています。これは StatefulSet の特徴です。
NAME READY STATUS RESTARTS AGE disk-test-0 1/1 Running 0 27s新しい Pod がディスクを再マウントし、データが無傷であることを確認します。
kubectl exec disk-test-0 -- ls /data期待される出力は、
testファイルがディスクに残っていることを示しています。lost+found test
関連資料
ディスクボリュームの使用中に問題が発生した場合は、「ディスクボリュームに関する FAQ」でトラブルシューティング情報をご参照ください。
ディスクサイズが要件を満たさなくなった場合、またはディスクがいっぱいになった場合は、「ディスク永続ボリュームの拡張」をご参照ください。
ディスク使用率をリアルタイムで監視するには、「コンテナーストレージモニタリングの概要」をご参照ください。