KubeCon 18会议分享 -- k8s网络复杂性和诊断

简介: 在刚刚过去的北美KubeCon 18中,有一位来自Redhat的老哥分享了k8s网络的诊断的方法,阿里云容器服务在客户问题中有挺多是网络的问题,这个分享可以帮助在使用k8s网络遇到问题时的诊断流程。

在刚刚过去的北美KubeCon 18中,有一位来自Redhat的老哥分享了k8s网络的诊断的方法,阿里云容器服务在客户问题中有挺多是网络的问题,这个分享可以帮助在使用k8s网络遇到问题时的诊断流程。

为啥k8s网络那么复杂

首先介绍了k8s网络为啥这么复杂,都有哪些考虑到的地方,这部分介绍的很多内容也是我们团队在做网络时遇到的一些坑。

k8s网络方案设计需要考虑很多方面:

image.png | left | 747x402

  • 宿主机间的网络:是采用纯硬件的网络还是虚拟的网络(例如openstack)的vxlan,关系到宿主机的性能以及容器网络可以选择的方案,比如宿主机是虚拟网络的话容器网络一般只能采用overlay的方案。
  • 容器间网络:采用Overlay(封包成宿主机的包)的网络还是 Non-overlay的网络以及各自的性能和限制,容器的IP地址管理,容器的网络访问控制(Network Policy), 网络带宽管理(Qos/Traffic sharping)
  • K8S本身的网络结构适配:负载均衡(kube-proxy...), K8S的Network Policy, Ingress服务等等。

需要协调很多层次的网络组件:

  • 容器网络的包会被各个层次去修改,在容器中会有istio等service mesh组件, 在宿主机上也会有kube-proxy/kubelet会修改包的源/目的地址等等
  • 需要考虑到底层网络的一些限制,比如带宽限制,比如arp劫持/防欺骗等等

image.png | left | 747x420

k8s网络配置过程以及诊断:

上面讲了很多网络的复杂度,下面讲师以kubeadm为例介绍了网络的配置过程,针对配置的过程以及每一步做的事情和完成的原因可以了解网络初始化的过程,方便出现问题时排查:

大体上的k8s网络从集群初始化到ready是这样的流程:

image.png | left | 747x405

  1. 先是集群创建出来,节点加入到集群中,这个时候每个节点(kubelet)都通过宿主机网络连通到master节点的管控的组件(apiserver等)上。这个时候在集群中能看到节点列表(kubectl get node),但是每个节点都是NotReady的状态,这个时候非Host网络的Pod都会在Pending状态,因为没有节点网络是Ready的,如下图Coredns就是Pending的,说明宿主机的网络已经联通了,但是容器网络还没有好:

image.png | left | 747x397

  1. 然后每个节点再配置CNI的plugin和配置,比如最常见的我们通过flannel的模板部署flannel的插件,节点在监听到插件和配置存在时会上报状态,这个时候整个节点的网络才ready,这时候k8s会将需要容器网络的容器调度到ready的节点上,Pending状态就会变成Creating状态,然后由节点上的kubelet再调用CNI插件去配置容器的网络,容器就能变成Running状态,这个时候容器的网络也就Ready了:

image.png | left | 719x390

容器网络配置这一步会有哪些问题呢?

