Kubernetes は、どのクラウドディスクをワークロードにプロビジョニングするかを自動的に判断しません。ディスクタイプとゾーンの優先設定を対応付けるストレージクラスを定義し、それを PersistentVolumeClaim (PVC) で参照する必要があります。PVC が作成されると、Disk-Controller はディスクを自動的にプロビジョニングし、PersistentVolume (PV) としてバインドします。
前提条件
開始する前に、以下をご確認ください。
-
kubectl が設定された、稼働中の Container Service for Kubernetes (ACK) クラスター
-
クラスター内でストレージクラスと PersistentVolumeClaim (PVC) リソースを作成する権限
デフォルトのストレージクラス
シングルゾーンクラスターには、デフォルトで以下のストレージクラスが含まれています。マルチゾーンクラスターでは、対象ゾーンを指定するために手動でストレージクラスを作成する必要があります。
| ストレージクラス | ディスクタイプ | 最適な用途 |
|---|---|---|
alicloud-disk-efficiency |
ウルトラディスク | 中程度の I/O 要件を持ち、コストを重視するワークロード |
alicloud-disk-ssd |
標準 SSD | 信頼性の高いパフォーマンスを必要とする汎用ワークロード |
alicloud-disk-essd |
拡張 SSD (ESSD) | 低レイテンシー、高スループットの本番環境ワークロード |
alicloud-disk-available |
高可用性モード | ディスクタイプよりもディスクの可用性を優先するワークロード |
alicloud-disk-topology |
WaitForFirstConsumer モード | Pod のスケジューリングによってディスクゾーンが決定されるマルチゾーンクラスター |
alicloud-disk-available の場合、システムはまず標準 SSD の作成を試み、SSD リソースが枯渇している場合はウルトラディスクにフォールバックします。v1.14.8.44-c23b62c5-aliyun より前のバージョンの Disk-Controller の場合、フォールバックの順序は、拡張 SSD (ESSD) → 標準 SSD → ウルトラディスクです。
ストレージクラスの作成
クラスターの設定に基づいてストレージクラスのタイプを選択します:
-
シングルゾーンクラスターまたは固定ゾーンのディスク: ゾーン ID を指定したストレージクラスの作成
-
マルチゾーンクラスター: WaitForFirstConsumer モードでのストレージクラスの作成
ゾーン ID を指定したストレージクラスの作成
このアプローチは、シングルゾーンクラスター、またはディスク作成を特定のゾーンに固定したい場合に使用します。
-
次の内容で
storage-class.yamlという名前のファイルを作成します:kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: alicloud-disk-ssd-hangzhou-b provisioner: alicloud/disk parameters: type: cloud_ssd regionId: cn-hangzhou zoneId: cn-hangzhou-b reclaimPolicy: Retain # デフォルトは Delete です。意図しないデータ損失を防ぐため、Retain に設定します。各パラメーターを次の表で説明します。
パラメーター 説明 必須 デフォルト provisionerディスクをプロビジョニングするためのボリュームプラグイン。 alicloud/diskに設定します。はい — typeディスクタイプ。有効な値: cloud_efficiency(ウルトラディスク)、cloud_ssd(標準 SSD)、cloud_essd(ESSD)、available(利用可能な最適なタイプを自動選択する高可用性モード)。はい — regionIdディスクが作成されるリージョン。 はい — zoneIdディスクが作成されるゾーン。マルチゾーンクラスターの場合、複数のゾーンをカンマで区切って指定します: cn-hangzhou-a,cn-hangzhou-b,cn-hangzhou-c。はい — reclaimPolicyPVC が削除されたときにディスクを再利用するためのポリシー。 Retainはディスクを保持し、Deleteはディスクを削除します。データ損失を防ぐには、Retainを設定します。いいえ Deleteencryptedディスクを暗号化するかどうか。 いいえ false -
ストレージクラスを適用します:
kubectl apply -f storage-class.yaml -
ストレージクラスが作成されたことを確認します:
kubectl get storageclass alicloud-disk-ssd-hangzhou-b出力には、プロビジョナーとして
alicloud/diskを持つストレージクラスが表示されます。
WaitForFirstConsumer モードでのストレージクラスの作成
マルチゾーンクラスターでは、Pod がスケジューリングされる前に PersistentVolume (PV) がプロビジョニングされることがあり、その結果、ディスクが、最終的に Pod が実行されるゾーンとは異なるゾーンに配置されてしまうことがあります。その場合、Pod は別のゾーンのディスクをアタッチできないため、起動に失敗します。WaitForFirstConsumer モードは、ディスクを消費する Pod がスケジューリングされるまでディスクのプロビジョニングを遅延させることでこの問題を解決し、ディスクが常に Pod と同じゾーンに作成されるようにします。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-disk-topology-ssd
provisioner: alicloud/disk
parameters:
type: cloud_ssd
reclaimPolicy: Retain # デフォルトは Delete です。
volumeBindingMode: WaitForFirstConsumer
ストレージクラスを適用します:
kubectl apply -f storage-class-topology.yamlゾーン選択の仕組み — 次の表に、StorageClass の設定に基づいたディスク配置の動作をまとめます。
| 設定 | ディスクの配置 |
|---|---|
zoneId なし、WaitForFirstConsumer なし |
Disk-Controller コンポーネントがデプロイされているゾーン |
zoneId 設定あり、WaitForFirstConsumer なし |
指定されたゾーン (ラウンドロビンで選択) |
WaitForFirstConsumer 有効 |
ディスクを消費する Pod がスケジューリングされたノードのゾーン |
PersistentVolumeClaim (PVC) と Pod の作成
以下のマニフェストは、alicloud-disk-ssd-hangzhou-b ストレージクラスを使用する PersistentVolumeClaim (PVC) と、そのディスクをマウントする Pod を作成します。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: disk-ssd
spec:
accessModes:
- ReadWriteOnce
storageClassName: alicloud-disk-ssd-hangzhou-b
resources:
requests:
storage: 20Gi
---
kind: Pod
apiVersion: v1
metadata:
name: disk-pod-ssd
spec:
containers:
- name: disk-pod
image: nginx
volumeMounts:
- name: disk-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: disk-pvc
persistentVolumeClaim:
claimName: disk-ssd
マニフェストを適用します:
kubectl apply -f pvc-pod.yaml
PersistentVolumeClaim (PVC) がバインドされ、Pod が実行中であることを確認します:
kubectl get pvc disk-ssd
kubectl get pod disk-pod-ssd
正常にバインドされた PersistentVolumeClaim (PVC) は STATUS: Bound と表示されます。実行中の Pod は STATUS: Running と表示されます。
複数インスタンスの StatefulSet の作成
volumeClaimTemplates を使用して、StatefulSet の各レプリカに対して個別の PersistentVolumeClaim (PVC) と PersistentVolume (PV) を動的に作成します。以下の例では、レプリカごとに 20 GiB のディスクを持つ 2 レプリカの nginx StatefulSet を作成します。
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: disk-ssd
mountPath: /data
volumeClaimTemplates:
- metadata:
name: disk-ssd
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "alicloud-disk-ssd-hangzhou-b"
resources:
requests:
storage: 20Gi
マニフェストを適用します:
kubectl apply -f statefulset.yaml
StatefulSet、Pod、PersistentVolumeClaim (PVC) がすべて作成されたことを確認します:
kubectl get statefulset web
kubectl get pods -l app=nginx
kubectl get pvc -l app=nginx
各 Pod (web-0、web-1) は、それぞれ独立してプロビジョニングされたディスクを持つ独自の PersistentVolumeClaim (PVC) (disk-ssd-web-0、disk-ssd-web-1) を取得します。