宣言:
docker作為容器云的中非常具有代表性的產(chǎn)品伴奥,近年來(lái)收到非常廣泛的關(guān)注惜论,而如何對(duì)docker這樣的容器云進(jìn)行管理也是一件非常頭疼的事情封恰,本文主要通過(guò)對(duì)k8s集群管理中flannel組件的分析討論越庇,來(lái)為大家了解docker集群管理提供一點(diǎn)幫助卤唉。
kubernetes 集群中Flannel的使用說(shuō)明
k8s集群安裝配置etcd的時(shí)會(huì)為安裝的k8s集群配置一個(gè)網(wǎng)段桑驱,這個(gè)網(wǎng)段是整個(gè)集群中容器可以使用的ip地址段,譬如我們?cè)诎惭b完成etcd的時(shí)候執(zhí)行etcdctl set 設(shè)置一個(gè)key-value的鍵值對(duì)指定這個(gè)集群的網(wǎng)段范圍痊硕,但是如何確保每個(gè)minion節(jié)點(diǎn)中容器的ip地址是唯一的岔绸,就需要flannel來(lái)幫忙了亭螟,flannel基于集群的這個(gè)網(wǎng)段來(lái)為每個(gè)minion節(jié)點(diǎn)做二次子網(wǎng)的劃分预烙。接下來(lái)我們?yōu)榇蠹曳治鰂lannel和etcd是如何協(xié)同搭配完成這一工作的道媚。
在安裝配置k8s集群時(shí)候需要為每一個(gè)minion節(jié)點(diǎn)安裝flannel扁掸,我們主要從配置文件入手來(lái)分析flannel是怎樣工作來(lái)完成對(duì)集群子網(wǎng)的二次劃分。
# Flanneld configuration options
# etcd url location.? Point this to the server where etcd runs
FLANNEL_ETCD="http://192.168.163.152:2379"
# etcd config key.? This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_KEY="/coreos.com/network"
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
在配置文件中我們看到指定了兩個(gè)參數(shù)一個(gè)是FLANNEL_ETCD這個(gè)值指定的是我們安裝etcd服務(wù)端的地址和端口最域,可以通過(guò)netstat 命令看下minion端的連接狀態(tài)谴分,可以看到minion端與etcd服務(wù)端etcd的端口相連接镀脂,這個(gè)設(shè)置是讓minion節(jié)點(diǎn)的flannel能夠與服務(wù)端的etcd保持通信:
第二個(gè)值FLANNEL_ETCD_KEY是指定的一個(gè)key薄翅,我們?cè)诎惭betcd服務(wù)端時(shí)執(zhí)行了一條命令:
etcdctl -C 192.168.163.148:2379 set /coreos.com/network/config '{ "Network": "192.168.0.0/16" }'
這個(gè)值很重要翘魄,這個(gè)key對(duì)應(yīng)的value就是我們每個(gè)minion機(jī)為docker設(shè)置的啟動(dòng)參數(shù)范圍。先看一張圖斋射,這張圖是minion機(jī)docker的啟動(dòng)參數(shù)
需要注意的是docker啟動(dòng)參數(shù)中的 --bip=192.168.102.1/24這個(gè)參數(shù),flannel的作用就是修改了這個(gè)參數(shù)相當(dāng)于為每一臺(tái)minion主機(jī)的docker劃分了子網(wǎng)桑包。再通過(guò)ifconfig查看下可以看到圖:
多了一個(gè)docker的虛擬網(wǎng)卡铐炫,所以我們?cè)诎惭bkubernetes時(shí)如果發(fā)現(xiàn)我們安裝完docker后docker0網(wǎng)卡的網(wǎng)段不在FLANNEL_ETCD_KEY中那將會(huì)導(dǎo)致docker無(wú)法啟動(dòng)鳖悠,在kubernetes node上執(zhí)行kubectl get node將會(huì)顯示node節(jié)點(diǎn) not ready。
綜上所述:
flannel作為coreos提供給k8s的組件,在運(yùn)行過(guò)程中通過(guò)與etcd進(jìn)行通信獲取整個(gè)集群網(wǎng)段信息并進(jìn)行子網(wǎng)的二次分配萌朱,使得每個(gè)minion節(jié)點(diǎn)都能擁有一個(gè)唯一的子網(wǎng)網(wǎng)段冒晰,進(jìn)而確保在整個(gè)k8s集群中運(yùn)行的docker容器都能獲得唯一的ip地址。