C0reFast记事本

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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配置就如下:

1
2
3
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
Chen Fu wechat
新注册了公众号,同步更新,长按关注,可以第一时间收到推送