詳解:Flannel安裝與配置
Flannel是 CoreOS 團隊針對 Kubernetes 設計的一個覆蓋網路(Overlay Network)工具,其目的在於幫助每一個使用 Kuberentes 的 CoreOS 主機擁有一個完整的子網。 |
Flannel是一種基於overlay網路的跨主機容器網路解決方案,也就是將TCP資料包封裝在另一種網路包裡面進行路由轉發和通訊,Flannel是CoreOS開發,專門用於docker多機互聯的一個工具,讓叢集中的不同節點主機建立的容器都具有全叢集唯一的虛擬ip地址,Flannel使用go語言編寫。
Flannel為每個host分配一個subnet,容器從這個subnet中分配IP,這些IP可以在host間路由,容器間無需使用nat和埠對映即可實現跨主機通訊
每個subnet都是從一個更大的IP池中劃分的,flannel會在每個主機上執行一個叫flanneld的agent,其職責就是從池子中分配subnet
Flannel使用etcd存放網路配置、已分配 的subnet、host的IP等資訊
Flannel資料包在主機間轉發是由backend實現的,目前已經支援UDP、VxLAN、host-gw、AWS VPC和GCE路由等多種backend
容器直接使用目標容器的ip訪問,預設透過容器內部的eth0傳送出去。
報文透過veth pair被髮送到vethXXX。
vethXXX是直接連線到虛擬交換機docker0的,報文透過虛擬bridge docker0傳送出去。
查詢路由表,外部容器ip的報文都會轉發到flannel0虛擬網路卡,這是一個P2P的虛擬網路卡,然後報文就被轉發到監聽在另一端的flanneld。
flanneld透過etcd維護了各個節點之間的路由表,把原來的報文UDP封裝一層,透過配置的iface傳送出去。
報文透過主機之間的網路找到目標主機。
報文繼續往上,到傳輸層,交給監聽在8285埠的flanneld程式處理。
資料被解包,然後傳送給flannel0虛擬網路卡。
查詢路由表,發現對應容器的報文要交給docker0。
docker0找到連到自己的容器,把報文傳送過去。
節點名稱 IP地址 安裝軟體 docker1 192.168.198.133 etcd、flannel、docker docker2 192.168.198.130 flannel、docker
etcd下載地址:
啟動 :
etcd -name etcd1 -data-dir /var/lib/etcd --advertise-client-urls http://192.168.198.133:2379,http://127.0.0.1:2379 --listen-client-urls http://192.168.198.133:2379,http://127.0.0.1:2379 &
flannel下載地址:
新增flannel網路配置資訊到etcd:
etcdctl --endpoints {"Network": "10.0.0.0/16", "SubnetLen": 24, "SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0", "Backend": {"Type": "vxlan"}}'
Network:用於指定Flannel地址池
SubnetLen:用於指定分配給單個宿主機的docker0的ip段的子網掩碼的長度
SubnetMin:用於指定最小能夠分配的ip段
SudbnetMax:用於指定最大能夠分配的ip段,在上面的示例中,表示每個宿主機可以分配一個24位掩碼長度的子網,可以分配的子網從10.0.1.0/24到10.0.20.0/24,也就意味著在這個網段中,最多隻能有20臺宿主機
Backend:用於指定資料包以什麼方式轉發,預設為udp模式,host-gw模式效能最好,但不能跨宿主機網路
# cat /etc/systemd/system/flanneld.service [Unit] Description=Flanneld Documentation= After=network.target Before=docker.service [Service] User=root ExecStartPost=/usr/local/bin/mk-docker-opts.sh ExecStart=/usr/local/bin/flanneld \ --etcd-endpoints="http://192.168.198.133:2379" \ --iface=192.168.198.133 \ --ip-masq=true \ --etcd-prefix=/coreos.com/network Restart=on-failure Type=notify LimitNOFILE=65536 [Install] WantedBy=multi-user.target
# systemctl daemon-reload # systemctl start flanneld
Flannel啟動過程解析:
從etcd中獲取network的配置資訊,劃分subnet,並在etcd中進行註冊,將子網資訊記錄到/run/flannel/subnet.env中,Flannel必須先於Docker啟動。
檢視etcd中的資料:
# etcdctl ls /coreos.com/network/subnets /coreos.com/network/subnets/10.0.18.0-24
檢視docker1的flannel網路卡資訊:
38: flannel.1:mtu 1450 qdisc noqueue state UNKNOWN group default link/ether 1a:8e:8b:09:d6:d4 brd ff:ff:ff:ff:ff:ff inet 10.0.18.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::188e:8bff:fe09:d6d4/64 scope link valid_lft forever preferred_lft forever
可以看到flannel0網路卡的地址和etcd儲存的地址一樣,這樣flannel網路配置完成
Docker安裝完成以後,需要修改其啟動引數以使其能夠使用flannel進行IP分配,以及網路通訊
在Flannel執行之後,會生成一個環境變數檔案,包含了當前主機要使用flannel通訊的相關引數,如下:
# cat /run/flannel/subnet.env FLANNEL_NETWORK=10.0.0.0/16 FLANNEL_SUBNET=10.0.18.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=true
可以使用flannel提供的 將subnet.env轉寫成Docker啟動引數,建立好的啟動引數預設生成在/run/docker_opts.env檔案中:
# /opt/flannel/mk-docker-opts.sh -c # cat /run/docker_opts.env DOCKER_OPTS=" --bip=10.0.18.1/24 --ip-masq=false --mtu=1450" 修改docker的服務啟動檔案如下: # vim /lib/systemd/system/docker.service EnvironmentFile=/run/docker_opts.env ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://
重啟docker
systemctl daemon-reload systemctl restart docker
這時可以看到docker0的ip已經位於flannel網路卡的網段之中:
3: docker0:mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:de:a3:d8:7d brd ff:ff:ff:ff:ff:ff inet 10.0.18.1/24 brd 10.0.18.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:deff:fea3:d87d/64 scope link valid_lft forever preferred_lft forever 38: flannel.1:mtu 1450 qdisc noqueue state UNKNOWN group default link/ether 1a:8e:8b:09:d6:d4 brd ff:ff:ff:ff:ff:ff inet 10.0.18.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::188e:8bff:fe09:d6d4/64 scope link valid_lft forever preferred_lft forever
root@ubuntu:~# docker run -it busybox / # ip a 1: lo:mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 39: eth0@if40:mtu 1450 qdisc noqueue link/ether 02:42:0a:00:12:02 brd ff:ff:ff:ff:ff:ff inet 10.0.18.2/24 brd 10.0.18.255 scope global eth0 valid_lft forever preferred_lft forever / # ping 10.0.12.2 PING 10.0.12.2 (10.0.12.2): 56 data bytes 64 bytes from 10.0.12.2: seq=0 ttl=62 time=0.803 ms
root@ubuntuserver:~/flannel# docker exec -it b4d /bin/bash root@b4d65fdc02a3:/usr/local/apache2# ip a 1: lo:mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 5: eth0@if6:mtu 1450 qdisc noqueue state UP group default link/ether 02:42:0a:00:0c:02 brd ff:ff:ff:ff:ff:ff inet 10.0.12.2/24 brd 10.0.12.255 scope global eth0 valid_lft forever preferred_lft forever root@b4d65fdc02a3:/usr/local/apache2# root@b4d65fdc02a3:/usr/local/apache2# root@b4d65fdc02a3:/usr/local/apache2# ping 10.0.18.2 PING 10.0.18.2 (10.0.18.2) 56(84) bytes of data. 64 bytes from 10.0.18.2: icmp_seq=1 ttl=62 time=0.794 ms 64 bytes from 10.0.18.2: icmp_seq=2 ttl=62 time=0.957 ms
此時的網路資料包流向如圖:
host-gw bakcend是flannel的另一個backend。與vxlan不同,host-gw不會封裝資料包,而是在主機的路由表中建立到其他主機的subnet的路由條目,從而實現容器網路跨主機通訊。需要說明的是,host-gw不能跨宿主機網路通訊,或者說跨宿主機網路通訊需要物理路由支援。
修改etcd如下:
etcdctl --endpoints {"Network": "10.0.0.0/16", "SubnetLen": 24, "SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0", "Backend": {"Type": "host-gw"}}'
重啟flanneld與docker:
systemctl restart flanneld docker
可以在宿主機上檢視到路由條目:
root@ubuntu:~# ip route default via 192.168.198.2 dev ens33 proto dhcp metric 100 10.0.12.0/24 via 192.168.198.130 dev ens33 10.0.18.0/24 dev docker0 proto kernel scope link src 10.0.18.1 linkdown 169.254.0.0/16 dev ens33 scope link metric 1000 192.168.198.0/24 dev ens33 proto kernel scope link src 192.168.198.133 metric 100
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2699591/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- centos7 (阿里雲、linux) 單機spark的安裝與配置詳解(jdk安裝與配置,scala安裝與配置,hadoop安裝與配置,spark安裝與配置)CentOS阿里LinuxSparkJDKHadoop
- 本地windows搭建spark環境,安裝與詳細配置(jdk安裝與配置,scala安裝與配置,hadoop安裝與配置,spark安裝與配置)WindowsSparkJDKHadoop
- 059、安裝配置flannel(2019-03-28 週四)
- 詳解 RHEL7.1 yum源配置與軟體安裝
- MySQL的安裝與配置——詳細教程MySql
- Docker的安裝配置及使用詳解Docker
- 【python與pycharm安裝教程,詳解】PythonPyCharm
- DKhadoop環境安裝配置步驟詳解Hadoop
- MySQ 資料庫主從同步安裝與配置詳解(Master/Slave)資料庫主從同步AST
- 超詳細maven的解除安裝、重新安裝與配置Maven
- influxdb詳解(一):安裝與啟動UX
- 阿里雲、騰訊雲、CentOS下的MySQL的安裝與配置詳解阿里CentOSMySql
- 詳解Linux下Nginx+Tomcat整合的安裝與配置的步驟LinuxNginxTomcat
- Nginx 安裝與配置Nginx
- Spark安裝與配置Spark
- Telnet安裝與配置
- 【Redis】安裝與配置Redis
- [Redis] 安裝與配置Redis
- 【MySQL】安裝與配置MySql
- jdk安裝與配置JDK
- MacVim安裝與配置Mac
- 【MongoDB】安裝與配置MongoDB
- Rabbitmq安裝與配置MQ
- vim安裝與配置
- MySQL安裝與配置MySql
- Supervisor安裝與配置
- Nginx安裝與配置Nginx
- (一) 基於阿里雲安裝配置部署 docker 詳解阿里Docker
- Mac系統安裝和配置tomcat步驟詳解MacTomcat
- Jmeter安裝配置詳細教程JMeter
- idea maven怎麼安裝配置 idea maven配置教程詳細圖解IdeaMaven圖解
- Maven安裝詳解Maven
- Vue的安裝與配置Vue
- Redis的安裝與配置Redis
- MariaDB的安裝與配置
- Kafka SSL安裝與配置Kafka
- sqoop 安裝與配置使用OOP
- Centos安裝與配置RedisCentOSRedis