IBM Cloud Docs
設定群集 DNS 提供者

設定群集 DNS 提供者

IBM Cloud® Kubernetes Service 叢集裡的每一個服務都會獲指派一個「網域名稱系統 (DNS)」名稱,叢集 DNS 提供者登錄此名稱來解析 DNS 要求。 如需有關服務和 Pod 的 DNS 的詳細資訊,請參閱 Kubernetes 文件

叢集 DNS 提供者是 核心DNS,這是一個通用的權威 DNS 伺服器,提供向後相容但可擴展的集成Kubernetes。 由於 CoreDNS 是單一執行檔和單一進程,因此相較於其他群集 DNS 提供者,它有較少的相依性和會發生問題的移動零件。 此外,該專案的撰寫語言與 Kubernetes 專案相同,都是 Go,這有助於保護記憶體。 最後,與其他群集 DNS 提供者相比,CoreDNS 支援更彈性的使用個案,因為您可以建立自訂 DNS 項目,例如 CoreDNS 文件中的常見設定。

自動調整叢集 DNS 提供者

預設情況下,CoreDNS 包含一個部署,可根據群集內 Worker 節點和核心的數量自動擴充 CoreDNS Pod。 您可以透過編輯 CoreDNS autoscaling ConfigMap 來微調 CoreDNS autoscaler 參數。 例如,如果您的應用程式大量使用群集 DNS 提供者,您可能需要增加 CoreDNS pod 的最小數量,以支援應用程式。 如需詳細資訊,請參閱 Kubernetes 文件

開始之前:登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  1. 驗證 CoreDNS autoscaler 部署是否可用。 在 CLI 輸出中,驗證有一個部署 AVAILABLE(可用)。

    kubectl get deployment -n kube-system coredns-autoscaler
    

    輸出範例

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    coredns-autoscaler   1/1     1            1           69d
    
  2. 編輯 CoreDNS autoscaler 的預設設定。 尋找 data.linear 欄位,其預設為每 16 個工作者節點或 256 個核心有一個 CoreDNS Pod,且至少有兩個 CoreDNS Pod,而不論叢集大小 (preventSinglePointFailure: true)。如需相關資訊,請參閱 Kubernetes 文件

    kubectl edit configmap -n kube-system coredns-autoscaler
    

    輸出範例

    apiVersion: v1
    data:
      linear: '{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true}'
    kind: ConfigMap
    metadata:
    ...
    

自訂叢集 DNS 提供者

您可以透過編輯 CoreDNS ConfigMap 自訂 CoreDNS。 例如,您可能想要設定存根網域和上游 DNS 伺服器,以解析指向外部主機的服務。 此外,您可以在 CoreDNS ConfigMap 內設定多個 Corefile。 如需詳細資訊,請參閱 Kubernetes 文件

NodeLocal DNS 快取依賴 CoreDNS 來維護 DNS 解析的快取。 將適用的 NodeLocal DNS 快取和 CoreDNS 配置 (例如 Stub 網域) 保持相同,以維護 DNS 解析一致性。

開始之前:登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  1. 驗證有 CoreDNS 部署可供使用。 在 CLI 輸出中,驗證有一個部署 AVAILABLE(可用)。

    kubectl get deployment -n kube-system coredns
    

    輸出範例

    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    coredns   3/3     3            3           69d
    
  2. 編輯 CoreDNS ConfigMap 的預設值。 在 ConfigMap 的 data 部分使用 Corefile 自訂存根網域和上游 DNS 伺服器。 如需詳細資訊,請參閱 Kubernetes 文件

    CoreDNS proxy 外掛程式已淘汰,並取代為 forward 外掛程式。 如果您更新CoreDNSConfigMap,確保更換全部 proxy 實例與 forward

    kubectl edit configmap -n kube-system coredns
    

    CoreDNS 範例輸出

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: coredns
    namespace: kube-system
      data:
        Corefile: |
          import <MyCorefile>
          .:53 {
              errors
              health {
                lameduck 10s
              }
              ready
              kubernetes cluster.local in-addr.arpa ip6.arpa {
                 pods insecure
                 fallthrough in-addr.arpa ip6.arpa
                 ttl 30
              }
              prometheus :9153
              forward . /etc/resolv.conf {
                  max_concurrent 1000
              }
              cache 30 {
                  disable success cluster.local
                  disable denial cluster.local
              }
              loop
              reload
              loadbalance
          }
        <MyCorefile>: |
          abc.com:53 {
            errors
            cache 30
            loop
            forward . 1.2.3.4
            }
    
  3. 選用項目:將自訂 Corefile 新增至 CoreDNS ConfigMap。 在以下範例中,請將 import <MyCoreFile> 包含在 data.Corefile 區段中,並使用您自訂的 Corefile 資訊完成 data.<MyCorefile> 區段。 如需詳細資訊,請參閱 Corefile 匯入說明文件

    CoreDNS proxy 外掛程式已淘汰,並取代為 forward 外掛程式。 如果您更新CoreDNSConfigMap,確保更換全部 proxy 實例與 forward

    kubectl edit configmap -n kube-system coredns
    

    自訂 Corefile 範例輸出

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns
      namespace: kube-system
    data:
      Corefile: |
        import <MyCorefile>
        .:53 {
            errors
            health
            kubernetes cluster.local in-addr.arpa ip6.arpa {
               pods insecure
               upstream 172.16.0.1
               fallthrough in-addr.arpa ip6.arpa
            }
            prometheus :9153
            forward . /etc/resolv.conf {
                max_concurrent 1000
            }
            cache 30 {
                disable success cluster.local
                disable denial cluster.local
            }
            loop
            reload
            loadbalance
        }
      <MyCorefile>: |
        abc.com:53 {
          errors
          cache 30
          loop
          forward . 1.2.3.4
        }
    
  4. 在幾分鐘之後,CoreDNS Pod 會挑選 ConfigMap 變更。

