覆蓋網絡 Flannel 0.7

資源

特性

概念

  • 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支持linux

    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能夠從新啓動 甚至進行升級而不會影響現有的流量git

    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

調試

優化

常見問題

實際應用

相關文章
相關標籤/搜索