6.3.4 服务发现方式:DNS
创建Service资源对象时,ClusterDNS会为它自动创建资源记录用于名称解析和服务注册,于是,Pod资源可直接使用标准的DNS名称来访问这些Service资源。每个Service对象相关的DNS记录包含如下两个:
{SVCNAME}.{NAMESPACE}.{CLUSTER_DOMAIN}
{SVCNAME}.{NAMESPACE}.svc.{CLUSTER_DOMAIN}
另外,在前面第2章的部署参数中,“--cluster-dns”指定了集群DNS服务的工作地址,“--cluster-domain”定义了集群使用的本地域名,因此,系统初始化时默认会将“cluster.local”和主机所在的域“ilinux.io”作为DNS的本地域使用,这些信息会在Pod创建时以DNS配置的相关信息注入它的/etc/resolv.conf配置文件中。例如,在此前创建的用于交互式Pod资源的客户端中查看其配置,命令如下:
**[terminal]
**[delimiter / # ]**[command cat /etc/resolv.conf]
nameserver 169.254.25.10
search default.svc.cluster.local svc.cluster.local cluster.local ilinux.io
options ndots:5
上述search参数中指定的DNS各搜索域,是以次序指定的几个域名后缀,具体如下所示:
{NAMESPACE}.svc.{CLUSTER_DOMAIN}
:如default.svc.cluster.localsvc.{CLUSTER_DOMAIN}
:如svc.cluster.local{CLUSTER_DOMAIN}
:如cluster.local{WORK_NODE_DOMAIN}
:如ilinux.io
例如,在此之前创建的用于交互式Po客户端中尝试请求解析myapp-svc的相关DNS记录:
**[terminal]
**[delimiter / # ]**[command nslookup myapp-svc.default]
nslookup: can't resolve '(null)': Name does not resolve
Name: myapp-svc.default
Address 1: 10.233.16.105 myapp-svc.default.svc.cluster.local
解析时,“myapp-svc”服务名称的搜索次序依次是default.svc.cluster.local、svc.cluster.local、cluster.local和ilinux.io,因此基于DNS的服务发现不受Service资源所在的名称空间和创建时间的限制。上面的解析结果也正是默认的default名称空间中创建的myapp-svc服务的IP地址。