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.daliqc.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.daliqc.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.daliqc.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.daliqc.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.daliqc.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。
如下圖所示: