容器中域名解析流程以及不同 dnsPolicy 对域名解析影响
本文分享自华为云社区《容器中域名解析流程以及不同dnsPolicy对域名解析影响》,作者:可以交个朋友 。
一、coreDNS 背景
部署在 kubernetes 集群中的容器业务通过 coreDNS 服务解析域名,Coredns 基于 caddy 框架,将整个 CoreDNS 服务都建立在一个使用 Go 编写的 HTTP/2 Web 服务器 Caddy 上。通过插件化(链)架构,以预配置的方式(configmap 卷挂载内容配置)选择需要的插件编译,按序执行插件链上的逻辑,通过四种方式(TCP、UDP、gRPC 和 HTTPS)对外直接提供 DNS 服务。
二、kubelet 通过修改容器/etc/resolv.conf 文件使得容器中可解析域名
在 kubernetes 集群中,coreDNS 服务和 kube-apiserver 通信获取 clusterip 和 serviceName 的映射关系,并且 coreDNS 本身通过 clusterip(默认 xx.xx.3.10,比如集群 clusterip 网段为 10.247.x.x,则 coreDNS 对外暴露服务的 clusterip 为 10.247.3.10),我们知道操作系统域名服务器关键配置文件/etc/resolv.conf 中的 nameserver 字段指定,所以只需要使得容器/etc/resolv.conf 中 nameserver 字段配置为 coreDNS 的 clusterip 地址即可。
那么谁来完成容器/etc/resolv.conf 的修改和如何修改?kubelet 负责拉起容器,启动参数中--cluster-dns 字段对应值就是该集群 coreDNS 的 clusterip 地址,kubelet 在拉起容器中,根据 Pod 的 dnsPolicy 选项,把该值修改注入到容器中。
三、Pod 不同 dnsPolicy 对容器/etc/resolv.conf 的影响
Default:如果 dnsPolicy 被设置为“Default”,则名称解析 nameserver 配置将从 pod 运行的节点/etc/resolv.conf 继承。
ClusterFirst:如果 dnsPolicy 被设置为“ClusterFirst”,则使用集群 coredns 的 service 地址作为 Pod 内/etc/resolv.conf 中 nameserver 配置。
ClusterFirstWithHostNet:对于使用 hostNetwork 网络模式运行的 Pod,需明确设置其 DNS 策略“ClusterFirstWithHostNet”,否则 hostNetwork + ClusterFirst 实际效果 = Default
None:它允许用户自定义 Pod 内/etc/resolv.conf 配置,忽略 Kubernetes 环境中默认的 DNS 设置。应使用 dnsConfigPod 规范中的字段提供所有 DNS 设置 。
/etc/resolv.conf 相关配置说明
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/ca9001fd2a9115713982f9a79】。文章转载请联系作者。
评论