在CNI插件和配置文件安装到节点上后,节点就会变成ready了,就会有容器调度到节点上,但不一定容器能正确运行:

  • CNI插件执行失败了,容器一直在Creating,通过kubelet日志或者容器事件可以看到cni的报错
  • CNI插件执行没问题,容器也能变成Running,但是容器网络通信不行(容器间,容器和宿主机(健康检查等)

对于第一种情况:

我们能看到的现象是这样的:容器一直在Creating,通过kubelet日志或者容器事件可以看到cni的报错

image.png | left | 747x327

image.png | left | 747x327

对于第二种情况:

通常可以通过健康检查日志或者容器本身的网络请求的日志看到容器网络是不连通的:

image.png | left | 747x325

如何排查这些问题:

对于容器网络不通的情况,我们要如何排查呢,这里讲师介绍了一些简单的容器虚拟化网络和排查的知识,可以从中入手:

如何区分容器的网卡

ip -d -d link show dev {网卡名} 这个命令可以看到网卡的类型以及详细的一些信息,比如

image.png | left | 747x264

cni0是一个bridge设备,可以比作物理网络中的交换机

image.png | left | 747x326

这个截图是在容器内部执行的,容器的eth0网卡,是一个veth类型的设备,veth是用来联通不同的namespace的,通常用来联通容器和宿主机的网桥,后面的if33代表它联通的另外一端的网卡的编号,到宿主机的namespace中执行ip -d link show我们就能看到这个网卡编号对应的网卡

如果有的容器没有ip 命令,那我们要怎么进到容器中排查呢?可以通过nsenter的命令进入到容器的网络命名空间操作,例如:

image.png | left | 747x352

其中的pid就是容器进程的ID,PID可以通过ps -ef | grep <容器进程>,也可以通过kubectl get pod -o yaml | grep containerID , 然后docker inspect 来找到对应的pid。

排查Iptables:

很多时候遇到网络配置成功,但是容器网络不通的问题都是iptables在从中作梗,比如增加了什么防火墙规则,Chain的Policy被改掉啦之类的。

iptables工作的地方:

image.png | left | 747x318

容器进程访问网络时,会首先经过容器内部的iptables,然后到宿主机上面,在宿主机上面会通过宿主机的iptables和routing最终决定包的取舍和去向。

那么谁会添加iptables规则呢?

答案是谁都会。。。

image.png | left | 747x334

iptables添加为了几个功能: 负载均衡(在PREROUTING中去做DNAT+RAMDOM), 访问控制(在FORWARD/INPUT/OUTPUT)中去做限制, 源地址装换(POSTROUTING中转换成宿主机的IP地址)等等

最后介绍抓包大法:

上面的介绍可见网络的过程和复杂度,但是通常排查时没办法一条一条规则的顺着去排查,何况规则还是由那么多组件操控随时会变化,这时候可以使用抓包工具排查在哪一层包被丢掉了来一一排除的解决问题:
我们可以在不同层次的网卡上抓包来看到底包丢在什么地方,或者被改成了啥熊样。

image.png | left | 747x310

在容器服务这边,通常情况下,我们采用tcpdump的方式通过容器IP等过滤条件抓包排查,如果需要详细的包的解析,可以tcpdump -w写到文件中,然后通过wireshark去解析,这里讲师展示了另外一个工具:kokotap 可以创建一个拷贝的接口,将容器的流量也导入到这个接口上方便wireshark直接在宿主机上也能抓到容器的包。

总结

整个分享就是这些,这个分享中前面介绍了很多k8s网络的复杂度,这块介绍的比较全面,我们在做网络插件时在那些点上也都会遇到一些坑,在后面的介绍中主要是网络排查的入门以及工具,通过这些工具可以上手排查问题了,但排查到现象后具体的原因没有详细介绍,可能因为遇到的问题场景就太多了,大家可以在排查的过程中多多增加经验。

容器服务在k8s网络上有深入的实践,另外有开源的网络插件Terway,覆盖了k8s网络的方方面面,项目链接 https://github.com/AliyunContainerService/terway

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
Kubernetes 数据安全/隐私保护 容器
K8s中Flannel网络插件安装提示forbidden无权限的解决方法
总的来说,解决“forbidden无权限”的问题,需要从权限和配置两个方面来考虑。只有当用户或者服务账户有足够的权限,且Flannel的配置文件设置正确,才能成功地安装Flannel。希望这个解答能够帮助你解决问题。
526 13
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
578 12
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
1150 2
|
域名解析 运维 网络协议
网络诊断指南:网络故障排查步骤与技巧
网络诊断指南:网络故障排查步骤与技巧
8106 7
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
1255 1
|
传感器 网络协议
CCF推荐B类会议和期刊总结:(计算机网络领域)
中国计算机学会(CCF)推荐的B类会议和期刊在计算机网络领域具有较高水平。本文总结了所有B类会议和期刊的详细信息,包括全称、出版社、dblp文献网址及研究领域,涵盖传感器网络、移动网络、网络协议等多个方向,为学者提供重要学术交流平台。
CCF推荐B类会议和期刊总结:(计算机网络领域)
|
传感器 算法 物联网
CCF推荐C类会议和期刊总结:(计算机网络领域)
该文档总结了中国计算机学会(CCF)推荐的计算机网络领域C类会议和期刊,详细列出了各类会议和期刊的全称、出版社、dblp文献网址及研究领域,为研究者提供了广泛的学术交流资源和平台。
CCF推荐C类会议和期刊总结:(计算机网络领域)
|
Kubernetes 网络协议 网络安全
k8s中网络连接问题
【10月更文挑战第3天】
1336 7
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
4941 3

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多