k8s 手动部署flannel(k8s基于cnm网络插件)

环境准备

安装etcd,并配置key存储网络信息

  1. etcd的秘钥文件复制到各个节点包括主节点(并授权)
scp /opt/etcd/ssl/* [email protected]:/opt/etcd/ssl
chmod 755 /opt/etcd/ssl
  1. 由于flannel不支持etcd-v3,需要开启etcd-v2版本
#[Clustering]
ETCD_ENABLE_V2="true"

systemctl restart etcd
  1. 存储flannel的网络信息
vi flannel-config.json
{
    
    
  "Network": "10.2.0.0/16",
  "SubnetLen": 24,
  "Backend": {
    
    
    "Type": "vxlan"
  }
}
#Network 定义该网络的 IP 池为 10.2.0.0/16
#SubnetLen 指定每个主机分配到的 subnet 大小为 24 位,即10.2.X.0/24
#Backend 为 vxlan,即主机间通过 vxlan 通信

export ETCDCTL_API=2
#环境变量

etcdctl --endpoints=$ENDPOINTS --ca-file="/opt/etcd/ssl/ca.pem" --cert-file="/opt/etcd/ssl/server.pem" --key-file="/opt/etcd/ssl/server-key.pem" set /docker-flannel/network/config < flannel-config.json
#注意命令跟v3有区别

下载flannel,配置运行

wget https://github.com/coreos/flannel/releases/download/v0.13.1-rc1/flannel-v0.13.1-rc1-linux-amd64.tar.gz
tar -zxvf flannel-v0.13.1-rc1-linux-amd64.tar.gz
mv flanneld /usr/local/bin/
scp flannel [email protected]:/usr/local/bin/
#拷贝到其他节点和主节点

flanneld -etcd-endpoints="https://192.168.12.10:2379,https://192.168.12.11:2379,https://192.168.12.12:2379" -etcd-cafile="/opt/etcd/ssl/ca.pem" -etcd-certfile="/opt/etcd/ssl/server.pem" -etcd-keyfile="/opt/etcd/ssl/server-key.pem"  -etcd-prefix=/docker-flannel/network  -iface=eth0
#-etcd-endpoints 指定 etcd url
#-iface 指定主机间数据传输使用的 interface
#-etcd-prefix 指定 etcd 存放 flannel 网络配置信息的 key

修改docker网络

vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=10.2.94.1/24 --mtu=1450
#flanneld运行的时候会生成一个文件在/run/flannel/subnet.env记录了网络信息
#--bip=/run/flannel/subnet.env里的DOCKER_OPT_BIP
#--mtu=/run/flannel/subnet.env里的DOCKER_OPT_MTU

systemctl daemon-reload
systemctl restart docker
#查看docker0接口地址发生了改变

在这里插入图片描述
flanneld这样运行不方便管理,需要改为systemctl进行管理

vi /usr/lib/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/local/bin/flanneld \
  -etcd-cafile=/opt/etcd/ssl/ca.pem \
  -etcd-certfile=/opt/etcd/ssl/server.pem \
  -etcd-keyfile=/opt/etcd/ssl/server-key.pem \
  -etcd-endpoints=https://192.168.12.10:2379,https://192.168.12.11:2379,https://192.168.12.12:2379 \
  -etcd-prefix=/docker-flannel/network \
  -iface=eth0 \
  -ip-masq
ExecStartPost=/usr/local/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure

[Install]
WantedBy=multi-user.target
WantedBy=docker.service
#创建systemctl服务文件,Service部分是跟命令启动类似的只要替换即可
#-ip-masq不开启flannel.1 接口的源nat,避免访问不是docker的真实IP
#ExecStartPost=/usr/local/flannel/mk-docker-opts.sh这个脚本文件在flannel下载解压后会有,指定到具体目录即可

修改docker网络

vi /usr/lib/systemd/system/docker.service
EnvironmentFile=/run/flannel/subnet.env
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_NETWORK_OPTIONS
#flanneld运行的时候会生成一个文件在/run/flannel/subnet.env记录了网络信息,docker只要每次重启获取文件内里的信息

systemctl daemon-reload
systemctl restart docker

在这里插入图片描述
观察route就能看到每台宿主机都是一个子网,通过route访问到对方,如果是vxlan模式就进行隧道传输,flannel也是支持host-wg主机网关模式

systemctl服务文件不会写可以yum安装flannel,然后保存一份systemctl服务文件卸载后进行修改即可
部分systemctl服务文件参考:https://www.cnblogs.com/love19791125/p/11283633.html

疑问:可以看到都是错误,但是其实是没问题的,我的版本是v0.13.1-rc1(命令启动也是有错误提示)
在这里插入图片描述
2021.02.02更新

由于搭建的k8s没有使用CNI插件,而是使用docker自带的CNM,使用过程中出现节点超过24小时后,重新链接后发现flannel地址改变了,吓了一跳,这样会导致Pod网络故障,除非重新建立Pod才行

查看了flannel发现有续租的问题,续租时间为24小时,如果超过24小时就会读取/run/flannel/subnet.env下的FLANNEL_SUBNET参数值进行etcd注册,如果发生IP冲突就会重新分配新的子网给节点

1、我难道是发生IP冲突?
在这里插入图片描述
查看日志后发现,没有提示任何的关于IP地址重复的错误,但是发现创建子网的时候匹配本地是None,不应该呀,我本地有这个文件/run/flannel/subnet.env

在这里插入图片描述
奇怪不对了,没有FLANNEL_SUBNET字段,发现问题了,在继续查看subnet.env文件怎么生成

在这里插入图片描述通过一个脚本生成的。查看下发现写错了
在这里插入图片描述
解决:
在这里插入图片描述
后面不加-f或者-d 使用默认位置即可,查看/run/flannel/subnet.env和/run/docker_opts.env

/run/flannel/subnet.env用于flannel读取的环境变量
/run/docker_opts.env用于docker启动参数

在这里插入图片描述再把docker服务的环境变量文件改下,重启docker服务和flannel服务

参考:https://coreos.com/flannel/docs/latest/reservations.html

猜你喜欢

转载自blog.csdn.net/yangshihuz/article/details/111990819
k8s