任务

任务
管理集群
管理集群
Debug DNS 方案
Enabling Service Topology (EN)
IP Masquerade Agent 用户指南
Kubernetes 云管理控制器
Safely Drain a Node while Respecting the PodDisruptionBudget (EN)
为 Kubernetes 运行 etcd 集群
为系统守护进程预留计算资源
为节点发布扩展资源
使用 CoreDNS 进行服务发现
使用 KMS 提供商进行数据加密
使用 Kubernetes API 访问集群
关键插件 Pod 的调度保证
启用端点切片
命名空间演练
在 Kubernetes 集群中使用 NodeLocal DNSCache
在 Kubernetes 集群中使用 sysctl
在实时集群上重新配置节点的 Kubelet
声明网络策略
开发云控制器管理器
控制节点上的 CPU 管理策略
控制节点上的拓扑管理策略
搭建高可用的 Kubernetes Masters
改变默认 StorageClass
更改 PersistentVolume 的回收策略
自定义 DNS 服务
访问集群上运行的服务
通过命名空间共享集群
通过配置文件设置 Kubelet 参数
配置 API 对象配额
配置多个调度器
配置资源不足时的处理方式
限制存储消耗
集群 DNS 服务自动伸缩
集群安全
集群管理
静态加密 Secret 数据
用插件扩展 kubectl
管理巨页(HugePages)
调度 GPUs

Edit This Page

集群 DNS 服务自动伸缩

本页展示了如何在集群中启用和配置 DNS 服务的自动伸缩功能。

准备开始

  • 你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

要获知版本信息,请输入 kubectl version.

  • 本指南假设您的节点使用 AMD64 或 Intel 64 CPU 架构

  • 确保已启用 DNS 功能本身。

  • 建议使用 Kubernetes 1.4.0 或更高版本。

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

在 kube-system 命名空间中列出集群中的 DeploymentsDeployment 是管理应用副本的 API 对象。

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 namespace 中的 Deployment:

kubectl get deployment --namespace=kube-system

输出类似如下这样:

NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
...
coredns      2         2         2            2           ...
...

在早于 1.12 的 Kubernetes 版本中,DNS 部署称为 “kube-dns”。

Kubernetes 1.5 或之前版本,DNS 通过使用 ReplicationController 来实现,而不是 Deployment。 所以看不到 kube-dns 或者类似的名称,在之前的输出中,列出了集群内 kube-system namespace 中的 ReplicationController:

kubectl get rc --namespace=kube-system

输出类似如下这样:

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

确定伸缩目标

如果有一个 DNS Deployment,伸缩目标是:

Deployment/<your-deployment-name>

其中 <your-deployment-name> 是 DNS 部署的名称。例如,如果您的 DNS 部署名称是 coredns,则您的扩展目标是 Deployment/coredns。

如果有一个 DNS ReplicationController,那么伸缩目标为:

ReplicationController/<your-rc-name>

这里 <your-rc-name> 是 DNS ReplicationController 的名称。 例如,DNS ReplicationController 的名称是 kube-dns-v20,则伸缩目标为 ReplicationController/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.6.0
        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> 替换成 scale 目标。

进入到包含配置文件的目录中,输入如下命令创建 Deployment:

kubectl apply -f dns-horizontal-autoscaler.yaml

一个成功的命令输出是:

deployment.apps/dns-autoscaler created

DNS 水平自动伸缩在已经启用了。

调优自动伸缩参数

验证 dns-autoscaler ConfigMapConfigMap 是一种 API 对象,用来将非机密性的数据保存到健值对中。使用时可以用作环境变量、命令行参数或者存储卷中的配置文件。 是否存在:

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-proportional-autoscaler

禁用 DNS 水平自动伸缩

有几个 DNS 水平自动伸缩的选项。具体使用哪个选项因环境而异。

选项 1:调小 dns-autoscaler deployment 至 0 个副本

该选项适用于所有场景。运行如下命令:

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

输出如下所示:

deployment.extensions/dns-autoscaler scaled

验证当前副本数为 0:

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:从 master 节点删除 dns-autoscaler manifest 文件

如果 dns-autoscaler 在插件管理器的控制之下,该选项可以工作,并且具有操作 master 节点的写权限。

登录到 master 节点,删除对应的 manifest 文件。 dns-autoscaler 的路径一般为:

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

当 manifest 文件删除后,插件管理器将删除 dns-autoscaler Deployment。

理解 DNS 水平自动伸缩工作原理

  • cluster-proportional-autoscaler 应用独立于 DNS service 部署。

  • autoscaler Pod 运行一个客户端,它通过轮询 Kubernetes API server 获取集群中节点和核心的数量。

  • 一个期望的副本数会被计算,并根据当前可调度的节点、核心数、给定伸缩参数,被应用到 DNS 后端。

  • 伸缩参数和数据点会基于一个 ConfigMap 来提供给 autoscaler,它会在每次轮询时刷新它的参数表,以与最近期望的伸缩参数保持一致。

  • 允许对伸缩参数进行修改,而不需要重建或重启 autoscaler Pod。

  • autoscaler 提供了一个控制器接口来支持两种控制模式:linear 和 *ladder*。

未来功能增强

控制模式,除了 linear 和 ladder,正在考虑未来将开发自定义 metric。

基于 DNS 特定 metric 的 DNS 后端的伸缩,考虑未来会开发。当前实现是使用集群中节点和核心的数量是受限制的。

支持自定义 metric,类似于 Horizontal Pod 自动伸缩 所提供的,考虑未来进行开发。

接下来

反馈