0.前言

参考文档:https://github.com/containernetworking/cni

Pod网络插件,为了实现Pod网络而需要的插件、组件。由于Kubernetes通过开放的CNI接口来允许插件的接入,所以它又称之为CNI网络插件。

为了解决跨主机容器间通信问题,市面上存在很多解决方案,为了兼容和规范这些解决方案,Kubernetes仅设计了网络模型,却将Pod网络的实现交给了CNI网络插件,并允许网络插件通过标准的CNI(Container Network Interface,容器网络接口)连接到容器管理系统。

CNI网络插件主要解决的就是容器跨主机通信问题而存在的,并使跨主机间运行的Pod位于同一个网络平面,其大致解决步骤通常有两步:分配设置自定义容器网络(PodIP在集群中全局唯一性)和实现容器网络通信(处理方法通常有路由、覆盖网络{Vxlan、IPIP}等等)。

每个Pod都会创建一个名叫"pause"的根容器,其他运行的业务容器都是复制该容器的网络,这个容器就是Kubernetes为了自定义网络等特殊功能而存在的。

CNI网络插件分为以下四种:

  • MAIN,主要的,创建接口,主要网络的实现。如:bridge、ipvlan、loopback、macvlan、ptp、vlan、host-device。
  • Windows,特用于Windows的MAIN插件。如:win-bridge、win-overlay。
  • IPAM,仅提供IP地址分配功能。如:dhcp、host-local、static。
  • META,其他插件,通过调用第三方插件来实现网络功能。如:tuning、portmap、bandwidth、sbr、firewall、flannel。

    光单独靠一种CNI网络插件是无法实现完整的Pod网络通信和更高级的网络策略功能的,第三方组织可以灵活的组合这些CNI插件实现基本Pod网络功能和更高级功能,所以市面上流行出来很多解决方案。

    在现今,比较常用的流行的Pod网络解决方案有Flannel和Calico(支持网络策略功能)、Canal(由Flannel实现网络通信+Calico提供网络策略)。

1.Flannel概述

参考文档:https://github.com/flannel-io/flannel

Flannel是一种专为Kubernetes设计简单易配置的Pod网络通信方案。

1.1.PodIP(容器IP)地址分配方法

Flannel在每个主机运行一个代理"flanneld"负责从预置的网络地址空间"10.244.0.0/16"中为每个节点主机分配一个独立的子网"如10.244.0.0/24、10.244.1.0/24...依次类推",每个节点都拥有一个独立子网。Flannel直接通过Kubernetes API 或Etcd来存储网络配置、分配的子网和任何辅助数据(例如主机的公共IP)。

  1. [root@k8s-master01 ~]# ps aux |grep flannel |grep -v grep
  2. root 129882 0.1 1.1 1406468 21844 ? Ssl 01:58 0:01 /opt/bin/flanneld --ip-masq --kube-subnet-mgr
  3. [root@k8s-master01 ~]# ifconfig
  4. cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
  5. inet 10.244.0.1 netmask 255.255.255.0 broadcast 10.244.0.255
  6. inet6 fe80::40e6:c0ff:fe73:7322 prefixlen 64 scopeid 0x20<link>
  7. ether 42:e6:c0:73:73:22 txqueuelen 1000 (Ethernet)
  8. RX packets 2135 bytes 173643 (169.5 KiB)
  9. RX errors 0 dropped 0 overruns 0 frame 0
  10. TX packets 2144 bytes 221369 (216.1 KiB)
  11. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  12. ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  13. inet 192.168.124.134 netmask 255.255.255.0 broadcast 192.168.124.255
  14. ether 00:0c:29:40:e3:9f txqueuelen 1000 (Ethernet)
  15. RX packets 21776361 bytes 3312500382 (3.0 GiB)
  16. RX errors 0 dropped 0 overruns 0 frame 0
  17. TX packets 21943903 bytes 3680963238 (3.4 GiB)
  18. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  19. flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
  20. inet 10.244.0.0 netmask 255.255.255.255 broadcast 0.0.0.0
  21. inet6 fe80::743d:5cff:febf:9d75 prefixlen 64 scopeid 0x20<link>
  22. ether 76:3d:5c:bf:9d:75 txqueuelen 0 (Ethernet)
  23. RX packets 0 bytes 0 (0.0 B)
  24. RX errors 0 dropped 0 overruns 0 frame 0
  25. TX packets 0 bytes 0 (0.0 B)
  26. TX errors 0 dropped 8 overruns 0 carrier 0 collisions 0
  27. ....
  28. veth5af012c2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
  29. inet6 fe80::7c96:79ff:feb5:e5d1 prefixlen 64 scopeid 0x20<link>
  30. ether 7e:96:79:b5:e5:d1 txqueuelen 0 (Ethernet)
  31. RX packets 1071 bytes 102134 (99.7 KiB)
  32. RX errors 0 dropped 0 overruns 0 frame 0
  33. TX packets 1091 bytes 112057 (109.4 KiB)
  34. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  35. veth72fc4936: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
  36. inet6 fe80::f44a:83ff:fe6b:e926 prefixlen 64 scopeid 0x20<link>
  37. ether f6:4a:83:6b:e9:26 txqueuelen 0 (Ethernet)
  38. RX packets 1064 bytes 101399 (99.0 KiB)
  39. RX errors 0 dropped 0 overruns 0 frame 0
  40. TX packets 1072 bytes 110626 (108.0 KiB)
  41. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Flannel会在每个创建的Pod从子网中"10.244.0.0/24"分配一个集群中全局唯一的PodIP,每个主机上创建一个名为"cni|cbr0"的拥有IP地址"10.244.0.1"的虚拟网卡(地址在全局唯一)作为Pod的网关,

用于跨主机Pod间网络通信。如下图所示:

1.2.跨主机Pod网络通信实现方法

参考文档:https://github.com/flannel-io/flannel/blob/master/Documentation/backends.md

Flannel支持多种跨主机间Pod通信处理方法(backend mechanisms,又称之为后端机制)。

1.2.1.HOST-GW

host-gw,Host GateWay,主机网关,在节点主机上创建到达目标Pod地址的路由直接完成报文转发。

该模式仅适用于物理主机在同一个局域网中,在跨网段的物理主机网络中,需要在跨网段的路由设备上手动添加静态路由,随着路由的跳数会增加路由条目的数量,增加复杂度。

1.2.2.VXLAN

VxLAN(默认),VxLAN,Virtual extensible Local Area Network,虚拟可扩展局域网。Flannel使用Linux内核的VxLAN模块将虚拟网络数据包信息封装到物理网络的报文中,然后通过物理网络传输报文,类似于VPN隧道封装技术。这将会在所有节点主机上创建一个名叫"flannel.1"的虚拟网卡用于VxLAN报文的封装和解封装工作,Flannel会将这个网卡的MAC和IP相关信息记录到Etcd。

VxLAN有两种跨主机通信机制:

VxLAN Default:默认机制



VxLAN DirectRouting:使用直接路由的方式通信,类似于host-gw,当主机在同一个子网时则通过静态路由的方式直接将Pod网络报文转发到其他主机上,如果主机在不同子网中时则采用默认的VxLAN通信方式。在配置参数中使用"DirectRouting:true"即可。

1.2.3.UDP

UDP,使用普通的UDP报文封装成隧道转发,工作原理等同于VxLAN,只不过封装的报文为UDP报文。仅用于调试,当前面两种模式不适用时,则可以使用该通信方式(早期的Linux内核不支持VxLAN)。该模式性能与前两种对比较低。

2.安装Flannel网络插件

参考文档:https://github.com/flannel-io/flannel

当前主机环境:

  • 主机系统版本:CentOS Linux release 7.6.1810 (Core)
  • Kubernetes版本:v1.23.0

    安装要求:无

1、配置Github域名加速

安装清单文件来源于Github,所以需要配置一下域名加速。

浏览器输入"https://www.ipaddress.com/"查询获取域名解析国内IP。



向主机Host文件添加记录:

  1. [root@k8s-master01 ~]# cat >> /etc/hosts <<EOF
  2. 185.199.108.133 raw.githubusercontent.com
  3. EOF

2、下载清单文件

Kubernetes v1.17+:

  1. [root@k8s-master01 ~]# wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml -O flannel.yml

Kubernetes v1.6~v1.15:

  1. [root@k8s-master01 ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-legacy.yml -O flannel-legacy.yml

3、配置Flannel

Flannel默认使用的Pod子网(CIDR)是"10.244.0.0/16",如果你在初始化集群的时候设置的Pod子网为其他网段,则这边需要修改为相同的子网。

Flannel默认使用的后端机制为VXLAN。配置后端可以参考"https://github.com/flannel-io/flannel/blob/master/Documentation/backends.md"文档。

  1. [root@k8s-master01 ~]# vim flannel.yml
  2. ...
  3. kind: ConfigMap
  4. apiVersion: v1
  5. metadata:
  6. name: kube-flannel-cfg
  7. namespace: kube-system
  8. labels:
  9. tier: node
  10. app: flannel
  11. data:
  12. cni-conf.json: |
  13. {
  14. "name": "cbr0",
  15. "cniVersion": "0.3.1",
  16. "type": "flannel",
  17. "delegate": {
  18. "hairpinMode": true,
  19. "isDefaultGateway": true
  20. }
  21. }
  22. net-conf.json: |
  23. {
  24. "Network": "10.244.0.0/16",
  25. "Backend": {
  26. "Type": "vxlan"
  27. }
  28. }
  29. ...

4、使用清单文件安装Flannel

  1. [root@k8s-master01 ~]# kubectl apply -f flannel.yaml

3.Flannel配置详解(安装Flannel前必读)

参考文档:https://github.com/flannel-io/flannel/blob/master/Documentation/backends.md

通过flannel.yaml清单文件可以看到flannel的配置信息保存到了ConfigMap/kube-flannel-cfg中名叫net-conf.json的文件。

我们可以通过修改相关配置来修改Flannel的工作模式和相关参数。

  1. kind: ConfigMap
  2. apiVersion: v1
  3. metadata:
  4. name: kube-flannel-cfg
  5. namespace: kube-system
  6. labels:
  7. tier: node
  8. app: flannel
  9. data:
  10. cni-conf.json: |
  11. {
  12. "name": "cbr0",
  13. "cniVersion": "0.3.1",
  14. "plugins": [
  15. {
  16. "type": "flannel",
  17. "delegate": {
  18. "hairpinMode": true,
  19. "isDefaultGateway": true
  20. }
  21. },
  22. {
  23. "type": "portmap",
  24. "capabilities": {
  25. "portMappings": true
  26. }
  27. }
  28. ]
  29. }
  30. net-conf.json: |
  31. {
  32. "Network": "10.244.0.0/16",
  33. "Backend": {
  34. "Type": "vxlan"
  35. }
  36. }

3.2.配置Flannel工作模式为VXLAN相关配置项

VxLAN,Virtual extensible Local Area Network,虚拟可扩展局域网。

Type(string): vxlan

设置Flannel工作模式为"vxlan"。

VNI(number)

设置要使用的VXLAN标识符(VNI)。在Linux中默认值为1。 在Windows上应该大于或等于4096。

Port(number)

用于发送封装数据包的 UDP 端口。 在Linux上,默认值为内核默认值,目前为8472,但在Windows上,必须为4789。

GBP(Boolean):

Group Based Policy,启用基于VXLAN组的策略。默认为false。Windows不支持GBP。

DirectRouting(Boolean):

直接路由的意思,当主机位于同一个局域网时,则采用静态路由的方式进行Pod间通信,类似于host-gw的工作方式。当主机在不同的子网中时,则采用Vxlan隧道方式通信。该配置默认值为false。Windows不支持该功能。

MacPrefix(String):

仅用于Windows,设置Mac前缀。默认为OE-2A。

3.3.配置Flannel工作模式为HOST-GW相关配置项

Host GateWay,主机网关。

Type(string): host-gw

设置Flannel工作模式为"host-gw"。

3.4.配置Flannel工作模式为UDP相关配置项

仅当主机不支持VxLAN和host-gw模式的时候才建议使用该模式。

Type(string): udp

设置Flannel工作模式为"udp"。

Port(number):

设置发送封装数据包要使用的UDP端口。默认为8285.

4.完全卸载Flannel网络插件

想要完全的从主机上移除Flannel,除了需要删除已运行的Pod之外,还需要删除主机中相关的创建虚拟网卡设备和相关CNI配置文件。

1、基于安装清单删除Flannel创建的资源对象

在任一Master节点上操作:

  1. [root@k8s-master01 ~]# kubectl delete -f flannel.yml

2、移除虚拟网卡

在所有主机上操作:

  1. [root@k8s-master01 ~]# ifconfig cni0 down
  2. [root@k8s-master01 ~]# ip link delete cni0
  3. [root@k8s-master01 ~]# ifconfig flannel.1 down
  4. [root@k8s-master01 ~]# ip link delete flannel.1

3、删除Flannel相关CNI配置文件

  1. [root@k8s-master01 ~]# rm -rf /var/lib/cni/
  2. [root@k8s-master01 ~]# rm -rf /etc/cni/net.d/*

4、重启kubelet服务

  1. [root@k8s-master01 ~]# systemctl restart kubelet
  2. [root@k8s-master01 ~]# kubectl get nodes
  3. NAME STATUS ROLES AGE VERSION
  4. k8s-master01 NotReady control-plane,master 3h56m v1.23.0
  5. k8s-master02 NotReady control-plane,master 3h55m v1.23.0
  6. k8s-master03 NotReady control-plane,master 3h55m v1.23.0
  7. k8s-node01 NotReady <none> 3h52m v1.23.0

K8S Flannel网络插件的更多相关文章

  1. K8S(03)核心插件-Flannel网络插件

    系列文章说明 本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白 需要视频可以联系我 K8S核心网络插件Flannel 目录 系列文 ...

  2. Kubernetes1.91(K8s)安装部署过程(五)--安装flannel网络插件

    node节点需要安装flannel网络插件才能保证所有的pod在一个局域网内通信,直接使用yum安装即可,版本是0.7.1. 1.安装flannel插件: 注意是2个node节点都需要安装,都需要修改 ...

  3. 使用kubeadm安装kubernetes/部署前准备/flannel网络插件/镜像下载/

    本文内容参考<kuberneters进阶实战>/马哥的新书/推荐 部署前的准备 主机名称解析 分布式系统环境中的多主机通信通常基于主机名称进行,这在IP地址存在变化的可能性时为主机提供了固 ...

  4. k8s的flannel网络插件配置

    flannel的网络插件配置 Kubernetes网络通信需要解决以下问题:            (1)容器间通信:同一个Pod内的多个容器间的通信,lo            (2)Pod通信:P ...

  5. k8s更换网络插件:从flannel更换成calico

    卸载flannel 查看已安装的flannel的信息 # 查看CNI插件,可以得知使用的是flannel # cat /etc/cni/net.d/10-flannel.conflist { &quo ...

  6. K8S Calico网络插件

    0.前言 参考文档:https://github.com/containernetworking/cni Pod网络插件,为了实现Pod网络而需要的插件.组件.由于Kubernetes通过开放的CNI ...

  7. Flannel网络插件配置

    # ps -ef|grep docker|grep bip FLANNEL_OPTIONS="-ip-masq=true" -ip-masq=true 这个参数的目的是让flann ...

  8. k8s之网络插件flannel及基于Calico的网络策略

    1.k8s网络通信 a.容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现; b.pod之间的通信:pod ip <---> pod ip,pod和pod之间不经过任何转换即可 ...

  9. k8s系列---网络插件flannel

    跨节点通讯,需要通过NAT,即需要做源地址转换. k8s网络通信: 1) 容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现: 2) pod之间的通信,pod ip <---> ...

