Pod 的四种DNS策略
Kubernetes支持Pod维度DNS策略设置,通过pod规约中dnsPolicy字段设置,最终配置落到 /etc/resolv.conf文件中,也就说k8s最终还是通过设置Pod容器中/etc/resolv.conf 文件来做设置解析配置,跟普通的虚拟机或者实体机是一样,因为Pod容器本身就一个小的主机。
1.ClusterFirst(默认DNS策略)
采用集群DNS,与配置的集群域后缀不匹配的任何 DNS 查询 都将转发到从节点继承的上游名称服务器。简单来说,就是使用 Kubernetes 中 kubedns 或 coredns 服务进行域名解析,如果解析不成功,才会使用宿主机的 DNS 配置进行解析。
example容器/etc/resolv.conf
search test.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5
options ndots:5 代表当待解析域名包含.大于等于5时就会先解析域名,只有域名解析不成功时才会继续匹配serach域或domain域
访问test名字空间下example-svc服务,可以直接通过example-svc访问,会与search域组合,最终组合成example-svc.test.svc.cluster.local,访问test1名字空间下example-svc1,通过example-svc.test1,会与search域组合,最终组合成example-svc.test1.svc.cluster.local
设置search域主要还是为了方便k8s内部服务之间访问
2.None
自定义DNS策略,设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置,Pod 会使用其 dnsConfig 字段 所提供的 DNS 设置。
用户可以在 dnsConfig 字段中指定以下属性:
nameservers:将用作于 Pod 的 DNS 服务器的 IP 地址列表。 最多可以指定 3 个 IP 地址。当 Pod 的 dnsPolicy 设置为 "None" 时, 列表必须至少包含一个 IP 地址,否则此属性是可选的。 所列出的服务器将合并到从指定的 DNS 策略生成的基本名称服务器,并删除重复的地址。
searches:用于在 Pod 中查找主机名的 DNS 搜索域的列表。此属性是可选的。 指定此属性时,所提供的列表将合并到根据所选 DNS 策略生成的基本搜索域名中。 重复的域名将被删除。Kubernetes 最多允许 6 个搜索域。
options:可选的对象列表,其中每个对象可能具有 name 属性(必需)和 value 属性(可选)。 此属性中的内容将合并到从指定的 DNS 策略生成的选项。 重复的条目将被删除。
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-domain.example
- my.dns.search.suffix
options:
- name: ndots
value: "2"
- name: edns0
创建上面的 Pod 后,容器 test 会在其 /etc/resolv.conf 文件中获取以下内容:
nameserver 1.2.3.4
search ns1.svc.cluster-domain.example my.dns.search.suffix
options ndots:2 edns0
dnsConfig 是可选的,可以与任何dnsPolicyjie设置一起使用,当一起使用的时候,会进行合并,dnsPolicy优先级更高
3.Default
Pod 从运行所在的节点继承名称解析配置,即跟所在节点主机一致
4.ClusterFirstWithHostNet
对于以 hostNetwork 方式运行的 Pod,应显式设置其 DNS 策略 为"ClusterFirstWithHostNet"
k8s新版本集群DNS服务是默认采用CoreDNS组件实现,1.13版本之前是采用Kube-dns
通过HostAliases 向 Pod /etc/hosts 文件添加条目
当 DNS 配置以及其它选项不合理的时候,通过向 Pod 的 /etc/hosts 文件中添加条目, 可以在 Pod 级别覆盖对主机名的解析。你可以通过 PodSpec 的 HostAliases 字段来添加这些自定义条目.
apiVersion: v1
kind: Pod
metadata:
name: hostaliases-pod
spec:
restartPolicy: Never
hostAliases:
- ip: "127.0.0.1"
hostnames:
- "foo.local"
- "bar.local"
- ip: "10.1.2.3"
hostnames:
- "foo.remote"
- "bar.remote"
containers:
- name: cat-hosts
image: busybox
command:
- cat
args:
- "/etc/hosts"
pod打印/etc/hosts文件,多了以下内容
#Entries added by HostAliases.
127.0.0.1 foo.local bar.local
10.1.2.3 foo.remote bar.remote
避免手动去修改/etc/hosts文件,通过HostAliases进行修改,因为该文件由 Kubelet 管理,并且 可以在 Pod 创建/重启过程中被重写