Kubernetes Pod dnsPolicy 配置

在Kubernetes中,可以针对每个Pod设置DNS的策略,通过PodSpec下的dnsPolicy字段可以指定相应的策略,目前支持的策略如下:

  • Default“: Pod继承所在宿主机的设置,也就是直接将宿主机的/etc/resolv.conf内容挂载到容器中。
  • ClusterFirst“: 默认的配置,所有请求会优先在集群所在域查询,如果没有才会转发到上游DNS。
  • ClusterFirstWithHostNet“: 和ClusterFirst一样,不过是Pod运行在hostNetwork:true的情况下强制指定的。
  • None“: 1.9版本引入的一个新值,这个配置忽略所有配置,以Pod的dnsConfig字段为准。

为什么会想起找一下dnsPolicy的文档呢,也是因为Pod里默认使用了ClusterFirst策略,导致经常有DNS请求出现timeout问题,想用一个简单的办法继承宿主机的配置,现在看来比较简单了,直接设置dnsPolicy:Default就可以了。

针对上面说的dnsConfig字段,也有个详细的说明:

dnsConfig字段包括下面几个属性:

  • nameservers: DNS Server的列表,最多3个IP/
  • searches: search域名列表,也就是/etc/resolv.conf中的search字段的配置,最多配置6个
  • options: u选项列表,也就是/etc/resolv.conf中的option字段的配置

一个测试的yaml:

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 1.2.3.4
    searches:
      - ns1.svc.cluster.local
      - my.dns.search.suffix
    options:
      - name: ndots
        value: "2"
      - name: edns0

最后Pod中的/etc/resolv.conf配置就如下:

nameserver 1.2.3.4
search ns1.svc.cluster.local my.dns.search.suffix
options ndots:2 edns0

所以,Kubernetes配置虽然复杂,但还是很灵活啊。

参考:

  1. https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy