すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Pod を公開するための DNAT の構成

最終更新日:Jul 03, 2025

ゲームや 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 するポート。複数のポートはコンマ (,) で区切ります。例: 80,443

k8s.aliyun.com/pod-dnat-expose-protocol

使用するプロトコル。有効値: tcp および udp。デフォルト値: tcp

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 クラスタ

  1. ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。

  2. [クラスタ] ページで、目的のクラスタを見つけて名前をクリックします。左側のペインで、[クラスタ情報] をクリックします。

  3. [クラスタ情報] ページで、[基本情報] タブをクリックし、[ワーカー RAM ロール] の横にあるハイパーリンクをクリックします。

  4. カスタムポリシーを作成し、次の内容をポリシーに追加します。詳細については、「手順 1: カスタムポリシーを作成する」をご参照ください。

    {
          "Effect": "Allow",
          "Action": [
            "ecs:DescribeNetworkInterfaces",
            "vpc:DescribeNatGateways",
            "vpc:DescribeForwardTableEntries",
            "vpc:CreateForwardEntry",
            "vpc:DescribeEipAddresses",
            "vpc:DeleteForwardEntry",
            "vpc:DescribeRouteTableList",
            "vpc:DescribeRouteEntryList"
          ],
          "Resource": [
            "*"
          ],
          "Condition": {}
        }
  5. カスタムポリシーをクラスタのワーカー 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: nginx

poddnats.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" です。