6. 二进制部署Flannel 网络

部署 Flannel 网络

kubernetes 要求集群内各节点能通过 Pod 网段互联互通,本文档介绍使用 Flannel上创建互联互通的 Pod 网段的步骤。

使用的变量

本文档用到的变量定义如下:

NODE_IP=100.69.218.95 # 当前部署节点的 IP
ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR

创建 TLS 秘钥和证书

etcd 集群启用了双向 TLS 认证,所以需要为 flanneld 指定与 etcd 集群通信的 CA 和秘钥。

创建 flanneld 证书签名请求:

$ cd /root/cfssldir
$ cat > flanneld-csr.json <<EOF
{
  "CN": "flanneld",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
  • hosts 字段为空

生成 flanneld 证书和私钥:

$ cfssl gencert -ca=/root/cfssldir/ca.pem \
  -ca-key=/root/cfssldir/ca-key.pem \
  -config=/root/cfssldir/ca-config.json \
  -profile=kubernetes flanneld-csr.json | cfssljson -bare flanneld
$ ls flanneld*
flanneld.csr  flanneld-csr.json  flanneld-key.pem flanneld.pem
$ sudo mkdir -p /root/flannel
$ sudo mv flanneld*.pem /root/flannel

向 etcd 写入 Pod 网段信息

#将生成的flanneld证书复制到etcd容器中
$cd /root/flannel
$cp docker cp flanneld-key.pem flanneld.pem  etcd0:./
$ docker exec -it etcd0 sh
#写入 Pod 网段信息
etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --ca-file=ca.pem \
  --cert-file=flanneld.pem \
  --key-file=flanneld-key.pem \
  set /kubernetes/networks/config '{"Network":"172.17.0.0/16", "SubnetLen": 24, "Backend": {"Type": "vxlan"}}'

  • flanneld 目前版本 不支持 etcd v3,故使用 etcd v2 API 写入配置 key 和网段数据;
  • 写入的 Pod 网段(172.17.0.0/16) 需要先查询本机docker0的ip并做对应修改,且必须与 kube-controller-manager 的 --cluster-cidr 选项值一致;

安装和配置 flanneld

下载 flanneld

$ wget https://github.com/coreos/flannel/releases/download/v0.7.1/flannel-v0.7.1-linux-amd64.tar.gz
$ tar -xzvf flannel-v0.7.1-linux-amd64.tar.gz -C flannel
$ sudo cp flannel/{flanneld,mk-docker-opts.sh} /root/flannel

创建 flanneld 的 systemd unit 文件

[root@k8s01 system]# cat flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent

[Service]
Type=notify
ExecStart=/root/flannel/flanneld \
  -etcd-cafile=/root/flannel/ca.pem \
  -etcd-certfile=/root/flannel/flanneld.pem \
  -etcd-keyfile=/root/flannel/flanneld-key.pem \
  -etcd-endpoints=https://100.69.218.95:2379 \
  -etcd-prefix=/kubernetes/network
ExecStartPost=/root/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target

  • mk-docker-opts.sh 脚本将分配给 flanneld 的 Pod 子网网段信息写入到 /run/flannel/docker 文件中,后续 docker 重启时使用这个文件中参数值设置 docker0 网桥

启动 flanneld

$ sudo cp flanneld.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl enable flanneld
$ sudo systemctl start flanneld
$ systemctl status flanneld
$

检查 flanneld 服务

$ journalctl  -u flanneld |grep 'Lease acquired'
$ ifconfig flannel.1
$

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

需要先进入etcd0容器

$ docker exec -it etcd0 sh
# 查看集群 Pod 网段(/16)
etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --ca-file=ca.pem \
  --cert-file=flanneld.pem \
  --key-file=flanneld-key.pem \
  get /kubernetes/network/config
{ "Network": "172.17.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }
# 查看已分配的 Pod 子网段列表(/24)
 etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --ca-file=ca.pem \
  --cert-file=flanneld.pem \
  --key-file=flanneld-key.pem \
  ls /kubernetes/network/subnets
/kubernetes/network/subnets/172.30.19.0-24
$ # 查看某一 Pod 网段对应的 flanneld 进程监听的 IP 和网络参数
  etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --ca-file=ca.pem \
  --cert-file=flanneld.pem \
  --key-file=flanneld-key.pem \
  get /kubernetes/network/subnets/172.17.94.0-24 
  #172.17.94.0-24这个地址在上一步查询后得到
{"PublicIP":"100.69.218.95","BackendType":"vxlan","BackendData":{"VtepMAC":"ee:5d:bd:9b:d4:4e"}}

确保能ping通 Pod 网段

当前分配的 Pod网段是:172.17.94.0-24

ping 其网关地址,确保该命令正常返回icmp结果:

$ ping 172.17.94.1

配置docker网桥地址

本步骤较为重要,需要重启docker与etcd0并且flannel保持启动状态

  1. 配置前确保flanneld为正常启动状态,使用下命令验证:

    systemctl status flanneld.service #running且日志无异常报错则通过验证
    
  2. 由于docker环境不同,在本机的docker.service下自行添加相关参数

重新配置docker的systemd unit文件

#在[service]下添加
Environment="PATH=/root/local/bin:/bin:/sbin:/usr/bin:/usr/sbin"
EnvironmentFile=-/run/flannel/docker
  • dockerd 运行时会调用其它 docker 命令,如docker-proxy,所以需要将 docker 命令所在的目录加到 PATH 环境变量中;
  • flanneld 启动时将网络配置写入到 /run/flannel/docker 文件中的变量 DOCKER_NETWORK_OPTIONS,dockerd 命令行上指定该变量值来设置 docker0 网桥参数;
  • 如果指定了多个 EnvironmentFile 选项,则必须将 /run/flannel/docker 放在最后(确保 docker0 使用 flanneld 生成的 bip 参数);
  • 不能关闭默认开启的 --iptables--ip-masq 选项;

重启 docker

$ sudo systemctl daemon-reload
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
$ sudo iptables -F && sudo iptables -X && sudo iptables -F -t nat && sudo iptables -X -t nat
$ sudo systemctl restart docker
#等待docker重启完毕,再重启etcd0,在此期间内,flannel日志会报错,为正常现象
$ docker restart etcd0

重启成功后,验证安装

[root@k8s01 /]# ifconfig flannel.1
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 172.17.94.0  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::ec5d:bdff:fe9b:d44e  prefixlen 64  scopeid 0x20<link>
        ether ee:5d:bd:9b:d4:4e  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 8 overruns 0  carrier 0  collisions 0

[root@k8s01 /]# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 172.17.94.1  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::42:24ff:fef9:71c4  prefixlen 64  scopeid 0x20<link>
        ether 02:42:24:f9:71:c4  txqueuelen 0  (Ethernet)
        RX packets 23010088  bytes 5756148348 (5.3 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 22953511  bytes 3403543843 (3.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

若inet 两个设备处于同一网段下:inet 172.17.94.0/inet 172.17.94.1,则配置成功

posted @ 2021-10-04 16:58  backTraced  阅读(132)  评论(0编辑  收藏  举报