写点什么

Kubernetes 网络的常见故障及排查手册

  • 2020-05-16
  • 本文字数:4299 字

    阅读完需:约 14 分钟

Kubernetes网络的常见故障及排查手册

随着云计算的兴起,各大平台之争也落下了帷幕,Kubernetes 作为后起之秀已经成为了事实上的 PaaS 平台标准,而网络又是云计算环境当中最复杂的部分,总是让人琢磨不透。网络可以说是 Kubernetes 部署和使用过程中最容易出问题的部分之一,最主要原因在于对网络技术非常熟悉的人员本来就相对较少,和 Kubernetes 结合后能彻底将网络掌握透彻就更不容易。如此一来,用户在部署使用 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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.3
RUN apt-get update && apt-get -y install iproute2 net-tools ethtool nano
CMD ["/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
复制代码

Kubernetes 跨集群的网络连接

如今,Kubernetes 的部署实现了网络虚拟化,让容器可以在同一集群中的多个节点运行并相互通信。然而,越来越多的企业将 Kubernetes 用作为跨所有公有云和私有云基础设施的基础计算平台,可在不同的 Kubernetes 集群中运行的容器想要实现互相通信,实现的方法依然是传统的通过 ingress controller 或者节点端口来完成。


想要更简单快速地实现跨集群的网络连接,Rancher Labs 贡献的开源项目Submariner值得一试。Submariner 支持多个 Kubernetes 集群之间的跨集群网络连接,它创建了必要的隧道和路径,能为部署在需要相互通信的多个 Kubernetes 集群中的微服务提供网络连接。


这一全新的解决方案解决了 Kubernetes 集群之间的连接障碍,为多集群部署提供了更多实现方式,例如在跨地区的 Kubernetes 内复制数据库,以及跨集群部署服务网格。感兴趣的朋友可以在 GitHub 上了解及下载噢:


https://github.com/rancher/submariner


更多参考链接:


2020-05-16 17:182219

评论

发布
暂无评论
发现更多内容

Java StringBuffer 动态字符串

爱好编程进阶

程序员 后端开发

惨遭面试官吊打高并发系统设计,回来学习2400小时后成功复仇

Java架构追梦

Java 后端开发 程序员面试

Alibaba最新出版的JDK源码剖析手册(究极奥义版)开源

Java架构追梦

jdk java面试 后端开发

开源之夏 2022 重磅来袭!欢迎报名 RadonDB 社区项目!

RadonDB

数据库 开源 RadonDB 开源之夏

认清大脑中的一对塑料姐妹花,科学解锁情绪密码

图灵教育

效率 职场 脑科学

IDEA的Docker插件实战(Dockerfile篇)

爱好编程进阶

Java 程序员 后端开发

Java 生成随机数的 5 种方式,你知道几种?

爱好编程进阶

Java 程序员 后端开发

2022年4月国产数据库大事记

墨天轮

数据库 opengauss TiDB 国产数据库 达梦

Q1手机银行运营报告:交易规模超150万亿,月活跃用户4.9亿

易观分析

手机银行

Apache Calcite SQL解析及语法扩展

不穿格子衬衫的程序员

数据库 sql 大数据 flink Apache Calcite

易观分析刘怡:技术投入聚焦降本增效,用技术赋能人提升企业能效

易观分析

人口变化 技术赋能

Stack 顿悟三部曲(3):溯源 goroutine 堆栈

蓬蒿

golang 堆栈 协程 stack goroutine

中小型企业团队的CRM系统最佳实践

低代码小观

低代码 CRM 客户关系管理 CRM系统 客户关系管理系统

ETL自动化运维调度管理工具 TASKCTL 流程文件系统

敏捷调度TASKCTL

程序员 DevOps 运维 ETL 大数据运维

上市商业银行手机银行场景建设专题分析

易观分析

商业银行 手机银行

2022金蝶云苍穹峰会抢先看

金蝶云·苍穹

苍穹峰会 苍穹5.0 人力云

LAXCUS分布式操作系统:云盘的使用

LAXCUS分布式操作系统

云盘 分布式存储 分布式软件系统

想要成为一名真正的软件工程师吗?加入非凸,一起升级!

非凸科技

招聘 社招 校招 软件开发工程师

造孽啊!阿里内部的神级项目和JDK源码阅读指南竟惨遭GitHub开源

Java架构追梦

Java 程序员 后端开发

java 通过 SmbFile 类操作共享文件夹

爱好编程进阶

程序员 后端开发

真可笑!拿着这份JVM学习笔记学了2个月,就想着出去跳槽涨10k

Java架构追梦

Java 程序员 后端开发

淘宝京东优惠券返利机器人

江苏京酷电子商务有限公司

淘宝电商 群聊机器人 返利 采集京东

为 GPU 而来,焱融科技推出新一代全闪分布式文件存储产品

焱融科技

人工智能 云计算 高性能 文件存储 高计算

量子计算是人工智能的未来吗?

海拥(haiyong.site)

人工智能 量子计算 5月月更

Java 类型信息详解和反射机制

爱好编程进阶

Java 程序员 后端开发

Java面试前的敲门砖:多线程+微服务spring源码+Redis+docker+Git

Java架构追梦

Java 后端开发 程序员面试

【INFOCOM 2022】支持任意网络拓扑的同步流水线并行训练算法,有效减少大规模神经网络的训练时间

阿里云大数据AI技术

神经网络 机器学习 算法 并行训练算法

AliIAC 智能音频编解码器:在有限带宽条件下带来更高质量的音频通话体验

阿里云CloudImagine

语音 音频 视频云 音频编码器

OneFlow如何做静态图的算子对齐任务

OneFlow

人工智能 graph 自动测试 算子对齐

OceanBase 3.2.3 发版|HTAP引擎全面升级,TPC-H性能10倍提升!

OceanBase 数据库

oceanbase

java poi 读取Excel中的手机号或电话号码,手机号变成1

爱好编程进阶

程序员 后端开发

Kubernetes网络的常见故障及排查手册_文化 & 方法_Rancher_InfoQ精选文章