随机推荐

  1. [译]HTML&CSS Lesson5: 定位

    CSS最大的用处之一就是可以将内容和元素定位到任何我们想要的位置,使我们的设计具有结构,使内容更加易懂. CSS有好几种不同的定位属性,每种都有自己的使用场景.在这节课中我们会通过不同的案例--可复用 ...

  2. java栈stack和堆heap的工作原理,用途及区别?举例说明

    java堆和栈的区别[新手可忽略不影响继续学习] Java中内存分成两种:一种是栈stack,一种是堆heap.函数中的一些基本类型的变量(int, float)和对象的引用变量(reference) ...

  3. Python:爬取中国各市的疫情数据并存储到数据库

    import requests import pymysql import json def create(): # 连接数据库 db = pymysql.connect(host = 'localh ...

  4. 最小栈问题:题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

    MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.get ...

  5. 【c++】容器的基本操作

    操作\容器 vector list string set stack queue map 插入 push_bcak().insert() push_back() .push_front().inser ...

  6. Wireshark查找与标记数据包

    查找数据包 按Ctrl-F. 查找数据包提供了4个选项: 显示过滤器(Display filter):该选项可以让你通过输入表达式进行筛选,并只找出那些满足该表达式的数据包.如:not ip, ip. ...

  7. c++对c的拓展_using

    using 声明:使指定标识符可用   注意:与其他同名标识符有作用域冲突时产生二义性即报错 using 编辑指令: 使整个命名空间标识符可用 注意:与其他同名标识符作用域发生冲突使时优先使用局部变量 ...

  8. 微信小程序,制作属于自己的Icon图标

    前言 最近在接手一个微信小程序,发现里面的图标都是使用的image组件,看起来非常别扭,加载也不太顺畅. 就想着看看微信有没有类似自带的图标库可以使用. 有是有,就是太少了,翻来翻去好像也就 8 种, ...

  9. java四种访问修饰符及各自的权限

    1.public,即共有的,是访问权限限制最宽的修饰符.被public修饰的类.属性.及方法不仅可以跨类访问,而且可以跨包访问. 2. protected,即保护访问权限,是介于public和priv ...

  10. 前端CSS基础

    一:CSS 1.什么是CSS? CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). C ...