Kubernetes は、ワークロードにどのクラウドディスクをプロビジョニングするかを自動的に認識しません。ディスクタイプとゾーンのプリファレンスをマッピングする StorageClass を定義し、それを永続ボリューム要求 (PVC) で参照する必要があります。PVC が作成されると、Disk-Controller はディスクを自動的にプロビジョニングし、永続ボリューム (PV) としてバインドします。
前提条件
作業を開始する前に、以下をご確認ください。
-
kubectl が設定された実行中の Container Service for Kubernetes (ACK) クラスター
-
クラスター内に StorageClass および PVC リソースを作成する権限
デフォルトの StorageClass
シングルゾーンクラスターには、以下の StorageClass がデフォルトで含まれています。マルチゾーンクラスターでは、ターゲットゾーンを指定するために手動で StorageClass を作成する必要があります。
| StorageClass | ディスクタイプ | 最適な用途 |
|---|---|---|
alicloud-disk-efficiency |
Ultra ディスク | 中程度の I/O 要件を持つコスト重視のワークロード |
alicloud-disk-ssd |
標準 SSD | 信頼性の高いパフォーマンスを必要とする汎用ワークロード |
alicloud-disk-essd |
Enhanced SSD (ESSD) | 低レイテンシー、高スループットの本番ワークロード |
alicloud-disk-available |
高可用性モード | ディスクタイプよりもディスクの可用性が優先されるワークロード |
alicloud-disk-topology |
WaitForFirstConsumer モード | Pod のスケジューリングによってディスクゾーンが決定されるマルチゾーンクラスター |
alicloud-disk-available の場合、システムはまず標準 SSD の作成を試み、SSD リソースが枯渇した場合は Ultra ディスクにフォールバックします。v1.14.8.44-c23b62c5-aliyun より前のバージョンの Disk-Controller の場合、フォールバック順序は Enhanced SSD (ESSD) → 標準 SSD → Ultra ディスクです。
StorageClass の作成
クラスター構成に基づいて StorageClass タイプを選択します。
-
シングルゾーンクラスターまたは固定ゾーンディスク: ゾーン ID を持つ StorageClass の作成
-
マルチゾーンクラスター: WaitForFirstConsumer モードでの StorageClass の作成
ゾーン ID を持つ StorageClass の作成
このアプローチは、シングルゾーンクラスター、またはディスク作成を特定のゾーンに固定したい場合に使用します。
-
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(Ultra ディスク)、cloud_ssd(標準 SSD)、cloud_essd(ESSD)、available(利用可能な最適なタイプを自動的に選択する高可用性モード)。はい — regionIdディスクが作成されるリージョンです。 はい — zoneIdディスクが作成されるゾーンです。マルチゾーンクラスターの場合、 cn-hangzhou-a,cn-hangzhou-b,cn-hangzhou-cのように、複数のゾーンをカンマで区切って指定します。はい — reclaimPolicyPVC が削除されたときにディスクを再利用するためのポリシーです。 Retainはディスクを保持し、Deleteは削除します。データ損失を防ぐためにRetainに設定します。いいえ Deleteencryptedディスクを暗号化するかどうか。 いいえ false -
StorageClass を適用します。
kubectl apply -f storage-class.yaml -
StorageClass が作成されたことを確認します。
kubectl get storageclass alicloud-disk-ssd-hangzhou-b出力には、プロビジョナーとして
alicloud/diskを持つ StorageClass が表示されるはずです。
WaitForFirstConsumer モードでの StorageClass の作成
マルチゾーンクラスターでは、Pod がスケジューリングされる前に 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
StorageClass を適用します。
kubectl apply -f storage-class-topology.yaml
ゾーン選択の仕組み — 次の表は、StorageClass 構成に基づいたディスク配置の動作をまとめたものです。
| 構成 | ディスク配置 |
|---|---|
zoneId なし、WaitForFirstConsumer |
Disk-Controller コンポーネントがデプロイされているゾーン |
zoneId が設定されている、WaitForFirstConsumer |
指定されたゾーン (ラウンドロビンで選択) |
WaitForFirstConsumer が有効 |
消費する Pod がスケジューリングされるノードのゾーン |
PVC と Pod の作成
以下のマニフェストは、alicloud-disk-ssd-hangzhou-b StorageClass に裏付けられた 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
PVC がバインドされ、Pod が実行中であることを確認します。
kubectl get pvc disk-ssd
kubectl get pod disk-pod-ssd
正常にバインドされた PVC は STATUS: Bound と表示されます。実行中の Pod は STATUS: Running と表示されます。
マルチインスタンス StatefulSet の作成
volumeClaimTemplates を使用して、各 StatefulSet レプリカに対して個別の PVC と 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、および PVC がすべて作成されたことを確認します。
kubectl get statefulset web
kubectl get pods -l app=nginx
kubectl get pvc -l app=nginx
各 Pod (web-0、web-1) は、それぞれ独立してプロビジョニングされたディスクに裏付けられた独自の PVC (disk-ssd-web-0、disk-ssd-web-1) を取得します。