自学内容网 自学内容网

Kubernetes部署CNI网络组件

目录

1.概述

K8S的三种网络

VLAN和VXLAN的区别

K8S中Pod网络通信

flannel的三种模式

flannel的UDP模式工作原理

flannel的VXLAN模式工作原理

2.部署flannel

在node01节点上操作

在master01节点上操作

3.部署Calico

Calico主要由三个部分组成

calico的IPIP模式工作原理

calico的BGP模式工作原理

flannel与calico的区别

在master01节点上操作

4.部署CoreDNS

在所有node节点上操作

在master01节点上操作


1.概述

K8S的三种网络

  1. 节点网络         nodeIP         物理网卡的IP实现节点间的通信
  2. Pod网络          podIP           Pod与Pod之间可通过Pod的IP相互通信
  3. Service网络    clusterIP      在K8S集群内可通过service资源的clusterIP实现对Pod集群的网络代理转发

VLAN和VXLAN的区别

  1. VLAN主要用作于在交换机上逻辑划分广播域,还可以配合STP生成树协议阻塞路径接口,避免产生环路和广播风暴
  2.  VXLAN可以将数据帧封装成UDP报文,再通过网络层传输给其它网络,从而实现虚拟大二层网络的通信
  3. VXLAN支持更多的二层网络:VXLAN最多可支持 2^24 个;VLAN最多支持 2^12 个(4096-2)
  4. VXLAN可以防止物理交换机MAC表耗尽:VLAN需要在交换机的MAC表中记录MAC物理地址;VXLAN采用隧道机制,MAC物理地址不需记录在交换机

K8S中Pod网络通信

Pod内容器与容器之间的通信

  • 在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命令空间,相当于它们在同一台机器上一样,可以用 localhost 地址访问彼此的端口。

同一个Node内Pod之间的通信

  • 每个 Pod 都有一个真实的全局 IP 地址,同一个 Node 内的不同 Pod 之间可以直接采用对方 Pod 的 IP 地址进行通信,Pod1 与 Pod2 都是通过 Veth 连接到同一个 docker0 网桥,网段相同,所以它们之间可以直接通信。

不同Node上Pod之间的通信

  • Pod 地址与 docker0 在同一网段,docker0 网段与宿主机网卡是两个不同的网段,且不同 Node 之间的通信只能通过宿主机的物理网卡进行。
  • 要想实现不同 Node 上 Pod 之间的通信,就必须想办法通过主机的物理网卡 IP 地址进行寻址和通信。因此要满足两个条件:Pod 的 IP 不能冲突;将 Pod 的 IP 和所在的 Node 的 IP 关联起来,通过这个关联让不同 Node 上 Pod 之间直接通过内网 IP 地址通信。

flannel的三种模式

  1. UDP:出现最早的模式,但是性能最差,基于flanneld应用程序实现数据包的封装/解封装
  2. VXLAN:flannel的默认模式,也是推荐使用的模式,性能比UDP模式更好,基于内核实现数据帧的封装/解封装,而且配置简单使用方便
  3. HOST-GW:性能最好的模式,但是配置负载,且不能跨网段

flannel的UDP模式工作原理

  1. 原始数据包从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel0虚拟接口
  2. flanneld服务进程会监听flannel0接口接收到的数据,flanneld进程会将原始数据包封装到UDP报文里
  3. flanneld进程会根据在etcd中维护的路由表查到目标Pod所在的nodeIP,并在UDP报文外封装nodeIP头部、MAC头部,再通过物理网卡发送到目标node节点
  4. UDP报文通过8285端口送达到目标node节点的flanneld进程进行解封装,再根据本地路由规则通过flannel0接口发送到cni0网桥,再由cni0发送到目标Pod容器

flannel的VXLAN模式工作原理

  1. 原始数据帧从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel.1虚拟接口
  2. flannel.1接口接收到数据帧后添加VXLAN头部,并在内核将原始数据帧封装到UDP报文里
  3. 根据在etcd中维护的路由表查到目标Pod所在的nodeIP,并在UDP报文外封装nodeIP头部、MAC头部,再通过物理网卡发送到目标node节点
  4. UDP报文通过8472端口送达到目标node节点的flannel.1接口并在内核进行解封装,再根据本地路由规则发送到cni0网桥,再由cni0发送到目标Pod容器 

2.部署flannel

实验准备:

k8s集群master01:192.168.88.22kube-apiserver kube-controller-manager kube-scheduler etcd
 
