centos7下安裝docker(15.7容器跨主機網絡---calico)


Calico是一個純三層的虛擬網絡方案,Calico為每個容器分配一個IP,每個host都是router,把不同host的容器連接起來。與vxlan不同的是:calico不對數據包進行封裝,不需要NAT和端口映射,擴展性和性能都很好

與其他容器網絡相比,calico還有一個優勢:network policy。用戶可以動態定義ACL規則,控制進出容器的數據包,實現業務需求

calico依賴etcd在不同主機間共享和交換信息,存儲calico網絡狀態。calico網絡中每個主機都要運行calico組件,提供容器interface管理,動態路由,動態ACL,報告狀態等功能

 

部署calico

1.安裝etcd

安裝好后執行: etcd -listen-client-urls http://192.168.7.222:2379 -advertise-client-urls http://192.168.7.222:2379

2.修改docker1和docker2中的docker的配置文件:/etc/systecd/system/docker.service.d/10-machine.conf

重啟docker服務

3。在docker1和docker2上部署calico

wget -O /usr/local/bin/calicoctl https://github.com/projectcalico/calicoctl/releases/download/v1.6.1/calicoctl   下載calico安裝包

修改權限

啟動calico服務:calicoctl  node run 

注:calico服務啟動的時候主要是運行一個calico容器

1.啟動calico服務的時候,首先設置主機網絡,例如enable IP forwarding

2.下載並啟動calico-node容器,calico會以容器的形式運行(與weave類似)

注:在啟動服務的時候如果報錯,注意以上兩點:1. ETCD_ENDPOINTS=http://127.0.0.1:2379這里應該是連接我們的etcd的服務器,是我們之前在docker配置文件中設置的/etc/systemd/system/docker.service.d/,在本實驗中應該是 ETCD_ENDPOINTS=http://192.168.7.222:2379

2.由於通過calicoctl node run啟動服務時,會自動下載鏡像 quay.io/calico/node:latest,tag是latest默認的,所以我們可以提前下載好相關的鏡像,使用 docker pull quay.io/calico/node:v2.6.2

3.由於docker node run 服務是寫好了的代碼進行啟動的,但是我們也可以自己去手動運行容器啟動,自己手動啟動的時候注意以上兩點即可

 docker run --net=host --privileged --name=calico-node -d --restart=always -e NODENAME=docker2 -e CALICO_NETWORKING_BACKEND=bird -e CALICO_LIBNETWORK_ENABLED=true  -e ETCD_ENDPOINTS=http://192.168.7.222:2379  -v /var/log/calico:/var/log/calico  -v /var/run/calico:/var/run/calico  -v /lib/modules:/lib/modules -v /run:/run -v /run/docker/plugins:/run/docker/plugins -v /var/run/docker.sock:/var/run/docker.sock quay.io/calico/node:v2.6.2

這是官方文檔的方式,在啟動服務的時候指定鏡像

啟動calico服務一步搞定的辦法是:ETCD_ENDPOINTS=http://172.17.8.101:2379 calicoctl node run --node-image=quay.io/calico/node:v2.6.2

指定自己的etcd的endpoints,指定鏡像的tag

 

查看calico狀態:

calicoctl node status

官網安裝calico服務地址(centos)https://docs.projectcalico.org/v2.6/getting-started/docker/installation/vagrant-coreos/

 

 

2.創建calico網絡

docker network create --driver calico --ipam-driver calico-ipam calico-net1

--driver calico:網絡使用calico驅動

--ipam-driver calico-ipam:指定使用calico的IPAM驅動管理IP

calico是global網絡,etcd會將calico-net1同步到所有主機

 

calico網絡結構:

在docker2上運行容器:

docker run -itd --name calico1 --network=calico-net1 busybox

查看calico1的網絡配置

calico0shi calico interface 分配的IP為192.168.100.64/32.calico0對應docker2上6的編號的interface

docker2將作為router負責轉發目的的地址為calico1的數據包,所有發送到calico1的數據都會給 calie9fa9faf0fa,因為 calie9fa9faf0fa與cali0是一對veth pair,calico1能收到數據

 

docker2的網絡結構如上盜圖:

 

下面我們來看一下docker1上的網絡結構

由於calico是global網絡,所以我們不需要啟動calico服務,也可以看到我們建立的calico網絡:calico-net1

啟動calico服務后,在docker1中運行容器:

 

使用與docker2上相同的網段calico-net1后獲得的IP為192.168.72.129/32

 

在docker1上新建容器后可以看到docker1上新添加了2條路由:

1.目的地址為dockwe2上得容器,網關是:192.168.7.226

2.目的地址為 calico-node容器的路由

下面我們來看一下docker1與docker2的網絡是否能夠ping通

注:如果啟動calico node run 服務時沒有任何輸出的結果,或者使用caloci網絡運行的容器無法和其他host上的容器ping通,可能是由於host上的calicoctl的安裝包沒有下載好,建議重新下載或者是在其他host上重新拷貝一份

 

現在docker1與docker2上的容器之間的通信如上圖:盜圖

 

1.根據docker2上的calico1的容器的路由表,將數據包從cali0發出

2.數據經過veth pair到達docker2,查看路由表,數據根據ens160發給daoker1(192.168.7.235)上

3.docker2收到數據后,根據路由表發送給 cali5224fe3869b,通過veth pair cali0發送到calicao2中

 

 

接下來我們看不同calico網絡之間的連通性

1.創建calico-net2

 

2.運行容器calico3使用calico-net2網絡:docker run -itd --name calico3 --network calico-net2 busybox

3.

calico為calico3容器分配了192.168。72.130/32網絡,驗證相同的host上的容器之間是否能ping通

 

 雖然calico2和calico3在同一個host上,但是由於他們使用的是不同的calico網絡,也是不能通的

calico默認的policy規則是:容器只能與同一個calico網絡中的容器通信

 

calico的每個網絡都有一個同名的profile,profile中定義了該網絡的policy,我們具體看一下calico-net1的profile:

首先我們要編輯一個文件:/etc/calico/calicoctl.cfg

1.創建目錄mkdir /etc/calico

2.vim /etc/calico/calicoctl.cfg

apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
  datastoreType: "etcdv2"
  etcdEndpoints: "http://etcd1:2379,http://etcd2:2379"

具體參考;https://docs.projectcalico.org/v2.6/reference/calicoctl/setup/etcdv2,

如果不編輯/etc/calico/calicoctl.cfg這個文件的話,會報一下錯誤:Failed to get resources: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:2379: getsockopt: connection refused

3.查看我們的calico-net1的profile

calico get  profile calico-net1 -o yaml

1.命名為calico-net1

2.為profile添加一個tag calico-net1,這個tag默認和網絡名一致,但是是可以任意設置,這個tag和上面的name沒有一點關系,這個tag后面會用到

3.egress:對容器個發出的數據包進行限制,當前沒有任何限制

4.ingress:對進入容器的數據包進行限制,當前是接收來自tag calico-net1的容器,其實就是接收本網段的數據包

 

calicoctl:管理資源,資源通過yaml和json格式來定義,通過calicoctl create或者apply方式來創建或應用,通過calicoctl get來查看

calicoctl支持的資源類型有:bgpPeer, hostEndpoint, policy, ipPool, profile, workloadEndpoint等

制定policy

calico能夠讓用戶定義靈活的policy規則,精細化控制容器的流量

試驗:創建一個新的calico網絡calico-web並部署一個httpd容器

定義calico-web中的容器允許被calico-net2中的容器訪問

web2容器的IP是192.168.72.131

現在還無法訪問192.168.72.131的80端口

創建policy文件web.yml

創建好后,使用命令:calicoctl create -f web.yuml使用這個資源

 

 

 

創建calico的IP池

首先查看IP pool:calicoctl get ippool

創建ippoll首先創建一個資源文件

vim pool.yaml

運行命令進行創建:calicoctl create -f ippool.yaml

我們在進行查看:calicoctl get ippool

有我們自定義的10.20.0.0/24的網段

驗證連通性:

創建一個subnet為10.20.0.0/24的網絡,通過--subnet=10.20.0.0/24來指定subnet

運行容器個,查看他的IP

使用calico-sub運行的容器的IP是10.20.0.129,驗證同一host上的容器是否能通

 

另一個容器的IP是192.168.72.139

不能ping通

 

不同host上的相同subnet的容器是可以ping通的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM