目录
kubernetes 要求集群内各节点(包括 master 节点)能通过 Pod 网段互联互通。flannel 使用 vxlan 技术为各节点创建一个可以互通的 Pod 网络,使用的端口为 UDP 8472。
flanneld 第一次启动时,从 etcd 获取配置的 Pod 网段信息,为本节点分配一个未使用的地址段,然后创建 flannedl.1 网络接口。
flannel 将分配给自己的 Pod 网段信息写入 /run/flannel/docker 文件,docker 后续使用这个文件中的环境变量设置 docker0 网桥,从而从这个地址段为本节点的所有 Pod 容器分配 IP。
注意: flanneld 与 docker 结合使用;
01.下载和分发 flanneld 二进制文件
mkdir -p /srv/kubernetes/cni/bin/flannel
mkdir -p /srv/kubernetes/cni/net.d
wget https://github.com/coreos/flannel/releases/download/v0.12.0/flannel-v0.12.0-linux-amd64.tar.gz
tar -xzvf flannel-v0.11.0-linux-amd64.tar.gz -C bin/flannel
02.向 etcd 写入集群 Pod 网段信息
写入的 Pod 网段 ${CLUSTER_CIDR} 地址段(如 /16)必须小于 SubnetLen,必须与 kube-controller-manager 的 --cluster-cidr 参数值一致;
etcd 使用ETCDCTL_API=2, 并确定etcd集群支持V2版本的api
$ ETCDCTL_API=2
$ alias etcdctl2="ETCDCTL_API=2 && /srv/kubernetes/bin/etcdctl --endpoints=https://10.40.58.153:2379,https://10.40.58.154:2379,https://10.40.61.116:2379 --cert-file=/srv/kubernetes/pki/etcd.pem --key-file=/srv/kubernetes/pki/etcd-key.pem --ca-file /srv/kubernetes/pki/ca.pem"
$ etcdctl2 mkdir /coreos.com/network
$ etcdctl2 mk /coreos.com/network/config '{"Network":"10.243.0.0/16","SubnetLen":21,"Backend":{"Type":"vxlan"}}'
$ etcdctl2 get /coreos.com/network/config
03.使用systemd管理flanneld
export ETCD_ENDPOINTS='https://10.40.61.116:2379,https://10.40.58.153:2379,https://10.40.58.154:2379'
export FLANNEL_ETCD_PREFIX='/coreos.com/network'
cat > flanneld.service << EOF
[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=/srv/kubernetes/cni/bin/flanneld \\
-etcd-cafile=/srv/kubernetes/pki/ca.pem \\
-etcd-certfile=/srv/kubernetes/pki/etcd.pem \\
-etcd-keyfile=/srv/kubernetes/pki/etcd-key.pem \\
-etcd-endpoints=${ETCD_ENDPOINTS} \\
-etcd-prefix=${FLANNEL_ETCD_PREFIX} \\
-ip-masq
ExecStartPost=/opt/k8s/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=always
RestartSec=5
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
EOF
04.启动flannel
systemctl daemon-reload
systemctl enable flanneld
systemctl start flanneld
systemctl status flanneld
05.检查分配给各 flanneld 的 Pod 网段信息
查看集群 Pod 网段(/16)
etcdctl2 get /coreos.com/network/config
输出:
{"Network":"10.243.0.0/16","SubnetLen":21,"Backend":{"Type":"vxlan"}}
查看已分配的 Pod 子网段列表(/21)
etcdctl2 ls /coreos.com/network/subnets
输出:
/coreos.com/network/subnets/10.243.104.0-21 /coreos.com/network/subnets/10.243.128.0-21 /coreos.com/network/subnets/10.243.8.0-21
查看某一Pod网段对应的节点IP和flannel接口地址
etcdctl2 get /coreos.com/network/subnets/10.243.8.0-21
输出:
{"PublicIP":"10.40.58.154","BackendType":"vxlan","BackendData":> {"VtepMAC":"e6:b5:ae:55:96:f4"}}
10.243.8.0/21 被分配给节点10.40.58.154;
VtepMAC 为10.40.58.154点的 flannel.1 网卡 MAC 地址;
06.检查节点网络
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:3e:10:b5:e3 brd ff:ff:ff:ff:ff:ff
inet 10.40.58.153/22 brd 10.40.59.255 scope global dynamic eth0
valid_lft 313466837sec preferred_lft 313466837sec
3: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN
link/ether 0e:f3:ba:47:04:40 brd ff:ff:ff:ff:ff:ff
inet 10.243.128.0/32 scope global flannel.1
valid_lft forever preferred_lft forever
flannel.1 网卡的地址为分配的 Pod 子网段的第一个 IP(.0),且是 /32 的地址;
$ ip route show |grep flannel.1
10.243.8.0/21 via 10.243.8.0 dev flannel.1 onlink
10.243.104.0/21 via 10.243.104.0 dev flannel.1 onlink
到其它节点 Pod 网段请求都被转发到 flannel.1 网卡;
flanneld 根据 etcd 中子网段的信息,如 $/coreos.com/network/subnets/10.243.128.0-21 ,来决定进请求发送给哪个节点的互联 IP;
07.检查生成子网文件
使用systemctl命令启动flanneld后,会自动执行mk-docker-opts.sh生成如下两个文件环境变量文件:
- /run/flannel/subnet.env
FLANNEL_NETWORK=10.243.0.0/16
FLANNEL_SUBNET=10.243.104.1/21
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
- /run/flannel/docker
DOCKER_OPT_BIP="--bip=10.243.104.1/21"
DOCKER_OPT_IPMASQ="--ip-masq=false"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_OPTS=" --bip=10.243.104.1/21 --ip-masq=false --mtu=1450"
Docker将会读取这两个环境变量文件作为容器启动参数。
Q&A
```
网友评论