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