本文介紹如何針對不同的情境使用dnsPolicy欄位為叢集的Pod配置DNS策略,以及如何使用HostAliases
欄位在容器Pod內部解析網域名稱到固定IP地址。
前提條件
已建立ACK託管叢集或ACK Serverless叢集。具體操作,請參見建立ACK託管叢集、Container Service Serverless 版使用快速入門。
背景資訊
叢集DNS網域名稱解析原理詳情,請參見Kubernetes叢集中DNS網域名稱解析原理。
ACK叢集預設部署了一套CoreDNS工作負載,並通過kube-dns的服務名暴露DNS服務。ACK部署的CoreDNS工作負載後端是兩個名為coredns的Pod,叢集會根據Pod內的配置,將網域名稱請求發送至叢集DNS伺服器擷取結果。
可以執行以下命令查看kube-dns的服務詳情。
kubectl get svc kube-dns -n kube-system
可以執行以下命令查看CoreDNS的Pod的詳情。
kubectl get deployment coredns -n kube-system
使用dnsPolicy欄位為叢集的Pod配置DNS策略
ACK支援通過dnsPolicy欄位為每個Pod配置不同的DNS策略。目前ACK叢集支援四種策略:
ClusterFirst:這是預設的DNS策略,意味著當Pod需要進行網域名稱解析時,首先會查詢叢集內部的CoreDNS服務。通過CoreDNS來做網域名稱解析,表示Pod的/etc/resolv.conf檔案被自動設定指向kube-dns服務地址。
None:使用該策略,Kubernetes會忽略叢集的DNS策略。需要您提供dnsConfig欄位來指定DNS配置資訊,否則Pod可能無法正確解析任何網域名稱。
Default:Pod直接繼承叢集節點的網域名稱解析配置。即在ACK叢集直接使用ECS的/etc/resolv.conf檔案(檔案內配置的是阿里雲DNS服務)。
ClusterFirstWithHostNet:強制在hostNetwork網路模式下使用ClusterFirst策略(預設使用Default策略)。
針對上述四種策略,本文列舉四種情境分別介紹如何配置dnsPolicy。
情境一:使用ACK叢集提供的CoreDNS來做網域名稱解析
如需使用ACK叢集提供的CoreDNS來做網域名稱解析,可使用dnsPolicy: ClusterFirst
策略。樣本配置如下:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: ClusterFirst
情境二:Pod層面自訂DNS配置
當您需要給Deployment類型的工作負載指定DNS配置時,可使用dnsPolicy: None
策略。樣本配置如下:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
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個IP地址。當Pod的dnsPolicy設定為 |
searches | Pod中主機名稱尋找的DNS搜尋域列表。此屬性是可選的。指定後,提供的列表將合并到從所選DNS策略產生的基本搜尋網域名稱中,並重複資料刪除的網域名稱。Kubernetes最多允許6個搜尋域。 說明 當DNS Server不可達時,僅會嘗試第一個搜尋域。 |
options | 可選的對象列表,其中每個對象可以具有name屬性(必需)和value屬性(可選)。此屬性中的內容將合并到從指定的DNS策略產生的選項中,並重複資料刪除的條目。關於options更多詳細資料,請參見DNS解析及緩衝策略說明。 |
更多資訊,請參見Kubernetes官網的DNS配置說明。
情境三:採用阿里雲ECS的DNS配置
當您的應用Pod不需要訪問叢集內的其他服務,只需要通過阿里雲DNS來做解析,也不希望DNS解析經過CoreDNS,可以採用dnsPolicy: Default
策略。樣本配置如下:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: Default
情境四:在HostNetwork網路模式下訪問叢集服務
如果您的應用Pod使用hostNetwork:true來配置網路,Pod中啟動並執行應用程式可以直接看到宿主機的網路介面,其DNS策略預設為Default,不能訪問叢集內的服務。如果您希望在此網路模式下訪問叢集內服務,可使用dnsPolicy: ClusterFirstWithHostNet
策略。樣本配置如下:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
使用HostAliases
欄位在容器Pod內部解析網域名稱到固定IP地址
在容器Pod內部解析網域名稱到固定IP地址有如下兩種方法:
全域配置(影響整個叢集中所有Pod對特定網域名稱的解析結果):當您希望在容器Pod內部解析某一網域名稱到固定IP地址時,可以在CoreDNS啟用hosts外掛程式,具體操作,請參見CoreDNS的擴充配置。
針對單個Pod的配置:若您希望僅在某個容器Pod內部解析網域名稱到固定IP地址生效,您可以通過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: - name: cat-hosts image: busybox:1.28 command: - cat args: - "/etc/hosts"
當為Pod的spec欄位中增加
hostAliases
欄位後,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
可以看到,foo.local、bar.local、foo.remote網域名稱都已經綁定到固定的IP。
相關文檔
關於更多DNS配置調優操作,請參見DNS最佳實務。
如需瞭解DNS解析及緩衝策略,請參見DNS解析及緩衝策略說明。