覆盖网络 Flannel 0.7

29次阅读

共计 5961 个字符,预计需要花费 15 分钟才能阅读完成。

资源

https://github.com/coreos/fla… 官方资源

https://github.com/coreos/fla… 下载地址

特性
概念

Flannel 会修改 Docker 的启动参数,限制指定每台节点使用的子网不重复
数据请求会从 docker0 虚拟网卡转发到 flannel0 虚拟网卡 再将数据封包之后通过路由或者隧道发送到对应节点解包,再从 flannel0 虚拟网发送到 docker0 虚拟网卡
可以使用 etcd 的最新版本 3.x,但 flannel 使用的还是 2.x 的数据保存格式,和 v2 的 api
使用中间网络会有网络延迟,大概比使用路由器性能下降了 2 倍路由器平均内网请求 0.2ms 左右 使用中间网络内网平均 0.4ms
使用 vxlan backend 时,数据是由 Kernel 转发的,Flannel 不转发数据,仅仅动态设置 ARP entry
Flannel 中有多种 backend,其中 vxlan backend 通过内核转发数据,而 udp backend 通过用户态进程中的 proxy 转发数据
0.7.0 中刚刚加入,即 VTEP 的 IP 加上了 /32 位的掩码避免了广播,此前的版本都是 /16 掩码,解决了 VXLAN 网络中由于广播导致的“网络风暴”的问题。
Flannel 在使用 vxlan backend 的时候,短暂启停 flanneld 不会造成网络中断,而 udp backend 会
可以重启 flanneld 来更新网络配置;然后 flannel 每 24h 会自动重新分配集群内的网络 flanneld 挂掉会导致本地的 ARP entry 无法自动更新,但是已经生成的网络环境还是可用的

安装
mkdir /opt/flanneld-v0.8.0
wget https://github.com/coreos/flannel/releases/download/v0.8.0/flannel-v0.8.0-linux-amd64.tar.gz
tar -xzvf flannel-v0.8.0-linux-amd64.tar.gz -C /opt/flanneld-v0.8.0
ln -sf /opt/flanneld-v0.8.0/flanneld /usr/bin/flanneld
rm -f flannel-v0.8.0-linux-amd64.tar.gz
mkdir -p /var/log/k8s/flanneld

# 配置配置文件
vim /etc/sysconfig/flanneld

FLANNEL_ETCD=”http://10.31.75.198:2379,http://10.29.164.118:2379″
FLANNEL_ETCD_KEY=”/dudu_flannel/network”
FLANNEL_OPTIONS=”-ip-masq=true -v=0″
FLANNEL_IFACE=”eth0″
网卡 eth0 或 IP
-ip-masq=true 这个参数的目的是让 flannel 进行 ip 伪装,而不让 docker 进行 ip 伪装。这么做的原因是如果 docker 进行 ip 伪装,流量再从 flannel 出去,其他 host 上看到的 source ip 就是 flannel 的网关 ip,而不是 docker 容器的 ip

# 配置系统启动
vim /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld server
After=network.target
After=network-online.target
Wants=network-online.target
Before=docker.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/flanneld
ExecStart=/usr/bin/flanneld -etcd-endpoints=${FLANNEL_ETCD} -iface=${FLANNEL_IFACE} -etcd-prefix=${FLANNEL_ETCD_KEY} $FLANNEL_OPTIONS
Restart=on-failure

[Install]
WantedBy=multi-user.target

# 向 etcd 写入网段配置
export ETCDCTL_API=3
etcdctl put /dudu_flannel/network/config ‘{“Network”: “172.17.0.1/16″,”SubnetMin”: “172.17.0.0”, “SubnetMax”: “172.17.254.0”,”Backend”:{“Type”:”vxlan”}}’ –endpoints=10.30.187.25:2379
查看
etcdctl –endpoints=10.30.187.25:2379 get /dudu_flannel/network/config
删除
etcdctl –endpoints=10.30.187.25:2379 del –prefix=true “/dudu_flannel”

或 rest 接口
curl -X PUT http://10.30.187.25:2379/v2/keys/dudu_flannel/network/config -d value='{“Network”: “172.17.0.1/16″,”SubnetLen”:24,”Backend”:{“Type”:”vxlan”}}’
curl http://localhost:2379/v2/keys/dudu_flannel/network/config

# 删除配置
curl http://localhost:2379/v2/keys/dudu_flannel/network/config -XDELETE
curl http://localhost:2379/v2/keys/dudu_flannel?recursive=true -XDELETE

# 关闭防火墙 flanneld
systemctl stop firewalld
systemctl disable firewalld

# 清理防火墙到默认规则
#没有任何参数的 -F 命令在当前表中刷新所有链。同样的,-X 命令删除表中所有非默认链。
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F
iptables -t raw -X
iptables -t security -F
iptables -t security -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

保存规则
iptables-save

#查看规则
iptables -t filter –list
iptables -t mangle –list
iptables -t nat –list
iptables -t raw –list

# 清理网卡
ip link delete docker0
ip link delete flannel.1

# 停止 docker 启动 flannel
systemctl daemon-reload
systemctl stop docker
systemctl stop flanneld

systemctl enable flanneld
systemctl start flanneld
systemctl status -l flanneld

systemctl restart flanneld

