• K8S故障处理指南:网络问题排查思路


    1. 前言

    对于私有化环境,客户的网络架构,使用的云平台存在着各种差异,K8S网络可能会出现各种问题,此文着重讲解遇到此种问题的排查方法和思路,不会涉及相关网络底层技术描述.

    环境说明

    由于我们的k8s网络组件默认使用了flannel,这里描述的集群网络,均为flannel。但如果你使用了其他CNI组件,依然可以参考此文章的排查思路.

    2. 异常场景

    如何判断k8s集群网络出现异常?

    • 当集群出现pods大量异常,日志显示dns解析失败,或者节点间网络连接失败等,即可判断是集群网络异常

    我们可以通过如下几种方式进行排查。当任何一种方式的结果非预期内,则确认k8s集群网络出现异常

    2. 排查步骤

    • 测试节点互ping

    可以按照如下步骤操作

    查询node名称,podcidr,address并打印

    1. [root@localhost ~]# kubectl get nodes -o jsonpath='{range .items[*]}[name:{.metadata.name} , podCIDR:{.spec.podCIDR} , ipaddr:{.status.addresses[0].address}]{"\n"} {end}'
    2. [name:10.28.87.59 , podCIDR:172.27.1.0/24 , ipaddr:10.28.87.59]
    3. [name:10.28.87.60 , podCIDR:172.27.0.0/24 , ipaddr:10.28.87.60]
    4. [name:10.28.87.61 , podCIDR:172.27.2.0/24 , ipaddr:10.28.87.61]
    5. [name:10.28.87.62 , podCIDR:172.27.4.0/24 , ipaddr:10.28.87.62]
    6. [name:10.28.87.63 , podCIDR:172.27.3.0/24 , ipaddr:10.28.87.63]
    7. [name:10.28.87.64 , podCIDR:172.27.5.0/24 , ipaddr:10.28.87.64]

    此命令需要在所有节点下执行,可在部署机器上使用ansible调用使用上述命令获取到的CIDR地址,进行ping操作,seq根据节点数量进行设置

    从上面结果可以看到共6个K8S节点,子网分别是172.27.0-172.27.5子网段。

    使用下边shell脚本测试pod子网,通的话打印up

    1. [root@localhost ~]# for ip in $(seq 0 5);do ping -c2 -W1 -q 172.27.$ip.1 2>1 &>/dev/null && echo "172.27.$ip.1 up" || echo "172.27.$ip.1 down";done
    2. 172.27.0.1 up
    3. 172.27.1.1 up
    4. 172.27.2.1 up
    5. 172.27.3.1 up
    6. 172.27.4.1 up
    7. 172.27.5.1 up

    非预期结果: 出现某个节点固定的ping异常,即认为对应节点间vxlan通信异常,检查对应节点的网络即可

    • tcp,udp查询

    需要在所有节点上执行,可在一台机器上使用ansible调用

    ping操作属于三层操作,由于某些环境会禁ping,因此我们可以使用如下命令进行确认

    使用http请求访问coredns metrics接口,状态码为200时正常,状态码000代表网络异常不通

    1. [root@CentOS76 ~]# kubectl get pods -n kube-system -o wide | grep coredns | awk '{print $6}' | xargs -i  curl --connect-timeout 2 -o /dev/null -s -w "%{http_code}\n" http://{}:9153/metrics
    2. 200
    3. 200
    4. 200
    5. 200
    6. 200
    7. 200

    使用dns查询kubernetes.default地址。有返回则代表正常

    1. [root@localhost ~]# kubectl get pods -n kube-system -o wide | grep coredns | awk '{print $6}' | xargs -l nslookup -type=a kubernetes.default.svc.cluster.local
    2. Server:         172.27.2.23
    3. Address:        172.27.2.23#53
    4. Name:   kubernetes.default.svc.cluster.local
    5. Address172.26.0.1
    6. ---------
    7. Server:         172.27.1.131
    8. Address:        172.27.1.131#53
    9. Name:   kubernetes.default.svc.cluster.local
    10. Address172.26.0.1
    11. ---------
    12. Server:         172.27.3.57
    13. Address:        172.27.3.57#53
    14. Name:   kubernetes.default.svc.cluster.local
    15. Address172.26.0.1
    16. ---------
    17. Server:         172.27.0.29
    18. Address:        172.27.0.29#53
    19. Name:   kubernetes.default.svc.cluster.local
    20. Address172.26.0.1
    21. ---------
    22. Server:         172.27.5.53
    23. Address:        172.27.5.53#53
    24. Name:   kubernetes.default.svc.cluster.local
    25. Address172.26.0.1
    26. ---------
    27. Server:         172.27.4.65
    28. Address:        172.27.4.65#53
    29. Name:   kubernetes.default.svc.cluster.local
    30. Address172.26.0.1
    31. ---------

    非预期结果:dns查询报connection timed out; no servers could be reached, curl报000,都代表网络可能存在异常

    3. 异常场景

    当我们通过上述方式,确认集群节点存在异常时,可以使用如下思路进行逐一排查

    • ip_forward内核被重置为0

    • flannel通信异常

    • 启用了firewalld防火墙

    • 启用了安全软件

    • ip_forward

    名词解释:ip_forward代表了路由转发特性,为0时不开启,设置为1时代表启用。由于vxlan的跨三层特性, 集群节点需要转发目标主机非自己的数据包.
    影响范围: 如果此值设为0,会导致跨节点通信异常.

    出现原因: 在部署时,会向/etc/sysctl.conf里边添加net.ipv4.ip_forward=1,来保证永久生效。

    问题定位: 出现在集群重启后,发现pods异常,网络不通. 通过tcmdump抓包发现flannel流量正常。

    处理方式

    查询本机内核参数, 在所有节点上执行,可在部署机上使用ansible调用,为读操作,可放心执行

    1. [root@localhost ~]# sysctl -n net.ipv4.ip_forward
    2. 0

    打印sysctl加载链,会变更相关内核参数,生产环境禁用使用(如果出现ip_forward为0则可使用)

    1. [root@localhost ~]# sysctl --system
    2. * Applying /usr/lib/sysctl.d/00-system.conf ...
    3. ......
    4. * Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
    5. .....
    6. * Applying /usr/lib/sysctl.d/50-default.conf ...
    7. .......
    8. * Applying /etc/sysctl.d/99-sysctl.conf ...
    9. .......
    10. * Applying /etc/sysctl.conf ...
    11. .......

    找到具体是哪个文件修改了ip_forward为0,则修改此文件,并重载内核参数。无异常禁止使用

    [root@localhost ~]# sysctl -p
    • flannel通信异常

    名词说明: vxlan是vlan的拓展协议,为overlay网络,可以穿透三层网络对二层进行扩展,即大二层网络。flannel我们默认使用了vxlan做为封装协议,端口为8472
    影响范围: 跨节点通信异常
    问题定位: 对udp 8472端口抓发,发现只有出站流量,未有入站流量,即可认定为flannel vxlan通信异常
    出现原因: 安全组封禁,vxlan端口冲突,网卡异常等。由于flannel异常的原因多种多样,此次仅针对常见情况进行描述。建议具体问题具体分析。
    问题处理: 使用nc等相关命令进行测试,如果抓包仍未发现入站流量,且其他udp端口正常,则可使用修改port的方式

    添加Port字段,将通信端口修改为8475

    1. [root@localhost ~]# kubectl edit cm -n kube-system kube-flannel-cfg
    2. net-conf.json: |
    3.     {
    4.       "Network""172.27.0.0/16",
    5.       "Backend": {
    6.         "Type""vxlan",
    7.         "Port"8475
    8.       }
    9.     }

    修改后需要重启相关daemonset pods

    [root@localhost ~]# kubectl get pods -n kube-system | grep flannel | xargs kubectl delete pods -n kube-system

    修改port不生效,可使用host-gw 如果内网各节点二层互通,可使用host-gw模式,此模式兼容性好,网络效率高.

    1. [root@localhost ~]# kubectl edit cm -n kube-system kube-flannel-cfg
    2. net-conf.json: |
    3.     {
    4.       "Network""172.27.0.0/16",
    5.       "Backend": {
    6.         "Type""host-gw",
    7.     }

    如果无法定位问题,可以通过抓包的方式来判断

    例如:当时coredns网络不通时,通过curl测试

    curl -I 10.187.1.24:9153/metrics

    然后再开一个窗口抓包

    tcpdump -nn -i flannel.1 host 10.187.1.24 and port 9153 -vv

    防火墙排查

    名词解释: 此处的防火墙指Linux的软件防火墙,在Cenots上叫firewalld, 在UOS下叫UFW. 默认的软件防火墙会导致相关数据库被拦截
    影响范围: 特定服务访问异常,集群节点互通异常
    问题定位: 对iptables表链进行分析,发现有非预期的规则出现,则代表存在其他防火墙规则
    出现原因: 客户安装安全软件,或者是非预期的软件行为导致
    问题排查:

    一般看到ufw, public, zone这种,都可能是默认的系统防火墙

    1. [root@localhost ~]# iptables-save | egrep  "^:" | egrep -v "KUBE|CNI|DOCKER"
    2. :FORWARD_IN_ZONES - [0:0]
    3. :FORWARD_IN_ZONES_SOURCE - [0:0]
    4. :FORWARD_OUT_ZONES - [0:0]
    5. :FORWARD_OUT_ZONES_SOURCE - [0:0]

    发现后手动关闭,以centos7为例

    [root@localhost ~]# systemctl stop firewalld

    iptables FORWARD转发链添加了REJECT规则,该规则在ACCEPT之上

    图片

    删除规则后正常

    iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited

    常见安全软件排查

    1. qaxsafed  # 奇安信,
    2. sangfor_watchdog # 深信服安全软件
    3. YDservice  #qcloud安全软件,影响pod和docker桥接网络
    4. Symantec #赛门铁克的安全软件
    5. start360su_safed  #360安全软件
    6. gov_defence_service
    7. gov_defence_guard      #  ps aux | grep defence 
    8. wsssr_defence_daemon   # 奇安信服务器安全加固软件
    9. wsssr_defence_service
    10. wsssr_defence_agent   #影响pod网络
    11. kesl #卡巴斯基安全软件,影响容器通信 

    名词解释: 和在windows环境下是一样的,xc背景下,linux的各类安全软件也非常多,如奇安信,深信服等
    影响范围: 特定服务访问异常
    问题定位: 以上所有排查方式都尝试过,则可往此方面排查
    出现原因: 客户安全软件在内核网络层hook了对应函数,相关规则过滤了特定的应用数据库,导致异常

  • 相关阅读:
    麒麟系统开发笔记(十二):在国产麒麟系统上编译GDAL库、搭建基础开发环境和基础Demo
    No ‘Access-Control-Allow-Origin‘ header前端浏览器跨域用LiveServer处理
    电脑截图怎么转换成文字?学会这个方法,轻松实现
    CN_计算机网络性能指标
    tonybot 人形机器人 查看端口并对应端口 0701
    http直接调用paddlepaddle实现文字转语音,语音转文字
    视频播放器—纹理-渲染-窗口
    提高APP安全性的必备加固手段——深度解析代码混淆技术
    C# WinForm —— 27 28 29 30 ListView 介绍与应用
    【Java集合框架】14——LinkedHashSet 类
  • 原文地址:https://blog.csdn.net/weixin_45623111/article/details/136184842