DNS域名解析是ACK Serverless集群内实现服务发现的方式之一。本文主要介绍ACK Serverless集群中DNS域名解析原理和DNS服务发现方案。
索引
注意事项
如果在创建ACK Serverless集群时,未开启任意DNS服务发现组件,容器Pod将默认使用VPC提供的DNS服务器进行域名解析。该模式下不支持Kubernetes内Service服务名的域名解析。
对于已创建的ACK Serverless集群,启用DNS服务发现方案仅对新建的容器Pod生效,即启用前创建的容器Pod并不会随着方案的启用而切换其DNS配置文件,需重新创建容器Pod来使其接入新的DNS服务发现方案。
CoreDNS(托管)组件会逐步替换CoreDNS(非托管),直至CoreDNS(非托管)下线,后续您可能无法在控制台看到CoreDNS(非托管)。如需使用CoreDNS(非托管)组件,请提交工单咨询。
ACK Serverless集群中DNS域名解析原理
在ACK Serverless集群创建容器Pod时,默认情况下,/etc/resolv.conf
文件的内容如下。该文件指定了DNS服务器、搜索域和一些其他参数。
# nameserver表示本容器Pod使用的DNS服务器IP地址。
nameserver 172.xx.x.xx
# search表示请求服务时需要拼接的域名后缀,当Pod处于kube-system命名空间时如下。
search kube-system.svc.cluster.local svc.cluster.local cluster.local
# 其他参数
options ndots:5
关于DNS域名解析配置文件和Pod DNSPolicy的字段含义,请参见DNS原理和配置说明。
ACK Serverless集群支持的DNS服务发现方案
DNS服务发现方案 | 说明 |
CoreDNS(托管) | 推荐使用。容器Pod使用CoreDNS(托管)组件进行域名解析,由ACK Serverless来创建并保证CoreDNS的正常运行。您无需关心CoreDNS的运行状态,免除手动运维。此外,该方案不占用集群中的ECI实例。 |
CoreDNS(非托管) | 容器Pod使用CoreDNS(非托管)组件进行域名解析,您必须确保正确配置CoreDNS,并时刻关注CoreDNS副本的运行状态。 |
PrivateZone | 容器Pod使用PrivateZone组件进行域名解析,ACK Serverless会自动创建、更新PrivateZone中的域名解析记录。 |
CoreDNS(托管)
托管版CoreDNS组件通过kube-system命名空间下的kube-dns服务的集群IP暴露DNS服务。业务Pod使用托管CoreDNS的流程如下。
链路 | 说明 |
① | 客户端(Client Pod)访问上游服务(TargetService)时,会先从本地DNS域名解析配置文件( 在本方案中,DNS服务器地址为ACK Serverless集群的kube-system命名空间下创建的名为kube-dns的集群IP的IP地址。kube-dns的集群IP的后端由ACK Serverless集群负责动态维护更新,您无需关注。 |
② | 客户端(Client Pod)请求集群外部域名时,托管CoreDNS会将域名请求转发至VPC提供的DNS服务器(100.100.2.136、100.100.2.138)进行解析。 |
③ | 客户端(Client Pod)通过DNS服务器获取到上游服务(TargetService)的IP地址后,向该IP发出请求。 |
开启CoreDNS(托管)组件
开启CoreDNS(托管)组件后,ACK Serverless集群会自动在kube-system命名空间下创建名为kube-dns的集群IP服务。请勿手动修改。
CoreDNS(托管)组件逐步开放中,如在控制台无法看到CoreDNS(托管)组件,表明当前地域尚未开放支持CoreDNS(托管)组件。CoreDNS(托管)组件的自定义配置功能逐步开放中,如有使用需求,请提交工单咨询。
方式一:对于新建的ACK Serverless集群,您可以在创建集群时,指定CoreDNS(托管)作为DNS服务发现,启用托管版CoreDNS组件。
方式二:对于已创建的ACK Serverless集群,您可以在集群管理页面,选择运维管理 > 组件管理,单击网络页签,然后单击CoreDNS(托管)组件的安装,启用托管版CoreDNS组件。具体操作,请参见管理组件。
CoreDNS(非托管)
CoreDNS(非托管)是Kubernetes集群中负责DNS解析的组件,能够支持解析集群内部自定义服务域名和集群外部域名。CoreDNS(非托管)具备丰富的插件集,在集群层面支持自建DNS、自定义Hosts、CNAME、Rewrite等需求。与Kubernetes一样,CoreDNS项目由CNCF托管,关于CNCF的更多信息,请参见CNCF。关于CoreDNS的更多信息,请参见CoreDNS: DNS and Service Discovery。
非托管版CoreDNS组件通过kube-system命名空间下的kube-dns的集群IP暴露DNS服务,业务Pod使用非托管CoreDNS的流程如下。
链路 | 说明 |
① | 客户端(Client Pod)访问上游服务(TargetService)时,会先从本地DNS域名解析配置文件( 在本方案中,DNS服务器地址为ACK Serverless集群kube-system命名空间的kube-dns的集群IP的IP地址。 |
② | 客户端(Client Pod)请求集群外部域名时,CoreDNS会将域名请求转发至VPC提供的DNS服务器(100.100.2.136、100.100.2.138)进行解析。 |
③ | 客户端(Client Pod)通过DNS服务器获取到上游服务(TargetService)的IP地址后,向该IP发出请求。 |
开启CoreDNS(非托管)组件
方式一:对于新建的ACK Serverless集群,您可以在创建集群时,指定CoreDNS作为DNS服务发现,启用非托管版CoreDNS组件。
方式二:对于已创建的ACK Serverless集群,您可以在集群管理页面,选择运维管理 > 组件管理,单击网络页签,然后单击CoreDNS组件的安装,启用非托管版CoreDNS组件。具体操作,请参见管理组件。
PrivateZone
PrivateZone是一项基于阿里云VPC环境提供的私有域名解析服务。通过使用PrivateZone控制器,就可以实现对ACK Serverless集群内各命名空间的Service和Endpoint资源的实时监控。该控制器与APIServer交互,自动将资源的域名同步到PrivateZone中。ACK Serverless中的容器Pod通过PrivateZone DNS解析服务就可完成Kubernetes的服务发现。关于如何使用PrivateZone方案,请参见ACK Serverless集群基于云解析PrivateZone的服务发现。
PrivateZone通过VPC提供的DNS服务器(100.100.2.136、100.100.2.138)暴露DNS服务,业务Pod使用PrivateZone的流程如下。
链路 | 说明 |
① | PrivateZone控制器连接至APIServer,监听集群中服务的创建和更新事件。 |
② | PrivateZone控制器监听到服务的创建和更新事件后,将其同步至PrivateZone产品中权威Zone解析记录中。 |
③ | 客户端(Client Pod)访问上游服务(TargetService)时,会先从本地DNS域名解析配置文件( 在本方案中,DNS服务器地址为DNS域名解析配置文件中配置VPC提供的DNS服务器IP地址(100.100.2.136、100.100.2.138)。DNS服务器会从PrivateZone获取正确的解析记录,返回给客户端。 |
④ | 客户端(Client Pod)通过DNS服务器拿获取到上游服务(TargetService)的IP地址后,向该IP发出请求。 |
开启PrivateZone组件
方式一:对于新建的ACK Serverless集群,您可以在创建集群时,指定PrivateZone作为DNS服务发现,启用PrivateZone组件。
方式二:对于已创建的ACK Serverless集群,您可以在
eci-profile
配置项中设置enablePrivateZone
参数值为true
,启用PrivateZone组件。
常见问题
如何确认当前集群CoreDNS(托管)、CoreDNS(非托管)、PrivateZone组件已成功开启?
CoreDNS(托管)和CoreDNS(非托管)组件
登录容器服务管理控制台,在集群管理页面,选择运维管理 > 组件管理,单击网络页签,如果组件右上角有已安装字样,说明当前集群的CoreDNS(托管)或CoreDNS(非托管)组件已开启成功。
以CoreDNS(托管)组件为例,如下图所示。
PrivateZone组件
登录PrivateZone控制台,通过ACK Serverless的VPC ID搜索权威Zone,如果能够搜到名称以集群ID结尾的Zone,则说明PrivateZone已开启成功。
如何确认业务Pod正在使用CoreDNS(托管)、CoreDNS(非托管)、PrivateZone组件?
CoreDNS(托管)和CoreDNS(非托管)组件
通过执行命令
kubectl exec
进入容器Pod中,执行命令cat /etc/resolv.conf
,如果nameserver
字段被指向到kube-system命名空间下的kube-dns服务的集群IP地址,说明该Pod正在使用CoreDNS(托管)或CoreDNS(非托管)组件。PrivateZone组件
通过执行命令
kubectl exec
进入容器Pod中,执行命令cat /etc/resolv.conf
,如果nameserver
字段被指向到100.100.2.136
和100.100.2.138
(此处IP为本文示例IP,具体指向的IP地址以实际为准),说明Pod正在使用PrivateZone组件。