K8S-Flannel

K8S CNI 插件 Flannel

转发:https://www.cnblogs.com/noah-luo/p/13345177.html
Kubbernetes 设计了网络模型,但却将它的实现交给了网络插件,CNI网络插件最主要的功能就是实现了POD资源能够跨宿主机进行通信。
常见的CNI网络插件:Flannel、Calico、Canal、Contiv、OpenContrail、NSX-T、Kube-router。

Flannel功能概述

1、flannel利用Kubernetes API或者etcd用于存储整个集群的网络配置,其中最主要的内容为设置集群的网络地址空间。例如,设定整个集群内所有容器的IP都取自网段“10.1.0.0/16”。
2、flannel在每个主机中运行flanneld作为agent,它会为所在主机从集群的网络地址空间中,获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配。
例如,设定本主机内所有容器的IP地址网段“10.1.2.0/24”。
3、flanneld再将本主机获取的subnet以及用于主机间通信的Public IP,同样通过kubernetes API或者etcd 存储起来。
4、flannel利用各种backend mechanism,例如udp,vxlan等等,跨主机转发容器间的网络流量,完成容器间的跨主机通信。

flannel支持3种网络模型

1、host-gw网关模型

{"Network": "xxx", "Backend": {"Type": "host-gw"}}

主要用于宿主机在的情况下POD间的通信,即不跨网段通信.
此时flannel的功能很简单,就是在每个宿主机上创建了一条通网其他宿主机的网关路由

2、vxlan隧道模型

{"Network": "xxx", "Backend": {"Type": "vxlan"}}

主要用于宿主机不在同网段的情况下POD间通信,即跨网段通信.
此时flannel会在宿主机上创建一个,用于和其他宿主机间建立VXLAN隧道
跨宿主机通信时,需要经由flannel.1设备封包、解包,因此效率不高

3、混合模型

{"Network": "xxx", "Backend": {"Type": "vxlan","Directrouting": true}}

在既有同网段宿主机,又有跨网段宿主机的情况下,选择混合模式
flannel会根据通信双方的网段情况,自动选择是走网关路由通信还是通过VXLAN隧道通信

实际工作中的模型选择

很多人不推荐部署K8S的使用的flannel做网络插件,不推荐的原因是是flannel性能不高,然而

1、flannel性能不高是指它的VXLAN隧道模型,而不是gw模型
2、规划K8S集群的时候,应规划多个K8S集群来管理不同的业务
3、同一个K8S集群的宿主机,就应该规划到同一个网段
4、既然是同一个网段的宿主机通信,使用的就应该是gw模型
5、gw模型只是创建了网关路由,通信效率极高
6、因此,建议工作中使用flannel,且用gw模型

Flannel的安装

1、Flannel下载

Flannel地址:https://github.com/flannel-io/flannel
我这用的版本是:0.13.0,包为:flannel-v0.13.0-linux-amd64.tar.gz

2、创建安装flannel目录,并解压flannel包

mkdir /opt/flannel-v0.13.0
tar vxf flannel-v0.13.0-linux-amd64.tar.gz -C /opt/flannel-v0.13.0

3、创建软连接

ln -s /opt/flannel-v0.13.0/ /opt/flannel

4、创建证书目录

mkdir /opt/flannel/certs

5、将证书拷贝到 flannel下的证书目录

ca.pem client-key.pem  client.pem

6、在etcd中写入网络信息(只需要在集群中的一台etcd中执行)

etcd v2

/opt/etcd/etcdctl set /coreos.com/network/config '{"Network": "172.7.0.0/16", "Backend": {"Type": "host-gw"}}'

etcd v3
由于flannel不能直接连接etcd v3,需要如下操作
1、etcd启动脚本添加–enable-v2参数,并重启etcd,若重启etcd服务flannel还是报错,请重启服务器再次尝试。

2、使用etcdctl API V2进行设置参数

ETCDCTL_API=2 /opt/etcd/etcdctl --ca-file=/opt/etcd/certs/ca.pem --cert-file=/opt/etcd/certs/etcd-peer.pem --key-file=/opt/etcd/certs/etcd-peer-key.pem --endpoints https://192.168.10.21:2379,https://192.168.10.22:2379,https://192.168.10.23:2379   set /coreos.com/network/config '{"Network": "172.7.0.0/16", "Backend": {"Type": "host-gw"}}'

etcd 获取对应的键值信息

/opt/etcd/etcdctl get /coreos.com/network/config

