zoukankan      html  css  js  c++  java
  • Ubuntu1804下k8s-CoreDNS占CPU高问题排查

    1.背景:

    最近在ubuntu804上适配k8s的时候,部署到业务pod的时候,出现了服务器卡死,top查看发现负载很高,进行CPU排序发现如下信息,可知是CoreDNS服务导致。

    2. 分析排查:

    1.分析CoreDNS问题

    根据coredns状态是CrashLoopBackOff

    # kubectl get pod -n kube-system -l k8s-app=kube-dns
    NAME                      READY   STATUS             RESTARTS   AGE
    coredns-76b74f549-99331   0/1     CrashLoopBackOff   5          4m45s
    

    查看coredns对应的pod日志有如下错误:

    # kubectl -n kube-system logs coredns-76b74f549-99bxd
    .:53
    2021/06/03 06:20:28 [INFO] CoreDNS-1.1.3
    2021/06/03 06:20:28 [INFO] linux/amd64, go1.10.1, b0fd575c
    2021/06/03 06:20:28 [INFO] plugin/reload: Running configuration MD5 = d23dc615bc772457a380ba5d5c2690b7
    CoreDNS-1.1.3
    [FATAL] plugin/loop: Loop (127.0.0.1:60429 -> :53) detected for zone ".", see https://coredns.io/plugins/loop#troubleshooting. Query: "HINFO 6292641803451309721.7599235642583168995."

    再根据日志报错,可以获取到如下文档内容:

     

     由以上信息可知:

    Kubernetes集群中转发循环的一个常见原因是与主机节点上的本地DNS缓存的交互(例如systemd)。例如,在某些配置中,systemd resolved将把环回地址127.0.0.53作为名称服务器放入/etc/resolv.conf。默认情况下,Kubernetes(通过kubelet)将使用默认dnsPolicy将这个/etc/resolv.conf文件传递给所有pod,使它们无法进行DNS查找(包括CoreDNS pod)。

    简而言之:DNS回环了。

    出现这个问题的关键原因是ubuntu1804中 /etc/resolv.conf文件默认nameserver为127.0.0.53,所以需要调整kubelet的启动文件中DNS配置文件路径到/run/systemd/resolve/resolv.conf。

    ansibel部署的时候kubelet-config.yaml文件可以做如下修改做判断:

    {% if ansible_distribution == "Ubuntu" and ansible_distribution_major_version|int > 16 %}
    resolvConf: /run/systemd/resolve/resolv.conf
    {% else %}
    resolvConf: /etc/resolv.conf
    {% endif %}

    修改kubelet启动文件,再重新部署k8s,问题解决。

    root@ubuntu1804:~# kubectl get pod -n kube-system -l k8s-app=kube-dns
    NAME                       READY   STATUS    RESTARTS   AGE
    coredns-5757945748-mh8mp   1/1     Running   0          23h
    coredns-5757945748-p2scc   1/1     Running   0          23h
    coredns-5757945748-vfmkz   1/1     Running   0          23h
    

    2.CoreDNS升级

    在查看CoreDNS Github的时候,获取到CoreDNS从1.2.1版本开始添加的loop插件用于防止回环问题。

     再查看自己正在使用的CoreDNS版本,竟然还为1.1.3。

    # kubectl -n kube-system logs -f  coredns-8f9b4c9f5-9rvjq 
    .:53
    2021/06/03 06:20:28 [INFO] CoreDNS-1.1.3g 

    果断升级CoreDNS版本,

    到此CoreDNS问题全部解决。

    3.参考文档

    https://coredns.io/plugins/loop/#troubleshooting

    https://kubernetes.io/zh/docs/tasks/administer-cluster/dns-debugging-resolution/

    https://github.com/coredns/coredns/tree/v1.2.1/plugin/loop

    原文链接:https://www.cnblogs.com/yaohong/p/14845377.html

  • 相关阅读:
    分苹果
    马拉车算法(求最长回文子串)
    KMP
    字典树
    关于子类和父类中的this的用法
    最长上生子序列LIS
    sass
    黑马程序员----java基础笔记下(毕向东)
    DOM
    ajax教程
  • 原文地址:https://www.cnblogs.com/yaohong/p/14845377.html
Copyright © 2011-2022 走看看