任务

Kubernetes v1.12 版本的文档已不再维护。您现在看到的版本来自于一份静态的快照。如需查阅最新文档,请点击 最新版本。

Edit This Page

自动伸缩集群中的 DNS 服务

此页面展示如何启用和配置集群中 DNS 服务的自动伸缩。

准备开始

To check the version, enter kubectl version.

To check the version, enter kubectl version.

确定 DNS 水平自动伸缩是否已经启用

列出集群中命名空间 kube-system 下的 Deployment:

kubectl get deployment --namespace=kube-system

输出类似:

NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
...
dns-autoscaler        1         1         1            1           ...
...

如果在输出中看到 dns-autoscaler,则表示已启用 DNS 水平自动缩放, 可以跳过阅读优化自动缩放参数章节。

获取 DNS Deployment 名或 ReplicationController 名

列出集群中命名空间 kube-system 下的 Deployment:

kubectl get deployment --namespace=kube-system

在早于 1.12 的 Kubernetes 版本中,DNS Deployment 称之为 kube-dns

在 Kubernetes 1.5 之前的版本中,DNS 是使用 ReplicationController 而不是 Deployment 来实现的。 因此,如果在前面的输出中没有看到 kube-dns 或类似的名称,请在 kube-system 名称空间中列出集群中的 ReplicationControllers:

kubectl get rc --namespace=kube-system

输出类似:

NAME            DESIRED   CURRENT   READY     AGE
...
kube-dns-v20    1         1         1         ...
...

确定规模目标

如果是 DNS Deployment,则伸缩目标是:

Deployment/<your-deployment-name>

其中, 是 DNS Deployment 的名称。 例如,如果 DNS Deployment 名是 coredns, 则伸缩目标是 Deployment/coredns。

如果是 DNS ReplicationController,则伸缩目标是:

ReplicationController/<your-rc-name>

其中, 是 DNS ReplicationController 的名称。 例如,如果 DNS ReplicationController 的名称为 kube-dns-v20,则伸缩目标是 ReplicationControlle/kube-dns-v20。

启用 DNS 水平自动扩缩

在本节中,您将创建一个 Deployment。Deployment 中的 Pod 根据 cluster-proportional-autoscaler-amd64 镜像运行容器。

创建一个名为 dns-horizontal-autoscaler.yaml 的文件内容如下:

admin/dns/dns-horizontal-autoscaler.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dns-autoscaler
  namespace: kube-system
  labels:
    k8s-app: dns-autoscaler
spec:
  selector:
    matchLabels:
       k8s-app: dns-autoscaler
  template:
    metadata:
      labels:
        k8s-app: dns-autoscaler
    spec:
      containers:
      - name: autoscaler
        image: k8s.gcr.io/cluster-proportional-autoscaler-amd64:1.1.1
        resources:
            requests:
                cpu: "20m"
                memory: "10Mi"
        command:
          - /cluster-proportional-autoscaler
          - --namespace=kube-system
          - --configmap=dns-autoscaler
          - --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,"min":1}}
          - --logtostderr=true
          - --v=2

在文件中,将 <SCALE_TARGET> 替换为扩缩目标。

转至包含配置文件的目录,然后输入以下命令以创建 Deployment:

kubectl create -f dns-horizontal-autoscaler.yaml

运行成功后的输出结果为:

deployment.apps/kube-dns-autoscaler created

现在启用了 DNS 水平自动扩缩。

调优自动扩缩参数

验证 dns-autoscaler ConfigMap 存在:

kubectl get configmap --namespace=kube-system

输出类似:

NAME                  DATA      AGE
...
dns-autoscaler        1         ...
...

修改 ConfigMap 中的数据:

kubectl edit configmap 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-proportion -autoscaler

禁用 DNS 水平自动扩缩

有一些选项可用于调优 DNS 水平自动扩缩。使用哪个选项取决于不同的条件。

选项 1:将 dns-autoscaler deployment 降低到 0 个副本

此选项适用于所有情况。输入这个命令:

kubectl scale deployment --replicas=0 dns-autoscaler --namespace=kube-system

输出是:

deployment.extensions/dns-autoscaler scaled

验证副本计数是否为零:

kubectl get deployment --namespace=kube-system

输出在 DESIRED 和 CURRENT 列中显示 0:

NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
...
dns-autoscaler        0         0         0            0           ...
...

选项 2:删除 dns-autoscaler deployment

如果 dns-autoscaler 在您自己的控制之下,则此选项有效,这意味着没有人会重新创建它:

kubectl delete deployment dns-autoscaler --namespace=kube-system

输出是:

deployment.extensions "dns-autoscaler" deleted

选项 3:从主节点中删除 dns-autoscaler 清单文件

此选项可行的前提是,dns-autoscaler 在附加组件管理器 的控制之下, 并且有对主节点的写访问权。

登录主节点并删除相应的清单文件。这个 dns-autoscaler 的通用路径是:

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

删除清单文件后,附加组件管理器将删除 dns-autoscaler Deployment。

了解 DNS 水平自动缩放的工作原理

未来的改进

除了线性和梯形之外,未来将考虑自定义度量的控制模式。

基于 DNS 特定指标的 DNS 后端扩展正在考虑作为未来发展。当前实现使用集群中的节点和核心数量是有限的。

未来将考虑支持类似于水平 Pod 自动伸缩

接下来

了解更多关于实施 of cluster-proportional-autoscaler

反馈