設定叢集 DNS 提供者

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

叢集 DNS 提供者是 核心DNS,這是一個通用的權威 DNS 伺服器,提供向後相容但可擴展的集成Kubernetes。 由於 CoreDNS 僅是一個可執行檔且僅運行單一程序,因此相較於其他叢集 DNS 服務供應商,其依賴項較少,可能引發問題的運作組件也較少。 此外,該專案的撰寫語言與 Kubernetes 專案相同,都是 Go,這有助於保護記憶體。 最後,CoreDNS 比其他叢集 DNS 服務供應商支援更靈活的使用情境,因為您可以建立自訂 DNS 記錄,例如 《 CoreDNS 》文件中所述的常見設定。

CoreDNS 以及 NodeLocal DNS 快取設定變更(適用於版本 1.34 及後續版本)
在 和 NodeLocal CoreDNS DNS 設定中,預設 DNS 快取時間已從 30 秒延長至 120 秒。 此變更適用於 DNS 快取設定 ConfigMap。 有些使用者因為快取時間太短導致 DNS 查詢頻繁,因而觸及 pDNS (或 UDP ) 流量限制。 30 秒的快取間隔通常沒有必要,除非是變動非常頻繁的 DNS 記錄,例如健康檢查終端點。 對於大多數工作負載而言,120 秒的預設快取時間能提供更佳的效能表現,並減少不必要的 DNS 流量。 需要為特定使用情境設定較短快取時間的使用者,可覆寫此設定。

自動調整叢集 DNS 提供者

預設情況下,CoreDNS 包含一項部署功能,可根據叢集內的作業節點數量及核心數,自動調整 CoreDNS 匣的規模。 您可以透過編輯 CoreDNS 中的自動擴展設定( ConfigMap ),來微調 CoreDNS 的自動擴展參數。 舉例來說,如果您的應用程式大量使用叢集 DNS 提供者,您可能需要增加「CoreDNS」Pod 的最低數量,以支援該應用程式。 如需更多資訊,請參閱 Kubernetes 的文件

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

  1. 請確認 CoreDNS 的自動擴展器部署是否可用。 在 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」自動擴展器的預設設定。 尋找 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 中設定多個 Corefiles。 如需更多資訊,請參閱 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 的文件

    proxyCoreDNS 外掛程式已遭棄用,並由 外掛 forward 程式取代。 若您更新了,ConfigMap,CoreDNS 請務必將所有 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 納入 data.Corefile 區段,並根據您的自訂 Corefile 資訊填寫 data. 區段。 如需更多資訊,請參閱 Corefile 的匯入文件

    proxyCoreDNS 外掛程式已遭棄用,並由 外掛 forward 程式取代。 若您更新了,ConfigMap,CoreDNS 請務必將所有 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 文件

預設情況下,針對使用「ClusterFirstDNS 政策的 Pod 所發出的叢集 DNS 請求,會傳送至叢集 DNS 服務。 若您在工作節點上啟用 NodeLocal DNS快取功能,該工作節點上這些Pod的叢集DNS請求將會轉發至本地DNS快取,該快取會監聽鏈路本地IP位址 169.254.20.10。 DNS 快取也會在 kube-system 名稱空間中 kube-dns 服務的叢集 IP 上接聽。

當您已在叢集裡使用 區域感知 DNS 時,請不要新增 DNS 快取標籤。 此外,NodeLocal DNS快取仰賴於 CoreDNS 來維護DNS解析的快取。 保持適用的 NodeLocal DNS 快取與 CoreDNS 設定(例如 stub 網域)保持一致,以維持 DNS 解析的一致性。

1.34 及更早版本
NodeLocal DNS 快取是選擇性加入。 您必須手動將 ibm-cloud.kubernetes.io/node-local-dns-enabled=true 標籤加入工作者節點,以啟用它。
1.35 及後續版本
NodeLocal DNS 快取預設在所有工作節點上啟用。 升級到 1.35 版本的群集會自動啟用 NodeLocal DNS,除非您選擇不啟用。 為了防止自動啟用,請在升級前將 ibm-cloud.kubernetes.io/node-local-dns-disabled=true 標籤套用到工作節點。

有關 1.35 版本變更的詳細資訊,請參閱 1.35 版本資訊

啟用 NodeLocal 的DNS快取

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

1.35 及後續版本
NodeLocal DNS 預設在所有 Worker 節點上啟用。 僅當您先前停用 NodeLocal DNS 或新增工作站節點時停用 NodeLocal DNS,請遵循這些步驟。
1.34 及更早版本
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"
        ```
        輸出範例
    
        ```sh {: screen}
        NAME          STATUS                      ROLES    AGE   VERSION       NODE-LOCAL-DNS-ENABLED
        10.xxx.xx.xxx Ready,SchedulingDisabled    <none>   28h   v1.35+IKS   true
        ```
    3. 驗證 DNS 快取代理程式 Pod 是否在工作者節點上執行。
    
    ```sh {: pre}
        kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
        ```
        輸出範例
    
        ```sh {: screen}
        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.35 及後續版本

若要停用預設啟用的 NodeLocal DNS,請將 ibm-cloud.kubernetes.io/node-local-dns-disabled=true 標籤新增至您的工作節點。

kubectl label node --all --overwrite "ibm-cloud.kubernetes.io/node-local-dns-disabled=true"
1.34 及更早版本

若要停用 NodeLocal DNS,請從工作節點移除 ibm-cloud.kubernetes.io/node-local-dns-enabled 標籤。

  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"
        ```
        輸出範例
    
        ```sh {: screen}
        NAME          STATUS                      ROLES    AGE   VERSION       NODE-LOCAL-DNS-ENABLED
        10.xxx.xx.xxx Ready,SchedulingDisabled    <none>   28h   v1.35+IKS   
        ```
    2. 驗證 Pod 是否已不再於停用了 DNS 快取的節點上執行。 輸出不會顯示任何 pod。
    
    ```sh {: pre}
        kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
        ```
        輸出範例
    
        ```sh {: screen}
        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-dnsConfigMap 以自訂 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-configConfigMap 以擴展 DNS NodeLocal 快取設定,例如自訂 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 時的輸出範例
    
        ```sh {: screen}
        Error from server (NotFound): ConfigMaps "node-local-dns-config" not found
        ```
    2. 如果 ConfigMap 不存在,請建立 `NodeLocal` DNS 快取 ConfigMap。
    
    ```sh {: pre}
        kubectl create cm -n kube-system node-local-dns-config
        ```
        輸出範例
    
        ```sh {: screen}
        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