設定群集 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 文件。
開始之前:登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。
-
驗證 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
-
編輯 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 解析一致性。
開始之前:登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。
-
驗證有 CoreDNS 部署可供使用。 在 CLI 輸出中,驗證有一個部署 AVAILABLE(可用)。
kubectl get deployment -n kube-system coredns
輸出範例
NAME READY UP-TO-DATE AVAILABLE AGE coredns 3/3 3 3 69d
-
編輯 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 }
-
選用項目:將自訂 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 }
-
在幾分鐘之後,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
-
如果你 為 CoreDNS 客製化存根域和上游 DNS 伺服器,你還必須 客製化
NodeLocal
DNS快取 與這些存根域和上游 DNS 伺服器。 -
列出叢集裡的節點。
NodeLocal
DNS 快取代理程式 Pod 是在每個節點上執行的常駐程式集的一部分。kubectl get nodes
-
新增
ibm-cloud.kubernetes.io/node-local-dns-enabled=true
標籤至工作者節點。 該標籤可在工作者節點上啟動 DNS 快取代理程式 Pod。-
將標籤新增至一或多個工作者節點。
-
為叢集裡的所有工作者節點加上標籤: 將標籤新增至所有現有工作者節點儲存區。
-
若要標示個別工作者節點,請執行下列動作:
kubectl label node <node_name> --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled=true"
-
-
藉由檢查
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
-
驗證 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>
-
-
對每個工作者節點重複先前的步驟以啟用 DNS 快取。
停用 NodeLocal DNS 快取
您可以停用一個或多個工作節點的 NodeLocal
DNS 快取。
-
從工作者節點移除
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-"
-
藉由檢查
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
-
驗證 Pod 是否已不再於停用了 DNS 快取的節點上執行。 輸出不會顯示任何 pod。
kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
輸出範例
No resources found.
-
-
對每個工作者節點重複先前的步驟以停用 DNS 快取。
自訂 NodeLocal DNS 快取
您可以透過編輯兩個 configmap 中的任一個來自訂 NodeLocal
DNS 快取。
node-local-dns
配置映射表: 客製NodeLocal
DNS 快取配置。node-local-dns-config
配置映射表: 延長NodeLocal
透過自訂存根網域或上游 DNS 伺服器來設定 DNS 快取,以解析指向外部主機的服務。
NodeLocal
DNS 快取依賴 CoreDNS 來維護 DNS 解析的快取。 將適用的 NodeLocal
DNS 快取和 CoreDNS 配置 (例如 Stub 網域) 保持相同,以維護 DNS 解析一致性。
編輯 node-local-dns
ConfigMap 以取得一般配置更新項目
編輯 node-local-dns
ConfigMap 以自訂 NodeLocal
DNS 快取配置。
開始之前:登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。
-
驗證
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
-
編輯預設值,或將自訂 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 ...
-
在幾分鐘之後,
NodeLocal
DNS 快取 Pod 會挑選 ConfigMap 變更。
編輯 node-local-dns-config
ConfigMap 以延伸 Stub 網域或上游伺服器
編輯 node-local-dns-config
ConfigMap 以延伸 NodeLocal
DNS 快取配置,例如透過自訂 Stub 網域或上游 DNS 伺服器。 如需詳細資訊,請參閱 Kubernetes 文件。
開始之前:登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。
-
驗證
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
-
確認
NodeLocal
DNS 快取具有 ConfigMap。-
判斷
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
-
如果 ConfigMap 不存在,請建立
NodeLocal
DNS 快取 ConfigMap。kubectl create cm -n kube-system node-local-dns-config
輸出範例
configmap/node-local-dns-config created
-
-
編輯
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"]}
-
在幾分鐘之後,
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。
-
更新受區域感知 DNS 影響的任何 DNS 輸出網路原則,例如依賴於 Pod 或名稱空間選取器以取得 DNS 輸出的原則。 執行下列指令以取得網路政策清單。
kubectl get networkpolicy --all-namespaces -o yaml
-
使用
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"
-
重新整理叢集主節點,以部署區域感知 DNS 資源。
ibmcloud ks cluster master refresh -c <cluster_name_or_ID>
-
檢閱叢集詳細資料中的 主要性能,以監看完成重新整理作業。
ibmcloud ks cluster get -c <cluster_name_or_ID>
-
如果你 為 CoreDNS 客製化存根域和上游 DNS 伺服器,你還必須 客製化
NodeLocal
DNS快取 與這些存根域和上游 DNS 伺服器。 -
設定叢集區域的環境變數。
ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
-
啟動所有區域中的 CoreDNS 和 CoreDNS autoscaler Pod。
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=1 done
-
驗證 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
-
在所有工作者節點上啟動
NodeLocal
DNS 快取 Pod。kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true"
-
驗證
NodeLocal
DNS 快取 Pod 是否在所有工作者節點上執行。for ZONE in ${ZONES}; do kubectl get pods -n kube-system -l "k8s-app=node-local-dns-${ZONE}" -o wide done
-
為工作者節點儲存區加上標籤,以便未來工作者節點繼承
ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true
標籤。
停用及刪除區域感知 DNS
若要移除區域感知 DNS,您必須先在多區域叢集的每一個區域中停用區域感知 DNS。 然後,刪除區域感知 DNS 資源。
-
從工作者節點儲存區中移除
ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true
標籤。 -
為叢集中的區域設定環境變數。
ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
-
停止所有工作者節點上的
NodeLocal
DNS 快取 Pod。kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled-"
-
停止所有區域中的 CoreDNS autoscaler Pod。
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=0 done
-
驗證 CoreDNS autoscaler Pod 不再於所有區域中執行。
for ZONE in ${ZONES}; do kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}" done
-
停止所有區域中的 CoreDNS Pod。
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-${ZONE}" --replicas=0 done
-
從
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-"
-
重新整理叢集主節點 以刪除區域感知 DNS 資源。
ibmcloud ks cluster master refresh --cluster <cluster-name-or-id>
-
檢閱叢集詳細資料中的 主要性能,以監看完成重新整理作業。
ibmcloud ks cluster get -c <cluster_name_or_ID>