# 命令行启动
/usr/local/bin/flanneld -etcd-endpoints=http://10.29.167.233:2379 -etcd-prefix=/dudu_flannel/network -iface=eth0 -log_dir=/var/log/k8s/flanneld

# 启动 flannel 之后从 etcd 中获取 network 的配置信息划分本机 subnet 子网络,
#并在 etcd 中进行注册本机的 IP 已经对应的子网。
#Flannel 守护程序将子网配置信息记录到 /run/flannel/subnet.env 文件中
#Flannel 守护进程还创建 /run/flannel/docker 文件记录 docker 的守护进程启动需要的环境变量信息
#按照生成的 docker 环境变量配置 docker 的启动参数启动 docker
#如果没有 /run/flannel/docker 文件手动生成
/opt/flanneld-v0.8.0/mk-docker-opts.sh -i
cat /run/docker_opts.env

# 例子:
cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.17.0.0/16
FLANNEL_SUBNET=172.17.31.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false

cat /run/flannel/docker
DOCKER_OPT_BIP=”–bip=172.17.31.1/24″
DOCKER_OPT_IPMASQ=”–ip-masq=true”
DOCKER_OPT_MTU=”–mtu=1450″
DOCKER_NETWORK_OPTIONS=” –bip=172.17.31.1/24 –ip-masq=true –mtu=1450 ”

# 修改 docker 的启动参数 按照 /run/flannel/docker 文件中的配置 ip-masq 表示 IP 伪装
vim /etc/docker/daemon.json
{
“registry-mirrors”: [“https://mb4qkfnx.mirror.aliyuncs.com”],
“insecure-registries”:[“dudureg.xip.io:5000”],
“bip”:”172.17.0.1/24″,
“ip-masq”: false,
“mtu”: 1450,
“iptables”:false
}

# 重启 docker
systemctl restart docker
#查看路由,查看网卡
route -n
ifconfig
#查看成员
curl http://localhost:2379/v2/keys/dudu_flannel/network/subnets
#PublicIP 配置的地址是外网地址,不是内网地址

# 测试
docker run -d -it –name ip_test alpine:3.5 ash
docker inspect ip_test
docker exec -ti ip_test ash #进入容器中互 ping

docker run -it –rm busybox sh

docker logs -f -t –tail=100 ip_test
#查看系统日志
journalctl -fu docker.service
journalctl –no-pager -l -u flanneld

# 监控包
tcpdump -i flannel.1
tcpdump host 10.29.168.24 and 10.29.167.186 -w /var/log/001.cap
tcpdump -i flannel.1 -w /var/log/001.cap
#防火墙 Nat 转发规则
iptables -t filter -L -v

# 查看封包地址
bridge fdb show dev flannel.1
删除
bridge fdb del xx:xx:xx:cc:dd:a7 dev flannel.1
添加
bridge fdb add xx:xx:xx:cc:dd:a7 dev flannel.1 dst 192.168.110.18 self permanent
常用操作命令
配置

配置使用 Vxlan 重启需要在几秒钟内完成此操作,因为 ARP 条目可能会开始超时,需要法兰绒守护程序刷新它们
为了避免重新启动过程中的中断,不能更改配置(例如,VNI,-iface 值)
vxlan 将具有较低的延迟开销和原生网络一样的带宽,性能基本和原生一样

cat /boot/config-uname -r | grep CONFIG_VXLAN 检查主机内核是否支持 VXLAN 返回 CONFIG_VXLAN= m 支持
cat flannel-config.json
{
“Network”: “172.17.0.0/16”,
“SubnetLen”: 24,
“Backend”: {
“Type”: “vxlan”,
“VNI”: 1
}
}
在 backend 中还可以配置 Port 默认为内核默认端口 8472 是发送 UDP 封包的端口号
#保存到 etcd
etcdctl set /dudu_flannel/network/config < flannel-config.json

使用 udp 作为后端 flanneld 可以重新启动 甚至进行升级而不会影响现有的流量
cat flannel-config.json
{
“Network”: “172.17.0.0/16”,
“SubnetLen”: 24,
“SubnetMin”: “172.17.0.0”,
“SubnetMax”: “172.17.254.0”,
“Backend”: {
“Type”: “udp”,
“Port”: 7890
}
}

使用 host-gw 作为后端

etcdctl set /dudu_flannel/network/config ‘{“Network”: “192.168.0.1/16″,”SubnetLen”: 24,”Backend”: {“Type”: “host-gw”}}’
curl http://10.99.132.22:2379/v2/keys/dudu_flannel/network/config

flanneld -etcd-endpoints=http://10.99.132.21:2379 -etcd-prefix=/dudu_flannel/network -logtostderr=true -v=3 -iface=eth0 &>> /var/log/flanneld &

子节点启动网桥模式
docker run –net=bridge -itd –name=’vm2′ sshd:1.0
测试联通
docker exec vm1 ping -c 3 192.168.1.194
测试路由
docker exec vm1 traceroute 192.168.1.194

–iface 启动参数默认使用的系统的默认路由网卡 route -n 排在第一个的就是默认路由,在阿里云默认路由就是 etch1 为外网路由
内网路由是 eth0 需要手动配置 –iface=”eth0″ 才能让 flannel 使用内网路由内网 IP 通信

功能
功能 1
功能 2
调试
优化
常见问题
实际应用

正文完
 0