ゲームやP2Pのシナリオでは、elastic IPアドレス (EIP) をポッドに割り当てる代わりに、アプリケーションポッドをクライアントに直接公開する必要がある場合があります。 従来のモードでは、EIPを使用してポッドを公開できます。 ただし、ポッドに割り当てることができるEIPの数は限られており、セキュリティ管理が必要です。 この場合、インターネットNATゲートウェイのDNATルールを設定し、インターネットNATゲートウェイを使用してポッドを公開できます。 この方法では、EIPをインターネットNATゲートウェイに関連付けるだけで済み、使用するEIPの数が減ります。
前提条件
ACK管理クラスターまたはACK専用クラスターが作成され、Terwayがインストールされます。 詳細については、「マネージドACKクラスターの作成」および「専用ACKクラスターの作成」をご参照ください。
インターネットNATゲートウェイは、クラスターがデプロイされている仮想プライベートクラウド (VPC) に作成されます。 インターネットNATゲートウェイを作成すると、natgwコントローラーが有効になります。 インターネットNATゲートウェイの作成方法の詳細については、「インターネットNATゲートウェイの作成と管理」をご参照ください。
パブリックIPアドレスとプライベートIPアドレス間のマッピングを指定するDNATルール、およびパブリックポートとプライベートポート間のマッピングが作成されます。 DNATの詳細については、「ECSインスタンスのインターネットNATゲートウェイでのDNATの設定」をご参照ください。
インターネットNATゲートウェイに関連付けられているEIPにパブリックIPアドレスを設定します。
パブリックポート: natgwコントローラーは、natgwの構成ファイルの
portRangeStart
パラメーターとportRangeEnd
パラメーターで指定されたポート範囲からパブリックポートを自動的に割り当てます。 割り当てられたポートは、ポッドにちなんで名付けられたカスタムリソースオブジェクトのpoddnats.alibabacloud.com
フィールドに記録されます。ポッドがリッスンするポートにプライベートポートを設定します。
プライベートIPアドレスをポッドのIPアドレスに設定します。
制限事項
IPv6インターネット帯域幅は、ECSインスタンスで実行されるポッドにのみ割り当てることができ、ECI (elastic container instances) で実行されるポッドには割り当てられません。
インターネットNATゲートウェイでサポートされるDNATルールの数は、ゲートウェイのタイプによって異なります。 詳細については、「DNATに関するFAQ」をご参照ください。
ポッドの設定
次の表に、ポッドの設定を示します。
ポッドの注釈 | 値 |
k8s.aliyun.com/pod-dnat | ポッドのDNATを有効にします。 このパラメータは空のままです。 |
k8s.aliyun.com/pod-dnat-expose-port | ポッドがリッスンするポート。 複数のポートはコンマ (,) で区切ります。 例: '80,443 '。 |
k8s.aliyun.com/pod-dnat-expose-protocol | 使用するプロトコル。 有効な値: |
k8s.aliyun.com/pod-dnat-fixed | このアノテーションを追加した後、ポッドがステートフルアプリケーション用に作成されている場合、ポッドのDNAT設定は変更されません。 |
ポッドで公開されているポートへのインバウンドトラフィックを許可するには、ポッドのセキュリティグループルールを設定する必要があります。
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ルールを作成し、アノテーションを追加して特定のポッドに関連付ける必要があります。
ステップ1: DNATでRAM権限を付与する
ACKクラスターの場合:
ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[クラスター情報] をクリックします。
[クラスター情報] ページで、[基本情報] タブをクリックし、[Worker RAMロール] の横にあるハイパーリンクをクリックします。
カスタムポリシーを作成し、次の内容をポリシーに追加します。 詳細については、「 [製品の変更] 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ロールにカスタムポリシーをアタッチします。 詳細については、「 [製品の変更] ACK管理クラスターのワーカーRAMロールの権限が取り消されます」トピックのワーカーRAMロールにカスタムポリシーをアタッチするセクションをご参照ください。
ACKサーバーレスクラスター:
RAMユーザーのAccessKeyペアを生成します。 詳細については、「RAMユーザーの作成」および「カスタムポリシーの作成」をご参照ください。
ステップ2: ack-extend-network-controllerのnatgwコントローラを有効にする
ack-extend-network-controllerをインストールし、natgwコントローラを有効にします。 ack-extend-network-controllerのインストール方法の詳細については、「App Marketplace」をご参照ください。
natgwコントローラに次のパラメータを指定します。
clusterID: "c11ba338192xxxxxxx" # Specify the actual value.
regionID: "cn-hangzhou" # Specify the actual value.
vpcID: "vpc-bp1rkq0zxxxxxx" # Specify the actual value.
enableControllers:
- natgw # Enable DNAT.
networkController:
natGwPool:
- natgwId: "< nat gateway id. >" # The ID of the Internet NAT gateway.
zoneId: "< nat gateway zone id. cn-hangzhou-j >" # The zone ID of the Internet NAT gateway.
portRangeStart: 512 # The first port.
portRangeEnd: 1024 # The last port.
eips:
- "<auto config all nat gateway eips if not config. 0.0.0.0 >" # Specify an EIP that is associated with the Internet NAT gateway. If you leave this parameter empty, all EIPs associated with the Internet NAT gateway are used.
credential: # Specify an AccessKey pair. For ACK clusters, we recommend that you use the RamRole mode. You do not need to configure this parameter if you granted permissions to the worker RAM role of the cluster in step 1.
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: nginx
次のコマンドを実行してpoddnats.alibabacloud.com
にアクセスし、ポッドのパブリックIPアドレスとパブリックポートを取得します。
kubectl get poddnats -oyaml
期待される結果
apiVersion: alibabacloud.com/v1
kind: PodDNAT
metadata:
creationTimestamp: "2022-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
パラメーター:
externalPort
: ポッドのプライベートポートにマップされているパブリックポート。 ポートは、指定されたポート範囲からnatgwコントローラによって割り当てられます。externalIP
: 外部アクセス用のNATゲートウェイのEIP。