Container Service for Kubernetes (ACK) クラスタにディスクボリュームがマウントされた StatefulSet をデプロイすると、クラスタに指定されたゾーン構成またはディスクカテゴリに関連する問題が原因で、StatefulSet の作成に失敗することがあります。このトピックでは、ゾーンをまたいでデプロイされるアプリケーションの推奨構成について説明します。推奨構成を使用すると、基盤となる構成が原因で発生する問題を防ぎ、アプリケーションリリースの中断のリスクを最小限に抑えることができます。
背景情報
Kubernetes は強力なコンテナオーケストレーション機能を提供し、ユーザーが Kubernetes 上の StatefulSet を使用して大規模なステートフル アプリケーションを容易に開発できるようにします。 Kubernetes はアプリケーションの配布とデプロイを大幅に簡素化します。ただし、これにより基盤となるハードウェアロジックがユーザーから隠され、次の問題が発生する可能性があります。
クロスゾーンクラスタ内のアプリケーションが、目的のゾーンであるゾーン A ではなく、誤ってゾーン B にデプロイされます。
ディスクのマウントに使用される動的にプロビジョニングされた PV の作成に失敗し、InvalidDataDiskCatagory.NotSupported などのエラーが表示されます。
ディスクをアプリケーションにマウントすると、次のエラーメッセージが表示されます。
指定されたインスタンスの instanceType は、このディスクカテゴリをサポートしていません。アプリケーションをデバッグすると、次のエラーメッセージが表示されます。
0/x ノードが使用可能です。x ノードにボリュームノードアフィニティの競合がありました。
上記のこれらの問題は、アプリケーションのリリースを中断させる可能性があります。これらの問題のリスクを軽減するために、このトピックで提供されている推奨構成を使用できます。
推奨構成
要件
NAS ファイルシステムではなくディスクを使用してデータを永続化します。 NAS ファイルシステムと比較して、ディスクはより安定しており、データ転送のためのより高い帯域幅を提供します。
十分なノードとストレージリソースを確保するために、3 つのゾーンにクラスタをデプロイします。
クラスタ内のすべてのノードが使用できなくなった場合にノードを追加できるように、ノードの自動スケーリングを有効にします。
マウントの失敗を回避するために、使用する StorageClass に複数のディスクカテゴリを指定することをお勧めします。
アプリケーションのポッドを異なるゾーンのノードに均等に分散できるようにします。
推奨されるノードプール構成
各ノードプールを単一のゾーンにのみデプロイします。
新しいゾーンのノードをクラスタに追加する場合は、新しいゾーンに新しいノードプールを作成することをお勧めします。詳細については、「ノードプールの作成と管理」をご参照ください。
クラスタにノードプールを作成する場合は、各ノードプールが別々のゾーンにデプロイされていることを確認してください。ノードプールのゾーンを識別しやすくするために、ノードプール名にゾーン ID を指定することをお勧めします。
ノードプールの自動スケーリングを有効にします。詳細については、「ノードの自動スケーリングを有効にする」をご参照ください。
ノードプールの自動スケーリングを有効にすると、ノードプール内のすべてのノードがポッドのスケジューリングに使用できなくなった場合、システムは自動的にノードプールにノードを追加します。次の図は、ノードの自動スケーリングの例を示しています。

同じタイプの Elastic Compute Service (ECS) インスタンスを使用して異なるゾーンにノードプールをデプロイするか、同じタイプのブロックストレージをサポートする ECS インスタンスを使用して異なるゾーンにノードプールをデプロイします。
クラウドディスクをアタッチできる ECS インスタンスタイプは、ディスクのカテゴリによって異なります。そのため、ディスクと ECS インスタンスが同じゾーンにある場合でも、ポッドにマウントされたディスクのカテゴリがポッドをホストする ECS インスタンスでサポートされていないために、ポッドの起動に失敗することがあります。
無関係なアプリケーションがノードにスケジュールされないように、ノードプール内のすべてのノードに taint を追加します。

