6. 二进制部署Flannel 网络
部署 Flannel 网络
kubernetes 要求集群内各节点能通过 Pod 网段互联互通,本文档介绍使用 Flannel上创建互联互通的 Pod 网段的步骤。
使用的变量
本文档用到的变量定义如下:
NODE_IP=100.69.218.95 # 当前部署节点的 IP
ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR
创建 TLS 秘钥和证书
etcd 集群启用了双向 TLS
认证,所以需要为 flanneld 指定与 etcd 集群通信的 CA 和秘钥。
创建 flanneld 证书签名请求:
$ cd /root/cfssldir
$ cat > flanneld-csr.json <
- hosts 字段为空
生成 flanneld 证书和私钥:
$ cfssl gencert -ca=/root/cfssldir/ca.pem \
-ca-key=/root/cfssldir/ca-key.pem \
-config=/root/cfssldir/ca-config.json \
-profile=kubernetes flanneld-csr.json | cfssljson -bare flanneld
$ ls flanneld*
flanneld.csr flanneld-csr.json flanneld-key.pem flanneld.pem
$ sudo mkdir -p /root/flannel
$ sudo mv flanneld*.pem /root/flannel
向 etcd 写入 Pod 网段信息
#将生成的flanneld证书复制到etcd容器中
$cd /root/flannel
$cp docker cp flanneld-key.pem flanneld.pem etcd0:./
$ docker exec -it etcd0 sh
#写入 Pod 网段信息
etcdctl \
--endpoints=https://127.0.0.1:2379 \
--ca-file=ca.pem \
--cert-file=flanneld.pem \
--key-file=flanneld-key.pem \
set /kubernetes/networks/config '{"Network":"172.17.0.0/16", "SubnetLen": 24, "Backend": {"Type": "vxlan"}}'
- flanneld 目前版本 不支持 etcd v3,故使用 etcd v2 API 写入配置 key 和网段数据;
- 写入的 Pod 网段(172.17.0.0/16) 需要先查询本机docker0的ip并做对应修改,且必须与 kube-controller-manager 的
--cluster-cidr
选项值一致;
安装和配置 flanneld
下载 flanneld
$ wget https://github.com/coreos/flannel/releases/download/v0.7.1/flannel-v0.7.1-linux-amd64.tar.gz
$ tar -xzvf flannel-v0.7.1-linux-amd64.tar.gz -C flannel
$ sudo cp flannel/{flanneld,mk-docker-opts.sh} /root/flannel
创建 flanneld 的 systemd unit 文件
[root@k8s01 system]# cat flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
[Service]
Type=notify
ExecStart=/root/flannel/flanneld \
-etcd-cafile=/root/flannel/ca.pem \
-etcd-certfile=/root/flannel/flanneld.pem \
-etcd-keyfile=/root/flannel/flanneld-key.pem \
-etcd-endpoints=https://100.69.218.95:2379 \
-etcd-prefix=/kubernetes/network
ExecStartPost=/root/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure
[Install]
WantedBy=multi-user.target
- mk-docker-opts.sh 脚本将分配给 flanneld 的 Pod 子网网段信息写入到
/run/flannel/docker
文件中,后续 docker 重启时使用这个文件中参数值设置 docker0 网桥
启动 flanneld
$ sudo cp flanneld.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl enable flanneld
$ sudo systemctl start flanneld
$ systemctl status flanneld
$
检查 flanneld 服务
$ journalctl -u flanneld |grep 'Lease acquired'
$ ifconfig flannel.1
$
检查分配给各 flanneld 的 Pod 网段信息
需要先进入etcd0容器
$ docker exec -it etcd0 sh
# 查看集群 Pod 网段(/16)
etcdctl \
--endpoints=https://127.0.0.1:2379 \
--ca-file=ca.pem \
--cert-file=flanneld.pem \
--key-file=flanneld-key.pem \
get /kubernetes/network/config
{ "Network": "172.17.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }
# 查看已分配的 Pod 子网段列表(/24)
etcdctl \
--endpoints=https://127.0.0.1:2379 \
--ca-file=ca.pem \
--cert-file=flanneld.pem \
--key-file=flanneld-key.pem \
ls /kubernetes/network/subnets
/kubernetes/network/subnets/172.30.19.0-24
$ # 查看某一 Pod 网段对应的 flanneld 进程监听的 IP 和网络参数
etcdctl \
--endpoints=https://127.0.0.1:2379 \
--ca-file=ca.pem \
--cert-file=flanneld.pem \
--key-file=flanneld-key.pem \
get /kubernetes/network/subnets/172.17.94.0-24
#172.17.94.0-24这个地址在上一步查询后得到
{"PublicIP":"100.69.218.95","BackendType":"vxlan","BackendData":{"VtepMAC":"ee:5d:bd:9b:d4:4e"}}
确保能ping通 Pod 网段
当前分配的 Pod网段是:172.17.94.0-24
ping 其网关地址,确保该命令正常返回icmp
结果:
$ ping 172.17.94.1
配置docker网桥地址
本步骤较为重要,需要重启docker与etcd0并且flannel保持启动状态
-
配置前确保flanneld为正常启动状态,使用下命令验证:
systemctl status flanneld.service #running且日志无异常报错则通过验证
-
由于docker环境不同,在本机的docker.service下自行添加相关参数
重新配置docker的systemd unit文件
#在[service]下添加
Environment="PATH=/root/local/bin:/bin:/sbin:/usr/bin:/usr/sbin"
EnvironmentFile=-/run/flannel/docker
- dockerd 运行时会调用其它 docker 命令,如
docker-proxy
,所以需要将docker
命令所在的目录加到PATH
环境变量中; - flanneld 启动时将网络配置写入到
/run/flannel/docker
文件中的变量DOCKER_NETWORK_OPTIONS
,dockerd 命令行上指定该变量值来设置 docker0 网桥参数; - 如果指定了多个
EnvironmentFile
选项,则必须将/run/flannel/docker
放在最后(确保 docker0 使用 flanneld 生成的 bip 参数); - 不能关闭默认开启的
--iptables
和--ip-masq
选项;
重启 docker
$ sudo systemctl daemon-reload
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
$ sudo iptables -F && sudo iptables -X && sudo iptables -F -t nat && sudo iptables -X -t nat
$ sudo systemctl restart docker
#等待docker重启完毕,再重启etcd0,在此期间内,flannel日志会报错,为正常现象
$ docker restart etcd0
重启成功后,验证安装
[root@k8s01 /]# ifconfig flannel.1
flannel.1: flags=4163 mtu 1450
inet 172.17.94.0 netmask 255.255.255.255 broadcast 0.0.0.0
inet6 fe80::ec5d:bdff:fe9b:d44e prefixlen 64 scopeid 0x20
ether ee:5d:bd:9b:d4:4e txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 8 overruns 0 carrier 0 collisions 0
[root@k8s01 /]# ifconfig docker0
docker0: flags=4163 mtu 1450
inet 172.17.94.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::42:24ff:fef9:71c4 prefixlen 64 scopeid 0x20
ether 02:42:24:f9:71:c4 txqueuelen 0 (Ethernet)
RX packets 23010088 bytes 5756148348 (5.3 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22953511 bytes 3403543843 (3.1 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
若inet 两个设备处于同一网段下:inet 172.17.94.0/inet 172.17.94.1
,则配置成功