開源的網(wǎng)絡組件
Kubernetes的網(wǎng)絡模型假定了所有Pod都在一個可以直接連通的扁平網(wǎng)絡空間中志珍。這在GCE里面是現(xiàn)成的網(wǎng)絡模型,Kubernetes假定這個網(wǎng)絡也存在痢虹。而在私有云里搭建Kubernetes集群币呵,就不能假定這種網(wǎng)絡已經(jīng)存在了。我們需要自己實現(xiàn)這個網(wǎng)絡假設紊馏,將不同節(jié)點上的Docker容器之間的相互訪問先打通,然后運行Kubernetes蒲犬。
目前已經(jīng)有多個開源組件支持容器網(wǎng)絡模型朱监。本節(jié)介紹幾個常見的網(wǎng)絡組件及其安裝配置方法,包括Flannel原叮、Open vSwitch赫编、直接路由和Calico。
Flannel
Flannel之所以可以搭建Kubernetes依賴的底層網(wǎng)絡奋隶,是因為它能實現(xiàn)以下兩點擂送。
(1)它能協(xié)助Kubernetes,給每一個Node上的Docker容器都分配互相不沖突的IP地址唯欣。
(2)它能在這些IP地址之間建立一個覆蓋網(wǎng)絡(Overlay Network)嘹吨,通過這個覆蓋網(wǎng)絡,將數(shù)據(jù)包原封不動地傳遞到目標容器內境氢。
現(xiàn)在蟀拷,通過下圖來看看Flannel是如何實現(xiàn)這兩點的碰纬。
可以看到,F(xiàn)lannel首先創(chuàng)建了一個名為flannel0的網(wǎng)橋问芬,而且這個網(wǎng)橋的一端連接docker0網(wǎng)橋悦析,另一端連接一個叫作flanneld的服務進程。
flanneld進程并不簡單此衅,它上連etcd强戴,利用etcd來管理可分配的IP地址段資源,同時監(jiān)控etcd中每個Pod的實際地址挡鞍,并在內存中建立了一個Pod節(jié)點路由表骑歹;它下連docker0和物理網(wǎng)絡,使用內存中的Pod節(jié)點路由表墨微,將docker0發(fā)給它的數(shù)據(jù)包包裝起來道媚,利用物理網(wǎng)絡的連接將數(shù)據(jù)包投遞到目標flanneld上,從而完成Pod到Pod之間的直接地址通信欢嘿。
Flannel之間的底層通信協(xié)議的可選技術包括UDP衰琐、VxLan也糊、AWS VPC等多種方式炼蹦。通過源flanneld封包、目標flanneld解包狸剃,最終docker0收到的就是原始的數(shù)據(jù)掐隐,對容器應用來說是透明的,感覺不到中間Flannel的存在钞馁。
我們看一下Flannel是如何做到為不同Node上的Pod分配的IP不產(chǎn)生沖突的虑省。其實想到Flannel使用了集中的etcd存儲就很容易理解了。它每次分配的地址段都在同一個公共區(qū)域獲取僧凰,這樣大家自然能夠互相協(xié)調探颈,不產(chǎn)生沖突了。而且在Flannel分配好地址段后训措,后面的事情是由Docker完成的伪节,F(xiàn)lannel通過修改Docker的啟動參數(shù)將分配給它的地址段傳遞進去:
--bip 172.17.18.1/24
通過這些操作,F(xiàn)lannel就控制了每個Node上的docker0地址段的地址绩鸣,也就保障了所有Pod的IP地址在同一個水平網(wǎng)絡中且不產(chǎn)生沖突了怀大。
Flannel完美地實現(xiàn)了對Kubernetes網(wǎng)絡的支持,但是它引入了多個網(wǎng)絡組件呀闻,在網(wǎng)絡通信時需要轉到flannel0網(wǎng)絡接口化借,再轉到用戶態(tài)的flanneld程序,到對端后還需要走這個過程的反過程捡多,所以也會引入一些網(wǎng)絡的時延損耗蓖康。
另外铐炫,F(xiàn)lannel模型默認采用了UDP作為底層傳輸協(xié)議,UDP本身是非可靠協(xié)議钓瞭,雖然兩端的TCP實現(xiàn)了可靠傳輸驳遵,但在大流量、高并發(fā)的應用場景下還需要反復測試山涡,確保沒有問題堤结。
Flannel的安裝和配置如下。
由于Flannel使用etcd作為數(shù)據(jù)庫鸭丛,所以需要預先安裝好etcd竞穷,此處不在過多描述。
安裝Flannel
? 需要在每個Node上都安裝Flanel鳞溉。Flannel軟件的下載地址為:
https://github.com/coreos/flannel/releases
? 將下載的壓縮包flannel-<version>-linux-amd64.tar.gz解壓瘾带,將二進制文件flanneld和mk-docker-opts.sh復制到/usr/bin(或其他PATH環(huán)境變量中的目錄)下,即可完成對Flannel的安裝熟菲。
- 配置Flannel
此處以使用systemd系統(tǒng)為例對flanneld服務進行配置看政。編輯服務配置文件/usr/lib/systemd/system/flanneld.service:
[Unit]
Description=flanneld overlay address etcd agent
After=network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/flanneld
ExecStart=/usr/bin/flanneld -etcd-endpoints=${FLANNEL_ETCD} $FLANNEL_OPTIONS
[Install]
RequiredBy=docker.service
WantedBy=multi-user.target
編輯配置文件/etc/sysconfig/flannel,設置etcd的URL地址:
FLANNEL_ETCD="http://20.0.40.51:2379"
FLANNEL_ETCD_KEY="/coreos.com/network"
在啟動flanneld服務之前,需要在etcd中添加一條網(wǎng)絡配置記錄抄罕,這個配置將用于flanneld分配給每個Docker的虛擬IP地址段:
etcdctl set /coreos.com/network/config '{"Network": "10.1.0.0/16"}'
由于Flannel將覆蓋docker0網(wǎng)橋允蚣,所以如果Docker服務已啟動,則需要停止Docker服務呆贿。
- 啟動flanneld服務
systemctl restart flanneld
- 設置docker0網(wǎng)橋的IP地址
mk-docker-opts.sh -i
source /run/flannel/subnet.env
ifconfig docker0 ${FLANNEL_SUBNET}
完成后確認網(wǎng)絡接口docker0的IP地址屬于flannel0的子網(wǎng),重啟docker服務嚷兔。