設定 NodeLocal DNS 快取

在選擇的工作節點上設定 NodeLocal DNS 快取代理,以改善 IBM Cloud Kubernetes Service 集群的集群 DNS 效能和可用性。 如需詳細資訊,請參閱 Kubernetes docs

預設情況下,使用 ClusterFirst DNS 政策的 Pod 的群集 DNS 請求會傳送至群集 DNS 服務。 如果在 Worker 節點上啟用 NodeLocal DNS 快取,這些 Pod 在 Worker 節點上的群集 DNS 請求就會改為傳送至本機 DNS 快取,本機 DNS 快取會在連結本機 IP 位址 169.254.20.10 上監聽。 DNS 快取也會在 kube-system 名稱空間中 kube-dns 服務的叢集 IP 上接聽。

當您已在叢集裡使用 區域感知 DNS 時,請不要新增 DNS 快取標籤。 此外,NodeLocal DNS 快取會根據 CoreDNS 來維護 DNS 解析的快取。 將適用的 NodeLocal DNS 快取和 CoreDNS 配置 (例如 Stub 網域) 保持相同,以維護 DNS 解析一致性。

在執行 Kubernetes 1.18 或更新版本的叢集裡,NodeLocal DNS 快取已正式發行,但依預設仍會停用。

啟用 NodeLocal DNS 快取

為 Kubernetes 叢集裡的一個以上工作者節點啟用 NodeLocal DNS 快取。

下列步驟將更新在特定工作者節點上執行的 DNS Pod。 您也可以為工作者節點儲存區加上標籤,以便未來的節點繼承該標籤。

在開始之前,請更新任何受此功能影響的 DNS 出口網路政策,例如依賴 pod 或命名空間選擇器進行 DNS 出口的政策。

kubectl get networkpolicy --all-namespaces -o yaml
  1. 登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  2. 如果你 為 CoreDNS 客製化存根域和上游 DNS 伺服器,你還必須 客製化 NodeLocal DNS快取 與這些存根域和上游 DNS 伺服器。

  3. 列出叢集裡的節點。 NodeLocal DNS 快取代理程式 Pod 是在每個節點上執行的常駐程式集的一部分。

    kubectl get nodes
    
  4. 新增 ibm-cloud.kubernetes.io/node-local-dns-enabled=true 標籤至工作者節點。 該標籤可在工作者節點上啟動 DNS 快取代理程式 Pod。

    1. 將標籤新增至一或多個工作者節點。

    2. 藉由檢查 NODE-LOCAL-DNS-ENABLED 欄位是否設定為 true,驗證節點是否具有標籤。

      kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
      

      輸出範例

      NAME          STATUS                      ROLES    AGE   VERSION       NODE-LOCAL-DNS-ENABLED
      10.xxx.xx.xxx Ready,SchedulingDisabled    <none>   28h   v1.32+IKS   true
      
    3. 驗證 DNS 快取代理程式 Pod 是否在工作者節點上執行。

      kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
      

      輸出範例

      NAME                   READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
      node-local-dns-pvnjn   1/1     Running   0          1m    10.xxx.xx.xxx   10.xxx.xx.xxx  <none>           <none>
      
  5. 對每個工作者節點重複先前的步驟以啟用 DNS 快取。

停用 NodeLocal DNS 快取

您可以停用一個或多個工作節點的 NodeLocal DNS 快取。

  1. 登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  2. 從工作者節點移除 ibm-cloud.kubernetes.io/node-local-dns-enabled 標籤。 此動作會終止工作者節點上的 DNS 快取代理程式 Pod。

    執行下列指令,以從叢集中的所有工作者節點移除標籤。

    kubectl label node --all --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
    

    執行下列指令,以從個別工作者節點移除標籤。

    kubectl label node <node_name> "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
    
    1. 藉由檢查 NODE-LOCAL-DNS-ENABLED 欄位是否為空,驗證是否移除了標籤。

      kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
      

      輸出範例

      NAME          STATUS                      ROLES    AGE   VERSION       NODE-LOCAL-DNS-ENABLED
      10.xxx.xx.xxx Ready,SchedulingDisabled    <none>   28h   v1.32+IKS   
      
    2. 驗證 Pod 是否已不再於停用了 DNS 快取的節點上執行。 輸出不會顯示任何 pod。

      kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
      

      輸出範例

      No resources found.
      
  3. 對每個工作者節點重複先前的步驟以停用 DNS 快取。

自訂 NodeLocal DNS 快取

您可以透過編輯兩個 configmap 中的任一個來自訂 NodeLocal DNS 快取。

NodeLocal DNS 快取依賴 CoreDNS 來維護 DNS 解析的快取。 將適用的 NodeLocal DNS 快取和 CoreDNS 配置 (例如 Stub 網域) 保持相同,以維護 DNS 解析一致性。

編輯 node-local-dns ConfigMap 以取得一般配置更新項目

編輯 node-local-dns ConfigMap 以自訂 NodeLocal DNS 快取配置。

開始之前:登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  1. 驗證 NodeLocal DNS 快取常駐程式集是否可用。

    kubectl get ds -n kube-system node-local-dns
    

    輸出範例

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                         AGE
    node-local-dns   4         4         4       4            4           ibm-cloud.kubernetes.io/node-local-dns-enabled=true   82d
    
  2. 編輯預設值,或將自訂 Corefile 新增至 NodeLocal DNS 快取 ConfigMap。 您匯入的每一個 Corefile 都必須使用 coredns 路徑。 如需詳細資訊,請參閱 Kubernetes 文件

    NodeLocal DNS 快取只支援一組有限的 外掛程式

    kubectl edit configmap -n kube-system node-local-dns
    

    輸出範例

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: node-local-dns
      namespace: kube-system
    data:
      Corefile: |
        # Add your NodeLocal DNS customizations as import files under ./coredns directory.
        # Refer to /docs/containers?topic=containers-cluster_dns for details.
        import ./coredns/<MyCorefile>
        cluster.local:53 abc.com:53 {
            errors
            cache {
                    success 9984 30
                    denial 9984 5
            }
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            health 169.254.20.10:8080
            }
        in-addr.arpa:53 {
            errors
            cache 30
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            }
        ip6.arpa:53 {
            errors
            cache 30
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__CLUSTER__DNS__ {
                    force_tcp
            }
            prometheus :9253
            }
        .:53 {
            errors
            cache 30 {
                  disable success cluster.local
                  disable denial cluster.local
            }
            reload
            loop
            bind 169.254.20.10 172.21.0.10
            forward . __PILLAR__UPSTREAM__SERVERS__ {
                    force_tcp
            }
            prometheus :9253
            }
      <MyCorefile>: |
        # Add custom corefile content ...
    
  3. 在幾分鐘之後,NodeLocal DNS 快取 Pod 會挑選 ConfigMap 變更。

編輯 node-local-dns-config ConfigMap 以延伸 Stub 網域或上游伺服器

編輯 node-local-dns-config ConfigMap 以延伸 NodeLocal DNS 快取配置,例如透過自訂 Stub 網域或上游 DNS 伺服器。 如需詳細資訊,請參閱 Kubernetes 文件

