树叶云kubernetes教程:Kubernetes 自动扩缩集群DNS服务

自动扩缩集群 DNS 服务

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

在开始之前

  • 你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:
    • Katacoda
    • 玩转 Kubernetes

    要检查版本,请输入 ​kubectl version​。

  • 本指南假设你的节点使用 AMD64 或 Intel 64 CPU 架构
  • 确保已启用 DNS 功能本身。
  • 建议使用 Kubernetes 1.4.0 或更高版本。

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

在 kube-system 命名空间中列出集群中的 Deployments :

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 的名称

列出集群内 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

并在输出中寻找名称为 ​coredns ​或 ​kube-dns​ 的 Deployment。

你的扩缩目标为:

Deployment/<your-deployment-name>

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

Note: CoreDNS 是 Kubernetes 的默认 DNS 服务。CoreDNS 设置标签 ​k8s-app=kube-dns​, 以便能够在原来使用 ​kube-dns​ 的集群中工作。

启用 DNS 水平自动扩缩 

在本节,我们创建一个 Deployment。Deployment 中的 Pod 运行一个基于 ​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"]
# 待以下 issue 修复后,请删除 Configmaps
# 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: k8s.gcr.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
          # 应该保持目标与 cluster/addons/dns/kube-dns.yaml.base 同步
          - --target=<SCALE_TARGET>
          #当集群使用大节点(有更多核)时,“coresPerReplica”应该占主导地位。
          #如果使用小节点,“nodesPerReplica“ 应该占主导地位。
          - --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/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 ) )

注意 ​coresPerReplica ​和 ​nodesPerReplica ​的值都是整数。

背后的思想是,当一个集群使用具有很多核心的节点时,由 ​coresPerReplica ​来控制。 当一个集群使用具有较少核心的节点时,由 ​nodesPerReplica ​来控制。

其它的扩缩模式也是支持的,详情查看 cluster-proportional-autoscaler。

禁用 DNS 水平自动扩缩

有几个可供调优的 DNS 水平自动扩缩选项。具体使用哪个选项因环境而异。

选项 1:缩容 dns-autoscaler Deployment 至 0 个副本

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

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

输出如下所示:

deployment.apps/dns-autoscaler scaled

验证当前副本数为 0:

kubectl get rs --namespace=kube-system

输出内容中,在 DESIRED 和 CURRENT 列显示为 0:

NAME                                 DESIRED   CURRENT   READY   AGE
...
dns-autoscaler-6b59789fc8            0         0         0       ...
...

选项 2:删除 dns-autoscaler Deployment 

如果 dns-autoscaler 为你所控制,也就说没有人会去重新创建它,可以选择此选项:

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

输出内容如下所示:

deployment.apps "dns-autoscaler" deleted

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

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

登录到主控节点,删除对应的清单文件。 dns-autoscaler 对应的路径一般为:

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

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

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

  • cluster-proportional-autoscaler 应用独立于 DNS 服务部署。
  • autoscaler Pod 运行一个客户端,它通过轮询 Kubernetes API 服务器获取集群中节点和核心的数量。
  • 系统会基于当前可调度的节点个数、核心数以及所给的扩缩参数,计算期望的副本数并应用到 DNS 后端。
  • 扩缩参数和数据点会基于一个 ConfigMap 来提供给 autoscaler,它会在每次轮询时刷新它的参数表, 以与最近期望的扩缩参数保持一致。
  • 扩缩参数是可以被修改的,而且不需要重建或重启 autoscaler Pod。
  • autoscaler 提供了一个控制器接口来支持两种控制模式:linear 和 ladder。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/175607.html<

(0)
运维的头像运维
上一篇2025-03-24 19:09
下一篇 2025-03-24 19:10

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注