トラフィックの急増に対応するためにビジネスをスケールアップしたり、大規模なジョブを実行したりする際に、Elastic Container Instance (ECI) Pod の作成が失敗することがあります。一般的な原因としては、アベイラビリティゾーンのインスタンス在庫の不足や、vSwitch の IP アドレスの枯渇などが挙げられます。作成成功率を高め、事業継続性を確保するために、複数のアベイラビリティゾーンにまたがって ECI Pod を作成します。
前提条件
ターゲットの VPC 内の異なるアベイラビリティゾーンに、複数の vSwitch を作成済みである必要があります。
-
vSwitch の作成方法の詳細については、「vSwitch の作成と管理」をご参照ください。
-
ECI をサポートするリージョンとアベイラビリティゾーンの詳細については、「リージョンとゾーン」をご参照ください。
背景情報
ECI インスタンスを作成する際に、複数の vSwitch を提供することで、複数のアベイラビリティゾーンを指定できます。システムは、指定されたアベイラビリティゾーンにリクエストをランダムに分散させ、負荷を分散します。あるアベイラビリティゾーンの在庫が不足している場合、システムは自動的に別の指定されたアベイラビリティゾーンでインスタンスの作成を試みます。
複数のアベイラビリティゾーン (vSwitch) を指定する場合、以下の制限が適用されます。
-
指定するすべての vSwitch は、同じ VPC に属している必要があります。
-
最大 10 個の vSwitch を指定できます。
複数のアベイラビリティゾーンと複数のインスタンスタイプを組み合わせることで、インスタンスの作成成功率がさらに向上します。
設定
複数のアベイラビリティゾーンは、クラスターレベルまたは特定の ECI Pod に対して設定できます。
-
クラスター:クラスターに複数の vSwitch を指定します。この設定は、クラスター内のすべての ECI Pod に適用されます。
-
ECI Pod:ECI Pod の作成時に複数の vSwitch を指定します。この設定は、その特定の ECI Pod にのみ適用されます。
新規クラスターの設定
クラスターを作成する前に、使用予定の VPC 内の異なるアベイラビリティゾーンに複数の vSwitch を作成することを推奨します。クラスターを作成する際に、複数の vSwitch を設定して、複数アベイラビリティゾーン機能を有効にできます。次の例では、Container Service for Kubernetes (ACK) コンソールで ACK Serverless クラスターを作成する方法を示します。
[Virtual Private Cloud] セクションで、[既存を使用] を選択し、ターゲットの VPC を指定します。次に、[vSwitch] セクションで、異なるアベイラビリティゾーンから複数の vSwitch を選択します (1〜10 個の vSwitch を選択でき、システムは [推奨] のアベイラビリティゾーンをマークします)。
既存クラスターの設定
設定方法は、VK (ack-virtual-node コンポーネント) のバージョンによって異なります。
-
VK のバージョンが v2.0.0.90-15deb126e-aliyun 以降の場合、eci-profile を変更します。
-
VK のバージョンが v2.0.0.90-15deb126e-aliyun より前の場合、環境変数を変更します。
Eci-profile
複数のアベイラビリティゾーンを使用するには、eci-profile という名前の ConfigMap を編集し、data.vSwitchIds フィールドに vSwitch ID を追加します。
-
eci-profile を編集します。
kubectl edit cm -n kube-system eci-profile -
vSwitchIdsフィールドの値を変更します。vSwitch ID をカンマで区切って追加します。
data: enableClusterIp: "true" enableHybridMode: "false" enablePrivateZone: "false" resourceGroupId: "" securityGroupId: sg-2ze0b9o8pjjzts4h**** selectors: "" vSwitchIds: vsw-2zeet2ksvw7f14ryz****,vsw-2ze94pjtfuj9vaymf**** vpcId: vpc-2zeghwzptn5zii0w7**** -
変更を保存して終了します。
環境変数
新機能を利用するために、VK コンポーネントを最新バージョンにアップグレードすることを推奨します。
VK のデプロイ方法に応じて、Deployment または StatefulSet の ECI_VSWITCH 環境変数を更新して、複数のアベイラビリティゾーンを使用できます。次の例では Deployment を使用します。
-
Deployment を編集します。
kubectl -n kube-system edit deployment/virtual-node-controller -
ECI_VSWITCH環境変数を変更します。ECI_VSWITCH環境変数の値に vSwitch ID を追加します。複数の vSwitch ID はカンマで区切ります。- name: ECI_VSWITCH value: vsw-bp1xpiowfm5vo8o3c****,vsw-bp1rkyjgr1xwoho6k**** -
変更を保存して終了します。
ECI Pod の設定
Pod のメタデータで次のアノテーションを使用して、複数のアベイラビリティゾーンを指定します。
-
k8s.aliyun.com/eci-vswitch:複数の vSwitch を指定して、複数のアベイラビリティゾーンを使用します。
説明ECI Pod が
k8s.aliyun.com/eci-vswitchアノテーションを使用する場合、動的にプロビジョニングされたディスクをマウントする際にWaitForFirstConsumerタイプの StorageClass の使用はサポートされません。 -
k8s.aliyun.com/eci-schedule-strategy:複数のアベイラビリティゾーンに対するスケジューリングポリシーを設定します。有効な値は
VSwitchOrderedとVSwitchRandomです。次の表に、これらのポリシーについて説明します。説明複数のアベイラビリティゾーンにまたがるスケジューリングポリシーを指定しない場合、デフォルトで
VSwitchRandomポリシーが使用されます。スケジューリングポリシー
説明
VSwitchOrdered (順次)
-
ECI Pod がディスクをマウントする場合、ディスクのアベイラビリティゾーンは Pod のアベイラビリティゾーンと一致する必要があります。この要件を満たさないアベイラビリティゾーンは除外されます。
-
システムは、指定されたアベイラビリティゾーンを順番に試行してリソースの作成を試みます。最初のアベイラビリティゾーンの在庫が不足している場合は 2 番目を試行し、リソースが正常に作成されるまで続けます。
VSwitchRandom (在庫最適化)
-
ECI Pod がディスクをマウントする場合、ディスクのアベイラビリティゾーンは Pod のアベイラビリティゾーンと一致する必要があります。この要件を満たさないアベイラビリティゾーンは除外されます。
-
Alibaba Cloud は、最適な在庫スケジューリング戦略に基づいて、適切な vSwitch (およびそれに対応するアベイラビリティゾーン) を選択します。
-
ECI Pod がインスタンスタイプを指定する場合、スケジューラはそのタイプの予約済みインスタンスと一致するアベイラビリティゾーンを優先します。
-
ストレージパフォーマンスが優れたアベイラビリティゾーンが優先されます。以下の古いアベイラビリティゾーンは、スケジューリングの優先度が低くなります。
-
cn-beijing-e, cn-beijing-d
-
cn-shenzhen-a, cn-shenzhen-b, cn-shenzhen-c
-
cn-hangzhou-b, cn-hangzhou-e, cn-hangzhou-f
-
cn-shanghai-a, cn-shanghai-c
-
-
アノテーションは、Pod の設定ファイルのメタデータに追加する必要があります。たとえば、Deployment を作成する場合、アノテーションを spec.template.metadata セクションに追加する必要があります。
Elastic Container Instance 関連のアノテーションは、Pod の作成時にのみ適用されます。既存の Pod にこれらのアノテーションを追加または変更しても効果はありません。
以下は設定例です。
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
labels:
app: test
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx-test
labels:
app: nginx
alibabacloud.com/eci: "true"
annotations:
k8s.aliyun.com/eci-vswitch: "vsw-bp1xpiowfm5vo8o3c****,vsw-bp1rkyjgr1xwoho6k****" # 複数の vSwitch ID を指定します。
k8s.aliyun.com/eci-schedule-strategy: "VSwitchOrdered" # 複数アベイラビリティゾーンのスケジューリングポリシーを設定します。
spec:
containers:
- name: nginx
image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
ports:
- containerPort: 80
次のステップ
ご利用のインスタンスが NAT Gateway を使用してインターネットに接続している場合、複数の vSwitch を指定した後に SNAT エントリを更新する必要があります。
たとえば、既存の SNAT エントリが vSwitch レベルで設定されている場合、新しく追加された vSwitch 用に新しいエントリを追加する必要があります。これにより、新しい vSwitch で起動された ECI インスタンスがインターネットにアクセスできるようになります。