推奨されるクラスタ構成
クラスタの Kubernetes バージョンが 1.20 以降であることを確認します。
クラスタにインストールされている Container Storage Interface (CSI) プラグインのバージョンが 1.22 以降であることを確認します。詳細については、「CSI プラグインの管理」をご参照ください。
使用する StorageClass に複数のディスクカテゴリを指定します。
YAML テンプレートの例:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-disk-topology-alltype parameters: type: cloud_essd,cloud_ssd,cloud_efficiency provisioner: diskplugin.csi.alibabacloud.com reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true allowedTopologies: - matchLabelExpressions: - key: topology.diskplugin.csi.alibabacloud.com/zone values: - cn-beijing-a - cn-beijing-bパラメータの説明:
type: cloud_essd,cloud_ssd,cloud_efficiency: システムは、企業向け SSD (ESSD)、標準 SSD、Ultra ディスクの順序でカテゴリのディスクを作成しようとします。システムは最初に ESSD の作成を試みます。 ESSD の在庫がない場合、システムは標準 SSD の作成を試みます。標準 SSD の在庫がない場合、システムは Ultra ディスクの作成を試みます。これにより、在庫不足によるディスク作成エラーのリスクが軽減され、ポッドの起動エラーを防ぐのに役立ちます。volumeBindingMode: WaitForFirstConsumer: StorageClass を使用するポッドがノードにスケジュールされると、システムは StorageClass に基づいて、ノードがデプロイされているゾーンにディスクを作成しようとします。これにより、ゾーンの不整合によるディスクマウントエラーのリスクが軽減され、ポッドの起動エラーを防ぐのに役立ちます。allowedTopologies: このパラメータを使用して、特定のリージョンおよびゾーンの StorageClass を使用してプロビジョニングされたボリュームのトポロジードメインを制限できます。volumeBindingModeをWaitForFirstConsumerに設定すると、スケジューラは StorageClass を使用するポッドを指定されたトポロジードメインにスケジュールして、ディスク作成の要件を満たします。
推奨されるアプリケーション構成
次のサンプルコードは、標準の StatefulSet テンプレートの例を示しています。ビジネス要件に基づいてテンプレートをカスタマイズできます。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql"
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
topologySpreadConstraints:
- labelSelector:
matchLabels:
app: mysql
maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "mysql"
volumeMounts:
- name: disk-csi
mountPath: /var/lib/mysql
tolerations:
- key: "app"
operator: "Exists"
effect: "NoSchedule"
volumeClaimTemplates:
- metadata:
name: disk-csi
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: alicloud-disk-topology-alltype
resources:
requests:
storage: 40Giパラメータの説明:
topologySpreadConstraints: システムは、アプリケーションによってプロビジョニングされたポッドを異なるゾーンに分散しようとします。詳細については、「トポロジースプレッド制約」をご参照ください。volumeClaimTemplates: システムは、複製されたポッドごとに自動的にディスクを作成します。これは、アプリケーションを迅速にスケールアウトするのに役立ちます。
永続ボリューム (PV) が動的にプロビジョニングされると、PV の YAML ファイルには、PV がマウントされるノードのゾーンに関する情報が含まれます。 PV と PV にバインドされた永続ボリューム要求 (PVC) は、ポッドをホストするノードのゾーンにあるポッドにのみ関連付けることができます。これにより、ディスクをポッドに正常にマウントできます。
参考資料
ディスクボリュームのデータセキュリティを強化する方法の詳細については、「ディスクボリュームのデータセキュリティのベストプラクティス」をご参照ください。
リアルタイムのディスク使用量を表示する方法の詳細については、「コンテナストレージ監視の概要」をご参照ください。
ディスクサイズがビジネス要件を満たしていない場合、またはディスクがいっぱいの場合にディスクサイズを変更する方法の詳細については、「ディスクボリュームの拡張」をご参照ください。
ディスクのマウントに関する問題の詳細については、「ディスクボリュームに関するよくある質問」をご参照ください。