pods の SNAT - Amazon EKS

pods の SNAT

IPv6 ファミリーを使用してクラスターをデプロイした場合、このトピックの情報はクラスターに適用されません。IPv6 アドレスがネットワーク変換されないからです。クラスターでの IPv6 使用の詳細については、「チュートリアル: pods および services への IPv6 アドレスの割り当て」を参照してください。

デフォルトでは、クラスター内の各 pod に、pod がデプロイされた VPC に関連付けられた Classless Inter-Domain Routing (CIDR) ブロックから、プライベート IPv4 アドレスが割り当てられます。同じ VPC 内の Pods は、これらのプライベート IP アドレスをエンドポイントとして使用して相互に通信します。VPC に関連付けられている CIDR ブロック外の IPv4 アドレスと pod が通信する場合、Kubernetes 用の Amazon VPC CNI プラグイン が pod's IPv4 アドレスを、pod が実行されているノードのプライマリ Elastic Network Interface のプライマリプライベート IPv4 アドレスに変換します (デフォルトでは *)。

この動作によって、次の現象が起こります。

  • VPC ピアリング接続トランジット VPC、または Direct Connect を使用してクラスター VPC に接続されているネットワーク内または VPC 内にあるリソースは、pods との通信を開始できません。ただし、pods はこれらのリソースとの通信を開始し、リソースから応答を受け取ることができます。

  • pods は、実行しているノードに パブリック IP アドレスまたは 伸縮性 IP アドレスが割り当てられており、パブリックサブネット内にある場合にのみ、インターネットリソースと通信できます。パブリックサブネットに関連付けられているルートテーブルには、インターネットゲートウェイへのルートが含まれています。可能であれば、プライベートサブネットにノードをデプロイすることをお勧めします。

VPC ピアリング接続トランジット VPC、または Direct Connect を使用してクラスター VPC に接続されているネットワーク内または VPC 内にあるリソースがあって、IPv4 アドレスを使用して pods との通信を開始する必要がある場合、デフォルト設定を次のコマンドで変更する必要があります。

kubectl set env daemonset -n kube-system aws-node AWS_VPC_K8S_CNI_EXTERNALSNAT=true

設定を true に変更した後に pods がインターネットと通信するようにするには、ノードをデプロイしたプライベートサブネットに関連付けられているルートテーブルに、パブリック NAT ゲートウェイへのルートが含まれている必要があります。

*pod's 仕様に hostNetwork=true が含まれている場合 (デフォルトは false)、その IP アドレスは別のアドレスに変換されません。これは、クラスター上で実行されている kube-proxy と Amazon VPC CNI plugin for Kubernetes pods の場合のデフォルトです。これらの pods の場合、IP アドレスはノードのプライマリ IP アドレスと同じであるため、pod's IP アドレスは変換されません。pod's hostNetwork の設定の詳細については、「Kubernetes API リファレンス」の「PodSpec v1 core」を参照してください。