容器間內(nèi)部通信bridge模式 host模式 自定義網(wǎng)絡(luò) Container模式 None模式
跨主機(jī)通信Docker默認(rèn)的網(wǎng)絡(luò)環(huán)境下,單臺(tái)主機(jī)上的Docker容器可以通過docker0網(wǎng)橋直接通信,而不同主機(jī)上的Docker容器之間只能通過在主機(jī)上做端口映射進(jìn)行通信。 這種端口映射方式對(duì)很多集群應(yīng)用來說極不方便,。 如果能讓Docker容器之間直接使用自己的IP地址進(jìn)行通信,會(huì)解決很多問題,。 按實(shí)現(xiàn)原理可分別直接路由方式、橋接方式(如pipework),、Overlay隧道方式(如flannel,、ovs+gre)等。 直接路由 Flannel Flannel實(shí)質(zhì)上是一種覆蓋網(wǎng)絡(luò)(overlay network),即表示運(yùn)行在一個(gè)網(wǎng)上的網(wǎng)(應(yīng)用層網(wǎng)絡(luò)),并不依靠ip地址來傳遞消息, 而是采用一種映射機(jī)制,把ip地址和identifiers做映射來資源定位,。 也就是將TCP數(shù)據(jù)包裝在另一種網(wǎng)絡(luò)包里面進(jìn)行路由轉(zhuǎn)發(fā)和通信, 目前已經(jīng)支持UDP,、VxLAN,、AWS VPC和GCE路由等數(shù)據(jù)轉(zhuǎn)發(fā)方式。 Flannel實(shí)現(xiàn)的容器的跨主機(jī)通信通過如下過程實(shí)現(xiàn): 每個(gè)主機(jī)上安裝并運(yùn)行etcd和flannel,; 在etcd中規(guī)劃配置所有主機(jī)的docker0子網(wǎng)范圍,; 每個(gè)主機(jī)上的flannel根據(jù)etcd中的配置,為本主機(jī)的docker0分配子網(wǎng),保證所有主機(jī)上的docker0網(wǎng)段不重復(fù),并將結(jié)果(即本主機(jī)上的docker0子網(wǎng)信息和本主機(jī)IP的對(duì)應(yīng)關(guān)系)存入 etcd庫(kù)中,這樣etcd庫(kù)中就保存了所有主機(jī)上的docker子網(wǎng)信息和本主機(jī)IP的對(duì)應(yīng)關(guān)系; 當(dāng)需要與其他主機(jī)上的容器進(jìn)行通信時(shí),查找etcd數(shù)據(jù)庫(kù),找到目的容器的子網(wǎng)所對(duì)應(yīng)的outip(目的宿主機(jī)的IP),; 將原始數(shù)據(jù)包封裝在VXLAN或UDP數(shù)據(jù)包中,IP層以outip為目的IP進(jìn)行封裝,; 由于目的IP是宿主機(jī)IP,因此路由是可達(dá)的; VXLAN或UDP數(shù)據(jù)包到達(dá)目的宿主機(jī)解封裝,解出原始數(shù)據(jù)包,最終到達(dá)目的容器,。
Flannel特點(diǎn): 1. 使集群中的不同Node主機(jī)創(chuàng)建的Docker容器都具有全集群唯一的虛擬IP地址,。 2. 建立一個(gè)覆蓋網(wǎng)絡(luò)(overlay network),通過這個(gè)覆蓋網(wǎng)絡(luò),將數(shù)據(jù)包原封不動(dòng)的傳遞到目標(biāo)容器。覆蓋網(wǎng)絡(luò)是建立在另一個(gè)網(wǎng)絡(luò)之上并由其基礎(chǔ)設(shè)施支持的虛擬網(wǎng)絡(luò),。覆蓋網(wǎng)絡(luò)通過將一個(gè)分組封裝在另一個(gè)分組內(nèi)來將網(wǎng)絡(luò)服務(wù)與底層基礎(chǔ)設(shè)施分離,。在將封裝的數(shù)據(jù)包轉(zhuǎn)發(fā)到端點(diǎn)后,將其解封裝。 3. 創(chuàng)建一個(gè)新的虛擬網(wǎng)卡flannel0接收docker網(wǎng)橋的數(shù)據(jù),通過維護(hù)路由表,對(duì)接收到的數(shù)據(jù)進(jìn)行封包和轉(zhuǎn)發(fā)(vxlan),。 4. etcd保證了所有node上flanned所看到的配置是一致的,。同時(shí)每個(gè)node上的flanned監(jiān)聽etcd上的數(shù)據(jù)變化,實(shí)時(shí)感知集群中node的變化。 環(huán)境搭建主機(jī) | ip | 環(huán)境要求 | CentOS01 | 192.168.23.131 | etcd,docker,flannel | CentOS02 | 192.168.23.132 | etcd,docker,flannel |
ETCD版本問題: 當(dāng)重新啟動(dòng) 執(zhí)行 etcdctl member list 列出所有集群節(jié)點(diǎn)信息時(shí) 報(bào)錯(cuò)了 原因: ETCD3.4版本中,,ETCDCTL_API=3和etcd --enable-v2=false成為了默認(rèn)配置,。 flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API 為了兼容flannel,將默認(rèn)開啟v2版本,故配置文件中還要設(shè)置: 1.修改系統(tǒng)環(huán)境變量 vi /etc/profile
2.將指定etcdctl命令的版本為v2的加進(jìn)去 export ETCDCTL_API=2
3.刷新系統(tǒng)環(huán)境 source /etc/profile
注:etcdctl2和etcdctl3是不兼容的,兩者的api參數(shù)也不一樣,最關(guān)鍵的是“v2/v3的數(shù)據(jù)是不互通的” ETCDCTL_API=2 etcdctl set key value ETCDCTL_API=2 etcdctl ls / ETCDCTL_API=2 etcdctl del / --prefix
ETCDCTL_API=3 etcdctl put key value ETCDCTL_API=3 etcdctl get / ETCDCTL_API=3 etcdctl del / --prefix
ETCD中保存網(wǎng)絡(luò)信息ETCDCTL_API=2 etcdctl \ --endpoints "http://192.168.23.131:2379,http://192.168.23.132:2379" \ set /coreos.com/network/config \ '{"NetWork":"10.0.0.0/16","SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0","Backend": {"Type": "vxlan"}}'
Network: 用于指定Flannel地址池, 整個(gè)overlay(覆蓋)網(wǎng)絡(luò)為10.0.0.0/16網(wǎng)段 SubnetLen: 用于指定分配給單個(gè)宿主機(jī)的docker0的ip段的子網(wǎng)掩碼的長(zhǎng)度,默認(rèn)值也是24 SubnetMin: 用于指定最小能夠分配的ip段 SudbnetMax: 用于指定最大能夠分配的ip段,在上面的示例中,表示每個(gè)宿主機(jī)可以分配一個(gè)24位掩碼長(zhǎng)度的子網(wǎng),可以分配的子網(wǎng)從10.0.1.0/24到10.0.20.0/24,也就意味著在這個(gè)網(wǎng) 段中,最多只能有20臺(tái)宿主機(jī) Backend: 用于指定數(shù)據(jù)包以什么方式轉(zhuǎn)發(fā),默認(rèn)為udp模式, 這里使用的是vxlan模式.因?yàn)闉関xlan比起預(yù)設(shè)的udp性能相對(duì)好一些
注:flannel訪問etcd時(shí)使用的key默認(rèn)為:/coreos.com/network,可修改,但必須重新配置flanneld.conf的參數(shù)etcd-prefix,例如-etcd-prefix=/zking.com/network flannel安裝與配置下載或上傳flannel安裝包 創(chuàng)建flannel安裝目錄
mkdir -p /opt/flannel
tar xzf flannel-v0.11.0-linux-amd64.tar.gz -C /opt/flannel
cd /opt/flannel && ls
flanneld為主要的執(zhí)行文件 sh腳本用于生成Docker啟動(dòng)參數(shù) vim /etc/systemd/system/flanneld.service
systemctl daemon-reload && systemctl restart flanneld
ifconfig
如果看到flannel.1網(wǎng)卡的地址和etcd中存儲(chǔ)的地址一樣,這樣flannel網(wǎng)絡(luò)配置完成 docker配置在各個(gè)節(jié)點(diǎn)安裝好Docker,然后更改Docker的啟動(dòng)參數(shù),使其能夠使用flannel進(jìn)行IP分配,以及網(wǎng)絡(luò)通訊。 cat /run/flannel/subnet.env
/opt/flannel/mk-docker-opts.sh -d /run/flannel/docker_opts.env -c
cat /run/flannel/docker_opts.env
vim /lib/systemd/system/docker.service
下面是docker.service要修改的地方 [Service]節(jié)點(diǎn)中 指定啟動(dòng)參數(shù)所在的文件位置(這個(gè)配置是新增的) EnvironmentFile=/run/flannel/docker_opts.env 在原有ExecStart后面添加$DOCKER_OPTS 修改前 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 修改后 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_OPTS
如圖: systemctl daemon-reload && systemctl restart docker && systemctl status docker
ifconfig
注:觀察docker0的網(wǎng)卡ip地址已經(jīng)處于flannel網(wǎng)卡網(wǎng)段中 測(cè)試flanneldocker run -it --name=centos centos bash
cat /etc/hosts
docker inspect bridge
ping -c3 192.168.23.132
ping -c3 10.0.20.2
解決flannel下容器無法跨主機(jī)互通問題 經(jīng)測(cè)試,發(fā)現(xiàn)是防火墻的問題,關(guān)閉防火墻后問題解決,但作為服務(wù)的防火墻是不能關(guān)閉的,如何解決呢,。 這是由于linux還有底層的iptables,所以在node上分別執(zhí)行: iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -F iptables -L -n
|