開始之前:登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  1. 驗證 NodeLocal DNS 快取常駐程式集是否可用。

    kubectl get ds -n kube-system node-local-dns
    

    輸出範例

    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                         AGE
    node-local-dns   4         4         4       4            4           ibm-cloud.kubernetes.io/node-local-dns-enabled=true   82d
    
  2. 確認 NodeLocal DNS 快取具有 ConfigMap。

    1. 判斷 NodeLocal DNS 快取 ConfigMap 是否存在。

      kubectl get cm -n kube-system node-local-dns-config
      

      不存在 ConfigMap 時的輸出範例

      Error from server (NotFound): ConfigMaps "node-local-dns-config" not found
      
    2. 如果 ConfigMap 不存在,請建立 NodeLocal DNS 快取 ConfigMap。

      kubectl create cm -n kube-system node-local-dns-config
      

      輸出範例

      configmap/node-local-dns-config created
      
  3. 編輯 NodeLocal DNS 快取 ConfigMap。 ConfigMap 使用 KubeDNS 語法來自訂 Stub 網域和上游 DNS 伺服器。 如需詳細資訊,請參閱 Kubernetes 文件

    kubectl edit cm -n kube-system node-local-dns-config
    

    輸出範例

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: node-local-dns-config
      namespace: kube-system
    data:
      stubDomains: |
          {"abc.com" : ["1.2.3.4"]}
    
  4. 在幾分鐘之後,NodeLocal DNS 快取 Pod 會挑選 ConfigMap 變更。

設定區域感知 DNS

多區域 IBM Cloud Kubernetes Service 叢集 中設定區域感知 DNS,以改善叢集 DNS 效能和可用性。 此設定會延伸 NodeLocal DNS 快取,以偏好相同區域內的叢集 DNS 資料流量。

依預設,您的叢集會設定叢集層面的 DNS 資源,而不是區域感知 DNS 資源。 即使在您設定區域感知 DNS 之後,叢集層面的 DNS 資源仍會作為備份 DNS 來執行。 您的區域感知 DNS 資源與叢集層面 DNS 是分開的,而且變更區域感知 DNS 不會影響叢集層面 DNS。

當您在叢集裡使用區域感知 DNS 時,請勿使用 DNS 快取標籤

設定區域感知 DNS

完成下列步驟,以在多區域叢集裡設定區域感知 DNS。

  1. 更新受區域感知 DNS 影響的任何 DNS 輸出網路原則,例如依賴於 Pod 或名稱空間選取器以取得 DNS 輸出的原則。 執行下列指令以取得網路政策清單。

    kubectl get networkpolicy --all-namespaces -o yaml
    
  2. 使用 ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true 來標示 kube-system 名稱空間中的 coredns ConfigMap。

    kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true"
    
  3. 重新整理叢集主節點,以部署區域感知 DNS 資源。

    ibmcloud ks cluster master refresh -c <cluster_name_or_ID>
    
  4. 檢閱叢集詳細資料中的 主要性能,以監看完成重新整理作業。

    ibmcloud ks cluster get -c <cluster_name_or_ID>
    
  5. 如果你 為 CoreDNS 客製化存根域和上游 DNS 伺服器,你還必須 客製化 NodeLocal DNS快取 與這些存根域和上游 DNS 伺服器。

  6. 設定叢集區域的環境變數。

    ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
    
  7. 啟動所有區域中的 CoreDNS 和 CoreDNS autoscaler Pod。

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=1
    done
    
  8. 驗證 CoreDNS 和 CoreDNS autoscaler Pod 是否在所有區域中執行。

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}" -o wide
        kubectl get pods -n kube-system -l "k8s-app=coredns-${ZONE}" -o wide
    done
    
  9. 在所有工作者節點上啟動 NodeLocal DNS 快取 Pod。

    kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true"
    
  10. 驗證 NodeLocal DNS 快取 Pod 是否在所有工作者節點上執行。

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=node-local-dns-${ZONE}" -o wide
    done
    
  11. 為工作者節點儲存區加上標籤,以便未來工作者節點繼承 ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true 標籤。

停用及刪除區域感知 DNS

若要移除區域感知 DNS,您必須先在多區域叢集的每一個區域中停用區域感知 DNS。 然後,刪除區域感知 DNS 資源。

  1. 從工作者節點儲存區中移除 ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true 標籤

  2. 為叢集中的區域設定環境變數。

    ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
    
  3. 停止所有工作者節點上的 NodeLocal DNS 快取 Pod。

    kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled-"
    
  4. 停止所有區域中的 CoreDNS autoscaler Pod。

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=0
    done
    
  5. 驗證 CoreDNS autoscaler Pod 不再於所有區域中執行。

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}"
    done
    
  6. 停止所有區域中的 CoreDNS Pod。

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-${ZONE}" --replicas=0
    done
    
  7. kube-system 名稱空間中的 coredns ConfigMap 移除 ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true 標籤。

    kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns-"
    
  8. 重新整理叢集主節點 以刪除區域感知 DNS 資源。

    ibmcloud ks cluster master refresh --cluster <cluster-name-or-id>
    
  9. 檢閱叢集詳細資料中的 主要性能,以監看完成重新整理作業。

    ibmcloud ks cluster get -c <cluster_name_or_ID>