7、创建flannel的环境变量文件:/opt/flannel/subnet.env

vim /opt/flannel/subnet.env

FLANNEL_NETWORK=172.7.0.0/16
FLANNEL_SUBNET=172.7.21.1/24
FLANNEL_MTU=1500
FLANNEL_IPMASQ=false



8、创建flannel的启动脚本/opt/flannel/flanneld.sh

vim /opt/flannel/flanneld.sh

#!/bin/sh
./flanneld \
 --public-ip=192.168.10.21 \
 --etcd-endpoints=https://192.168.10.21:2379,https://192.168.10.22:2379,https://192.168.10.23:2379 \
 --etcd-keyfile=./cert/client-key.pem \
 --etcd-certfile=./cert/client.pem \
 --etcd-cafile=./cert/ca.pem \
 --iface=ens33 \
 --subnet-file=./subnet.env \
 --healthz-port=2401

9、给启动脚本执行权限以及创建执行日志目录

chmod +x /opt/flannel/flanneld.sh
mkdir -p /data/logs/flanneld

10、创建supervisor启动脚本/etc/supervisord.d/flannel.ini

vim /etc/supervisord.d/flannel.ini

[program:flanneld]
command=sh /opt/flannel/flanneld.sh
numprocs=1
directory=/opt/flannel
autostart=true
autorestart=true
startsecs=30
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
redirect_stderr=true
stdout_logfile=/data/logs/flanneld/flanneld.stdout.log
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=4
stdout_capture_maxbytes=1MB
killasgroup=true
stopasgroup=true

11、启动flannel

supervisorctl update
supervisorctl status

12、查看flannel日志

tail -f /data/logs/flanneld/flanneld.stdout.log

13、在一个节点去ping另外节点的POD的IP

14、查看route规则

15、了解宿主机源地址转换问题

iptables-save |grep -i postrouting

16、在各节点安装iptables-services

yum install iptables-services -y

17、在个节点启动iptables服务

systemctl start iptables
systemctl enable iptables

18、在个节点优化iptables规则

iptables-save |grep -i postrouting

iptables -t nat -D POSTROUTING -s 172.7.21.0/24 !  -o docker0 -j MASQUERADE
iptables -t nat -I POSTROUTING -s 172.7.21.0/24 ! -d 172.7.0.0/16 ! -o docker0 -j MASQUERADE

iptables-save | grep -i reject

iptables -t filter -D INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -t filter -D FORWARD -j REJECT --reject-with icmp-host-prohibited

iptables-save > /etc/sysconfig/iptables

19、再次使用curl命令在容器中访问其他节点的容器

Contents
  1. 1. K8S CNI 插件 Flannel
    1. 1.1. Flannel功能概述
    2. 1.2. flannel支持3种网络模型
      1. 1.2.1. 1、host-gw网关模型
      2. 1.2.2. 2、vxlan隧道模型
      3. 1.2.3. 3、混合模型
    3. 1.3. 实际工作中的模型选择
    4. 1.4. Flannel的安装
      1. 1.4.1. 1、Flannel下载
      2. 1.4.2. 2、创建安装flannel目录,并解压flannel包
      3. 1.4.3. 3、创建软连接
      4. 1.4.4. 4、创建证书目录
      5. 1.4.5. 5、将证书拷贝到 flannel下的证书目录
      6. 1.4.6. 6、在etcd中写入网络信息(只需要在集群中的一台etcd中执行)
      7. 1.4.7. 7、创建flannel的环境变量文件:/opt/flannel/subnet.env
      8. 1.4.8. 8、创建flannel的启动脚本/opt/flannel/flanneld.sh
      9. 1.4.9. 9、给启动脚本执行权限以及创建执行日志目录
      10. 1.4.10. 10、创建supervisor启动脚本/etc/supervisord.d/flannel.ini
      11. 1.4.11. 11、启动flannel
      12. 1.4.12. 12、查看flannel日志
      13. 1.4.13. 13、在一个节点去ping另外节点的POD的IP
      14. 1.4.14. 14、查看route规则 host-gw 模型
      15. 1.4.15. 15、了解宿主机源地址转换问题
      16. 1.4.16. 16、在各节点安装iptables-services
      17. 1.4.17. 17、在个节点启动iptables服务
      18. 1.4.18. 18、在个节点优化iptables规则
      19. 1.4.19. 19、再次使用curl命令在容器中访问其他节点的容器
|