在叢集中自動擴縮 DNS 服務

本頁面展示瞭如何在 Kubernetes 叢集中啟用和配置 DNS 服務的自動擴縮。

準備工作

  • 你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個不充當控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用這些 Kubernetes 操場之一。

    要檢查版本,請輸入 kubectl version

  • 本指南假設你的節點使用 AMD64 或 Intel 64 CPU 架構。

  • 確保 Kubernetes DNS 已啟用。

確定 DNS 水平自動擴縮是否已啟用

列出 kube-system 名稱空間中的 Deployment

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 Deployment 的名稱

列出 kube-system 名稱空間中你的叢集中的 DNS Deployment。

kubectl get deployment -l k8s-app=kube-dns --namespace=kube-system

輸出類似於:

NAME      READY   UP-TO-DATE   AVAILABLE   AGE
...
coredns   2/2     2            2           ...
...

如果你沒有看到 DNS 服務的 Deployment,你也可以透過名稱查詢它

kubectl get deployment --namespace=kube-system

並查詢名為 corednskube-dns 的 Deployment。

你的擴縮目標是

Deployment/<your-deployment-name>

其中 <your-deployment-name> 是你的 DNS Deployment 的名稱。例如,如果你的 DNS Deployment 的名稱是 coredns,你的擴縮目標是 Deployment/coredns。

啟用 DNS 水平自動擴縮

在本節中,你將建立一個新的 Deployment。Deployment 中的 Pods 執行基於 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 ) )

請注意,coresPerReplicanodesPerReplica 的值都是浮點數。

其思想是,當叢集使用多核節點時,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:從主節點刪除 kube-dns-autoscaler 清單檔案

如果 kube-dns-autoscaler 由(已棄用的)Addon Manager 控制,並且你對主節點具有寫入許可權,則此選項有效。

登入到主節點並刪除相應的清單檔案。kube-dns-autoscaler 的常見路徑是

/etc/kubernetes/addons/dns-horizontal-autoscaler/dns-horizontal-autoscaler.yaml

刪除清單檔案後,Addon Manager 將刪除 kube-dns-autoscaler Deployment。

瞭解 DNS 水平自動擴縮的工作原理

  • cluster-proportional-autoscaler 應用程式與 DNS 服務分開部署。

  • 一個自動擴縮器 Pod 執行一個客戶端,該客戶端輪詢 Kubernetes API 伺服器以獲取叢集中的節點和核心數量。

  • 根據當前可排程節點和核心以及給定的擴縮引數,計算所需的副本計數並將其應用於 DNS 後端。

  • 擴縮引數和資料點透過 ConfigMap 提供給自動擴縮器,它在每個輪詢間隔重新整理其引數表,以保持最新的所需擴縮引數。

  • 允許更改擴縮引數,而無需重新構建或重新啟動自動擴縮器 Pod。

  • 自動擴縮器提供了一個控制器介面來支援兩種控制模式:線性階梯式

下一步

最後修改於 2024 年 1 月 25 日太平洋標準時間下午 3:51:修復 dns-horizontal-autoscaling 頁面中的 Deployment 和 ConfigMap 名稱 (7e2f696572)