一. Pod 的 DNS 策略
- Default: 继承节点的 DNS 配置;
- ClusterFirst: 应用 coredns 作为 DNS 配置;
-
ClusterFirstWithHostNet:
- 当 Pod.spec.hostNetwork=true 时,Pod 的 DNS 策略被强制转换为 Default,即继承节点的 DNS 配置;
- 若 Pod 要应用 coredns 作为 DNS 配置,则需配置 pod.spec.dnsPolicy=ClusterFirstWithHostNet;
- None: 没有 DNS 配置;
若未指定 dnsPolicy,则默认 =ClusterFirst。
二. pod.spec.dnsPolicy=None
pod.spec.dnsPolicy=None 时,pod 中没有任何的 dns 配置;
此时必须在 spec 中配置 dnsConfig 配置,给 pod 提供自定义的 dns 配置:
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "uname -r && tail -f /dev/null"]
dnsPolicy: None
dnsConfig:
nameservers:
- 192.168.0.1
容器中能够看到,自定义的 dns 配置:
# kubectl exec -it test -c busybox -- sh
/ # cat /etc/resolv.conf
nameserver 192.168.0.1
/ # exit
三. pod.spec.dnsPolicy=Default
该模式下,pod 会继承节点的 dns 配置。
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "uname -r && tail -f /dev/null"]
dnsPolicy: Default
查看节点的 dns 配置:
# cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local
nameserver 8.8.8.8
options attempts:2
容器中能够看到,pod 的 dns 配置与节点的统一:
# cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local
nameserver 8.8.8.8
options attempts:2
四. pod.spec.dnsPolicy=ClusterFirst
若 pod 未显示指定 dnsPolicy,则默认 =ClusterFirst。
该模式下,pod 会应用 coredns 作为 pod 的 dns 配置。
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "uname -r && tail -f /dev/null"]
dnsPolicy: ClusterFirst
coredns 的 svc:
# kubectl get svc -A|grep dns
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 177d
容器中能够看到,pod 应用 coredns 作为 dns 配置:
# kubectl exec -it test -c busybox -- sh
/ #
/ # cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5
五. pod.spec.dnsPolicy=ClusterFirstWithHostNet
若 Pod 应用 hostNetwork,pod 的 ClusterFirst 会被强制转换为 Default,即继承宿主机的 dns 配置:
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "uname -r && tail -f /dev/null"]
dnsPolicy: ClusterFirst
hostNetwork: true
容器中的 dns 配置,与宿主机的统一:
# kubectl exec -it test -c busybox -- sh
/ # cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local
nameserver 8.8.8.8
options attempts:2
若 pod 应用 hostNetwork 时,依然应用 coredns 作为 dns 配置,则须要将 pod.spec.dnsPolicy 配置为 ClusterFirstWithHostNet:
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "uname -r && tail -f /dev/null"]
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true
容器中的 dns 配置,应用 coredns:
# kubectl exec -it test -c busybox -- sh
/ #
/ # cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5