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
- 创建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