flannel部署及常见问题

  • A+
所属分类:日志

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

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

flannel部署及常见问题

下载flannel并安装


下载

wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.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 * docker-node1:/usr/bin

scp * docker-node2:/usr/bin

scp * docker-node3:/usr/bin

创建生成flannel证书和私钥


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

创建证书签名请求:

cd /opt/ssl/

vi flanneld-csr.json

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

该证书只会被 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.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 \
set /kubernetes/network/config '{"Network":"172.30.0.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 参数值一致;

创建flanneld的systemd 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.30:2379,https://10.5.11.31:2379,https://10.5.11.32:2379 \

-etcd-prefix=/kubernetes/network \

-iface=ens160

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

部署到其他节点


1,拷贝flannel文件夹内容到各个节点/usr/bin目录下。

2,拷贝flanneld*.pem到所有节点

3,拷贝flanneld.service到所有节点

4,所有节点上设置开机启动systemctl enable flanneld

检查分配给各 flanneld 的 Pod 网段信息(以上部署完毕,此节排障使用)


查看已分配的 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 \
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=,配置中的引号去掉。一个引号引发的惨案。

weinxin
付生保个人博客
一个运维工程师的自媒体个人博客网站。也是关注IT技术学习和经验分享的原创独立自媒体个人博客。
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: