以前的博客已經介紹了部署一個簡單的Kubernetes集羣,可是這個集羣環境沒有一個合理的網絡配置。在實際生產中要實現集羣中各個組件的通訊,就須要使用第三方提供的網絡插件。node
一、下載fannel組件linux
wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz
二、安裝Flannel 網絡組件git
tar xf flannel-v0.10.0-linux-amd64.tar.gz cp flanneld /usr/bin/ cp mk-docker-opts.sh /usr/bin/
三、因爲是二進制的文件,將flanneld拷貝到有系統環境變量的可執行路徑就完成了安裝。下面講解具體的配置過程和原理。github
咱們之因此要單獨使用第三方的網絡插件來擴展k8s,主要緣由是在使用docker的環境中,在每一個node節點的docker0默認的網段都是172.17.0.0/16的網絡。若是要實現不一樣宿主node上pod(這裏也能夠理解爲容器)互相通訊,就不能使用默認的docker0提供的網段,咱們須要部署一個覆蓋網絡,讓每一個node節點的docker0網絡都處於不一樣的網段,這樣,經過添加一些路由轉發策略,就能讓集羣中各個pod在同一個虛擬的網絡中實現通訊。docker
一、這裏編寫flanneld的systemd文件:vim
# 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
對上面的文件作一下解釋:網絡
After=network.target
Before=docker.service
/etc/kubernetes/flanneld
文件中,咱們會指定flannel相關的啓動參數,這裏因爲須要指定etcd集羣,會有一部分不通用的參數,因此單獨定義。/usr/bin/remove-docker0.sh
這個腳本,將若是已經建立了docker0的網卡,就將他移除,防止產生衝突。(這個腳原本自k8s的源碼包)二、配置fannel參數文件:ide
# cat /etc/kubernetes/flanneld FLANNEL_ETCD="-etcd-endpoints=http://10.0.0.1:2379" # etcd集羣 FLANNEL_ETCD_KEY="/coreos.com/network" # etcd存儲flannel網絡信息的key
三、etcd中添加fannel的key, 這裏指定了flannel的網段:ui
etcdctl set /coreos.com/network/config '{ "Network": "10.1.0.0/16" }'
四、啓動fannel:插件
systemctl daemon-reload systemctl start flanneld
一、若是要使用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 ...
修改配置說明:
Requires=flanneld.service
二、驗證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
三、在每一個節點部署flannel,以後能夠建立pod,驗證不一樣節點上的pod可否ping通。這裏就不作演示,能夠參考我以前的博客。
Flannel是如何作到讓不一樣主機上的pod 互通呢,下面的網絡圖很清楚的解釋了這個問題: