ACK クラスター内の Pod は、デフォルトでプライベート IP アドレスを使用します。マルチテナントデータ分離やセキュリティ分離などのシナリオでは、Pod に独立したパブリック IP アドレスが必要になる場合があります。アノテーションを使用して、Pod に Elastic IP Address (EIP) をアタッチできます。
背景情報
デフォルトでは、Pod はインターネット NAT ゲートウェイを介してインターネットにアクセスします (クラスターのインターネットアクセスを有効にするをご参照ください) 。インバウンドトラフィックは通常、LoadBalancer Service を介して流入します。ただし、一部のシナリオでは、Pod に独自のパブリック IP アドレスが必要になります。
-
動的ポート割り当て:UDP ゲームサーバーや RTSP プロトコルは、クライアントごとにランダムなポートを割り当てます。独立した IP アドレスにより、ポートの競合を防ぐことができます。
-
SNAT のバイパス:外部サービスが許可リストに固定 IP を要求する場合、共有 SNAT 送信元 IP がブロックされる可能性があります。
-
直接 IP 識別:リアルタイム通信プロトコルなど、外部システムとのエンドツーエンド接続には、独立した IP アドレスが必要です。
制限事項
-
事前に、EIP の制限事項をご確認ください。
-
EIP の自動割り当てを使用する場合、Pod が再作成されたり、Container Network Interface (CNI) の実行が失敗したりすると、EIP の要求と解放が繰り返され、EIP の制限に抵触する場合があります。これを回避するには、Pod アノテーション
network.alibabacloud.com/allocated-eip-idを設定して EIP を指定してください。
操作手順
ポッドに EIP を割り当てるには、[コンポーネント管理] ページから ack-extend-network-controller コンポーネントをインストールします。
ステップ 1:コンポーネントのインストールまたはアップグレード
コンポーネントが Helm または ACK Marketplace を介してすでにインストールされている場合は、続行する前にアンインストールしてください。
ACS コンソール にログインします。左側のナビゲーションペインで、クラスター をクリックします。
クラスター ページで、管理するクラスターを見つけ、その ID をクリックします。クラスター詳細ページの左側のナビゲーションペインで、操作 > アドオン を選択します。
-
検索ボックスで [ACK Extend Network Controller] を検索し、コンポーネントカードの右下隅にあるInstallをクリックします。

