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配置虽然复杂,但还是很灵活啊。
参考: