Black lives matter.
We stand in solidarity with the Black community.
Racism is unacceptable.
It conflicts with the core values of the Kubernetes project and our community does not tolerate it.
We stand in solidarity with the Black community.
Racism is unacceptable.
It conflicts with the core values of the Kubernetes project and our community does not tolerate it.
本页展示了如何在集群中启用和配置 DNS 服务的自动伸缩功能。
你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:
要获知版本信息,请输入kubectl version
.
本指南假设您的节点使用 AMD64 或 Intel 64 CPU 架构
确保已启用 DNS 功能本身。
建议使用 Kubernetes 1.4.0 或更高版本。
在 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 水平自动伸缩已经启用,可以跳到 调优自动伸缩参数。
列出集群内 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。
在本段,我们创建一个 Deployment。Deployment 中的 Pod 运行一个基于 cluster-proportional-autoscaler-amd64
镜像的容器。
创建文件 dns-horizontal-autoscaler.yaml
,内容如下所示:
admin/dns/dns-horizontal-autoscaler.yaml
|
---|
|
在文件中,将 <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 ) )
注意 coresPerReplica
和 nodesPerReplica
的值都是整数。
想法是,当一个集群使用具有很多核心的节点时,由 coresPerReplica
来控制。 当一个集群使用具有较少核心的节点时,由 nodesPerReplica
来控制。
其它的伸缩模式也是支持的,详情查看 cluster-proportional-autoscaler。
有几个 DNS 水平自动伸缩的选项。具体使用哪个选项因环境而异。
该选项适用于所有场景。运行如下命令:
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 ...
...
如果 dns-autoscaler 为您所控制,该选项可以正常工作,也就说没有人会去重新创建它:
kubectl delete deployment dns-autoscaler --namespace=kube-system
输出内容如下所示:
deployment.extensions "dns-autoscaler" deleted
如果 dns-autoscaler 在插件管理器的控制之下,该选项可以工作,并且具有操作 master 节点的写权限。
登录到 master 节点,删除对应的 manifest 文件。 dns-autoscaler 的路径一般为:
/etc/kubernetes/addons/dns-horizontal-autoscaler/dns-horizontal-autoscaler.yaml
当 manifest 文件删除后,插件管理器将删除 dns-autoscaler Deployment。
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 自动伸缩 所提供的,考虑未来进行开发。