乐趣区

关于kubernetes:kubernetes-Pod的DNS策略

一. 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
退出移动版