k8s介绍系列---flannel网络通信介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s介绍系列---flannel网络通信介绍相关的知识,希望对你有一定的参考价值。

参考技术A k8s最小管理单元是pod,一个主机可以跑多个pod,一个pod可以跑多个容器,一个pod里面的所有容器共享一个网络命名空间,pod里面的容器直接通过localhost完成。

k8s的网络遵循以下原则:

flannel实现pod间通信,通过网络覆盖overlay network,把数据包封装在另一网络转发,覆盖给每个pod分配一个独立IP,使之看起来就是一台独立IP的物理主机

3个node,在多个node上面建立了覆盖网络,子网网段100.95.0.0/16,,每个容器在网段里获取到独立IP,宿主机所在局域网网段是172.20.32.0/19
flannel创建了一个更大的网络给pod,容纳的主机数65535(2^16)
每个宿主机,fannel给了小一点的网络100.96.x.0/24,每个宿主机可以有256个pod,docker默认的网桥docker0就是用这个网络,对于容器来说,都是通过docker0来通信的

对于跨宿主机容器通信,flannel使用了宿主机操作系统的kernel route和UDP包封装来完成
100.96.1.2和100.96.2.3要通信,100.96.1.2发包去100.96.2.3,先经过docker0,是所有桥网关,再经过route table处理,转发到局域网172.20.32.0/19,由fannel的一个守护程序flanneld创建
每一台宿主机跑一个flannel的deamon进程,进程程序会往宿主机的路由表写入路由规则

目标地址100.96.2.3,命中第二条,发往flannel0,是一个tun设备,在内核里面的虚拟网卡
tun设备连接到flannel的守护进程flanneld,该进程接受所有发往flannel0的数据包,做数据封装,根据目标地址,找到地址对应flannel网络对应的物理ip和端口,增加一个包头,包头目标地址为实际物理地址与端口,原地址改成局域网ip,将元数据包嵌入到新数据包,再把封装后的包给内核,内核根据目标地址去路由规则匹配,发现目标地址172.20.54.98,端口是8285,匹配不到任何规则,用默认default规则,通过eth0这张网卡,把数据包发给局域网(UDP广播)
node2收到包后,根据8285发现目标地址是给flanneld的,就交给该进程,进程收到包后把包头去掉,发现原目标地址是100.96.2.3,给flannel0,交给docker0处理
flannel0维护了一个映射关系,每创造一个虚拟容器IP,就知道这个容器IP实际在哪台宿主机上,吧映射关系存储起来,k8s里flanneld将映射关系存储在etcd中

看映射关系就知道100.96.2.0-24这个网段容器是放在172.20.54.98这台宿主机上面的
端口8285怎么知道?
flanneld的默认监听就是8285端口,所以发给node2:8285的所有UDP数据包,都会交给flannld进程处理,去掉包头还原数据包,还原后交给TUN设备flannel0,由0交给内核,内核根据node2的路由规则交给docker0

解出来的包的目标IP'是100.96.2.3,由flannel0交给kernel,命中第三条交给docker0,进入docker0的桥的子网
怎么配置docker使用100.96.X.0/24?
flanneld会把子网信息写到配置文件/run/flannel/subnet.env中

docker会使用这个配置环境来作为他bridge配置
dockerd --bip= FLANNEL_MTU

Flannel网络组件部署

在部署K8S之前,需要在集群服务器上部署CNI容器网络组件,从而实现集群的网络互联互通。目前可选的组件比较多,例如flannel、calico、weave等,各容器网络组件对比可参考文档:http://dockone.io/article/2599

本文介绍flannel网络组件的部署,配置环境在完成前文etcd集群和tls认证配置后。
一、生成flannel证书文件

# mkdir flanneld
# cd flanneld
# cat flanneld-csr.json 
{
  "CN": "flanneld",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "FuZhou",
      "L": "FuZhou",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

# cfssl gencert -ca=/etc/ssl/etcd/ca.pem   -ca-key=/etc/ssl/etcd/ca-key.pem   -config=/etc/ssl/etcd/ca-config.json   -profile=kubernetes flanneld-csr.json | cfssljson -bare flanneld

# mkdir /etc/ssl/flanneld
# cp *.pem /etc/ssl/flanneld/

二、向etcd注册flannel相关信息并验证(执行一次即可)

# cat env.sh   
#!/usr/bin/bash
export CLUSTER_CIDR="172.30.0.0/16"
export ETCD_ENDPOINTS="https://192.168.115.5:2379,https://192.168.115.6:2379,https://192.168.115.7:2379"
export FLANNEL_ETCD_PREFIX="/kubernetes/network"
# source  env.sh

# etcdctl   --endpoints=${ETCD_ENDPOINTS}   --ca-file=/etc/ssl/etcd/ca.pem   --cert-file=/etc/ssl/flanneld/flanneld.pem   --key-file=/etc/ssl/flanneld/flanneld-key.pem   set ${FLANNEL_ETCD_PREFIX}/config ‘{"Network":"‘${CLUSTER_CIDR}‘", "SubnetLen": 24, "Backend": {"Type": "vxlan"}}‘

# etcdctl    --endpoints=${ETCD_ENDPOINTS}    --ca-file=/etc/ssl/etcd/ca.pem    --cert-file=/etc/ssl/flanneld/flanneld.pem    --key-file=/etc/ssl/flanneld/flanneld-key.pem  get ${FLANNEL_ETCD_PREFIX}/config

技术分享图片
三、下载部署flannel

# cd /usr/local/src/
# wget  https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz

# tar -zxvpf flannel-v0.10.0-linux-amd64.tar.gz 
# cp {flanneld,mk-docker-opts.sh}  /usr/local/bin/ 

# cat /usr/lib/systemd/system/flanneld.service 
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
ExecStart=/usr/local/bin/flanneld   -etcd-cafile=/etc/ssl/etcd/ca.pem   -etcd-certfile=/etc/ssl/flanneld/flanneld.pem   -etcd-keyfile=/etc/ssl/flanneld/flanneld-key.pem   -etcd-endpoints=https://192.168.115.5:2379,https://192.168.115.6:2379,https://192.168.115.7:2379   -etcd-prefix=/kubernetes/network
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service

# systemctl daemon-reload
# systemctl start flanneld 
# systemctl status flanneld -l

技术分享图片
将flannel二进制程序文件和证书文件复制到vm2和vm3

# cd /usr/lib/systemd/system/
# scp flanneld.service  vm2:$(pwd)
# scp flanneld.service  vm3:$(pwd)

# scp -rp /etc/ssl/flanneld/ vm2:/etc/ssl/
# scp -rp /etc/ssl/flanneld/ vm3:/etc/ssl/
# scp -rp /usr/local/bin/flanneld  /usr/local/bin/mk-docker-opts.sh  vm2:/usr/local/bin/
# scp -rp /usr/local/bin/flanneld  /usr/local/bin/mk-docker-opts.sh  vm3:/usr/local/bin/

四、验证

# ifconfig flannel.1 && ssh vm2 ifconfig flannel.1  && ssh vm3 ifconfig flannel.1 

技术分享图片

# etcdctl    --endpoints=${ETCD_ENDPOINTS}    --ca-file=/etc/ssl/etcd/ca.pem    --cert-file=/etc/ssl/flanneld/flanneld.pem    --key-file=/etc/ssl/flanneld/flanneld-key.pem  ls ${FLANNEL_ETCD_PREFIX}/subnets

技术分享图片

以上是关于k8s介绍系列---flannel网络通信介绍的主要内容,如果未能解决你的问题,请参考以下文章

flannel网络插件介绍

k8s网络之Flannel网络

[k8s系列六]K8S网络补充之DNS

k8s 入门系列之集群安装篇

k8s入门系列之集群安装篇

Flannel网络组件部署