网络可以说是 Kubernetes 部署和使用过程中最容易出问题的了,最主要的是对网络技术非常熟悉的人员相对较少,和 Kubernetes 结合后能搞透彻网络这块的就更加稀少了,导致我们在部署使用过程中经常遇到一些网络问题。本文将重点关注网络,列出我们遇到的一些问题,包括解决和发现问题的简单方法。

流量转发和桥接

Kubernetes 支持各种网络插件,每个插件出现问题的方式都不尽相同。

Kubernetes 的核心是依靠Netfilter内核模块来设置低级别的集群IP负载均衡,这需要用到两个关键的模块:IP 转发和桥接(IP forward 和 bridge)。

IP forward

IP forward 是一种内核态设置,允许将一个接口的流量转发到另外一个接口,该配置是 Linux 内核将流量从容器路由到外部所必须的。

失败情况

有时候该项设置可能会被安全团队运行的定期安全扫描给重置了,或者没有配置为重启后生效,在这种情况下,就会出现网络访问失败的情况。

Pod 服务连接超时:

* connect to 10.100.225.223 port 5000 failed: Connection timed out* Failed to connect to 10.100.225.223 port 5000: Connection timed out* Closing connection 0curl: (7) Failed to connect to 10.100.225.223 port 5000: Connection timed out

Tcpdump可以显示发送了大量重复的 SYN数据包,但没有收到 ACK

如何诊断

# 检查 ipv4 forwarding 是否开启sysctl net.ipv4.ip_forward# 0 意味着未开启net.ipv4.ip_forward = 0

如何修复

# this will turn things back on a live serversysctl -w net.ipv4.ip_forward=1# on Centos this will make the setting apply after rebootecho net.ipv4.ip_forward=1 >> /etc/sysconf.d/10-ipv4-forwarding-on.conf# 验证并生效sysctl -p

桥接

bridge-netfilter 设置可以使 iptables 规则可以在 Linux Bridges 上面工作,就像 Docker 和 Kubernetes 设置的那样。

此设置对于 Linux 内核进行宿主机和容器之间进行数据包的地址转换是必须的。

失败情况

Pod 进行外部服务网络请求的情况下,将会出现目标主机不可达或者连接拒绝等错误(host unreachable 或 connection refused)。

如何诊断

# 检查 bridge netfilter 是否开启sysctl net.bridge.bridge-nf-call-iptables# 0 表示未开启net.bridge.bridge-nf-call-iptables = 0

如何修复

# Note some distributions may have this compiled with kernel,# check with cat /lib/modules/$(uname -r)/modules.builtin | grep netfiltermodprobe br_netfilter# 开启这个 iptables 设置sysctl -w net.bridge.bridge-nf-call-iptables=1echo net.bridge.bridge-nf-call-iptables=1 >> /etc/sysconf.d/10-bridge-nf-call-iptables.confsysctl -p

防火墙规则

Kubernetes 提供了各种网络插件来支持其集群功能,同时也对传统的基于 IP 和端口的应用程序提供了向后兼容的支持。

最常见的 一种 Kubernetes 网络方案就是利用 VxLan Overlay 网络,其中的 IP 数据包被封装在 UDP 中通过8472端口进行数据传输。

失败情况

这种情况下会出现100%数据包丢失:

$ ping 10.244.1.4 PING 10.244.1.4 (10.244.1.4): 56 data bytes^C--- 10.244.1.4 ping statistics ---5 packets transmitted, 0 packets received, 100% packet loss

如何诊断

最好的方式是使用相同的协议来传输数据,因为防火墙规则可能配置了特地的协议,比如可能会阻止 UDP 流量。

iperf是一个很好的验证工具:

#  在服务端执行iperf -s -p 8472 -u# 在客户端执行iperf -c 172.28.128.103 -u -p 8472 -b 1K

如何修复

当然是更新防火墙规则来停止组织这些流量了,这里有一些常见的 iptables 使用建议可以参考:https://serverfault.com/questions/696182/debugging-iptables-and-common-firewall-pitfalls

Pod CIDR 冲突

Kubernetes 为容器和容器之间的通信建立了一层特殊的 Overlay 网络。使用隔离的 Pod 网络,容器可以获得唯一的 IP 并且可以避免集群上的端口冲突,我们可以点击这里查看更多关于 Kubernetes 网络模型的一些信息。

当 Pod 子网和主机网络出现冲突的情况下就会出现问题了。

失败情况

Pod 和 Pod 之间通信会因为路由问题被中断:

$ curl http://172.28.128.132:5000curl: (7) Failed to connect to 172.28.128.132 port 5000: No route to host

如何诊断

首先查看分配的 Pod IP 地址:

$ kubectl get pods -o wideNAME                       READY     STATUS    RESTARTS   AGE       IP               NODEnetbox-2123814941-f7qfr    1/1       Running   4          21h       172.28.27.2      172.28.128.103netbox-2123814941-ncp3q    1/1       Running   4          21h       172.28.21.3      172.28.128.102testbox-2460950909-5wdr4   1/1       Running   3          21h       172.28.128.132   172.28.128.101

然后将主机 IP 范围与 apiserver中指定的 kubernetes 子网进行比较:

$ ip addr list3: eth1:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 52:54:00:2c:6c:50 brd ff:ff:ff:ff:ff:ff    inet 172.28.128.103/24 brd 172.28.128.255 scope global eth1       valid_lft forever preferred_lft forever    inet6 fe80::5054:ff:fe2c:6c50/64 scope link        valid_lft forever preferred_lft forever

如果出现了同网段的 IP,则很大概率会出现冲突了。

如何修复

仔细检查你的网络设置,确保你正在使用的网络、VLAN 或 VPC 之间不会有重叠。如果有冲突的,我们可以在 CNI 插件或 kubelet 的 pod-cidr参数中指定 IP 地址范围,避免冲突。

故障排查工具

下面是一些我们在排查上述问题时使用的一些非常有用的工具。

tcpdump

Tcpdump是一个用来捕获网络流量的工具,可以帮助我们解决一些常见的网络问题,下面是一个使用 tcpdump 进行流量捕获的一个简单例子。

我们进入一个容器来尝试去和其他的容器进行通信:

kubectl exec -ti testbox-2460950909-5wdr4 -- /bin/bash$ curl http://172.28.21.3:5000curl: (7) Failed to connect to 172.28.21.3 port 5000: No route to host

发现无法进行通信,然后在容器所在的主机,我们来捕获与容器目标 IP 有关的流量:

$ tcpdump -i any host 172.28.21.3tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes20:15:59.903566 IP 172.28.128.132.60358 > 172.28.21.3.5000: Flags [S], seq 3042274422, win 28200, options [mss 1410,sackOK,TS val 10056152 ecr 0,nop,wscale 7], length 020:15:59.903566 IP 172.28.128.132.60358 > 172.28.21.3.5000: Flags [S], seq 3042274422, win 28200, options [mss 1410,sackOK,TS val 10056152 ecr 0,nop,wscale 7], length 020:15:59.905481 ARP, Request who-has 172.28.21.3 tell 10.244.27.0, length 2820:16:00.907463 ARP, Request who-has 172.28.21.3 tell 10.244.27.0, length 2820:16:01.909440 ARP, Request who-has 172.28.21.3 tell 10.244.27.0, length 2820:16:02.911774 IP 172.28.128.132.60358 > 172.28.21.3.5000: Flags [S], seq 3042274422, win 28200, options [mss 1410,sackOK,TS val 10059160 ecr 0,nop,wscale 7], length 020:16:02.911774 IP 172.28.128.132.60358 > 172.28.21.3.5000: Flags [S], seq 3042274422, win 28200, options [mss 1410,sackOK,TS val 10059160 ecr 0,nop,wscale 7], length 0

我们可以看到由于线路出现了问题,所以内核无法将数据包路由到目标 IP。

这里有一篇关于 tcpdump 的一些比较有用的介绍文章:http://bencane.com/2014/10/13/quick-and-practical-reference-for-tcpdump/

Netbox

在一个镜像中内置一些网络工具包,对我们排查工作会非常有帮助,比如在下面的简单服务中我们添加一些常用的网络工具包:iproute2 net-tools ethtool

FROM library/python:3.3RUN apt-get update && apt-get -y install iproute2 net-tools ethtool nanoCMD ["/usr/bin/python", "-m", "SimpleHTTPServer", "5000"]

这里是一个简单的 Deployment 的资源清单文件:

apiVersion: apps/v1beta1kind: Deploymentmetadata:  labels:    run: netbox  name: netboxspec:  replicas: 2  selector:    matchLabels:      run: netbox  template:    metadata:      labels:        run: netbox    spec:      nodeSelector:        type: other            containers:      - image: quay.io/gravitational/netbox:latest        imagePullPolicy: Always        name: netbox      securityContext:        runAsUser: 0      terminationGracePeriodSeconds: 30

参考链接

  • https://gravitational.com/blog/troubleshooting-kubernetes-networking/

  • https://kubernetes.io/docs/concepts/cluster-administration/networking/

  • http://ebtables.netfilter.org/brfwia/brfwia.html#section4

  • https://serverfault.com/questions/696182/debugging-iptables-and-common-firewall-pitfalls

  • https://kubernetes.io/docs/concepts/cluster-administration/networking/#kubernetes-model

  • http://bencane.com/2014/10/13/quick-and-practical-reference-for-tcpdump/


