要提前设置的vpc endpoint:
| Service | Endpoint |
|---|---|
| Amazon EC2 | com.amazonaws.region-code.ec2 |
| Amazon Elastic Container Registry (for pulling container images) | com.amazonaws.region-code.ecr.api, com.amazonaws.region-code.ecr.dkr, and com.amazonaws.region-code.s3 |
| Application Load Balancers and Network Load Balancers | com.amazonaws.region-code.elasticloadbalancing |
| EC2 autoscalng | com.amazonaws.region.autoscaling |
| Amazon CloudWatch Logs | com.amazonaws.region-code.logs |
| AWS Security Token Service (required when using IAM roles for service accounts) | com.amazonaws.region-code.sts |
参考: https://docs.aws.amazon.com/vpc/latest/privatelink/aws-services-privatelink-support.html
使用CloudFormation部署VPC + Private Subnet + VPC Endpoint: https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-06-10/amazon-eks-fully-private-vpc.yaml
部署完成后,从CloudFormation的输出找到subnet的id:

将下面文件保存为private-cluster.yaml, subnet id作相应替换:
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: prod
region: us-east-1
managedNodeGroups:
- name: ng-1
instanceType: m5.xlarge
desiredCapacity: 2
privateNetworking: true
vpc:
subnets:
private:
us-east-1a:
id: "subnet-xxxx"
us-east-1b:
id: "subnet-xxxx"
us-east-1c:
id: "subnet-xxxx"
clusterEndpoints:
publicAccess: true
privateAccess: true
创建集群:
eksctl create cluster -f private-cluster.yaml
由于 clusterEndpoints中 privateAccess 和publicAccess都设置为 true, 所以在外网也可以执行kubectl 来访问集群。
由于VPC下没有到公网的路由,所以如果镜像在公网,则会创建失败:

使用ECR中的镜像创建pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
labels:
app: tomcat
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: 145197526627.dkr.ecr.us-east-1.amazonaws.com/java-app
imagePullPolicy: Always
env:
- name: ALLOW_EMPTY_PASSWORD
value: "yes"
ports:
- containerPort: 80
protocol: TCP
集群通过ECR的endpoint,拉取到镜像并部署成功:
