在没有外部网络权限的内部子网使用EKS服务时需要额外配置的VPC Endpoint

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
是否需要配置
EC2com.amazonaws.ap-southeast-1.ec2Interface
EKScom.amazonaws.ap-southeast-1.eksInterface
ECRcom.amazonaws.ap-southeast-1.ecr.apiInterface
ECRcom.amazonaws.ap-southeast-1.ecr.dkrInterface
ELBcom.amazonaws.ap-southeast-1.elasticloadbalancingInterface
CloudWatchcom.amazonaws.ap-southeast-1.logsInterface
STScom.amazonaws.ap-southeast-1.stsInterface
S3com.amazonaws.ap-southeast-1.s3Gateway不需要解析不需要解析

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记录
EC2ec2.ap-southeast-1.amazonaws.comvpce-03f7e3e94e933f477-jzzbvb9s.ec2.ap-southeast-1.vpce.amazonaws.com
EKSeks.ap-southeast-1.amazonaws.comvpce-03ff04f80322c97e8-f71svdwb.eks.ap-southeast-1.vpce.amazonaws.com
ECR-APIapi.ecr.ap-southeast-1.amazonaws.comvpce-0a66a4c16d2ad4bdf-a4oezego.api.ecr.ap-southeast-1.vpce.amazonaws.com
ECR-DKR*.dkr.ecr.ap-southeast-1.amazonaws.comvpce-052964fb1bab4d105-ewqgfa9t.dkr.ecr.ap-southeast-1.vpce.amazonaws.com
ELBelasticloadbalancing.ap-southeast-1.amazonaws.comvpce-05ccb048eccd2287e-locfnd3m.elasticloadbalancing.ap-southeast-1.vpce.amazonaws.com
CloudWatchlogs.ap-southeast-1.amazonaws.comlogs.ap-southeast-1.amazonaws.com
STSsts.ap-southeast-1.amazonaws.comvpce-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