flannel部署及常见问题汇总

2019年8月12日09:22:10 评论 329

flannel是一个专门为kubernetes定制的三层网络解决方案,主要用于解决容器的跨主机通信问题。Flannel 直接使用 Kubernetes API 或 ETCD 存储网络配置、分配的子网以及任何辅助数据(如主机的公网 IP)。数据包使用几种后端机制之一进行转发,包括 VXLAN 和各种云集成Flannel 需要在集群中的每台主机上运行一个名为 flanneld的代理程序,负责从群集预配置地址空间中为每台主机分配一个网段(subnet),本机上所有容器的Ip地址都将从该网段进行分配。

flannel最新版本下载地址:https://github.com/coreos/flannel/releases

下载flannel并安装

下载

wget https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz

解压缩

mkdir flannel && tar -xzvf flannel-v0.10.0-linux-amd64.tar.gz -C flannel

 

二进制安装

cd flannel && rm -rf README.md

拷贝二进制文件到/usr/bin目录

scp * gcdr-kubernetes-node01:/usr/bin

scp * gcdr-kubernetes-node02:/usr/bin

scp * docker-node3:/usr/bin

 

创建生成flannel证书和私钥

flannel 从 etcd 集群存取网段分配信息,而 etcd 集群启用了双向 x509 证书认证,所以需要为 flanneld 生成证书和私钥。

创建证书签名请求:

cd /opt/ssl/

cat > /opt/ssl/flanneld-csr.json  <<EOF

{
"CN": "flanneld",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "4Paradigm"
}
]
}

EOF

该证书只会被 kubectl 当做 client 证书使用,所以 hosts 字段为空;

 

生成证书和私钥:

/opt/local/cfssl/cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem   -ca-key=/etc/kubernetes/ssl/ca-key.pem   -config=/opt/ssl/config.json   -profile=kubernetes flanneld-csr.json | /opt/local/cfssl/cfssljson -bare flanneld

 

向 etcd 写入集群 Pod 网段信息

注意:本步骤只需执行一次。
etcdctl \
--endpoints="https//10.5.11.60:2379,https://10.5.11.31:2379,https://10.5.11.32:2379" \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/flanneld.pem \
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \
set /kubernetes/network/config '{"Network":"10.254.64.0/16", "SubnetLen": 24, "Backend": {"Type": "vxlan"}}'

      • flanneld 当前版本 (v0.10.0) 不支持 etcd v3,故使用 etcd v2 API 写入配置 key 和网段数据;
      • 写入的 Pod 网段 ${CLUSTER_CIDR} 必须是 /16 段地址,必须与 kube-controller-manager 的 --cluster-cidr 参数值一致;

 

创建flanneldsystemd unit文件

[root@docker-node1 ssl]# cat  /etc/systemd/system/flanneld.service

[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=/usr/bin/flanneld \

-etcd-cafile=/etc/kubernetes/ssl/ca.pem \

-etcd-certfile=/etc/kubernetes/ssl/flanneld.pem \

-etcd-keyfile=/etc/kubernetes/ssl/flanneld-key.pem \

-etcd-endpoints=https://10.5.11.60:2379,https://10.5.11.31:2379,https://10.5.11.32:2379 \

-etcd-prefix=/kubernetes/network \

-iface=ens192

ExecStartPost=/usr/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker

Restart=on-failure

[Install]

WantedBy=multi-user.target

RequiredBy=docker.service

 

      • mk-docker-opts.sh 脚本将分配给 flanneld 的 Pod 子网网段信息写入 /run/flannel/docker 文件,后续 docker 启动时使用这个文件中的环境变量配置 docker0 网桥;
      • flanneld 使用系统缺省路由所在的接口与其它节点通信,对于有多个网络接口(如内网和公网)的节点,可以用 -iface 参数指定通信接口,如上面的 eth0 接口;
      • flanneld 运行时需要 root 权限;

 

启动flanneld服务

systemctl daemon-reload

systemctl enable flanneld

systemctl start flanneld

systemctl status flanneld

 

 

检查分配给各 flanneld 的 Pod 网段信息

查看已分配的 Pod 子网段列表(/24):

etcdctl \
--endpoints="https//10.5.11.31:2379,https://10.5.11.32:2379,https://10.5.11.33:2379" \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/flanneld.pem \
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \
ls /kubernetes/network/subnets

删除已分配的 Pod 子网段列表(/24):

etcdctl \
--endpoints="https//10.5.11.30:2379,https://10.5.11.31:2379,https://10.5.11.32:2379" \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/flanneld.pem \
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \
rmdir /kubernetes/network/subnets

 

查看集群 Pod 网段(/16):

etcdctl \
--endpoints="https//10.5.11.30:2379,https://10.5.11.31:2379,https://10.5.11.32:2379" \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/flanneld.pem \
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \
get /kubernetes/network/config

删除集群 Pod 网段(/16):

etcdctl \
--endpoints="https//10.5.11.30:2379,https://10.5.11.31:2379,https://10.5.11.32:2379" \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/flanneld.pem \
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \
rm /kubernetes/network/config

 

查看某一 Pod 网段对应的节点 IP 和 flannel 接口地址:

etcdctl \
--endpoints="https//10.5.11.30:2379,https://10.5.11.31:2379,https://10.5.11.32:2379" \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/flanneld.pem \
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \
get /kubernetes/network/subnets/172.30.x.x

删除某一 Pod 网段对应的节点 IP 和 flannel 接口地址:

etcdctl \
--endpoints="https//10.5.11.30:2379,https://10.5.11.31:2379,https://10.5.11.32:2379" \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/flanneld.pem \
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \
rm  /kubernetes/network/subnets/172.30.x.x

 

备注:

1,main.go:232] Failed to create SubnetManager: parse "http://127.0.0.1:2379: first path segment in URL cannot contain colon

将-etcd-endpoints=,配置中的引号去掉。一个引号引发的惨案。

发表评论

您必须才能发表评论!