一. 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: v1kind: Podmetadata:  name: testspec:  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.confnameserver 192.168.0.1/ # exit

三. pod.spec.dnsPolicy=Default

该模式下,pod会继承节点的dns配置。

apiVersion: v1kind: Podmetadata:  name: testspec:  containers:    - name: busybox      image: busybox      command: ["/bin/sh", "-c", "uname -r && tail -f /dev/null"]  dnsPolicy: Default

查看节点的dns配置:

# cat /etc/resolv.confsearch default.svc.cluster.local svc.cluster.localnameserver 8.8.8.8options attempts:2

容器中能够看到,pod的dns配置与节点的统一:

# cat /etc/resolv.confsearch default.svc.cluster.local svc.cluster.localnameserver 8.8.8.8options attempts:2

四. pod.spec.dnsPolicy=ClusterFirst

若pod未显示指定dnsPolicy,则默认=ClusterFirst。
该模式下,pod会应用coredns作为pod的dns配置。

apiVersion: v1kind: Podmetadata:  name: testspec:  containers:    - name: busybox      image: busybox      command: ["/bin/sh", "-c", "uname -r && tail -f /dev/null"]  dnsPolicy: ClusterFirst

coredns的svc:

# kubectl get svc -A|grep dnskube-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.confsearch default.svc.cluster.local svc.cluster.local cluster.localnameserver 10.96.0.10options ndots:5

五. pod.spec.dnsPolicy=ClusterFirstWithHostNet

若Pod应用hostNetwork,pod的ClusterFirst会被强制转换为Default,即继承宿主机的dns配置:

apiVersion: v1kind: Podmetadata:  name: testspec:  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.confsearch default.svc.cluster.local svc.cluster.localnameserver 8.8.8.8options attempts:2

若pod应用hostNetwork时,依然应用coredns作为dns配置,则须要将pod.spec.dnsPolicy配置为ClusterFirstWithHostNet:

apiVersion: v1kind: Podmetadata:  name: testspec:  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.confsearch default.svc.cluster.local svc.cluster.local cluster.localnameserver 10.96.0.10options ndots:5