kubernetes单Master集群部署--部署flannel网络(4)

1、kubernetes网络模型

Container Network Interface(CNI)容器网络接口,由Google和coreOS主导。

kubernetes网络模型设计基本要求:

  • 一个pod一个ip
  • 每个pod独立IP,pod内所有容器共享网络(同一个IP)
  • 所有容器都可以与其他容器通信
  • 所有节点都可以与所有容器通信

简言之:所有ip都是可以通信的!

2、原理说明

Overlay NetWork:覆盖网络,在基础网络上叠加的一种虚拟网络技术模式,改网络中的主机通过虚拟链路连接起来。

flannel:是overlay网络的一种,也是将源数据包封装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、HOST/GW、VXLAN、AWS VPC和GCE路由等数据转发方式。

HOST/GW同一网段

VXLAN可跨网络

Flannel为每个host分配一个subnet,容器从这个subnet中分配IP,这些IP可以在host间路由,容器间无需使用nat和端口映射即可实现跨主机通信

每个subnet都是从一个更大的IP池中划分的,flannel会在每个主机上运行一个叫flanneld的agent,其职责就是从池子中分配subnet

Flannel使用etcd存放网络配置、已分配 的subnet、host的IP等信息

Flannel数据包在主机间转发是由backend实现的,目前已经支持UDP、VxLAN、host-gw、AWS VPC和GCE路由等多种backend

数据流过程:

  1. 容器直接使用目标容器的ip访问,默认通过容器内部的eth0发送出去。

  2. 报文通过veth pair被发送到vethXXX。

  3. vethXXX是直接连接到虚拟交换机docker0的,报文通过虚拟bridge docker0发送出去。

  4. 查找路由表,外部容器ip的报文都会转发到flannel0虚拟网卡,这是一个P2P的虚拟网卡,然后报文就被转发到监听在另一端的flanneld。

  5. flanneld通过etcd维护了各个节点之间的路由表,把原来的报文UDP封装一层,通过配置的iface发送出去。

  6. 报文通过主机之间的网络找到目标主机。

  7. 报文继续往上,到传输层,交给监听在8285端口的flanneld程序处理。

  8. 数据被解包,然后发送给flannel0虚拟网卡。

  9. 查找路由表,发现对应容器的报文要交给docker0。

  10. docker0找到连到自己的容器,把报文发送过去。

 

3、定义子网

Falnnel要用etcd存储自身一个子网信息,所以要保证能成功连接Etcd,写入预定义子网段:

/opt/etcd/bin/etcdctl \
--ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem \
--endpoints="https://10.11.97.191:2379,https://10.11.97.192:2379,https://10.11.97.71:2379" \
set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'

  

4、部署flannel

以下部署步骤在规划的每个node节点都操作。

下载二进制包:

# wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz
# tar zxvf flannel-v0.9.1-linux-amd64.tar.gz
# mv flanneld mk-docker-opts.sh /opt/kubernetes/bin

  

配置Flannel:

 cat /opt/kubernetes/cfg/flanneld

FLANNEL_OPTIONS="--etcd-endpoints=https://10.11.97.191:2379,https://10.11.97.192:2379,https://10.11.97.71:2379 -etcd-cafile=/opt/etcd/ssl/ca.pem -etcd-certfile=/opt/etcd/ssl/server.pem -etcd-keyfile=/opt/etcd/ssl/server-key.pem"

  

systemd管理Flannel:

cat /usr/lib/systemd/system/flanneld.service

[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service

[Service]
Type=notify
EnvironmentFile=/opt/kubernetes/cfg/flanneld
ExecStart=/opt/kubernetes/bin/flanneld --ip-masq $FLANNEL_OPTIONS
ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure

[Install]
WantedBy=multi-user.target

  

配置Docker启动指定子网段:

cat /usr/lib/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/run/flannel/subnet.env
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

  

 

重启flannel和docker:

# systemctl daemon-reload

# systemctl start flanneld

# systemctl enable flanneld

# systemctl restart docker

 

5、查看flannel路由信息

 

 /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --endpoints="https://10.11.97.191:2379,https://10.11.97.192:2379,https://10.11.97.71:2379" ls /coreos.com/network/subnets

 

  

查看具体路由的分配:

可以看到,24网段分配在node01节点10.11.97.71上。

 

6、检查和测试flannel

检查是否生效:

 

确保docker0与flannel.1在同一网段。

 

测试不同node之间互ping是通的。

node02节点:

 

在node02节点上ping  node01节点:

 

在node01节点上ping  node02节点:

 

 

7、部署脚本化

脚本地址:https://github.com/loveqx/k8s-study/blob/master/flannel/flannel.sh

posted @ 2019-08-15 12:53  skyflask  阅读(347)  评论(0编辑  收藏  举报