我认为标题是不言自明的。我做了很多实验,可悲的事实是 coredns 确实为集群内的所有请求增加了 20 ms 开销。一开始我们想也许通过增加更多的复制,并平衡更多实例之间的解析请求,我们可以改善响应时间,但它根本没有帮助。 (我们从 2 个 pods 扩大到 4 个 pods )

扩展到4个实例后,解析时间的波动有一些增强。但这不是我们所期望的,20 ms 开销仍然存在。

我们有一些 web 服务,它们的实际响应时间是 < 30 ms 并且使用 coredns 我们将响应时间加倍,这并不酷!

在对这件事得出结论后,我们做了一个实验来仔细检查这不是操作系统级别的开销。结果与我们预期的没有什么不同。

kubernetes - 如何避免 coredns 解决 kubernetes 中的开销-LMLPHP
kubernetes - 如何避免 coredns 解决 kubernetes 中的开销-LMLPHP

我们想也许我们可以基于将每个 pod 所需的 hostname 映射列表放入该 pod 的 /etc/hosts 来实现/部署一个解决方案。所以我最后的问题如下:

  • 有没有其他人经历过与 coredns 类似的事情?
  • 你能建议在 k8s 环境中工作的 coredns 的替代解决方案吗?

  • 任何想法或见解表示赞赏。提前致谢。

    最佳答案

    在 kubernetes 集群中运行 coreDNS 时需要注意几件事

  • 内存
  • 自动路径
  • 副本数
  • 自动缩放器
  • 其他插件
  • Prometheus 指标
  • 单独的服务器块

  • 内存

    CoreDNS 推荐的副本内存量为
    MB required (default settings) = (Pods + Services) / 1000 + 54
    

    kubernetes - 如何避免 coredns 解决 kubernetes 中的开销-LMLPHP

    自动路径

    Autopath 是 Coredns 中的一项功能,有助于增加外部查询的响应时间

    通常 DNS 查询会通过
  • ..svc.cluster.local
  • .svc.cluster.local
  • cluster.local
  • 然后配置转发,通常是主机搜索路径(/etc/resolv.conf
  • Trying "example.com.default.svc.cluster.local"
    Trying "example.com.svc.cluster.local"
    Trying "example.com.cluster.local"
    Trying "example.com"
    Trying "example.com"
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55265
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;example.com.           IN  A
    
    ;; ANSWER SECTION:
    example.com.        30  IN  A   93.184.216.34
    

    这需要更多的内存,所以计算现在变成
    MB required (w/ autopath) = (Number of Pods + Services) / 250 + 56
    

    副本数

    默认为 2,但启用 Autoscaler 应该有助于解决负载问题。

    自动调节器
    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: coredns
      namespace: default
    spec:
      maxReplicas: 20
      minReplicas: 2
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: coredns
      targetCPUUtilizationPercentage: 50
    

    节点本地缓存

    Kubernetes 1.15 中的 Beta



    https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/

    其他插件

    这些也将有助于了解 CoreDNS 内部发生了什么

    Error - 查询处理期间遇到的任何错误都将打印到标准输出。

    Trace - 启用请求如何通过 CoreDNS 的 OpenTracing

    Log - 查询日志

    health - CoreDNS 已启动并运行,这将返回 200 OK HTTP 状态代码

    ready - 通过启用就绪,当所有能够发出就绪信号的插件都这样做时,端口 8181 上的 HTTP 端点将返回 200 OK。

    部署中应使用就绪和运行状况
            livenessProbe:
              httpGet:
                path: /health
                port: 8080
                scheme: HTTP
              initialDelaySeconds: 60
              timeoutSeconds: 5
              successThreshold: 1
              failureThreshold: 5
            readinessProbe:
              httpGet:
                path: /ready
                port: 8181
                scheme: HTTP
    

    普罗米修斯指标

    Prometheus Plugin
    coredns_health_request_duration_seconds{} - duration to process a HTTP query to the local /health endpoint. As this a local operation, it should be fast. A (large) increase in this duration indicates the CoreDNS process is having trouble keeping up with its query load.
    https://github.com/coredns/deployment/blob/master/kubernetes/Scaling_CoreDNS.md

    单独的服务器块

    最后一点建议是将集群 DNS 服务器块与外部块分开
        CLUSTER_DOMAIN REVERSE_CIDRS {
            errors
            health
            kubernetes
            ready
            prometheus :9153
            loop
            reload
            loadbalance
        }
    
        . {
            errors
            autopath @kubernetes
            forward . UPSTREAMNAMESERVER
            cache
            loop
        }
    

    有关 k8 插件和其他选项的更多信息,请点击此处
    https://github.com/coredns/coredns/blob/master/plugin/kubernetes/README.md

    关于kubernetes - 如何避免 coredns 解决 kubernetes 中的开销,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60793911/

    10-10 19:20