自動調整叢集中的 DNS 服務規模
本頁說明如何在您的 Kubernetes 叢集中啟用與設定 DNS 服務的自動調整規模。
開始之前
您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用下列 Kubernetes 實驗環境
若要檢查版本,請輸入kubectl version
。本指南假設您的節點使用 AMD64 或 Intel 64 CPU 架構。
確認 Kubernetes DNS 已啟用。
判斷 DNS 水平自動調整規模是否已啟用
kubectl get deployment --namespace=kube-system
輸出結果類似於此
NAME READY UP-TO-DATE AVAILABLE AGE
...
kube-dns-autoscaler 1/1 1 1 ...
...
如果您在輸出中看到 "kube-dns-autoscaler",則表示 DNS 水平自動調整規模已啟用,您可以跳至調整自動調整規模參數。
取得您的 DNS 部署名稱
列出叢集中 kube-system 命名空間中的 DNS 部署
kubectl get deployment -l k8s-app=kube-dns --namespace=kube-system
輸出結果類似於此
NAME READY UP-TO-DATE AVAILABLE AGE
...
coredns 2/2 2 2 ...
...
如果您沒有看到 DNS 服務的部署,您也可以依名稱尋找
kubectl get deployment --namespace=kube-system
並尋找名為 coredns
或 kube-dns
的部署。
您的擴展目標是
Deployment/<your-deployment-name>
其中 <您的部署名稱>
是您的 DNS 部署名稱。例如,如果您的 DNS 部署名稱為 coredns,則您的擴展目標是 Deployment/coredns。
注意
CoreDNS 是 Kubernetes 的預設 DNS 服務。CoreDNS 設定標籤k8s-app=kube-dns
,使其可以在最初使用 kube-dns 的叢集中運作。啟用 DNS 水平自動調整規模
在本節中,您將建立新的部署。部署中的 Pod 執行以 cluster-proportional-autoscaler-amd64
映像檔為基礎的容器。
建立名為 dns-horizontal-autoscaler.yaml
的檔案,內容如下
kind: ServiceAccount
apiVersion: v1
metadata:
name: kube-dns-autoscaler
namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: system:kube-dns-autoscaler
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["list", "watch"]
- apiGroups: [""]
resources: ["replicationcontrollers/scale"]
verbs: ["get", "update"]
- apiGroups: ["apps"]
resources: ["deployments/scale", "replicasets/scale"]
verbs: ["get", "update"]
# Remove the configmaps rule once below issue is fixed:
# kubernetes-incubator/cluster-proportional-autoscaler#16
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "create"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: system:kube-dns-autoscaler
subjects:
- kind: ServiceAccount
name: kube-dns-autoscaler
namespace: kube-system
roleRef:
kind: ClusterRole
name: system:kube-dns-autoscaler
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kube-dns-autoscaler
namespace: kube-system
labels:
k8s-app: kube-dns-autoscaler
kubernetes.io/cluster-service: "true"
spec:
selector:
matchLabels:
k8s-app: kube-dns-autoscaler
template:
metadata:
labels:
k8s-app: kube-dns-autoscaler
spec:
priorityClassName: system-cluster-critical
securityContext:
seccompProfile:
type: RuntimeDefault
supplementalGroups: [ 65534 ]
fsGroup: 65534
nodeSelector:
kubernetes.io/os: linux
containers:
- name: autoscaler
image: registry.k8s.io/cpa/cluster-proportional-autoscaler:1.8.4
resources:
requests:
cpu: "20m"
memory: "10Mi"
command:
- /cluster-proportional-autoscaler
- --namespace=kube-system
- --configmap=kube-dns-autoscaler
# Should keep target in sync with cluster/addons/dns/kube-dns.yaml.base
- --target=<SCALE_TARGET>
# When cluster is using large nodes(with more cores), "coresPerReplica" should dominate.
# If using small nodes, "nodesPerReplica" should dominate.
- --default-params={"linear":{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true,"includeUnschedulableNodes":true}}
- --logtostderr=true
- --v=2
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
serviceAccountName: kube-dns-autoscaler
在檔案中,將 <SCALE_TARGET>
替換為您的擴展目標。
前往包含組態檔的目錄,並輸入此命令以建立 Deployment
kubectl apply -f dns-horizontal-autoscaler.yaml
成功命令的輸出為
deployment.apps/kube-dns-autoscaler created
DNS 水平自動擴展現已啟用。
調整 DNS 自動擴展參數
驗證 kube-dns-autoscaler ConfigMap 是否存在
kubectl get configmap --namespace=kube-system
輸出結果類似於此
NAME DATA AGE
...
kube-dns-autoscaler 1 ...
...
修改 ConfigMap 中的資料
kubectl edit configmap kube-dns-autoscaler --namespace=kube-system
尋找此行
linear: '{"coresPerReplica":256,"min":1,"nodesPerReplica":16}'
根據您的需求修改欄位。「min」欄位表示 DNS 後端的最小數量。後端的實際數量是使用此方程式計算的
replicas = max( ceil( cores × 1/coresPerReplica ) , ceil( nodes × 1/nodesPerReplica ) )
請注意,coresPerReplica
和 nodesPerReplica
的值都是浮點數。
這個概念是當叢集使用具有許多核心的節點時,coresPerReplica
佔主導地位。當叢集使用核心較少的節點時,nodesPerReplica
佔主導地位。
還有其他支援的擴展模式。有關詳細資訊,請參閱 cluster-proportional-autoscaler。
停用 DNS 水平自動擴展
有幾種選項可用於調整 DNS 水平自動擴展。要使用哪個選項取決於不同的條件。
選項 1:將 kube-dns-autoscaler deployment 縮減至 0 個副本
此選項適用於所有情況。輸入此命令
kubectl scale deployment --replicas=0 kube-dns-autoscaler --namespace=kube-system
輸出為
deployment.apps/kube-dns-autoscaler scaled
驗證副本計數為零
kubectl get rs --namespace=kube-system
輸出在 DESIRED 和 CURRENT 欄中顯示 0
NAME DESIRED CURRENT READY AGE
...
kube-dns-autoscaler-6b59789fc8 0 0 0 ...
...
選項 2:刪除 kube-dns-autoscaler deployment
如果 kube-dns-autoscaler 在您的控制之下,此選項才有效,這表示沒有人會重新建立它
kubectl delete deployment kube-dns-autoscaler --namespace=kube-system
輸出為
deployment.apps "kube-dns-autoscaler" deleted
選項 3:從 master 節點刪除 kube-dns-autoscaler manifest 檔案
如果 kube-dns-autoscaler 受 (已棄用的) Addon Manager 控制,且您具有 master 節點的寫入權限,則此選項才有效。
登入 master 節點並刪除對應的 manifest 檔案。此 kube-dns-autoscaler 的常見路徑為
/etc/kubernetes/addons/dns-horizontal-autoscaler/dns-horizontal-autoscaler.yaml
刪除 manifest 檔案後,Addon Manager 將刪除 kube-dns-autoscaler Deployment。
了解 DNS 水平自動擴展的運作方式
cluster-proportional-autoscaler 應用程式與 DNS 服務分開部署。
Autoscaler Pod 執行一個用戶端,該用戶端輪詢 Kubernetes API 伺服器,以取得叢集中節點和核心的數量。
會計算所需的副本計數,並根據目前可調度的節點和核心以及給定的擴展參數,將其套用至 DNS 後端。
擴展參數和資料點透過 ConfigMap 提供給 autoscaler,並且它會每隔輪詢間隔刷新其參數表,以保持最新的所需擴展參數。
允許變更擴展參數,而無需重建或重新啟動 autoscaler Pod。
Autoscaler 提供控制器介面,以支援兩種控制模式:linear 和 ladder。
接下來是什麼
- 閱讀關於 保證重要附加元件 Pod 的排程 的資訊。
- 深入了解 cluster-proportional-autoscaler 的實作。