一.Calico介紹
Calico是一種容器之間互通的網路方案,在虛擬化平臺中,比如OpenStack、Docker等都需要實現workloads之間互連,但同時也需要對容器做隔離控制,就像在Internet中的服務僅開放80埠、公有云的多租戶一樣,提供隔離和管控機制。而在多數的虛擬化平臺實現中,通常都使用二層隔離技術來實現容器的網路,這些二層技術有一些弊端,比如需要依賴VLAN、Bridge和隧道技術。其中Bridge帶來了複雜性,Vlan隔離和Tunnel隧道則消耗等多的資源並對物理環境有要求。隨著網路規模的增大,整體會變得更加複雜。我們嘗試把Host當做Internet中的路由器,使用BGP同步路由,並使用Iptables來做安全訪問策略,最終設計出了Calico方案。
設計思想:Calico不使用隧道或者NAT來實現轉發,而是巧妙的把所有二三層流量轉換成三層流量,並透過host上路由配置完成跨host轉發。
二.Calico優勢
- 更優的資源利用
二層網路通訊需要依賴廣播訊息機制,廣播訊息的開銷與host的數量呈指數級增長,Calico使用的三層路由方法,則完全抑制了二層廣播,減少了資源開銷。此外,二層網路使用Vlan隔離技術,天生有4096個規格限制,即便可以使用Vxlan解決,但Vxlan又帶來了隧道開銷的問題。Calico不使用vlan或者vxlan技術,使資源利用率更高。
- 可擴充套件性
Calico使用與Internet類似的方案,Internet的網路比任何資料中心都大,Calico同樣天然具有擴充套件性。
- 簡單更容易除錯
由於沒有隧道,意味著workloads之間路徑更短,配置更少,在host之間更容易進行debug除錯。
- 更少的依賴
Calico僅依賴三層路由可達
- 可適配性
Calico較少的依賴性使它能適配所有的VM、Container、白盒或者混合環境場景。
三、環境介紹:
1、作業系統:CentOS 7
2、主機結點:node1(192.168.223.131) node2(192.168.223.130)
3、軟體版本:calicoctl(version v1.6.1) etcdctl(version: 3.3.11) docker(version:20.10.21-ce)
[root@node2 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
修改兩個節點的主機名 [root@node1 ~]# hostnamectl --static set-hostname node1 [root@node1 ~]# echo "node1" > /etc/hostname [root@node2 ~]# hostnamectl --static set-hostname node2 [root@node2 ~]# echo "node2" > /etc/hostname
關閉兩臺主機的防火牆。若開啟iptables防火牆,則需要開啟2380埠通訊。 [root@node1 ~]# systemctl disable firewalld.service [root@node1 ~]# systemctl stop firewalld.service [root@node1 ~]# iptables -F [root@node1 ~]# firewall-cmd --state not running
在兩臺機器上都要設定hosts,均執行如下命令: [root@node1 ~]# vim /etc/hosts 192.168.223.131 node1 192.168.223.130 node2
兩臺集機器上的ip轉發功能開啟 [root@node1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@node1 ~]# vim /etc/sysctl.conf ...... net.ipv4.conf.all.rp_filter=1 net.ipv4.ip_forward=1 [root@node1 ~]# sysctl -p
四、配置ETCD叢集
1、兩臺結點安裝Etcd軟體包 [root@node1 ~]# yum install etcd -y 2、兩臺結點配置ETCD叢集模式 [root@node1 ~]# vim /etc/etcd/etcd.conf ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.223.131:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.223.131:2379"
根據不同主機進行相應修改,分別為node1 node2 ETCD_NAME="node1" 根據不同主機進行相應修改,分別為192.168.223.131\192.168.223.130
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.223.131:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.223.131:2379"
ETCD_INITIAL_CLUSTER="node2=http://192.168.223.130:2380,node1=http://192.168.223.131:2380"
3、啟用Etcd服務,並測試是叢集是否配置正確 [root@node1 ~]# systemctl start etcd [root@node1 ~]# export ETCDCTL_API=2 #根據節點設定數量 [root@node1 ~]# etcdctl member list
afc1b952a7b88713: name=node1 peerURLs=http://192.168.223.131:2380 clientURLs=http://192.168.223.1 31:2379 isLeader=true
fd636eb41152ae48: name=node2 peerURLs=http://192.168.223.130:2380 clientURLs=http://192.168.223.1 30:2379 isLeader=false
- 錯誤處理:Job for etcd.service failed because the control process exited with error code. See "systemctl status etcd.service" and "journalctl -xe" for details.
cd /var/lib/etcd/default.etcd 刪除這個目錄下所有檔案,如有重要資料請謹慎操作。
- 錯誤處理:etcdctl member list
Error: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:4001: connect: connection refused ; error #1: dial tcp 127.0.0.1:2379: connect: connection refused
error #0: dial tcp 127.0.0.1:4001: connect: connection refused error #1: dial tcp 127.0.0.1:2379: connect: connection refused
解決:vim /etc/etcd/etcd.conf 第六行結尾加上 ,http://127.0.0.1:2379
systemctl restart etcd 重啟解決
- 錯誤處理:publish error: etcdserver: request timed out
解決:所有節點同時啟動
五、 安裝Docker,配置使用叢集儲存
1、安裝docker
2、配置Docker守護程式使用有群集儲存 [root@node1 ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://7i5u59ls.mirror.aliyuncs.com"], "cluster-store": "etcd://192.168.223.131:2379" }
3、重啟Docker程式,並檢查配置是否正確 [root@node1 ~]# systemctl restart docker [root@node1 ~]# docker info | grep "Cluster Store" Cluster Store: etcd://192.168.223.131:2379
六、配置calico基於sysinit方式啟動
1、兩臺主機分別新增calico-node配置檔案 [root@node1 calico]# vim /etc/calico/calico.env
ETCD_ENDPOINTS="http://192.168.223.131:2379,http://192.168.223.130:2379"
ETCD_CA_FILE=""
ETCD_CERT_FILE=""
ETCD_KEY_FILE=""
CALICO_NODENAME="node1"
CALICO_NO_DEFAULT_POOLS=""
CALICO_IP="192.168.223.131"
CALICO_IP6=""
CALICO_AS=""
CALICO_LIBNETWORK_ENABLED=true
CALICO_NETWORKING_BACKEND=bird
2、兩臺主機分別新增calico-node sysinit配置檔案 [root@node1 calico]# vim /etc/systemd/system/calico-node.service
[Unit]
Description=calico-node
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=/etc/calico/calico.env
ExecStartPre=-/usr/bin/docker rm -f calico-node
ExecStart=/usr/bin/docker run --net=host --privileged \
--name=calico-node \
-e NODENAME=${CALICO_NODENAME} \
-e IP=${CALICO_IP} \
-e IP6=${CALICO_IP6} \
-e CALICO_NETWORKING_BACKEND=${CALICO_NETWORKING_BACKEND} \
-e AS=${CALICO_AS} \
-e NO_DEFAULT_POOLS=${CALICO_NO_DEFAULT_POOLS} \
-e CALICO_LIBNETWORK_ENABLED=${CALICO_LIBNETWORK_ENABLED} \
-e ETCD_ENDPOINTS=${ETCD_ENDPOINTS} \
-e ETCD_CA_CERT_FILE=${ETCD_CA_CERT_FILE} \
-e ETCD_CERT_FILE=${ETCD_CERT_FILE} \
-e ETCD_KEY_FILE=${ETCD_KEY_FILE} \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/log/calico:/var/log/calico \
-v /run/docker/plugins:/run/docker/plugins \
-v /lib/modules:/lib/modules \
-v /var/run/calico:/var/run/calico \
calico/node:v2.6.1
ExecStop=-/usr/bin/docker stop calico-node
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
3、兩臺主機分別啟動calico-node服務 [root@node1 calico]# systemctl daemon-reload [root@node1 calico]# systemctl start calico-node [root@node1 calico]# tail -f /var/log/messages ... Mar 11 12:23:46 node1 docker: Starting libnetwork service Mar 11 12:23:46 node1 docker: Calico node started successfully
4、下載calicoctl二進位制檔案,並新增執行許可權 [root@node1 calico]# wget -O /usr/local/bin/calicoctl https://github.com/projectcalico/calicoctl/releases/download/v1.6.1/calicoctl [root@node1 calico]# chmod +x /usr/local/bin/calicoctl
[root@node1 system]# calicoctl node status
Calico process is running.
IPv4 BGP status
+-----------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+-----------------+-------------------+-------+----------+-------------+
| 192.168.223.131 | node-to-node mesh | up | 10:29:48 | Established |
+-----------------+-------------------+-------+----------+-------------+
IPv6 BGP status
No IPv6 peers found.
[root@node1 calico]# calicoctl get node NAME node1 node2 node3
七、測試calico網路
1、建立網路 [root@node1 ~]# docker network create --driver calico --ipam-driver calico-ipam net1
#在任意一臺主機,都可以看到新增的網路外掛 [root@node1 ~]# docker network ls
2、在node1 node2 node3分別建立一個容器,檢視IP地址 [root@node1 ~]# docker run --net net1 --name workload-A -tid busybox [root@node1 ~]# docker exec -it workload-A ip addr
4: cali0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff
inet 192.168.166.128/32 scope global cali0
valid_lft forever preferred_lft forever
[root@node2 ~]# docker run --net net1 --name workload-B -tid busybox [root@node2 ~]# docker exec -it workload-B ip addr
4: cali0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff
inet 192.168.104.0/32 scope global cali0
valid_lft forever preferred_lft forever
3、在node1的容器中(workload-A),ping各結點的容器IP,測試網路是否正常
docker exec workload-A ping 192.168.104.0
PING 192.168.104.0 (192.168.104.0): 56 data bytes
64 bytes from 192.168.104.0: seq=0 ttl=62 time=0.435 ms
64 bytes from 192.168.104.0: seq=1 ttl=62 time=0.507 ms
4、檢視各結點的路由表 [root@node1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.223.2 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.104.0 192.168.223.130 255.255.255.192 UG 0 0 0 ens33
192.168.166.128 0.0.0.0 255.255.255.255 UH 0 0 0 calic5c95dfa8ad
192.168.166.128 0.0.0.0 255.255.255.192 U 0 0 0 *
192.168.223.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
參考:
Docker 使用Calico外掛配置網路 - 重啟一把梭 - 部落格園 (cnblogs.com)
【錯誤解決】新建etcd叢集報錯:publish error: etcdserver: request timed out_安安csdn的部落格-CSDN部落格