任务

任务
管理集群
管理集群
Debug DNS 方案
IP Masquerade Agent 用户指南
Kubernetes 云管理控制器
Safely Drain a Node while Respecting the PodDisruptionBudget (EN)
Set up High-Availability Kubernetes Masters (EN)
Storage Object in Use Protection
为 Kubernetes 运行 etcd 集群
为系统守护进程预留计算资源
为节点发布扩展资源
使用 Calico 来提供 NetworkPolicy
使用 CoreDNS 进行服务发现
使用 KMS 提供商进行数据加密
使用 Kubernetes API 访问集群
使用 Romana 来提供 NetworkPolicy
使用 Weave 网络来提供 NetworkPolicy
关键插件 Pod 的调度保证
命名空间演练
在 Kubernetes 中配置私有 DNS 和上游域名服务器
在 Kubernetes 集群中使用 sysctl
在实时集群上重新配置节点的 Kubelet
声明网络策略
应用资源配额和限额
开发云控制器管理器
控制节点上的 CPU 管理策略
改变默认 StorageClass
更改 PersistentVolume 的回收策略
设置 Pod CPU 和内存限制
访问集群上运行的服务
通过命名空间共享集群
通过配置文件设置 Kubelet 参数
配置 API 对象配额
配置命名空间下pod总数
配置多个调度器
配置资源不足时的处理方式
限制存储消耗
集群 DNS 服务自动伸缩
集群安全
集群管理
静态 Pods
静态加密 Secret 数据
安装网络策略驱动
用插件扩展 kubectl
管理巨页(HugePages)
自动伸缩集群中的 DNS 服务
调度 GPUs

Edit This Page

自动伸缩集群中的 DNS 服务

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

准备开始

为了检查版本, 输入 kubectl version.

为了检查版本, 输入 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

反馈