k8s集群node01:192.168.88.40kubelet kube-proxy docker 
k8s集群node02:192.168.88.13
 
etcd集群节点1:192.168.88.22etcd
etcd集群节点2:192.168.88.40
etcd集群节点3:192.168.88.13

在node01节点上操作

#上传 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目录中
cd /opt/
docker load -i flannel.tar
docker load -i flannel-cni-plugin.tar

mkdir /opt/cni/bin -p
tar xf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin

在master01节点上操作

#上传 kube-flannel.yml 文件到 /opt/k8s 目录中,部署 CNI 网络
cd /opt/k8s
kubectl apply -f kube-flannel.yml 

kubectl get pods -n kube-flannel
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-hjtc7   1/1     Running   0          7s

kubectl get nodes
NAME            STATUS   ROLES    AGE   VERSION
192.168.88.40   Ready    <none>   81m   v1.20.11

3.部署Calico

  • Calico不使用隧道或NAT来实现转发,而是把Host当作Internet中的路由器,使用BGP同步路由,并使用iptables来做安全访问策略,完成跨Host转发来。

Calico主要由三个部分组成

  1. Calico CNI插件:主要负责与kubernetes对接,供kubelet调用使用。
  2. Felix:负责维护宿主机上的路由规则、FIB转发信息库等。
  3. BIRD:负责分发路由规则,类似路由器。
  4. Confd:配置管理组件。

calico的IPIP模式工作原理

  1. 原始数据包从源主机的Pod容器发出,通过 veth pair 设备送达到tunl0接口,再被内核的IPIP驱动封装到node节点网络的IP报文里
  2. 根据Felix维护的路由规则通过物理网卡发送到目标node节点
  3. IP数据包到达目标node节点的tunl0接口后再通过内核的IPIP驱动解封装得到原始数据包,再根据本地路由规则通过 veth pair 设备送达到目标Pod容器

calico的BGP模式工作原理

每个Pod容器都有一个 veth pair 设备,一端接入容器,另一个接入宿主机网络空间,并设置一条路由规则。
这些路由规则都是 Felix 维护配置的,由 BIRD 组件基于 BGP 动态路由协议分发路由信息给其它节点。

  1. 原始数据包从源主机的Pod容器发出,通过 veth pair 设备送达到宿主机网络空间
  2. 根据Felix维护的路由规则通过物理网卡发送到目标node节点
  3. 目标node节点接收到数据包后,会根据本地路由规则通过 veth pair 设备送达到目标Pod容器

flannel与calico的区别

  • flannel: UDP  VXLAN  HOST-GW
  • 默认网段:10.244.0.0/16
  • 通常会采用VXLAN模式,用的是叠加网络、IP隧道方式传输数据,对性能有一定的影响。
  • Flannel产品成熟,依赖性较少,易于安装,功能简单,配置方便,利于管理。但是不具备复杂的网络策略配置能力。

在master01节点上操作

#上传 calico.yaml 文件到 /opt/k8s 目录中,部署 CNI 网络
cd /opt/k8s
vim calico.yaml
#修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kube-controller-manager配置文件指定的cluster-cidr网段一样
    - name: CALICO_IPV4POOL_CIDR
      value: "192.168.0.0/16"
  
kubectl apply -f calico.yaml

kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-659bd7879c-4h8vk   1/1     Running   0          58s
calico-node-nsm6b                          1/1     Running   0          58s
calico-node-tdt8v                          1/1     Running   0          58s

#等 Calico Pod 都 Running,节点也会准备就绪
kubectl get nodes

4.部署CoreDNS

  • CoreDNS 是 K8S 默认的集群内部 DNS 功能实现,为 K8S 集群内的 Pod 提供 DNS 解析服务
  • 根据 service 的资源名称 解析出对应的 clusterIP
  • 根据 statefulset 控制器创建的Pod资源名称 解析出对应的 podIP

在所有node节点上操作

#上传 coredns.tar 到 /opt 目录中
cd /opt
docker load -i coredns.tar

在master01节点上操作

#上传 coredns.yaml 文件到 /opt/k8s 目录中,部署 CoreDNS 
cd /opt/k8s
kubectl apply -f coredns.yaml

kubectl get pods -n kube-system 
NAME                          READY   STATUS    RESTARTS   AGE
coredns-5ffbfd976d-j6shb      1/1     Running   0          32s

#DNS 解析测试
kubectl run -it --rm dns-test --image=busybox:1.28.4 sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes


原文地址:https://blog.csdn.net/Ybaocheng/article/details/136236890

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!