服务发现DNS

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的流程如下。

image.png

链路

说明

客户端(Client Pod)访问上游服务(TargetService)时,会先从本地DNS域名解析配置文件(/etc/resolv.conf)中获取DNS服务器地址,再向DNS服务器地址发出域名解析请求,查询TargetService对应的目标IP地址。

在本方案中,DNS服务器地址为ACK Serverless集群kube-system命名空间下创建的名为kube-dns集群IP的IP地址。kube-dns的集群IP的后端由ACK Serverless集群负责动态维护更新,您无需关注。

image.png

客户端(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组件。

    image.png

  • 方式二:对于已创建的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的流程如下。

image.png

链路

说明

客户端(Client Pod)访问上游服务(TargetService)时,会先从本地DNS域名解析配置文件(/etc/resolv.conf)中获取DNS服务器地址,再向该DNS服务器地址发出域名解析请求,查询TargetService对应的目标IP地址。

在本方案中,DNS服务器地址为ACK Serverless集群kube-system命名空间的kube-dns集群IP的IP地址。

image.png

客户端(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组件。

    image.png

  • 方式二:对于已创建的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的流程如下。

image.png

链路

说明

PrivateZone控制器连接至APIServer,监听集群中服务的创建和更新事件。

PrivateZone控制器监听到服务的创建和更新事件后,将其同步至PrivateZone产品中权威Zone解析记录中。

客户端(Client Pod)访问上游服务(TargetService)时,会先从本地DNS域名解析配置文件(/etc/resolv.conf)中获取DNS服务器地址,再向该DNS服务器地址发出域名解析请求,查询TargetService对应的目标IP地址。

在本方案中,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组件。

    image.png

  • 方式二:对于已创建的ACK Serverless集群,您可以在eci-profile配置项中设置enablePrivateZone参数值为true,启用PrivateZone组件。

常见问题

如何确认当前集群CoreDNS(托管)、CoreDNS(非托管)、PrivateZone组件已成功开启?

  • CoreDNS(托管)和CoreDNS(非托管)组件

    登录容器服务管理控制台,在集群管理页面,选择运维管理 > 组件管理,单击网络页签,如果组件右上角有已安装字样,说明当前集群的CoreDNS(托管)或CoreDNS(非托管)组件已开启成功。

    以CoreDNS(托管)组件为例,如下图所示。

    image.png

  • 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.136100.100.2.138(此处IP为本文示例IP,具体指向的IP地址以实际为准),说明Pod正在使用PrivateZone组件。

相关文档