SNAT

当在同一个VPC间互相通讯时,Pod使用私网IP通讯;但当Pod与外部的IP通讯时,CNI会将它做SNAT转换,将它转换成主网卡上的IP。例如下面的pod访问外网资源时,默认会转换成节点上的public ip:

image-20221101210231967

但这个行为会带来一些后果:

  • 如果Pod所在VPC与其他VPC进行DX、VPC peering连接,外部的资源就不能主动连接该pod,该pod可以主动发起连接

  • 如果Pod想跟公网通讯,node上必须要有public IP,但很多情况pod都是跑在私网

为了解决这些问题,可以更改默认设置:

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

此时Pod跟公网通讯时,走的是NAT Gateway

image-20221101210312014