DNS策略概述
可以为Pod设置DNS解析策略,目前Kubernetes支持Default、ClusterFirst、ClusterFirstWithHostNet和None四种DNS策略,可通过Pod的dnsPolicy字段指定:
- ClusterFirst:是Pod的默认DNS策略,任何与集群域后缀不匹配的DNS查询均会转发到上游DNS服务器。上游DNS服务器默认取自节点的resolv.conf,集群管理员可配置了额外的存根域和上游DNS服务;
- Default:此策略下,名称解析配置将从Pod所在节点继承,自定义存根域和上游域名服务不能够与该策略一起使用;
- ClusterFirstWithHostNet:使用hostNetwork的Pod需指定为ClusterFirstWithHostNet,否则其默认的ClusterFirst策略会退化为Default;
- None:使用次策略的Pod,其DNS配置取自Pod的dnsConfig定义。
DNS策略配置示例
根据不同使用场景,DNS策略配置示例如下:
使用容器集群提供的CoreDNS来做域名解析
针对这种场景,可使用ClusterFirst策略,示例配置如下:
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
namespace: default
spec:
containers:
- image: registry-vpc-gzsyj.crs.ctyun.cn:30015/library/nginx-photon:v1.8.6
name: demo
dnsPolicy: ClusterFirst
Pod层面自定义DNS配置
若需要给工作负载指定DNS配置时,可使用None策略,并配置dnsConfig,示例配置如下:
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
namespace: default
spec:
containers:
- image: registry-vpc-gzsyj.crs.ctyun.cn:30015/library/nginx-photon:v1.8.6
name: demo
dnsPolicy: None
dnsConfig:
nameservers: ["169.254.xx.xx"]
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "2"
其中,dnsConfig中的参数说明如下:
参数
描述
nameservers
将用作Pod的DNS服务IP地址列表,最多可以指定3个地址。当Pod的dnsPolicy设置为None时,列表必须至少包含一个IP地址。列出的DNS的IP列表将合并到基于dnsPolicy生成的域名解析文件的nameserver字段中,并删除重复的地址。
searches
Pod中主机名查找的DNS搜索域列表,此属性是可选的。指定后,提供的列表将合并到从所选DNS策略生成的基本搜索域名中,并删除重复的域名。Kubernetes最多允许6个搜索域。
options
可选的对象列表,其中每个对象可以具有name属性(必需)和value属性(可选)。此属性中的内容将合并到从指定的DNS策略生成的选项中,并删除重复的条目。
采用天翼云主机的DNS配置
当Pod不需要访问集群内的其他服务,只需要通过云主机DNS来做解析,也不希望DNS解析经过CoreDNS,可以采用Default策略,示例配置如下:
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
namespace: default
spec:
containers:
- image: registry-vpc-gzsyj.crs.ctyun.cn:30015/library/nginx-photon:v1.8.6
name: demo
imagePullPolicy: Always
name: alpine
dnsPolicy: Default
在HostNetwork网络模式下访问集群服务
当Pod使用hostNetwork作为容器网络,此时若需解析集群内Service域名,可使用ClusterFirstWithHostNet策略,示例配置如下:
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
namespace: default
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- image: registry-vpc-gzsyj.crs.ctyun.cn:30015/library/nginx-photon:v1.8.6
name: demo
使用HostAliases配置容器Pod的/etc/hosts
当需要配置Pod的静态域名解析,可声明HostAliases字段,以修改Pod内/etc/hosts,示例配置如下:
apiVersion: v1
kind: Pod
metadata:
name: hostaliases-pod
spec:
hostAliases:
- ip: "127.0.**.**"
hostnames:
- "foo.local"
- "bar.local"
- ip: "10.1.**.**"
hostnames:
- "foo.remote"
containers:
- image: registry-vpc-gzsyj.crs.ctyun.cn:30015/library/nginx-photon:v1.8.6
name: demo
command:
- cat
args:
- "/etc/hosts"
Pod启动后,/etc/hosts文件会被添加如下内容:
# Kubernetes-managed hosts file.
127.0.**.** localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
10.200.**.** hostaliases-pod
# Entries added by HostAliases.
127.0.**.** foo.local bar.local
10.1.**.** foo.remote bar.remote
DNS解析请求流程
若未配置存根域,没有匹配集群域名后缀的任何请求,将转发到节点的上游域名服务器。
若已配置存根域和上游DNS服务器,DNS查询将基于下面的流程进行路由:
- 查询coredns中的DNS缓存层;
- 在缓存层,检查请求后缀,根据下面情况转发到对应DNS:
带有集群后缀的域名,例如.cluster.local,请求被发送到Coredns;
带有存根域后缀的域名,例如.test.local,请求被转发到配置的自定义DNS解析器;
其它域名解析请求则被转发到上游DNS。
如下图所示: