全部產品
Search
文件中心

Container Compute Service:DNS原理和配置說明

更新時間:Dec 11, 2024

本文介紹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叢集匹配有kube-system.svc.cluster.localsvc.cluster.localcluster.local3個尾碼,最多進行4次查詢才能得到正確解析結果。

options

定義網域名稱解析設定檔選項,支援多個KV值。例如該參數設定成ndots:5,說明如果訪問的網域名稱字串內的點字元數量超過ndots值,則認為是完整網域名稱,並被直接解析;如果不足ndots值,則追加search段尾碼再進行查詢。

根據上述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設定為None時,列表必須至少包含一個IP地址,否則此屬性是可選的。列出的DNS的IP列表將合并到基於dnsPolicy產生的網域名稱解析檔案的nameserver欄位中,並重複資料刪除的地址。

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。