Compartir a través de

在 Azure Kubernetes 服务 (AKS) 中自动缩放 CoreDNS

本文介绍如何在 Azure Kubernetes 服务 (AKS) 群集中配置和自定义 CoreDNS 自动缩放。

配置 CoreDNS 水平 Pod 缩放

由于 AKS 的弹性性质,通常会在群集内的 DNS 流量中突然出现峰值。 这些峰值可能导致 CoreDNS Pod 的内存消耗增加。 在某些情况下,这种增加的内存消耗可能会导致 Out of memory 问题。

为了解决此问题,AKS 集群自动缩放 CoreDNS Pod 以减少每个 Pod 的内存使用量。 此自动缩放逻辑的默认设置存储在 ConfigMap 中 coredns-autoscaler 。 但是,你可能会发现,CoreDNS Pod 的默认自动缩放并不总是足够激进,无法防止 Out of memory CoreDNS Pod 出现问题。 在这种情况下,可以直接修改 coredns-autoscaler ConfigMap。 请记住,只是增加 CoreDNS pod 的数量而不解决问题的根本原因Out of memory,可能只会提供临时修复。 如果在运行 CoreDNS Pod 的节点上没有足够的可用内存,增加 CoreDNS Pod 的数量将无济于事。 可能需要进一步调查并实施适当的解决方案,例如优化资源使用情况、调整资源请求和限制,或向节点添加更多内存。

CoreDNS 使用 水平群集比例自动缩放程序 进行 Pod 自动缩放。 可以编辑 coredns-autoscaler 以配置 CoreDNS Pod 数的缩放逻辑。 coredns-autoscaler ConfigMap 当前支持两个不同的 ConfigMap 键值:linearladder,这对应于两种受支持的控制模式。

  • linear 控制器可在 [min,max] 范围内生成与 max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) ) 等效的副本数。
  • ladder 控制器通过咨询两个不同的阶跃函数来计算副本数,一个用于核心缩放,另一个用于节点缩放,从而生成两个副本值的最大值。

有关控制模式和 ConfigMap 格式的详细信息,请参阅 上游文档

重要

建议每个群集至少有 个 CoreDNS Pod 副本。

查看当前 coredns-autoscaler ConfigMap

  • 使用coredns-autoscaler命令获取当前的 kubectl get configmaps ConfigMap。

    kubectl get configmap coredns-autoscaler --namespace kube-system --output yaml
    

    输出应类似于以下示例输出:

    apiVersion: v1
    data:
      ladder: '{"coresToReplicas":[[1,2],[512,3],[1024,4],[2048,5]],"nodesToReplicas":[[1,2],[8,3],[16,4],[32,5]]}'
    kind: ConfigMap
    metadata:
      name: coredns-autoscaler
      namespace: kube-system
      resourceVersion: "..."
      creationTimestamp: "..."
    

注释

提供的配置可用作潜在起点,但应根据特定的群集要求和 DNS 流量模式自定义值。 确定环境的相应副本数的一种方法是使用线性缩放公式: replicas = max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) ) 根据群集中的核心/节点计数确定副本计数。

后续步骤

若要了解如何排查 CoreDNS 问题,请参阅 排查 Azure Kubernetes 服务 (AKS) 上的 CoreDNS 问题