-
表示されるダイアログボックスで、次の表に基づいてパラメーターを設定します。その後、[OK] をクリックします。
パラメータ
説明
enableControllers
有効にする機能:
-
[eip]:EIP 機能を有効にします。
-
[ipv6gw]:IPv6 機能を有効にします。
-
[natgw]:DNAT ゲートウェイ機能を有効にします。
[eip] と [ipv6gw] はデフォルトで選択されており、追加の RAM 権限は必要ありません。
[natgw] には RAM 権限が必要です。詳細については、「DNAT に必要な RAM 権限を設定する」をご参照ください。
natGwPool
DNAT 設定。
customStatefulWorkloadKinds
カスタムのステートフルコンテナタイプ。デフォルトで、Kubernetes StatefulSet と直接作成された Pod がサポートされています。他のコンテナタイプを追加するには、[+ 追加] をクリックします。
-
ステップ 2:EIP 機能を有効にする
Pod の設定に annotations を追加することで、Pod に EIP をアタッチできます。サポートされているアノテーションの完全なリストについては、「Pod に EIP をアタッチするためのアノテーション」をご参照ください。
新しい EIP を自動的に割り当てることも、既存の EIP インスタンスを指定することもできます。2 つの方法はアノテーションと解放動作が異なります。自動割り当てされた EIP は、Pod が削除されるとデフォルトで解放されます。指定された EIP は保持されます。EIP 解放ポリシーの詳細については、「EIP 解放ポリシーを設定する」をご参照ください。
EIP の自動割り当て
-
[クラスター] ページで、対象クラスターの名前をクリックし、左側のナビゲーションペインで [ワークロード] > [デプロイメント] を選択します。
-
ページの右上隅で、[YAML から作成] をクリックします。
-
次のサンプル YAML を使用して、example という名前の Deployment を作成します。
-
デプロイが作成されたら、デプロイ詳細ページを開きます。 example-78d17b7xxx-adxxx などの Pod 名をクリックして、Pod の[詳細] ページを表示します。 [アノテーション] セクションで EIP 情報を確認できます。 [編集] をクリックすると、Pod YAML で EIP の詳細を表示できます。
-
この例の作業が完了したら、Deployment を削除します。EIP インスタンス ID が指定されていないため、自動割り当てされた EIP は、Pod が削除されるとデフォルトで解放されます。
EIP インスタンスの指定
-
EIP インスタンスを準備します。詳細については、「EIP を申請する」をご参照ください。
-
[クラスター] ページで、目的のクラスターの名前をクリックし、左側のナビゲーションペインで [ワークロード] > [StatefulSet] を選択します。
-
ページの右上隅で、[YAML から作成] をクリックします。
-
次のサンプル YAML を使用して、example という名前の StatefulSet を作成します。
-
StatefulSet が作成されたら、StatefulSet の詳細ページを開きます。example-0 などのポッド名をクリックして、ポッドの [詳細] ページを表示します。[アノテーション] セクションには、アタッチされた EIP 情報が表示されます。[編集] をクリックして、ポッドの YAML で EIP の詳細を表示します。
-
この例の作業が完了したら、StatefulSet を削除します。EIP インスタンス ID が指定されているため、Pod が削除されても EIP は保持されます。
関連操作
VPC コントローラーは、Pod IP アドレスが割り当てられた後に EIP をアタッチします。Pod は EIP がアタッチされる前に Ready 状態になる可能性があり、サービスの中断や接続タイムアウトが発生する可能性があります。次の方法を使用して、Pod がトラフィックを受け入れる前に EIP がアタッチされていることを確認してください。
readinessGates を使用した EIP アタッチステータスの確認
readinessGates を設定すると、VPC コントローラーは EIP がアタッチされた後に Pod conditions を設定します。EIP のアタッチが完了するまで、Pod は Ready 状態になりません。
kind: Pod
...
spec:
readinessGates:
- conditionType: "k8s.aliyun.com/eip"
status:
conditions:
- lastProbeTime: "2022-12-12T03:45:48Z"
lastTransitionTime: "2022-12-12T03:45:48Z"
reason: Associate eip succeed
status: "True"
type: k8s.aliyun.com/eip
...
initContainers を使用した EIP アタッチステータスの確認
Pod に initContainers を設定して、initContainers で EIP が割り当てられているかどうかを確認します。initContainers を設定するためのサンプルコード:
apiVersion: v1
kind: Pod
metadata:
name: example
annotations:
network.alibabacloud.com/pod-with-eip: "true"
spec:
containers:
- name: example
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
command: ['sh', '-c', 'echo "アプリケーションは実行中です!" && sleep 3600']
initContainers:
- name: init
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
command: ['timeout', '-t' ,'60', 'sh','-c', "until grep 'network.alibabacloud.com/allocated-eip-id' /etc/podinfo/annotations; do echo 'アノテーションを待機しています'; sleep 2; done"]
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations
DNAT に必要な RAM 権限の設定
DNAT 機能を使用するには、ack-extend-network-controller が Alibaba Cloud OpenAPI にアクセスする必要があります。次の RAM 権限を設定してください。
-
Resource Access Management (RAM) コンソールにログオンします。 左側のナビゲーションペインで、[アクセスポリシー] をクリックし、次に [ポリシーの作成] をクリックします。
-
[ポリシーの作成] ページで [スクリプトエディター] をクリックし、コードエディターの
Statementセクションに次の内容を貼り付け、次に [OK] をクリックします。[ポリシー名] を DNAT-Policy に設定し、再度 [OK] をクリックします。{ "Effect": "Allow", "Action": [ "ecs:DescribeNetworkInterfaces", "vpc:DescribeNatGateways", "vpc:DescribeForwardTableEntries", "vpc:CreateForwardEntry", "vpc:DescribeEipAddresses", "vpc:DeleteForwardEntry", "vpc:DescribeRouteTableList", "vpc:DescribeRouteEntryList" ], "Resource": [ "*" ], "Condition": {} } -
左側のナビゲーションペインで[ロール]をクリックし、検索ボックスで [AliyunCCNECRole] を検索し、[操作]列の[権限付与]をクリックします。
-
[アクセスポリシー] セクションの検索ボックスで DNAT-Policy を検索して選択し、[確認] をクリックします。