to inspire confidence in somebody.

0%

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:

1
apiVersion: v1
2
kind: Pod
3
metadata:
4
  namespace: default
5
  name: dns-example
6
spec:
7
  containers:
8
    - name: test
9
      image: nginx
10
  dnsPolicy: "None"
11
  dnsConfig:
12
    nameservers:
13
      - 1.2.3.4
14
    searches:
15
      - ns1.svc.cluster.local
16
      - my.dns.search.suffix
17
    options:
18
      - name: ndots
19
        value: "2"
20
      - name: edns0

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

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

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

参考:

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