ゲームや P2P のシナリオでは、Pod に Elastic IP アドレス (EIP) を割り当てる代わりに、アプリケーション Pod をクライアントに直接公開する必要がある場合があります。従来のモードでは、EIP を使用して Pod を公開できます。ただし、Pod に割り当てることができる EIP の数には制限があり、セキュリティ管理が必要です。この場合、インターネット NAT ゲートウェイの DNAT ルールを構成し、インターネット NAT ゲートウェイを使用して Pod を公開できます。この方法では、EIP をインターネット NAT ゲートウェイに関連付けるだけで済み、使用する EIP の数を減らすことができます。
前提条件
ACK マネージドクラスター または ACK 専用クラスター が作成され、Terway がインストールされていること。詳細については、「マネージド ACK クラスタを作成する」および「専用 ACK クラスタを作成する」をご参照ください。
クラスターがデプロイされている仮想プライベートクラウド (VPC) にインターネット NAT ゲートウェイが作成されていること。インターネット NAT ゲートウェイを作成した後、natgw コントローラーが有効になります。インターネット NAT ゲートウェイの作成方法の詳細については、「インターネット NAT ゲートウェイの作成と管理」をご参照ください。
パブリック IP アドレスとプライベート IP アドレス間のマッピング、およびパブリックポートとプライベートポート間のマッピングを指定する DNAT ルールが作成されていること。DNAT の詳細については、「ECS インスタンスのインターネット NAT ゲートウェイで DNAT を構成する」をご参照ください。
パブリック IP アドレスを、インターネット NAT ゲートウェイに関連付けられている EIP に設定します。
パブリックポート: natgw コントローラーは、natgw の構成ファイルの
portRangeStartパラメーターとportRangeEndパラメーターで指定されたポート範囲からパブリックポートを自動的に割り当てます。割り当てられたポートは、Pod の名前が付けられたカスタムリソースオブジェクトのpoddnats.alibabacloud.comフィールドに記録されます。プライベートポートを、Pod が listen するポートに設定します。
プライベート IP アドレスを Pod の IP アドレスに設定します。
制限事項
IPv6 インターネット帯域幅は、Elastic Container Instance (ECI) 上ではなく、ECS インスタンス上で実行されている Pod にのみ割り当てることができます。
インターネット NAT ゲートウェイでサポートされる DNAT ルールの数は、ゲートウェイの種類によって異なります。詳細については、「DNAT についてのよくある質問」をご参照ください。
Pod の構成
次の表に、Pod の構成を示します。
Pod のアノテーション | 値 |
k8s.aliyun.com/pod-dnat | Pod の DNAT を有効にします。このパラメーターは空のままにします ( |
k8s.aliyun.com/pod-dnat-expose-port | Pod が listen するポート。複数のポートはコンマ (,) で区切ります。例: |
k8s.aliyun.com/pod-dnat-expose-protocol | 使用するプロトコル。有効値: |
k8s.aliyun.com/pod-dnat-fixed | このアノテーションを追加した後、ステートフルアプリケーション用に Pod が作成された場合、Pod の DNAT 構成は変更されません。 |
Pod で公開されているポートへのインバウンドトラフィックを許可するように、Pod のセキュリティグループルールを構成する必要があります。
ack-extend-network-controller の DNAT を有効にする
ack-extend-network-controller は、リソースを作成するために OpenAPI Explorer にアクセスする必要があります。 ack-extend-network-controller に Resource Access Management (RAM) 権限を付与し、ACK コンソールでマーケットプレイスから ack-extend-network-controller をインストールし、DNAT ルールを作成して、アノテーションを追加することで特定の Pod に関連付ける必要があります。
手順 1: DNAT に RAM 権限を付与する
ACK クラスタ
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、目的のクラスタを見つけて名前をクリックします。左側のペインで、[クラスタ情報] をクリックします。
[クラスタ情報] ページで、[基本情報] タブをクリックし、[ワーカー RAM ロール] の横にあるハイパーリンクをクリックします。
カスタムポリシーを作成し、次の内容をポリシーに追加します。詳細については、「手順 1: カスタムポリシーを作成する」をご参照ください。
{ "Effect": "Allow", "Action": [ "ecs:DescribeNetworkInterfaces", "vpc:DescribeNatGateways", "vpc:DescribeForwardTableEntries", "vpc:CreateForwardEntry", "vpc:DescribeEipAddresses", "vpc:DeleteForwardEntry", "vpc:DescribeRouteTableList", "vpc:DescribeRouteEntryList" ], "Resource": [ "*" ], "Condition": {} }カスタムポリシーをクラスタのワーカー RAM ロールにアタッチします。詳細については、「カスタムポリシーをワーカー RAM ロールにアタッチする」をご参照ください。
ACK Serverless クラスタ
RAM ユーザーの AccessKey ペアを生成します。詳細については、「RAM ユーザーを作成する」および「カスタムポリシーを作成する」をご参照ください。
手順 2: ack-extend-network-controller の natgw コントローラーを有効にする
ack-extend-network-controller をインストールし、natgw コントローラーを有効にします。 ack-extend-network-controller のインストール方法の詳細については、「App Marketplace」をご参照ください。
natgw コントローラーには、次のパラメーターを指定します。
clusterID: "c11ba338192xxxxxxx" # 実際の値を指定します。
regionID: "cn-hangzhou" # 実際の値を指定します。
vpcID: "vpc-bp1rkq0zxxxxxx" # 実際の値を指定します。
enableControllers:
- natgw # DNAT を有効にします。
networkController:
natGwPool:
- natgwId: "< nat gateway id. >" # インターネット NAT ゲートウェイの ID。
zoneId: "< nat gateway zone id. cn-hangzhou-j >" # インターネット NAT ゲートウェイのゾーン ID。
portRangeStart: 512 # 最初のポート。
portRangeEnd: 1024 # 最後のポート。
eips:
- "<auto config all nat gateway eips if not config. 0.0.0.0 >" # インターネット NAT ゲートウェイに関連付けられている EIP を指定します。このパラメーターを空のままにすると、インターネット NAT ゲートウェイに関連付けられているすべての EIP が使用されます。
credential: # AccessKey ペアを指定します。ACK クラスタの場合、RamRole モードを使用することをお勧めします。手順 1 でクラスタのワーカー RAM ロールに権限を付与した場合は、このパラメーターを構成する必要はありません。
accessKey: ""
accessSecret: ""カスタムリソースオブジェクトを使用してポッドの DNAT 構成を追跡する
ポッドを作成すると、natgw コントローラーはポッドの名前を付けた PodDNAT オブジェクトを自動的に作成します。次の YAML テンプレートを使用してデプロイメントを作成します。この例では、ポッドのポート 80 をインターネットに公開するために DNAT 構成が追加されています。
apiVersion: apps/v1
kind: Deployment
metadata:
name: example
labels:
app: example
spec:
replicas: 1
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
annotations:
k8s.aliyun.com/pod-dnat: ""
k8s.aliyun.com/pod-dnat-expose-port: "80"
spec:
containers:
- name: example
image: nginxpoddnats.alibabacloud.com にアクセスしてポッドのパブリック IP アドレスとパブリックポートを取得するには、次のコマンドを実行します。
kubectl get poddnats -oyaml 期待される結果:
apiVersion: alibabacloud.com/v1
kind: PodDNAT
metadata:
creationTimestamp: "20**-09-20T03:26:44Z"
finalizers:
- natgw-controller
generation: 2
name: example-6cd498d7b-9****
namespace: default
ownerReferences:
- apiVersion: v1
blockOwnerDeletion: true
kind: Pod
name: example-6cd498d7b-9****
uid: 7af54e1c-eeb7-4fd0-b070-ff99ddbd****
resourceVersion: "357150"
uid: 2fad9bb7-cc84-46b4-b6eb-5d15f06c****
spec:
eni: eni-xxx
externalIP: 114.55.**.**
internalIP: 172.16.**.**
portMapping:
- externalPort: "512"
internalPort: "80"
protocol: tcp
tableId: ngw-xxx
vswitch: vsw-xxx
zoneID: cn-hangzhou-k
status:
entries:
- externalIP: 114.55.**.**
externalPort: "512"
forwardEntryId: fwd-xxx
internalIP: 172.16.**.**
internalPort: "80"
ipProtocol: tcpポッドの外部アドレスとポートは次のように構成されます。
externalIP: 外部アクセス用の NAT ゲートウェイのパブリック IP。この例では114.55.**.**です。externalPort: コントローラーによってポート範囲から割り当てられたパブリックポート。この例では"512"です。