Flannel部署及常见问题

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.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”: “generalichina.com”
}
]
}

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.203:2379,https://10.5.11.204:2379,https://10.5.11.205: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 参数值一致;

创建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.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=,配置中的引号去掉。一个引号引发的惨案。

人已赞赏
笔记

在RHEL上安装和升级Docker-EE

2020-10-12 13:31:39

笔记

角儿

2020-10-12 13:35:47

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索