Pod 的 DNS 策略
DNS 策略可以逐個 Pod 來設(shè)定。目前 Kubernetes 支持以下特定 Pod 的 DNS 策略茅撞。 這些策略可以在 Pod 規(guī)約中的 dnsPolicy
字段設(shè)置:
Default: Pod 從運(yùn)行所在的節(jié)點(diǎn)繼承名稱解析配置
ClusterFirst: 與配置的集群域后綴不匹配的任何 DNS 查詢(例如 "www.kubernetes.io") 都將轉(zhuǎn)發(fā)到從節(jié)點(diǎn)繼承的上游名稱服務(wù)器。集群管理員可能配置了額外的存根域和上游 DNS 服務(wù)器。
ClusterFirstWithHostNet:對于以 hostNetwork 方式運(yùn)行的 Pod,應(yīng)顯式設(shè)置其 DNS 策略 "`ClusterFirstWithHostNet`"守问。
None: 此設(shè)置允許 Pod 忽略 Kubernetes 環(huán)境中的 DNS 設(shè)置。Pod 會使用其 `dnsConfig` 字段 所提供的 DNS 設(shè)置坑资。
說明:** "Default" 不是默認(rèn)的 DNS 策略耗帕。如果未明確指定 `dnsPolicy`,則使用 "ClusterFirst"袱贮。
None(無策略)
清除 Pod 預(yù)設(shè) DNS 配置仿便,當(dāng) dnsPolicy 設(shè)置成為這個值之后, kubernetes 不會為 Pod 預(yù)先加載任何邏輯用于判定得到 DNS 的配置。因此若將 dnsPolicy 設(shè)置為 None , 為了避免 Pod 里面沒有 DNS 配置嗽仪,最好通過 dnsConfig 來描述自定義的 DNS 參數(shù)
#cat dns.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dns-none
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: dns
release: v1
template:
metadata:
labels:
app: dns
release: v1
env: test
spec:
containers:
- name: dns
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
dnsPolicy: None
dnsConfig:
nameservers:
- 10.65.4.17
searches:
- ns1.svc.cluster.local
- baidu.com
options:
- name: timeout
value: "2"
#kubectl apply -f dns.yml
#檢查POD DNS 配置
# kubectl exec -it dns-none-9585c8cc5-7l869 -n default -- cat /etc/resolv.conf
nameserver 10.65.4.17
search ns1.svc.cluster.local baidu.com
options timeout:2
默認(rèn)預(yù)設(shè) (Default)
Pod 里面的 DNS 配置繼承了宿主機(jī)上的 DNS 配置荒勇。即,該 Pod 的 DNS 配置與宿主機(jī)完全一致闻坚。
cat dns.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dns-none
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: dns
release: v1
template:
metadata:
labels:
app: dns
release: v1
env: test
spec:
containers:
- name: dns
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
dnsPolicy: Default
#kubectl apply -f dns.yml
#驗(yàn)證POD DNS 配置
# kubectl exec -it dns-none-84854bb9c-529vp -n default -- cat /etc/resolv.conf
nameserver 10.65.4.17
nameserver 223.5.5.5
search localdomain
#驗(yàn)證宿主機(jī)DNS配置
#cat /etc/resolv.conf
nameserver 10.65.4.17
nameserver 223.5.5.5
search localdomain
集群優(yōu)先 (ClusterFirst)
與 Default 相反沽翔,會預(yù)先使用 kube-dns (或 CoreDNS ) 的信息當(dāng)預(yù)設(shè)置參數(shù)寫入到該 Pod 內(nèi)的DNS配置。
# cat dns.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dns-none
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: dns
release: v1
template:
metadata:
labels:
app: dns
release: v1
env: test
spec:
containers:
- name: dns
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
dnsPolicy: ClusterFirst
# kubectl exec -it dns-none-56bb874bb8-59tcc -n default -- cat /etc/resolv.conf
nameserver 10.66.0.2
search default.svc.cluster.local svc.cluster.local cluster.local localdomain
options ndots:5
如設(shè)置了 hostNetwork = true 時窿凤,ClusterFirst 會被強(qiáng)制轉(zhuǎn)化為 Default
cat dns.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dns-none
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: dns
release: v1
template:
metadata:
labels:
app: dns
release: v1
env: test
spec:
hostnetwork: true
containers:
- name: dns
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
dnsPolicy: ClusterFirst
#kubectl apply -f dns.yml
#驗(yàn)證POD DNS 配置
# kubectl exec -it dns-none-89754bb9c-878ac -n default -- cat /etc/resolv.conf
nameserver 10.65.4.17
nameserver 223.5.5.5
search localdomain
#驗(yàn)證宿主機(jī)DNS配置
#cat /etc/resolv.conf
nameserver 10.65.4.17
nameserver 223.5.5.5
search localdomain
ClusterFirstWithHostNet (宿主機(jī)與 Kubernetes 共存 )
同時使用 hostNetwork 與 coredns 作為 Pod 預(yù)設(shè) DNS 配置仅偎。
cat dns.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dns-none
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: dns
release: v1
template:
metadata:
labels:
app: dns
release: v1
env: test
spec:
hostNetwork: true
containers:
- name: dns
image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
dnsPolicy: ClusterFirstWithHostNet
#kubectl apply -f dns,yml
#驗(yàn)證dns配置
#kubectl exec -it dns-none-86nn874ba8-57sar -n default -- cat /etc/resolv.conf
nameserver 10.66.0.2
search default.svc.cluster.local svc.cluster.local cluster.local localdomain
options ndots:5