DNS
K8S 为服务(Service)和 Pods 创建 DNS 记录,这样可以使用 DNS 名称而非 IP 来访问服务。
K8S 负责调度 DNS pod (CoreDNS)和服务(Service),并通过 Kubelet 告知 容器使用 DNS 服务的 IP 来解析 DNS 名称。
01 技术原理
kubelet 会为每个 Pod 生成 /etc/resolv.conf (revolve 配置文件解析)文件,如下配置:
nameserver 10.32.0.10 # CoreDNS 地址# <namespace> 表示不同 namespace 的值不一样,如果是 default 名字空间,那么配置为# search default.svc.cluster.local svc.cluster.local cluster.localsearch <namespace>.svc.cluster.local svc.cluster.local cluster.local # 搜索列表,补全 hostnameoptions ndots:5
- 如果 Pod 查询 data,且 Pod 位于名字空间 test,那么默认会查询 data.test.svc.cluster.local。
- 如果 Pod 查询 api.prod,那么会先查询 api.prod.default.svc.cluster.local,然后再查询 api.prod.svc.cluster.local,这条记录会解析成功。
备注:
search 选项解析规则:
- 查询主机名,如果主机名不以
.结尾,就认为是主机名,就依次以 search 列表的每一项组成 FQDN来查询,未查询到,则使用主机名查询。 - 查询主机名,如果主机名中间有
.,就认为是FQDN,先用它来查询,查询失败,就把它当作主机名来查询,按照 search 里的每一项组成 FQDN 来查询。 - 查询主机名,如果主机名以
.结尾, 则认为是 FQDN,只用它来查询,不会按照 search 里的每一项组成 FQDN 来查询。
options ndots: 含义:
- 当域名的
.的个数小于 num,则先与 search 里的每一项组成 FQDN 进行查询。 - 当域名中
.的个数大于或者 num, 则先对域名本身进行查询,再与 search 里的每一项组成 FQDN 进行查询。
默认 Ubuntu 系统的 /etc/resolv.conf配置:
nameserver 127.0.0.53options edns0 trust-adsearch lan
如果是ping test 操作,实际域名会搜索: test.lan
02 哪些资源对象会有 DNS 记录
在 K8S 资源中,Services 和 Pods 资源会获取 DNS 记录。
