EKS动手实验合集请参考这里。
本文介绍如何在没有外部网络连接的内部子网使用EKS服务。
一、背景
1、为何需要VPC Endpoint
在使用EKS服务时候,EKS集群的Node节点需要连接EC2、EKS、ECR、ELB等若干AWS服务,进行Node节点创建、镜像管理等操作,而这一步是依赖外网访问权限的。在没有外部网络权限的内部子网使用EKS服务时,因为没有外网权限,无法连接到AWS位于互联网上的服务端点,因此会遇到错误导致节点不能正常拉起。
由于内部网络不能提供对外路由,因此对这几个AWS服务的API调用需要配置VPC Endpoint来实现。在内部网络使用EKS需要配置EC2、EKS、ECR、S3、ELB、CloudWatch、STS等基础(X-ray根据实际情况配置)。
2、需要哪几种VPC Endpoint
需要配置的清单参考本文末尾的官方文档,这里概括其名称和如下。
服务 | 创建Endpoint界面搜索的服务名称 | 类型 | EC2使用VPC默认DNS时候 Endpoint是否自动解析 | EC2使用自建DNS 是否需要配置 |
---|---|---|---|---|
EC2 | com.amazonaws.ap-southeast-1.ec2 | Interface | 是 | 是 |
EKS | com.amazonaws.ap-southeast-1.eks | Interface | 是 | 是 |
ECR | com.amazonaws.ap-southeast-1.ecr.api | Interface | 是 | 是 |
ECR | com.amazonaws.ap-southeast-1.ecr.dkr | Interface | 是 | 是 |
ELB | com.amazonaws.ap-southeast-1.elasticloadbalancing | Interface | 是 | 是 |
CloudWatch | com.amazonaws.ap-southeast-1.logs | Interface | 是 | 是 |
STS | com.amazonaws.ap-southeast-1.sts | Interface | 是 | 是 |
S3 | com.amazonaws.ap-southeast-1.s3 | Gateway | 不需要解析 | 不需要解析 |
3、VPC Endpoint的域名解析
在配置好VPC Endpoint后,位于内网的节点、服务、代码就可以通过显式声明,即添加--endpoint-url https://xxxx/
的形式来访问以上服务。对于无法显式添加Endpoint的场景,以前需要使用Route 53 Private Zone为本VPC提供特殊的解析,将原先的Endpoint域名默认解析到公网,通过CNAME的方式解析到VPC内网新创建的这几个Endpoint上,即可让相关服务无缝调用。如今,目前VPC Endpoint已经集成了这个功能,在创建时候可以自动开启提供解析,因此无须额外创建Route 53 Private Zone了。
如果当前环境的EC2修改了默认DNS,即没有使用AWS VPC的DNS而是自建DNS Server的场景,那么还需要手工额外配置解析。
为保证操作精准,以英文菜单为例进行交互。点击界面上方区域代号边上的齿轮按钮,可以切换AWS Console的语言。如下截图。
二、配置EC2服务的VPC Endpoint
类型为Interface的VPC Endpoint包括上表中的EC2、EKS、ECR、ELB、CloudWatch、STS服务,配置过程如下。
1、创建VPC Endpoint
VPC Endpoint是区域(Regional)级别的服务,因此必须准确选择区域。例如服务部署在新加坡区域,后续所有操作都是新加坡区域,界面上会显示代号ap-southeast-1
,注意查看。
进入VPC服务界面,从左侧菜单中点击Endpoint
,点击右上角的Create endpoint
。如下截图。
在名称位置输入ec2
,在服务类型位置选择AWS Service
,在查找框中输入关键字ec2
,然后选中第一项com.amazonaws.ap-southeast-1.ec2
。注意这里一定要精确选择,搜索会出现名称相似的,包括带有后缀的,这里一定看仔细选择。继续向下滚动页面。如下截图。
选择服务完毕后,选择VPC。有多个VPC时候注意选择正确的VPC。接下来选中可用区。如果VPC是两个子网的,那么这里就选两个子网。如果VPC是三个子网的,那么这里就选三个可用。每个可用区后边的Subnet下拉框,点击后可选择私有子网。推荐选择到EKS Node节点EC2所在的纯内部子网,三个AZ都是这样操作。继续向下滚动页面。如下截图。
接下来继续配置。点击展开高级配置,确认其中的Enable DNS name
的选项是默认选中的状态。如果是使用AWS VPC自带的DNS则选中这个选项,由此本VPC内的服务访问将自动被解析到Endpoint。如果是使用自建DNS不使用VPC自带的DNS,那么需要关闭本选项。在IP地址类型位置默认选择IPv4
。如下截图。
在安全规则组位置,需要给Endpoint选择一个安全组。这里如果没有事先创建好合适的安全组,可去创建一个新的安全组,名字叫VPCEndpoint,放行范围是允许来自本VPC的CIDR范围(一般不要写0.0.0.0/0
)的地址授权允许入站访问443端口。然后在安全组这一步,绑定安全组。页面下方的Policy位置,选择默认的Full access
。继续向下滚动页面。如下截图。
最后在界面右下角,点击创建Create
按钮,完成VPC Endpoint的创建。
创建需要3-5分钟,请等待界面上Statis
状态指示变成绿色的可用。
2、查看VPC Endpoint地址
在VPC Endpoint界面,选中刚才创建的EC2 Endpoint,然后查看Detail,可看到下方有如下数个域名。如下截图。
这些域名讲解如下:
VPC全局可用的入口的域名(多AZ的别名):
vpce-03f7e3e94e933f477-jzzbvb9s.ec2.ap-southeast-1.vpce.amazonaws.com
访问这个地址,即可自动解析到某个AZ的Endpoint。
单个AZ的Endpoint的入口域名(只解析到本AZ):
vpce-03f7e3e94e933f477-jzzbvb9s-ap-southeast-1a.ec2.ap-southeast-1.vpce.amazonaws.com
vpce-03f7e3e94e933f477-jzzbvb9s-ap-southeast-1b.ec2.ap-southeast-1.vpce.amazonaws.com
vpce-03f7e3e94e933f477-jzzbvb9s-ap-southeast-1c.ec2.ap-southeast-1.vpce.amazonaws.com
在以上域名中可看到其中包含-1a
、-1b
、-1c
,这就表示三个AZ各自的Endpoint入口。如果上一步创建的是两个AZ,那么这里就是只有2个AZ的地址。
在以上截图的最右侧,还有一个域名ec2.ap-southeast-1.amazonaws.com
,这个域名在使用自建DNS时候要配置解析。后续章节会描述。
接下来还可以查看这些Endpoint域名背后的IP地址。在刚才的VPC Endpoint界面,点击第二个标签页子网Subnets
,即可看到这些信息。如下截图。
从自动管理和高可用的角度,不建议在代码中hardcode写入IP地址,建议代码和系统调用还是用AWS自动生成的域名。
3、通过显式声明传入VPC Endpoint地址的方式确认Endpoint正常(可选测试)
根据本文上一步截图中,我们选择VPC全局可用的入口的域名(多AZ的别名),然后将其放到AWSCLI脚本中,显式声明通过这个入口来调用,测试是否正常。
登录到位于内网的EKS节点上,使用AWSCLI(事先配置好AKSK),构建如下命令来查询当前Region的EC2清单:
aws ec2 describe-instances --endpoint-url https://vpce-03f7e3e94e933f477-jzzbvb9s.ec2.ap-southeast-1.vpce.amazonaws.com/
这里即可看到访问成功。
4、EC2使用VPC默认DNS场景 – 使用VPC自动提供Endpoint的解析
如果按照前文步骤,创建VPC Endpoint时候打开了VPC支持,那么不需要显式声明--endpoint-url
,就可正常工作。
执行域名查询命令,确认其解析有效。注意,所有VPC Endpoint都禁止Ping,因此ping命令只能用于测试解析是否正常,而不会ping通。此外可使用nslookup
命令代替。命令如下。
nslookup ec2.ap-southeast-1.amazonaws.com
当配置正确时候,返回3个结果如下:
[root@ip-172-31-1-79 ~]# nslookup ec2.ap-southeast-1.amazonaws.com
Server: 172.31.0.2
Address: 172.31.0.2#53
Non-authoritative answer:
Name: ec2.ap-southeast-1.amazonaws.com
Address: 172.31.78.156
Name: ec2.ap-southeast-1.amazonaws.com
Address: 172.31.86.228
Name: ec2.ap-southeast-1.amazonaws.com
Address: 172.31.56.201
[root@ip-172-31-1-79 ~]#
以上返回的三个地址就是VPC Endpoint在本VPC内的入口域名对应的IP地址。此处与上一步查看的IP可以对照确认匹配。
这个时候执行AWSCLI对EC2服务发起查询操作刚才的命令:
aws ec2 describe-instances
就可以看到执行正常。此时查询已经是通过Endpoint完成的了。
5、EC2使用自建DNS场景
如果EC2没有使用AWS VPC内自带的DNS,而是自己搭建了DNS,那么需要自己添加解析。
- 记录名称:
ec2.ap-southeast-1.amazonaws.com
- 记录类型:
CNAME
- 解析值:
vpce-03f7e3e94e933f477-jzzbvb9s.ec2.ap-southeast-1.vpce.amazonaws.com
- TTL:一般为60秒或300秒即可
请不要直接把以上内容填写到DNS。以上内容是本文做测试过程生成的记录。在您的真实生产环境内,要添加的DNS解析请查询您的VPC配置界面实际生成的域名(包含一个随机字符串与别的AWS账户相区分)。配置完毕后,等待1分钟(TTL周期)生效。
登录到EC2上,通过nslookup
命令确认其解析VPC Endpoint成功。然后再次执行aws ec2 describe-instances
命令测试访问即可。
三、配置ECR、ELB、CloudWatch、STS等类型也是Interface类型的VPC Endpoint
由于ECR和ELB类型也是Interface VPC Endpoint,配置全流程不再赘述。这里附上创建VPC Endpoint时候要搜索查找的服务名称:
- com.amazonaws.ap-southeast-1.eks
- com.amazonaws.ap-southeast-1.ecr.api
- com.amazonaws.ap-southeast-1.ecr.dkr
- com.amazonaws.ap-southeast-1.elasticloadbalancing
- com.amazonaws.ap-southeast-1.logs
- com.amazonaws.ap-southeast-1.sts
配置好后效果如下:
如果是使用VPC自带的DNS解析,那么打开DNS解析后都会自动生效。如果是自建DNS解析,那么就需要为以上Endpoint对照的域名添加解析记录。以本文为例:
服务 | 要添加解析的域名 | CNAME记录 |
---|---|---|
EC2 | ec2.ap-southeast-1.amazonaws.com | vpce-03f7e3e94e933f477-jzzbvb9s.ec2.ap-southeast-1.vpce.amazonaws.com |
EKS | eks.ap-southeast-1.amazonaws.com | vpce-03ff04f80322c97e8-f71svdwb.eks.ap-southeast-1.vpce.amazonaws.com |
ECR-API | api.ecr.ap-southeast-1.amazonaws.com | vpce-0a66a4c16d2ad4bdf-a4oezego.api.ecr.ap-southeast-1.vpce.amazonaws.com |
ECR-DKR | *.dkr.ecr.ap-southeast-1.amazonaws.com | vpce-052964fb1bab4d105-ewqgfa9t.dkr.ecr.ap-southeast-1.vpce.amazonaws.com |
ELB | elasticloadbalancing.ap-southeast-1.amazonaws.com | vpce-05ccb048eccd2287e-locfnd3m.elasticloadbalancing.ap-southeast-1.vpce.amazonaws.com |
CloudWatch | logs.ap-southeast-1.amazonaws.com | logs.ap-southeast-1.amazonaws.com |
STS | sts.ap-southeast-1.amazonaws.com | vpce-0c7a7868d16cf631f-3p1z73w5.sts.ap-southeast-1.vpce.amazonaws.com |
以上为本文档的例子,请替换以上所有信息为您的账户内生成的Endpoint域名。
至此除S3之外的Endpoint配置完成。接下来配置S3的Endpoint。
四、配置类型为Gateway的S3 VPC Endpoint
首先确认本VPC是否有已经存在的S3 VPC Endpoint。
1、本VPC已经存在S3 VPC Endpoint时候的路由表配置
在创建VPC时候,创建VPC向导界面会询问是否创建类型为Gateway的S3 VPC Endpoint。当时无论是否选中,创建VPC都会成功。因此在给VPC创建S3 VPC Endpoint之前,先查询下是否有已经存在的S3 VPC Endpoint。同一个VPC,只能有一个S3 VPC Endpoint。
进入VPC Endpoint界面,搜索关键词com.amazonaws.ap-southeast-1.s3
,如果能搜索出来,表示创建VPC时候已经创建了Endpoint。那么接下来就是将S3 VPC Endpoint绑定到所有的路由表。点击第二个标签页路由表,点击右侧的编辑按钮。如下截图。
进入编辑界面,选中本VPC所有子网(包括有EIP的外部子网,也包括没有外部网络的内部子网)。然后点击修改路由表保存生效。如下截图。
修改需要3-5分钟生效。
生效的最终确认方式是:点击进入到内部子网使用的路由表上,查看其中包含类似pl-6fa54006
的条目,目标地址是vpce-0014aadb62f662d16
。如果存在这样的条目,就表示Gateway Endpoint配置生效。如果不存在,则上一步操作完毕后,等待几分钟,就会出现这个条目。如下截图。
2、本VPC没有S3 VPC Endpoint时候新建配置
进入VPC服务界面,搜索S3服务,选择类型为Gateway的Endpoint。在搜索条件位置,输入com.amazonaws.ap-southeast-1.s3
作为搜索条件。然后在查询出来的Endpoint服务中,选择类型是Gateway
的。如下截图。
继续向下滚动页面。选择Endpoint要绑定的VPC。在路由表中,选择本VPC所有的路由表。注意此时右侧的一列Associated Ids
可显示本路由表绑定了多少个子网,用于配置参考提示之用。如下截图。
继续向下滚动页面。选择Policy是Full access
。最后点击右下角创建按钮。
创建S3 VPC Endpoint需要3-5分钟生效。
3、验证S3 VPC Endpoint工作正常
S3 Gateway Endpoint不依赖DNS解析,它的工作方式是基于路由表。因此即便EC2使用的是自建DNS,也不需要添加解析记录。
登录到位于内网的EC2上,事先配置好AKSK密钥,然后执行S3相关命令,能正常工作就表示S3 VPC Endpoint正常。例如查询存储桶清单命令。
aws s3 ls
至此EKS工作在内部网络所需要的VPC Endpoint全部配置完毕。
五、确认EKS Control Plan是Private模式
在完成所有Endpoint配置后,还需要再确认下EKS Control Plane所在的子网和允许Access状态。
在创建EKS时候,不管是使用eksctl命令行工具,还是EKS控制台图形界面,都需要将EKS控制平面选择到私有子网。如下截图。
同时,在EKS控制平面授权上,选择同时允许Public+Private。如果创建集群时候选择的控制平面只允许Public来访问,那么这里必须修改为Private,或者选择为同时接受Public和Private。否则位于纯内网的Nodegroup将无法和EKS控制平面通信。如下截图。
这样选择的好处是,开发者、运维人员本机的eksctl、kubectl等工具即可以从互联网直接操作EKS,同时VPC内的EKS Nodegroup也可以正常与EKS控制平面通信。
此参数创建后可修改。如果集群创建之初选的Public,创建后可以修改。如下截图。
至此所有配置完成。
六、参考文档
Private cluster requirements
https://docs.aws.amazon.com/eks/latest/userguide/private-clusters.html