一篇文章讲明白k8s网络插件flannel模式剖析:vxlan、host

简介: 一篇文章讲明白k8s网络插件flannel模式剖析:vxlan、host

跨节点通讯,需要通过NAT,即需要做源地址转换。

k8s网络通信:

  1) 容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现;

2) pod之间的通信,pod ip pod ip,pod和pod之间要不经过任何转换即可通信;

3) pod和service通信:pod ip cluster ip(即service ip)pod ip,他们通过iptables或ipvs实现通信,另外大家要注意ipvs取代不了iptables,因为ipvs只能做负载均衡,而做不了nat转换;

4) Service与集群外部客户端的通信

【root@master pki】# kubectl get configmap -n kube-system

NAME DATA AGE

coredns 1 22d

extension-apiserver-authentication 6 22d

kube-flannel-cfg 2 22d

kube-proxy 2 22d

kubeadm-config 1 22d

kubelet-config-1.11 1 22d

kubernetes-dashboard-settings 1 9h

【root@master pki】# kubectl get configmap kube-proxy -o yaml -n kube-system|grep mode

mode: ""

看到mode是空的,我们把它改为ipvs就可以了。

k8s要靠CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannel,callco,canel,kube-router。

这些插件使用的解决方案都如下:

1)虚拟网桥,虚拟网卡,多个容器共用一个虚拟网卡进行通信;

2)多路复用:MacVLAN,多个容器共用一个物理网卡进行通信;

3)硬件交换:SR-LOV,一个物理网卡可以虚拟出多个接口,这个性能最好。

CNI插件存放位置

【root@master ~】# cat /etc/cni/net.d/10-flannel.conflist

{

"name": "cbr0",

"plugins": 【

{

"type": "flannel",

"delegate": {

"hairpinMode": true,

"isDefaultGateway": true

}

},

{

"type": "portmap",

"capabilities": {

"portMappings": true

}

}

}

flanel只支持网络通讯,但是不支持网络策略。

callco网络通讯和网络策略都支持。

canel:flanel+callco合起来的功能。

我们可以部署flanel提供网络通讯,再部署一个callco只提供网络策略。而不用canel。

mtu:是指一种通信协议的某一层上面所能通过的最大数据包大小。

【root@master ~】# ifconfig

cni0: flags=4163 mtu 1450

inet 10.244.0.1 netmask 255.255.255.0 broadcast 0.0.0.0

inet6 fe80::4097:d5ff:fe28:6b64 prefixlen 64 scopeid 0x20

ether 0a:58:0a:f4:00:01 txqueuelen 1000 (Ethernet)

RX packets 1609844 bytes 116093191 (110.7 MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 1632952 bytes 577989701 (551.2 MiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

docker0: flags=4099 mtu 1500

inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255

ether 02:42:83:f8:b8:ff txqueuelen 0 (Ethernet)

RX packets 0 bytes 0 (0.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 0 bytes 0 (0.0 B)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ens192: flags=4163 mtu 1500

inet 172.16.1.100 netmask 255.255.255.0 broadcast 172.16.1.255

inet6 fe80::9cf3:d9de:59f:c320 prefixlen 64 scopeid 0x20

inet6 fe80::5707:6115:267b:bff5 prefixlen 64 scopeid 0x20

inet6 fe80::e34:f952:2859:4c69 prefixlen 64 scopeid 0x20

ether 00:50:56:a2:4e:cb txqueuelen 1000 (Ethernet)

RX packets 5250378 bytes 704067861 (671.4 MiB)

RX errors 139 dropped 190 overruns 0 frame 0

TX packets 4988169 bytes 4151179300 (3.8 GiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

flannel.1: flags=4163 mtu 1450

inet 10.244.0.0 netmask 255.255.255.255 broadcast 0.0.0.0

inet6 fe80::a82c:bcff:fef8:895c prefixlen 64 scopeid 0x20

ether aa:2c:bc:f8:89:5c txqueuelen 0 (Ethernet)

RX packets 51 bytes 3491 (3.4 KiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 53 bytes 5378 (5.2 KiB)

TX errors 0 dropped 10 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536

inet 127.0.0.1 netmask 255.0.0.0

inet6 ::1 prefixlen 128 scopeid 0x10

loop txqueuelen 1 (Local Loopback)

RX packets 59118846 bytes 15473986573 (14.4 GiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 59118846 bytes 15473986573 (14.4 GiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

veth6ec94aab: flags=4163 mtu 1450

inet6 fe80::487d:5bff:fef7:484d prefixlen 64 scopeid 0x20

ether 4a:7d:5b:f7:48:4d txqueuelen 0 (Ethernet)

RX packets 88112 bytes 19831802 (18.9 MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 105718 bytes 13343894 (12.7 MiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

vethf703483a: flags=4163 mtu 1450

inet6 fe80::b06a:eaff:fec3:33a8 prefixlen 64 scopeid 0x20

ether b2:6a:ea:c3:33:a8 txqueuelen 0 (Ethernet)

RX packets 760882 bytes 59400960 (56.6 MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 763263 bytes 282299805 (269.2 MiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

vethff579703: flags=4163 mtu 1450

inet6 fe80::d82f:37ff:fe9a:b6d0 prefixlen 64 scopeid 0x20

ether da:2f:37:9a:b6:d0 txqueuelen 0 (Ethernet)

RX packets 760850 bytes 59398245 (56.6 MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 764016 bytes 282349248 (269.2 MiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

通过ifconfig命令,我们可以看到flannel.1的地址是10.244.0.0,子网掩码是255.255.255.255,mtu是1450,mtu要留出一部分做封装叠加,额外开销使用。

cni0只有在pod运行时才会出现。

两个节点上的pod可以借助flannel隧道进行通信。默认使用的VxLAN协议,因为它有额外开销,所以性能有点低。

flannel第二种协议叫host-gw(host gateway),即Node节点把自己的网络接口当做pod的网关使用,从而使不同节点上的node进行通信,这个性能比VxLAN高,因为它没有额外开销。不过他有个缺点, 就是各node节点必须在同一个网段中 。

另外,如果两个pod所在节点在同一个网段中 ,可以让VxLAN也支持host-gw的功能, 即直接通过物理网卡的网关路由转发,而不用隧道flannel叠加,从而提高了VxLAN的性能,这种flannel的功能叫directrouting。

【root@master ~】# kubectl get daemonset -n kube-system

NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE

kube-flannel-ds-amd64 3 3 3 3 3 beta.kubernetes.io/arch=amd64 22d

【root@master ~】# kubectl get pods -n kube-system -o wide

NAME READY STATUS RESTARTS AGE IP //代码效果参考:http://www.zidongmutanji.com/bxxx/451004.html

NODE

kube-flannel-ds-amd64-6zqzr 1/1 Running 8 22d 172.16.1.100 master

kube-flannel-ds-amd64-7qtcl 1/1 Running 7 22d 172.16.1.101 node1

kube-flannel-ds-amd64-kpctn 1/1 Running 6 22d 172.16.1.102 node2

看到flannel是以pod的daemonset控制器形式运行的(其实flannel还可以以守护进程的方式运行)。

【root@master ~】# kubectl get configmap -n kube-system

NAME DATA AGE

kube-flannel-cfg 2 22d

【root@master ~】#kubectl get configmap -n kube-system kube-flannel-cfg -o json -n kube-system|grep Backend

\\"10.244.0.0/16\\",\n \\"Backend\\": {\n \\"Type\\": \\"vxlan\

flannel的配置参数:

1、network :flannel使用的CIDR格式的网络地址,用于为pod配置网络功能。

1)10.244.0.0/16--->

master: 10.244.0.0./24

//代码效果参考:http://www.zidongmutanji.com/zsjx/16955.html

node01: 10.244.1.0/24

....

node255: 10.244.255.0/24

可以支持255个节点

2)10.0.0.0/8

10.0.0.0/24

...

10.255.255.0/24

可以支持6万多个节点

2、SubnetLen :把network切分为子网供各节点使用时,使用多长的掩码进行切分,默认为24位;

3、SubnetMin :指明子网中的地址段最小多少可以分给子网使用,比如可以限制10.244.10.0/24,这样0~9就不让用;

4、SubnetMax :表示最多使用多少个,比如10.244.100.0/24

5、Backend: Vxlan,host-gw,udp(最慢)

flannel支持多种后端:

1.Vxlan

1.1 vxlan

1.2 Dirextrouting

2.host-gw:Host Gateway #不推荐,只能在二层网络中,不支持跨网络,如果有成千上万的Pod,容易产生广播风暴

3.UDP:性能差

【root@master ~】# kubectl get pods -o wide

NAME READY STATUS RESTARTS AGE IP NODE

myapp-deploy-69b47bc96d-79fqh 1/1 Running 4 7//代码效果参考:http://www.zidongmutanji.com/bxxx/242734.html

d 10.244.1.97 node1

myapp-deploy-69b47bc96d-tc54k 1/1 Running 4 7d 10.244.2.88 node2

【root@master ~】# kubectl exec -it myapp-deploy-69b47bc96d-79fqh -- /bin/sh

/ # ping 10.244.2.88 #ping对方Node上容器的ip

PING 10.244.2.88 (10.244.2.88): 56 data bytes

64 bytes from 10.244.2.88: seq=0 ttl=62 time=0.459 ms

64 bytes from 10.244.2.88: seq=0 ttl=62 time=0.377 ms

64 bytes from 10.244.2.88: seq=1 ttl=62 time=0.252 ms

64 bytes from 10.244.2.88: seq=2 ttl=62 time=0.261 ms

在其他节点上抓包,发现根本就在ens192上抓不到包。

【root@master ~】# tcpdump -i ens192 -nn icmp

【root@master ~】# yum install bridge-utils -y

【root@master ~】# brctl show docker0

bridge namebridge idSTP enabledinterfaces

docker08000.024283f8b8ffno

【root@master ~】# brctl show cni0

bridge namebridge idSTP enabledinterfaces

cni08000.0a580af40001noveth6ec94aab

vethf703483a

vethff579703

可以看到veth这些接口都是桥接到cni0上的。

brctl show表示查看已有网桥。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Kubernetes 数据安全/隐私保护 容器
K8s中Flannel网络插件安装提示forbidden无权限的解决方法
总的来说,解决“forbidden无权限”的问题,需要从权限和配置两个方面来考虑。只有当用户或者服务账户有足够的权限,且Flannel的配置文件设置正确,才能成功地安装Flannel。希望这个解答能够帮助你解决问题。
570 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停止抓包。
627 12
|
Kubernetes 网络协议 网络安全
k8s中网络连接问题
【10月更文挑战第3天】
1422 7
|
Kubernetes 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
838 0
|
SQL 监控 安全
网络安全与信息安全:漏洞、加密与安全意识
随着互联网的迅猛发展,网络安全和信息安全问题日益受到关注。本文深入探讨了网络安全漏洞、加密技术以及提高个人和组织的安全意识的重要性。通过分析常见的网络攻击手段如缓冲区溢出、SQL注入等,揭示了计算机系统中存在的缺陷及其潜在威胁。同时,详细介绍了对称加密和非对称加密算法的原理及应用场景,强调了数字签名和数字证书在验证信息完整性中的关键作用。此外,还讨论了培养良好上网习惯、定期备份数据等提升安全意识的方法,旨在帮助读者更好地理解和应对复杂的网络安全挑战。
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
582 17
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
430 10
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
405 10
|
监控 安全 网络安全
网络安全与信息安全:漏洞、加密与意识的交织
在数字时代的浪潮中,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文深入探讨了网络安全中的漏洞概念、加密技术的应用以及提升安全意识的重要性。通过实际案例分析,揭示了网络攻击的常见模式和防御策略,强调了教育和技术并重的安全理念。旨在为读者提供一套全面的网络安全知识框架,从而在日益复杂的网络环境中保护个人和组织的资产安全。

推荐镜像

更多