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
数据流过程:
-
容器直接使用目标容器的ip访问,默认通过容器内部的eth0发送出去。
-
报文通过veth pair被发送到vethXXX。
-
vethXXX是直接连接到虚拟交换机docker0的,报文通过虚拟bridge docker0发送出去。
-
查找路由表,外部容器ip的报文都会转发到flannel0虚拟网卡,这是一个P2P的虚拟网卡,然后报文就被转发到监听在另一端的flanneld。
-
flanneld通过etcd维护了各个节点之间的路由表,把原来的报文UDP封装一层,通过配置的iface发送出去。
-
报文通过主机之间的网络找到目标主机。
-
报文继续往上,到传输层,交给监听在8285端口的flanneld程序处理。
-
数据被解包,然后发送给flannel0虚拟网卡。
-
查找路由表,发现对应容器的报文要交给docker0。
-
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