Pod的DNS解析行为
Kubernetes以Pod为最小可创建、管理、部署单元,Pod内部包含一个或一组共享namespace和cgroup的紧密关联的容器。容器内部的DNS解析行为与Pod的DNS解析行为概念上是对等的。
Pod中的DNS查询行为直接受Pod的/etc/resolv.conf配置文件的影响,Kubelet在拉起Pod时,会根据Pod规约中dnsPolicy的配置为Pod生成/etc/resolv.conf配置。
默认情况下,Pod的dnsPolicy设置为clusterFirst, Pod的/etc/resolv.conf值类似:
nameserver 172.20.0.10
search <namespace>.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
各字段解释如下:
- nameserver : 域名解析服务器
- search : 域名查找后缀规则,会在
<namespace>.svc.cluster.local svc.cluster.local cluster.local
三个域中搜索匹配的记录 - options : 域名解析选项,KV值格式,典型的有ndots,表示解析的域名字符串内的点字符数量超过ndots值,则认为是完整域名,直接解析,如不足,则追加.svc.cluster.local后缀
默认情况下, nameserver值为云容器引擎内置的CoreDNS service ClusterIP, Kubernetes在CoreDNS中为普通Service赋予一个形如 my-svc.my-namespace.svc.cluster-domain.example
的DNS A记录,该名称会解析成Service对应的clusterIP。
Pod访问集群内部Service域名时,根据域名后缀规则依次查询Service名称,获得Service对应的ClusterIP。 Pod访问集群外部域名时,根据Pod规约的dnsPolicy值不同,使用Pod所在节点配置的DNS或者使用CoreDNS所在节点的配置DNS服务器进行解析。
Pod的DNS配置策略
Kubernetes支持以下特定Pod的DNS策略,这些策略由Pod规约中的dnsPolicy字段设置:
- "Default" : Pod继承其所在的节点的/etc/resolv.conf名称解析配置,域名解析行为与节点完全一致
- "ClusterFirst" : Pod规约中默认采用此配置,通过此配置Pod可以通过云容器引擎的提供的CoreDNS服务解析Service名称。任何与集群域后缀不匹配的任何DNS查询(例如 "www.kubernetes.io")由CoreDNS转发给其所在控制面节点中/etc/resolv.conf文件中记录的上游DNS服务器去解析。不过,若是以hostNetwork方式运行的Pod将其dnsPolicy设置为了ClusterFirst, 则dnsPolicy会强制从ClusterFirst转换成Default
- "ClusterFirstWithHostNet": 适用于以hostNetwork方式运行的Pod,将其DNS策略显式设置为"ClusterFirstWithHostNet"时可同时使用CoreDNS解析集群内部Service名称,又能使用节点的DNS服务解析非Service名称
- "None": Pod将忽略Kubernetes环境中的DNS设置,避免Pod里面没有配置任何DNS,建议在Pod规约中配置dnsConfig字段来为Pod提供域名解析服务
Pod的DNS应用案例
案例一:完全采用自定义的DNS服务器为Pod提供域名解析服务
要求自定义的DNS服务器能同时解析Kubernetes Service域名和外部域名,自定义服务器要能满足Kubernetes管理Service域名的需求。
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
dnsPolicy: "None"
dnsConfig:
nameservers:
- 100.95.0.1
searches:
- ns1.svc.cluster.local
- my.dns.search.suffix
options:
- name: ndots
value: "3"
案例二:采用CoreDNS作为域名解析服务器
Pod将使用CoreDNS解析Service域名,非Service域名转由CoreDNS的上游DNS服务器解析。
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
dnsPolicy: ClusterFirst
案例三:直接采用节点的DNS作为域名解析
Pod将使用节点的DNS解析所有域名,适合Pod只访问公网域名的应用场景。
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
dnsPolicy: Default
案例四:采用HostNet的DNS解析
如果在Pod中使用hostNetwork:true模式运行时,Pod将直接使用宿主机的网络名称空间,Pod可以访问Service域名,也可以使用Pod所在节点的DNS解析公网域名。
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true