AWS 为已有的EKS部署PrivateCluster和配置NAT

参考视频:https://www.youtube.com/watch?v=LJNNMTicv1c

参考文章:
https://blog.damavis.com/en/adding-static-outbound-ips-in-amazon-eks/
https://docs.aws.amazon.com/eks/latest/userguide/external-snat.html


【准备】
必须拥有已经创建EKS集群,但不能有Node Group

  1. 创建Private Subnet,每个AZ各创建一个Subnet,举例新加坡有3个AZ所以以下是已经创建好的CIDR
    不能勾auto assign ipv4
    – 172.31.0.0/20 【默认已创建好的】
    – 172.31.16.0/20 【默认已创建好的】
    – 172.31.32.0/20 【默认已创建好的】
    – 172.31.48.0/20 【新创建的Private Subnet CIDR】
    – 172.31.64.0/20 【新创建的Private Subnet CIDR】
    – 172.31.80.0/20 【新创建的Private Subnet CIDR】

2. 如果有使用Karpenter的话需要为新创建的subnet 添加tag
environment : private
karpenter.sh/discovery: YourClusterName

3. 创建NAT

4. 创建route table,并且把新创建的subnet绑定起来,然后网络出去的路口设置为创建好的NAT

PrivateSubnet -> NAT( 绑定在PublicSubnet当中 ) -> 使用Internet Gateway访问外网

PrivateRouteTable – 把PrivateSubnet和outbound – NAT绑定
PublicRouteTable – 把PublicSubnet和outbound – Internet Gateway绑定 (NAT 坐落在public subnet当中)

以下是设定outbound NAT

以下是设定 route table绑定了private subnet

========================================================================

【注意】

如果PublicSubnet和PrivateSubnet 绝对不能放在同一个route table。如果放在同一个route table的话就会出问题了。只要是route table有配置Internet Gateway的话EKS就会默认为是PublicCluster,如果你的subnet是无法auto assign ipv4的话就会遇到以下的问题。

参考文章:https://stackoverflow.com/questions/62601011/terraform-eks-node-groups-private-subnet

========================================================================

5. 更改已有的EKS Cluster 使用的subnet去到PrivateSubnet

6. 以下的命令就是为aws-node开启了pod使用snat的功能

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

7. 如果你有使用karpenter的话就需要删除已有的EC2NodeClass,并且根据以下的yml创建新的,CLUSTER_NAME改成你集群的名。
– 以下的yaml文件其实是指定scale out的node通过environment 和 discover tag 使用 private subnet

apiVersion: karpenter.k8s.aws/v1beta1
kind: EC2NodeClass
metadata:
  name: default
spec:
  amiFamily: AL2 # Amazon Linux 2
  role: "KarpenterNodeRole-${CLUSTER_NAME}" # replace with your cluster name
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: "${CLUSTER_NAME}" # replace with your cluster name
        enviroment: "private"
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: "${CLUSTER_NAME}" # replace with your cluster name

8. 创建default node group 进行测试。进入一个pod然后执行以下的命令获取public ip。这 public ip和NAT的IP是一样的那么就完成了!

curl ifconfig.me

Loading

Facebook评论