apache axis 1.4的invoke方法设置超时_Kubernetes 网络故障常见排查方法相关推荐

  1. 解决网络故障的一般方法

    经常有人在QQ上问我网络方面的一些问题,也经常有一些学生.读者,打电话或发邮件问我一些网络故障的解决方法,但他们只是叙述了故障的结果或现象,很少有人详细描述故障的产生原因.产生过程以及网络的状态,更没 ...

  2. 网络故障以及处理方法

    如今,计算机网络技术飞速发展,在社会生活和工作中的重要性日趋凸显.它给人们带来了极大的便利,但是同时,层出不穷.种类繁多的网络故障也给人们带来了很多的烦恼.本文将简单介绍一些常见的网络故障及其处理方法 ...

  3. cpu爆了怎么排查和处理_CPU 故障的排查方法

    CPU 故障的排查方法 CPU过热会引起频繁死机,这个问题该怎么解决,这时候就需要看看CPU的温度,如果温度过高(正常50度),那么,CPU 故障的排查方法有哪些?欢迎大家阅读!更多相关信息请关注相关 ...

  4. 100m光纤测速多少正常_光纤收发器常见故障问题排查方法总结大全

    当我们在使用光纤收发器的时候,难免会遇到一些问题,当遇到这些常见故障问题的时候我们该如何解决呢?接下来就由飞畅科技的小编来为大家详细介绍下光纤收发器常见故障问题排查方法,一起来看看吧! 一.整体故障排 ...

  5. gpu显示off_GPU常见故障及排查方法

    GPU常见故障及排查方法 1. GPU日志收集 安装GPU驱动的系统下,root用户任意目录下执行命令:nvidia-bug-report.sh 执行命令后,当前目录下会生成日志压缩包:nvidia- ...

  6. linux版电脑卡顿,教程方法;linux系统很卡的基本排查方法介绍电脑技巧-琪琪词资源网...

    琪琪词资源网-教程方法;linux系统很卡的基本排查方法介绍电脑技巧,以下是给大家带来的教程方法;linux系统很卡的基本排查方法介绍,大家可以了解一下哦! 1.查看内存使用情况 free -g 当观 ...

  7. 网络问题常用排查方法

    网络问题常用排查方法 Window端 常用命令 常用网站 Wireshark抓包 Linux端 常用命令 Tcpdump抓包 安卓 局域网Wireshark抓包 Tcpdump抓包 其他抓包工具 Wi ...

  8. 【收藏备用】服务器基本故障及排查方法

    第一章 加电类故障 一.定义举例 从上电(或复位)到自检完成这一段过程中电脑所发生的故障. 二.可能的故障现象 1. 主机不能加电(如:电源风扇不转或转一下即停等).有时不能加电.开机掉闸.机箱金属部 ...

  9. c# 接收网络汉字乱码_50种网络故障及解决方法

          1.故障现象:网络适配器(网卡)设置与计算机资源有冲突.分析.排除:通过调整网卡资源中的IRQ和I/O值来避开与计算机其它资源的冲突.有些情况还需要通过设置主板的跳线来调整与其它资源的冲突 ...

最新文章

  1. ML 03、机器学习的三要素
  2. 第一章.良好应用程序基石(2)
  3. php把int转string,如何在php中实现int转string
  4. 自定义View之onMeasure()
  5. 2021年中国自有品牌行业发展白皮书
  6. 数据仓库之电商数仓-- 1、用户行为数据采集
  7. java channelpipeline,Netty那点事(三)Channel与Pipeline
  8. Unity3D命令行Build
  9. iPhone 12搭载5nm A14芯片:晶体管数量高达150亿
  10. java swing登录界面_JAVA SWing实现登陆界面
  11. AI 之路、回顾 2021,展望 2022 :当代青年的小烦恼
  12. 2018级《程序设计基础(B)II》期末上机考试 重现--SDUT
  13. java和vr联系_VR,AR,MR的区别与联系
  14. Ambari2.7+HDP3.0安装(基于Centos7)
  15. 计算机语言发展简史,计算机语言发展简史
  16. USB 设置接口SetInterface
  17. Android R Framework wifi扫描场景总结
  18. 从一代名将到一代名流 法切蒂的蓝黑人生
  19. 中国连接Internet的海底光缆
  20. 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——1.1节智能手机市场现状

热门文章

  1. 怎么用class覆盖style样式
  2. BZOJ3522[Poi2014]Hotel——树形DP
  3. window.btoa()方法;使字符编码成base64的形式
  4. 【noi】植物大战僵尸
  5. Android(Fragment和Activity之间通信)
  6. 云计算的思想领袖:与Tier3的创始人和首席技术官Jared Wray的谈话
  7. 实例:从一个文件中读取销售记录,并合并生成销售报告,实现销售册数,总销售额,平均售价...
  8. OpenCV探索之路(十):图像修复技术
  9. Node.js + React + MongoDB 实现 TodoList 单页应用
  10. linux系统启动故障排除