网络插件flannel:
kubernetes网络通信:
(1)、容器间通信:同一个Pod内的多个容器间通信。可以直接通过lo实现
(2)、Pod之间的通信:在kubernetes中要求Pod之间的通信必须是一个Pod的自己的IP到另外一个Pod的自己的IP不经过任何的NET转换需直达,Pod IP=>Pod IP
(3)、Pod与Service之间的通信:Pod IP=>Service IP(cluster IP),Pod IP和Service IP(cluster IP)不在一个网段,但是通过本地的IPVS或IPtables规则实现通信。

查验kubernetes网络中使用的是IPVS规则还是IPtables规则

kubectl get configmap -n kube-system

查到名为kube-proxy的configmap

kubectl get configmap kube-proxy -n kube-system -o yaml

查询该configmap时其中有一项名为mode的选项,mode后面如果是IPvs就是用的IPvs 同理如果是IPtables就是用的IPtables,ipvs无法取代iptables因为ipvs只能做负载均衡,不能做NET转换。
(4)、Service与集群外部客户端的通信。
CNI:
第三方网络插件:

  flannel    #暂不支持网络策略
  calico
  canel
  kube-router
  。。。

无论是哪一种网络插件要想实现通讯,他们的解决方案无非就是下面几种方式。
解决方案:

虚拟网桥:以纯软件的方式实现一个虚拟网络并接入到网桥,这样可以保证每一个容器、每一个Pod都有一个自己专用的网络接口。
多路复用:
     MacVLAN:基于MAC的方式创建VLAN,为每个虚拟机创建自己独有的MAC地址,一个物理网卡承载多个容器时使用,直接使用物理网卡并基于物理网卡中的MACVALN机制进行跨节点通信。
硬件交换:
    SR-IOV(单根IOV):一个物理网卡在虚拟机中虚拟出多个接口
三种性能排名:硬件交换>多路复用>虚拟网桥

对于kubernetes来讲CNI配置在kubelet的启动文件当中。kubelet在启动时通过一个目录路径加载插件配置文件/etc/cni/net.d/,因此我们只需要把CNI的配置文件丢到该目录下,就可以自动被识别被加载成网络插件来使用

flannel:
  支持多种后端:
      VxLAN(扩展的虚拟局域网):
        (1)、VxLAN:隧道叠加
        (2)、Directrouting(直接路由):源和目标节点在同一网络,默认使用host-gw模式使用路由直接转发,不用隧道叠加,否则就会隧道叠加
      host-gw:现有多个节点,每个节点上都需要运行Pod,1节点和2节点上的Pod各自有一个专用的网段,把主机自己所在的网络接口当作网关来使用,从而给主机中的Pod各自配备一个IP地址,通过网关对外进行传递。需要在同一个二层网络当中才能使用此方式。
      UDP:使用UDP报文进行转发,比VxLAN性能更差,因为是使用的是普通的UDP报文进行转发的,仅支持在网络环境不支持前两种类型时使用。

根据自己需要定义flannel的configmap配置文件:
flannel应该部署有kubelet的节点之上,换句话说就是只要有kubelet的节点都要部署flannel,因为kubelet要借助网络插件设置网络接口,添加网络以及激活网络等功能。

flannel部署支持部署在系统之上的守护进程也支持部署在kubernetes的Pod之上,对第二种方式来讲必须把flannel配置为flannel所运行的节点网络名称空间的Pod,所以flannel运行所选择的控制器应该是DaemonSet,在每个节点之上只运行一个Pod副本,而且这个pod副本直接共享宿主机的网络名称空间,因为这样flannel才能设置宿主机的网络名称空间
配置方式:

  在github中下载flannel配置文档的ConfigMap模块添加"Directrouting": true

例如:

kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
  labels:
    tier: node
    app: flannel
data:
cni-conf.json: |
{
  "name": "cbr0",
  "cniVersion": "0.3.1",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}
net-conf.json: |
{
  "Network": "10.244.0.0/16",
  "Backend": {
    "Type": "vxlan"
    "Directrouting": true
  }
}

添加完该项后k8s的Pod就会自动修改使用的CNI方案
注意:尽量在部署完K8S后把该项配置修改好并apply,不然中间更新网络的话就会有一段时间集群的Pod网络状态是断网状态。

最后修改:2023 年 06 月 09 日
如果觉得我的文章对你有用,请随意赞赏