Kubernetes Flannel網絡部署
阿新 • • 發佈:2018-05-29
flannel kubernetes之前的博客已經介紹了部署一個簡單的Kubernetes集群,但是這個集群環境沒有一個合理的網絡配置。在實際生產中要實現集群中各個組件的通信,就需要使用第三方提供的網絡插件。
Flannel 二進制安裝
1、下載fannel組件
wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz
2、安裝Flannel 網絡組件
tar xf flannel-v0.10.0-linux-amd64.tar.gz cp flanneld /usr/bin/ cp mk-docker-opts.sh /usr/bin/
3、由於是二進制的文件,將flanneld拷貝到有系統環境變量的可執行路徑就完成了安裝。下面講解具體的配置過程和原理。
Flannel 配置
我們之所以要單獨使用第三方的網絡插件來擴展k8s,主要原因是在使用docker的環境中,在每個node節點的docker0默認的網段都是172.17.0.0/16的網絡。如果要實現不同宿主node上pod(這裏也可以理解為容器)互相通信,就不能使用默認的docker0提供的網段,我們需要部署一個覆蓋網絡,讓每個node節點的docker0網絡都處於不同的網段,這樣,通過添加一些路由轉發策略,就能讓集群中各個pod在同一個虛擬的網絡中實現通信。
1、這裏編寫flanneld的systemd文件:
# cat /usr/lib/systemd/system/flanneld.service [Unit] Description=Flanneld overlay address etcd agent After=network.target Before=docker.service [Service] EnvironmentFile=-/etc/kubernetes/flanneld ExecStartPre=/usr/bin/remove-docker0.sh ExecStart=/usr/bin/flanneld ${FLANNEL_ETCD} $FLANNEL_OPTIONS ExecStartPost=/usr/bin/mk-docker-opts.sh -d /run/flannel/docker Type=notify [Install] WantedBy=multi-user.target RequiredBy=docker.service
對上面的文件做一下解釋:
- Flannel網絡必須在宿主機網絡能對外(其它node節點)正常通信的情況下啟動才有意義,所以這裏定義
After=network.target
- 只有當Flannel 網絡啟動之後,才能創建一個與其它節點不會沖突的網絡,而docker的網絡需要和fannel 網絡相同才能保證跨主機通信,所以docker必須要在flannel網絡創建後才能啟動,這裏定義
Before=docker.service
- 在
/etc/kubernetes/flanneld
文件中,我們會指定flannel相關的啟動參數,這裏由於需要指定etcd集群,會有一部分不通用的參數,所以單獨定義。 - 當前創建flannel網絡時,我們會執行
/usr/bin/remove-docker0.sh
這個腳本,將如果已經創建了docker0的網卡,就將他移除,防止產生沖突。(這個腳本來自k8s的源碼包) - 啟動之後,我們需要使用fannel自帶的腳本,創建一個docker使用的啟動參數,這個參數就包含配置docker0網卡的網段。
2、配置fannel參數文件:
# cat /etc/kubernetes/flanneld
FLANNEL_ETCD="-etcd-endpoints=http://10.0.0.1:2379" # etcd集群
FLANNEL_ETCD_KEY="/coreos.com/network" # etcd存儲flannel網絡信息的key
3、etcd中添加fannel的key, 這裏指定了flannel的網段:
etcdctl set /coreos.com/network/config ‘{ "Network": "10.1.0.0/16" }‘
4、啟動fannel:
systemctl daemon-reload
systemctl start flanneld
docker配置
1、如果要使用flannel網絡,在啟動docker時,需要添加 --bip
參數,修改systemd啟動文件:
# vim /usr/lib/systemd/system/docker.service
[Unit] # 添加如下內容
After=network-online.target firewalld.service flanneld.service
Wants=network-online.target
Requires=flanneld.service
[Service] #增加EnvironmentFile=-/run/flannel/docker,並添加參數
...
EnvironmentFile=-/run/flannel/docker
ExecStart=/usr/bin/dockerd $DOCKER_OPTS
...
修改配置說明:
- docker的網絡配置需要依賴於Fannel, 所以定義
Requires=flanneld.service
- 運行docker時,需要加載配置參數,而此文件是執行flannel腳本後生成的。
- 在啟動docker是指定參數。
2、驗證docker0信息:
[root@node-3 ~]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.1.90.1 netmask 255.255.255.0 broadcast 0.0.0.0
ether 02:42:44:54:5b:c5 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 0 overruns 0 carrier 0 collisions 0
3、在每個節點部署flannel,之後可以創建pod,驗證不同節點上的pod能否ping通。這裏就不做演示,可以參考我之前的博客。
Flannel 網絡原理
Flannel是如何做到讓不同主機上的pod 互通呢,下面的網絡圖很清楚的解釋了這個問題:
Kubernetes Flannel網絡部署