ディスクは、データ共有を必要としないが、高い IOPS と低いレイテンシを必要とするアプリケーションに適しています。永続ストレージ要件を満たすために、既存のディスクを静的にプロビジョニングされたディスクボリュームとしてポッドにマウントできます。このトピックでは、静的にプロビジョニングされたディスクボリュームを使用する方法と、ボリュームを使用してデータを永続化できることを確認する方法について説明します。
シナリオ
ディスクは、以下のシナリオに適しています。
高いディスク I/O スループットを必要とし、データ共有を必要としないアプリケーションを作成する場合。アプリケーションは、MySQL や Redis などのストレージサービスを使用できます。
ログを高速で書き込む場合。
ポッドのライフサイクルとは無関係にデータを永続化する場合。
既存のディスクを静的にプロビジョニングされたディスクボリュームとしてポッドにマウントできます。このモードでは、永続ボリューム (PV) と永続ボリューム要求 (PVC) を手動で作成する必要があります。これにより、コンテナが起動する前に PV が準備されていることが保証されます。詳細については、「ディスクボリューム」をご参照ください。
前提条件
Container Storage Interface (CSI) プラグインがクラスタにインストールされていること。
説明クラスタ管理ページの左側のナビゲーションウィンドウで、csi-plugin と csi-provisioner を更新する」をご参照ください。
を選択します。[ストレージ] タブで、csi-plugin と csi-provisioner がインストールされているかどうかを確認できます。特定の機能を使用するために CSI プラグインを更新する方法の詳細については、「クラスタで FlexVolume を使用している場合は、FlexVolume は使用できなくなったため、クラスタを CSI プラグインに移行する必要があります。詳細については、「FlexVolume から CSI にアップグレードする」をご参照ください。
マウントするディスクが以下の要件を満たしていること。
ディスクの課金方法は従量課金であり、ディスクは [保留中] 状態であること。
ディスクが Elastic Compute Service (ECS) インスタンスと同じゾーンにあり、ディスクタイプが ECS インスタンスタイプと互換性があること。
重要ディスクはゾーンをまたいでマウントすることはできず、特定のディスクタイプは特定の ECS インスタンスにアタッチすることはできません。ECS インスタンスのゾーンと仕様が既存のディスクと一致していることを確認してください。そうでない場合、ディスクのマウントは失敗します。ディスクタイプと ECS インスタンスタイプの間の一致ルールについては、「インスタンスファミリの概要」をご参照ください。
使用上の注意
ディスクは共有できません。ディスクでマルチアタッチが有効になっていない場合、各ディスクは 1 つのポッドにのみマウントできます。マルチアタッチ機能については、「NVMe ディスクのマルチアタッチ機能と NVMe 予約機能を使用する」をご参照ください。
ディスクは、ディスクと同じゾーンにあるポッドにのみマウントできます。
ディスクと同じゾーンにあるポッドにのみディスクをマウントできます。
ディスクは、Deployment ではなく ポッドまたは StatefulSet にマウントすることをお勧めします。
説明マルチアタッチが無効になっている場合、ディスクは 1 つのポッドにのみマウントできます。Deployment にディスクをマウントする場合は、Deployment のポッドレプリカ数を 1 に設定する必要があります。複数のポッドを構成する場合、個別のディスクボリュームを各ポッドにマウントすることはできません。また、ポッドのボリュームのマウントおよびマウント解除の優先順位を指定することもできません。Deployment 内のポッドを再起動すると、Deployment で使用される更新ポリシーが原因で、再起動されたポッドにディスクがマウントできない場合があります。ディスクを Deployment にマウントしないことをお勧めします。
ディスク ボリュームを使用する場合に、アプリケーション構成に
securityContext.fsgroup
パラメーターが含まれていると、kubelet はボリュームがマウントされた後にchmod
コマンドとchown
コマンドを自動的に実行するため、ボリュームのマウント プロセスが遅くなる可能性があります。説明securityContext.fsgroup
パラメーターをアプリケーション構成に追加すると、Container Service for Kubernetes (ACK) は、ディスクがアプリケーションにマウントされたときに、ボリューム内のファイルの所有権を自動的に変更します。所有権の変更に必要な時間は、ボリューム内のファイルの数によって異なります。ボリュームに多数のファイルが存在する場合、変更プロセスには長い時間がかかります。 Kubernetes 1.20 以降を実行するクラスターの場合、ポッド構成のfsGroupChangePolicy
パラメーターをOnRootMismatch
に設定できます。これにより、ACK はポッドが最初に起動されたときにのみファイルの所有権を変更します。作成後にポッドを更新または再作成する場合、ボリュームのマウントプロセスには所有権の変更は含まれません。上記の 設定 がビジネス要件を満たしていない場合は、init コンテナーを作成し、init コンテナーに関連する操作を実行するための権限を付与することをお勧めします。
kubectl を使用して静的にプロビジョニングされたディスクボリュームをマウントする
手順 1: PV を作成する
クラスタに接続します。 詳細については、「クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する」または「Cloud Shell で kubectl を介して Kubernetes クラスタを管理する」をご参照ください。
次の YAML ファイルを変更し、disk-pv.yaml として保存します。
YAML ファイル内の次のパラメーターを置き換えます。
<YOUR-DISK-ID>
: 既存のディスク ID。例:d-uf628m33r5rsbi******
<YOUR-DISK-SIZE>
: 既存のディスクのサイズ。例:20 GiB
。<YOUR-DISK-ZONE-ID>
: 既存のディスクが配置されているゾーン。例:cn-shanghai-f
。<YOUR-DISK-CATEGORY>
: 既存のディスクのタイプ。例:cloud_essd
。次の表は、さまざまなディスクカテゴリの値を示しています。
cloud_essd_entry
: 企業向け SSD (ESSD) エントリーディスク。cloud_auto
: ESSD AutoPL ディスク。cloud_essd
: ESSD。cloud_ssd
: 標準 SSD。cloud_efficiency
: Ultra ディスク。
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
アノテーション。このパラメーターは、ディスクのマウントに必要な追加のノード制限を構成するために使用されます。 ポッドを互換性のある ECS ノードに確実にスケジュールできるように、ディスクのタイプを指定することをお勧めします。
claimRef
PV にバインドする PVC を指定します。 PV を任意の PVC にバインドする場合は、このパラメーターを削除します。
accessModes
PVC のアクセスモード。
ReadWriteOnce
を選択する必要があります。これは、ボリュームが読み取り/書き込みモードで 1 つのポッドのみにマウントされることを指定します。persistentVolumeReclaimPolicy
PV の再利用ポリシー。
Delete
: PVC が削除されると、関連する PV とディスクも削除されます。Retain: PVC が削除されると、関連する PV とディスクは保持され、手動でのみ削除できます。
driver
この例では、このパラメーターは
diskplugin.csi.alibabacloud.com
に設定されています。 この値は、Alibaba Cloud CSI プラグインが使用されることを指定します。nodeAffinity
ノードアフィニティ構成。ディスクはゾーンをまたいでマウントできません。 このパラメーターを使用して、ディスクが配置されているゾーンの対応する ECS ノードにポッドをスケジュールできます。
storageClassName
このパラメーターは、静的にプロビジョニングされたボリュームでは使用できません。 StorageClass を事前に作成する必要はありません。 ただし、ConfigMap の値が PV と PVC で同じであることを確認してください。
PV を作成します。
kubectl create -f disk-pv.yaml
PV を確認します。
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
PVC のアクセスモード。
ReadWriteOnce
を選択する必要があります。これは、ボリュームが読み取り/書き込みモードで 1 つのポッドのみにマウントされることを指定します。storage
ポッドに割り当てられるストレージ容量。値はディスクの容量を超えることはできません。
storageClassName
このパラメーターは、静的にプロビジョニングされたボリュームでは使用できません。 StorageClass を事前に作成する必要はありません。 ただし、ConfigMap の値が PV と PVC で同じであることを確認してください。
volumeName
PVC にバインドする PV を指定します。 PVC を任意の PV にバインドする場合は、このパラメーターを削除します。
PVC を作成します。
kubectl create -f disk-pvc.yaml
PVC を確認します。
kubectl get pvc
次の出力は、PV が PVC にバインドされていることを示しています。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Bound d-uf628m33r5rsbi****** 20Gi RWO disk <unset> 64s
手順 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: 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-pvc
StatefulSet を作成し、StatefulSet にディスクをマウントします。
kubectl create -f disk-test.yaml
StatefulSet によってプロビジョニングされたポッドがデプロイされているかどうかを確認します。
kubectl get pod -l app=nginx
次の出力は、StatefulSet に 1 つのポッドがデプロイされていることを示しています。
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
ACK コンソールで静的にプロビジョニングされたディスクボリュームをマウントする
手順 1: PV を作成する
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のペインで、 を選択します。
[永続ボリューム] ページで、[作成] をクリックします。
[作成] ダイアログボックスで、パラメーターを設定し、[作成] をクリックします。
パラメーター
説明
例
PV タイプ
[クラウドディスク] を選択します。
クラウドディスク
アクセスモード
[readwriteonce] のみがサポートされています。
ReadWriteOnce
ディスク ID
[ディスクの選択] をクリックし、ノードと同じリージョンにあるディスクを選択します。
d-uf628m33r5rsbi******
ファイルシステムタイプ
ディスクのファイルシステムを選択します。有効な値: [ext4]、[ext3]、[xfs]、[vfat]。デフォルト値: [ext4]。
ext4
PV を作成した後、[永続ボリューム] ページで PV を表示できます。
手順 2: PVC を作成する
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[永続ボリュームクレーム] ページの右上隅にある [作成] をクリックします。
[作成] ダイアログボックスで、パラメーターを設定し、[作成] をクリックします。
パラメーター
説明
例
PVC タイプ
[クラウドディスク] を選択します。
クラウドディスク
名前
PVC のカスタム名を入力します。名前は、UI に表示される形式の要件に従う必要があります。
diks-pvc
割り当てモード
[既存のボリューム] を選択します。
既存のボリューム
既存のストレージクラス
手順 1 で作成したボリュームを選択します。
d-uf690053kttkprgx****, 20GiB
容量
ポッドに割り当てられるストレージ容量。値はディスクの容量を超えることはできません。
20Gi
PVC を作成した後、[永続ボリュームクレーム] ページで PVC を表示できます。作成した PV は PVC にバインドされます。
手順 3: アプリケーションを作成し、アプリケーションにディスクをマウントする
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[statefulset] ページの右上隅にある [イメージから作成] をクリックします。
StatefulSet のパラメーターを設定し、[作成] をクリックします。
次の表に、いくつかのパラメーターについて説明します。ビジネス要件に基づいて他のパラメーターを設定します。詳細については、「StatefulSet を使用してステートフル アプリケーションを作成する」をご参照ください。
ウィザードページ
パラメーター
説明
例
[基本情報]
名前
StatefulSet のカスタム名を入力します。名前は、UI に表示される形式の要件に従う必要があります。
disk-test
[レプリカ]
StatefulSet によってプロビジョニングされるポッドレプリカの数。
1
[コンテナー]
イメージ名
アプリケーションのデプロイに使用されるイメージのアドレス。
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
[必要なリソース]
アプリケーションに必要な vCore の数、メモリの量、および一時ストレージの量を指定します。
CPU: 0.25 vCore
メモリ: 512 MiB
一時ストレージ: スキップ
[ボリューム]
[PVC の追加] をクリックし、パラメーターを設定します。
マウントソース: 手順 2 で作成した PVC を選択します。
コンテナーパス: ディスクをマウントするコンテナーパスを指定します。
マウントソース: disk-pvc.
コンテナーパス: /data
アプリケーションがデプロイされているかどうかを確認します。
[statefulset] ページで、作成したアプリケーションの名前をクリックします。
[ポッド] タブで、ポッドが Running 状態になっていることを確認します。
kubectl を使用して、ディスクに基づいてデータの永続性が有効になっているかどうかを確認する
前の例で作成した 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 -l app=nginx
次の出力は、新しいポッドの名前が削除したポッドと同じ名前であることを示しています。
NAME READY STATUS RESTARTS AGE disk-test-0 1/1 Running 0 27s
元のディスクがポッドにマウントされていて、ファイルがディスクに保持されていることを確認します。
kubectl exec disk-test-0 -- ls /data
次の出力は、
test
ファイルがディスクに保持されていることを示しています。lost+found test
参考資料
ディスク ボリュームの使用時にエラーが発生した場合は、「ディスク ボリュームに関する FAQ」をご参照ください。
ディスク サイズがビジネス要件を満たしていない場合、またはディスクがいっぱいの場合にディスクのサイズを変更する方法の詳細については、「ディスク ボリュームの拡張」をご参照ください。
リアルタイムのディスク使用状況の詳細については、「コンテナー ストレージの監視の概要」をご参照ください。