2051 Flannel部署及维护

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

```

最后更新于