本文介紹ACS叢集中的DNS服務原理,並針對不同情境介紹如何配置DNS策略。
背景資訊
ACS叢集預設不會部署DNS服務,您需要在建立叢集時選中CoreDNS。通過kube-dns的服務名暴露DNS服務。您可以執行以下命令查看kube-dns的服務詳情。關於建立叢集的具體操作,請參見建立ACS叢集。
kubectl get svc kube-dns -n kube-system預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 172.24.0.10 <none> 53/UDP,53/TCP,9153/TCP 27d叢集DNS網域名稱解析原理
ACS叢集中kubelet的啟動參數有--cluster-dns=<dns-service-ip>、--cluster-domain=<default-local-domain>,這兩個參數分別被用來設定叢集DNS伺服器的IP地址和主網域名稱尾碼。
Pod內的DNS網域名稱解析設定檔為/etc/resolv.conf,檔案內容如下。
nameserver xx.xx.0.10
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5參數 | 描述 |
nameserver | 定義DNS伺服器的IP地址。 |
search | 設定網域名稱的尋找尾碼規則,尋找配置越多,說明網域名稱解析尋找匹配次數越多。ACS叢集匹配有 |
options | 定義網域名稱解析設定檔選項,支援多個KV值。例如該參數設定成 |
根據上述Pod內的配置,叢集會將網域名稱請求(叢集內部定義的服務或是叢集外部網域名稱)查詢發往叢集DNS伺服器擷取結果。
叢集dnsPolicy配置和情境說明
ACS支援通過dnsPolicy欄位為每個Pod配置不同的DNS策略。目前ACS叢集支援以下三種策略:
ClusterFirst:通過CoreDNS來做網域名稱解析,Pod內/etc/resolv.conf配置的DNS服務地址是叢集DNS服務的kube-dns地址。該策略是叢集工作負載的預設策略。
None:忽略叢集DNS策略,需要您提供dnsConfig欄位來指定DNS配置資訊。
Default:Pod直接繼承叢集節點的網域名稱解析配置。即在ACS叢集直接使用ECS的/etc/resolv.conf檔案(檔案內配置的是阿里雲DNS服務)。
針對上述三種策略,本文列舉三種情境分別介紹如何配置dnsPolicy。
情境一:使用ACS叢集提供的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個搜尋域。 |
options | 可選的對象列表,其中每個對象可以具有name屬性(必需)和value屬性(可選)。此屬性中的內容將合并到從指定的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使用HostAliases配置容器Pod的/etc/hosts
當您希望在容器Pod內部解析某一網域名稱到固定IP地址時,可以在CoreDNS啟用hosts外掛程式,具體操作,請參見CoreDNS的擴充配置。
若您希望解析網域名稱到固定IP地址僅生效在某個容器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:
- 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
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。