k8s进阶9-DNS策略
k8s进阶9-DNS策略
在Kubernetes 中,有4种 DNS 策略
1 None
表示空的DNS设置
这种方式一般用于想要自定义 DNS 配置的场景,而且,往往需要和 dnsConfig 配合一起使用达到自定义 DNS 的目的。
2 Default
有人说 Default 的方式,是使用宿主机的方式,这种说法并不准确。
这种方式,其实是,让 kubelet 来决定使用何种 DNS 策略。而 kubelet 默认的方式,就是使用宿主机的 /etc/resolv.conf(可能这就是有人说使用宿主机的DNS策略的方式吧),但是,kubelet 是可以灵活来配置使用什么文件来进行DNS策略的,我们完全可以使用 kubelet 的参数:–resolv-conf=/etc/resolv.conf 来决定你的DNS解析文件地址。
3 ClusterFirst【默认使用策略】
这种方式,表示 POD 内的 DNS 使用集群中配置的 DNS 服务,简单来说,就是使用 Kubernetes 中 kubedns 或 coredns 服务进行域名解析。如果解析不成功,才会使用宿主机的 DNS 配置进行解析。
4 ClusterFirstWithHostNet
在某些场景下,我们的 POD 是用 HOST 模式启动的(HOST模式,是共享宿主机网络的),一旦用 HOST 模式,表示这个 POD 中的所有容器,都要使用宿主机的 /etc/resolv.conf 配置进行DNS查询,但如果你想使用了 HOST 模式,还继续使用 Kubernetes 的DNS服务,那就将 dnsPolicy 设置为 ClusterFirstWithHostNet。
这几种DNS策略,需要在Pod,或者Deployment、RC等资源中,设置 dnsPolicy 即可
5、结论
通过故障原因的分析,我们可以知道该故障比较好的解决办法,就是在deployment中去设置dnsPolicy,在不影响集群内服务直接调用的情况下,把ndots从默认的5修改成了2,使代理服务pod在访问server端域名的时候dns解析直接走绝对域名,这样就会避免走 search 域进行匹配,可以正确匹配到ip地址。通过此次故障也让我知其然知其所以然,在排查故障的过程中,需要去了解背后涉及到的知识点和根本原因。
6 写法
dnsPolicy: ClusterFirstWithHostNet
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
- 感谢你赐予我前进的力量