一、Calico簡介
??Calico為容器和虛擬機工作負載提供一個安全的網(wǎng)絡(luò)連接。Calico 是一種容器之間互通的網(wǎng)絡(luò)方案。在虛擬化平臺中,比如 OpenStack、Docker 等都需要實現(xiàn) workloads 之間互連,但同時也需要對容器做隔離控制,就像在 Internet 中的服務(wù)僅開放80端口、公有云的多租戶一樣,提供隔離和管控機制。而在多數(shù)的虛擬化平臺實現(xiàn)中,通常都使用二層隔離技術(shù)來實現(xiàn)容器的網(wǎng)絡(luò),這些二層的技術(shù)有一些弊端,比如需要依賴 VLAN、bridge 和隧道等技術(shù),其中 bridge 帶來了復(fù)雜性,vlan 隔離和 tunnel 隧道則消耗更多的資源并對物理環(huán)境有要求,隨著網(wǎng)絡(luò)規(guī)模的增大,整體會變得越加復(fù)雜。我們嘗試把 Host 當作 Internet 中的路由器,同樣使用 BGP 同步路由,并使用 iptables 來做安全訪問策略,最終設(shè)計出了 Calico 方案。
適用場景:k8s環(huán)境中的pod之間需要隔離。
設(shè)計思想:Calico 不使用隧道或 NAT 來實現(xiàn)轉(zhuǎn)發(fā),而是巧妙的把所有二三層流量轉(zhuǎn)換成三層流量,并通過 host 上路由配置完成跨 Host 轉(zhuǎn)發(fā)。
官網(wǎng):https://www.projectcalico.org/
文檔地址:https://docs.projectcalico.org/v3.10/getting-started/
二、設(shè)計優(yōu)勢:
1.更優(yōu)的資源利用
??二層網(wǎng)絡(luò)通訊需要依賴廣播消息機制,廣播消息的開銷與 host 的數(shù)量呈指數(shù)級增長,Calico 使用的三層路由方法,則完全抑制了二層廣播,減少了資源開銷。
??另外,二層網(wǎng)絡(luò)使用 VLAN 隔離技術(shù),天生有 4096 個規(guī)格限制,即便可以使用 vxlan 解決,但 vxlan 又帶來了隧道開銷的新問題。而 Calico 不使用 vlan 或 vxlan 技術(shù),使資源利用率更高。
2.可擴展性
??Calico 使用與 Internet 類似的方案,Internet 的網(wǎng)絡(luò)比任何數(shù)據(jù)中心都大,Calico 同樣天然具有可擴展性。
3.簡單而更容易 debug
??因為沒有隧道,意味著 workloads 之間路徑更短更簡單,配置更少,在 host 上更容易進行 debug 調(diào)試。
4.更少的依賴
??Calico 僅依賴三層路由可達。
5.可適配性
??Calico 較少的依賴性使它能適配所有 VM、Container、白盒或者混合環(huán)境場景。
Calico 架構(gòu):
??Calico 是一個三層的數(shù)據(jù)中心網(wǎng)絡(luò)方案,而且方便集成 OpenStack 這種 IaaS 云架構(gòu),能夠提供高效可控的 VM、容器、裸機之間的通信。
三、Calico網(wǎng)絡(luò)方式:
-
IPIP
??從字面來理解,就是把一個IP數(shù)據(jù)包又套在一個IP包里,即把 IP 層封裝到 IP 層的一個 tunnel,看起來似乎是浪費,實則不然。它的作用其實基本上就相當于一個基于IP層的網(wǎng)橋!一般來說,普通的網(wǎng)橋是基于mac層的,根本不需 IP,而這個 ipip 則是通過兩端的路由做一個 tunnel,把兩個本來不通的網(wǎng)絡(luò)通過點對點連接起來。ipip 的源代碼在內(nèi)核 net/ipv4/ipip.c 中可以找到。
??IPIP是一種將各Node的路由之間做一個tunnel,再把兩個網(wǎng)絡(luò)連接起來的模式。啟用IPIP模式時,Calico將在各Node上創(chuàng)建一個名為"tunl0"的虛擬網(wǎng)絡(luò)接口。
IPIP -
BGP
??邊界網(wǎng)關(guān)協(xié)議(Border Gateway Protocol, BGP)是互聯(lián)網(wǎng)上一個核心的去中心化自治路由協(xié)議。它通過維護IP路由表或‘前綴’表來實現(xiàn)自治系統(tǒng)(AS)之間的可達性,屬于矢量路由協(xié)議。
??BGP不使用傳統(tǒng)的內(nèi)部網(wǎng)關(guān)協(xié)議(IGP)的指標,而使用基于路徑、網(wǎng)絡(luò)策略或規(guī)則集來決定路由。因此,它更適合被稱為矢量性協(xié)議,而不是路由協(xié)議。BGP,通俗的講就是講接入到機房的多條線路(如電信、聯(lián)通、移動等)融合為一體,實現(xiàn)多線單IP。
BGP
Calico BGP模式在小規(guī)模集群中可以直接互聯(lián),在大規(guī)模集群中可以通過額外的BGP route reflector來完成。
BGP 機房的優(yōu)點:
??服務(wù)器只需要設(shè)置一個IP地址,最佳訪問路由是由網(wǎng)絡(luò)上的骨干路由器根據(jù)路由跳數(shù)與其它技術(shù)指標來確定的,不會占用服務(wù)器的任何系統(tǒng)。
??每個主機上都部署了calico/node作為虛擬路由器,并且可以通過calico將宿主機組織成任意的拓撲集群。當集群中的容器需要與外界通信時,就可以通過BGP協(xié)議將網(wǎng)關(guān)物理路由器加入到集群中,使外界可以直接訪問容器IP,而不需要做任何NAT之類的復(fù)雜操作。
四、Calico網(wǎng)絡(luò)模型主要工作組件
1.Felix:運行在每一臺 Host 的 agent 進程,主要負責網(wǎng)絡(luò)接口管理和監(jiān)聽、路由、ARP 管理、ACL 管理和同步、狀態(tài)上報等。
2.etcd:分布式鍵值存儲,主要負責網(wǎng)絡(luò)元數(shù)據(jù)一致性,確保Calico網(wǎng)絡(luò)狀態(tài)的準確性,可以與kubernetes共用;
3.BGP Client(BIRD):Calico 為每一臺 Host 部署一個 BGP Client,使用 BIRD 實現(xiàn),BIRD 是一個單獨的持續(xù)發(fā)展的項目,實現(xiàn)了眾多動態(tài)路由協(xié)議比如 BGP、OSPF、RIP 等。在 Calico 的角色是監(jiān)聽 Host 上由 Felix 注入的路由信息,然后通過 BGP 協(xié)議廣播告訴剩余 Host 節(jié)點,從而實現(xiàn)網(wǎng)絡(luò)互通。
4.BGP Route Reflector:在大型網(wǎng)絡(luò)規(guī)模中,如果僅僅使用 BGP client 形成 mesh 全網(wǎng)互聯(lián)的方案就會導(dǎo)致規(guī)模限制,因為所有節(jié)點之間倆倆互聯(lián),需要 N^2 個連接,為了解決這個規(guī)模問題,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 僅與特定 RR 節(jié)點互聯(lián)并做路由同步,從而大大減少連接數(shù)。
五、服務(wù)器架構(gòu)
| 名稱 | IP | 服務(wù) |
|---|---|---|
| master | 192.168.247.130 | etcd、calicoctl、docker、calico |
| node1 | 192.168.247.131 | calico、docker |
| node2 | 192.168.247.132 | calico、docker |
六、安裝配置
- 安裝etcd
[root@master ~]# yum install etcd -y
[root@node1 ~]# yum install etcd -y
[root@node2 ~]# yum install etcd -y
- 配置etcd集群
master:
# 配置etcd
[root@master ~]# vi /etc/etcd/etcd.conf
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="master"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.247.130:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.247.130:2379"
ETCD_INITIAL_CLUSTER="master=http://192.168.247.130:2380,node1=http://192.168.247.131:2380,node2=http://192.168.247.132:2380"
# docker配置
[root@master ~]# vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.247.130:2379 -H tcp://0.0.0.0:7654
# 啟動
[root@master ~]# systemctl start etcd
# 開機啟動
[root@master ~]# systemctl enable etcd
node1:
[root@node1 ~]# vi /etc/etcd/etcd.conf
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="node1"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.247.131:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.247.131:2379"
ETCD_INITIAL_CLUSTER="master=http://192.168.247.130:2380,node1=http://192.168.247.131:2380,node2=http://192.168.247.132:2380"
# docker配置
[root@master ~]# vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.247.131:2379 -H tcp://0.0.0.0:7654
# 啟動
[root@node1 ~]# systemctl start etcd
# 開機啟動
[root@node1 ~]# systemctl enable etcd
node2:
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="node2"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.247.132:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.247.132:2379"
ETCD_INITIAL_CLUSTER="master=http://192.168.247.130:2380,node1=http://192.168.247.131:2380,node2=http://192.168.247.132:2380"
# docker配置
[root@master ~]# vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.247.132:2379 -H tcp://0.0.0.0:7654
# 啟動
[root@node2 ~]# systemctl start etcd
# 開機啟動
[root@node2 ~]# systemctl enable etcd
進程查看:
[root@master ~]# ps -ef|grep etcd
root 8013 1 0 01:51 ? 00:00:01 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.247.130:2379 -H tcp://0.0.0.0:7654
etcd 8301 1 2 02:05 ? 00:00:22 /usr/bin/etcd --name=master --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:2379
# 查看集群成員(在三個節(jié)點機任意一個上面查看都可以,因為做的是集群環(huán)境)
[root@master ~]# etcdctl member list
2ebf7f58629a910c: name=node1 peerURLs=http://192.168.247.131:2380 clientURLs=http://192.168.247.131:2379 isLeader=false
644b83595c2adc40: name=master peerURLs=http://192.168.247.130:2380 clientURLs=http://192.168.247.130:2379 isLeader=true
8caab246e8249dd1: name=node2 peerURLs=http://192.168.247.132:2380 clientURLs=http://192.168.247.132:2379 isLeader=false
# 查看集群狀態(tài)
[root@master ~]# etcdctl cluster-health
member 2ebf7f58629a910c is healthy: got healthy result from http://192.168.247.131:2379
member 644b83595c2adc40 is healthy: got healthy result from http://192.168.247.130:2379
member 8caab246e8249dd1 is healthy: got healthy result from http://192.168.247.132:2379
cluster is healthy
- 安裝calicoctl(master\node1\node2)工具
下載地址:https://github.com/projectcalico/calicoctl/releases
所有節(jié)點:
[root@master ~]# curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.10.0/calicoctl
# 添加權(quán)限
[root@master ~]# chmod +x calicoctl
# 移動文件
[root@master ~]# mv calicoctl /usr/local/bin/
# 查看版本
[root@master ~]# calicoctl version
Client Version: v3.10.0
Git commit: 7968b525
no etcd endpoints specified
- 配置calicoctl
# 運行calicoctl時,默認調(diào)用/etc/calico/calicoctl.cfg文件,其中指定了datastoreType與etcdEndpoints等重要參數(shù);
# 或在運行calicoctl時,通--config參數(shù)指定文件
[root@master ~]# cat >/etc/calico/calicoctl.cfg <<EOF
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
etcdEndpoints: http://192.168.247.130:2379,https://192.168.247.131:2379,http://192.168.247.132:2379
EOF
- 設(shè)置docker連接etcd
# 設(shè)置docker連接etcd
# 修改docker服務(wù)的啟動參數(shù),即”ExecStart=/usr/bin/dockerd”;
# -H(option): 指定api端口;
# --cluster-store:連接etcd,docker支持跨主機的多節(jié)點網(wǎng)絡(luò)時,需要設(shè)置此參數(shù),否則網(wǎng)絡(luò)元數(shù)據(jù)無法協(xié)同
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.247.130:2379,192.168.247.131:2379,192.168.247.132:2379 -H tcp://0.0.0.0:7654
[root@master ~]# systemctl daemon-reload && systemctl restart docker
- ip轉(zhuǎn)發(fā)功能打開(所有主機)
[root@node1 ~]# vi /etc/sysctl.conf
# 添加內(nèi)容
net.ipv4.conf.all.rp_filter = 1
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p
net.ipv4.conf.all.rp_filter = 1
net.ipv4.ip_forward = 1
七、安裝Calico
??Calico服務(wù)以container的方式運行,container內(nèi)包含bird路由管理、Felix協(xié)議等,并采用host網(wǎng)絡(luò)與外部通信。
??所有workload節(jié)點啟用Calico服務(wù),做為calico節(jié)點(通過etcd)互相通信。
- 安裝calico
三個節(jié)點最好都要先下載calico容器鏡像:
[root@master ~]# docker pull calico/node:v3.10.0
v3.10.0: Pulling from calico/node
8d691f585fa8: Pull complete
8ef7b0583da7: Pull complete
8acefbc23005: Pull complete
c2bfb6bc5ad2: Pull complete
6dfaaec51364: Pull complete
070827ff8bdc: Pull complete
5e5d67e8363a: Pull complete
e9a69d06f68c: Pull complete
a298b2035bc8: Pull complete
dd6b1978d57b: Pull complete
312392dfc56c: Pull complete
Digest: sha256:722f4926940cbf01695413beb0f00b11e85a5ee7e2fa3b8ab3c11c2e1aaa07be
Status: Downloaded newer image for calico/node:v3.10.0
docker.io/calico/node:v3.10.0
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
calico/node v3.10.0 4365ab87e7e0 2 weeks ago 192MB
- Calico node會以container方式運行
calico節(jié)點管理
該命令下又包含四個子命令:run、status、diags和checksystem。
其中:
run命令可用于在該服務(wù)器上運行一個calico實例;
status命令可檢查整個calico網(wǎng)絡(luò)的狀態(tài);
diags用于手機calico節(jié)點的診斷信息;
checksystem命令用于檢查改服務(wù)器是否可以運行一個calico實例。
# Calico node會以container方式運行
[root@master ~]# calicoctl node run --node-image=calico/node:v3.10.0
[root@node1 ~]# calicoctl node run --node-image=calico/node:v3.10.0
[root@node2 ~]# calicoctl node run --node-image=calico/node:v3.10.0
# 查看calico狀態(tài)
[root@master ~]# calicoctl node status
Calico process is running.
IPv4 BGP status
+-----------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+-----------------+-------------------+-------+----------+-------------+
| 192.168.247.131 | node-to-node mesh | up | 19:23:56 | Established |
| 192.168.247.132 | node-to-node mesh | up | 19:24:00 | Established |
+-----------------+-------------------+-------+----------+-------------+
# 查看節(jié)點
[root@master ~]# calicoctl get nodes
NAME
master
node1
node2
- 創(chuàng)建calico的環(huán)境變量
生命周期是由linux系統(tǒng)的systemd來進行管理,以容器的形式運行:
# 添加配置(所有節(jié)點)
[root@master ~]# vi /etc/calico/calico.env
# 內(nèi)容
ETCD_ENDPOINTS=http://192.168.247.130:2379,http://192.168.247.131:2379,http://192.168.247.132:2379
# 啟用ssl/tls時,認證相關(guān)文件位置
ETCD_CA_FILE=""
ETCD_CERT_FILE=""
ETCD_KEY_FILE=""
# 留空時默認采用主機hostname作為辨識,所以留空時請確保主機名唯一
CALICO_NODENAME=""
CALICO_NO_DEFAULT_POOLS=""
# 設(shè)置路由下一跳,留空時從主機當前端口中自動選擇,有參數(shù)”autodetect”強制每次啟動時間自動檢測
CALICO_IP=""
CALICO_IP6=""
# as number,默認從全局默認設(shè)置繼承
CALICO_AS=""
# 啟用libnetwork drive
CALICO_LIBNETWORK_ENABLED=true
# 路由協(xié)議,可選”bird”,“gobgp”,“none”,默認即”bird”, “gobgp”無ipip模式
CALICO_NETWORKING_BACKEND=bird
注意:
CALICO_NODENAME 如果不設(shè)置的話,默認為主機名,要保證主機名唯一
CALICO_NETWORKING_BACKEND:有效值如下:
bird(默認值)
gobgp(無ipip模式)
node
- 創(chuàng)建calico-node.service配置文件
# master 節(jié)點
[root@master ~]# vi /lib/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=master \
-e IP=192.168.247.130 \
-e CALICO_NETWORKING_BACKEND=${CALICO_NETWORKING_BACKEND} \
-e ETCD_ENDPOINTS=http://127.0.0.1:2379 \
-v /var/log/calico:/var/log/calico \
-v /run/docker/plugins:/run/docker/plugins \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /lib/modules:/lib/modules \
-v /var/run/calico:/var/run/calico \
quay.io/calico/node:v2.6.10
ExecStop=-/usr/bin/docker stop calico-node
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
# 啟動容器
[root@master ~]# systemctl start calico-node
[root@master ~]# systemctl status calico-node
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
658768ddb894 calico/node:v3.10.0 "start_runit" 6 minutes ago Up 6 minutes calico-node
# 需3個節(jié)點全部啟動
[root@master ~]# calicoctl get nodes --out=wide
NAME ASN IPV4 IPV6
master (64512) 192.168.247.130/32
node1 (64512) 192.168.247.131/32
node2 (64512) 192.168.247.132/32
# 查看節(jié)點狀態(tài)
# 任意節(jié)點可查看;
# 顯示鄰居節(jié)點地址,節(jié)點之間是”node-to-node mesh”狀態(tài)(區(qū)別于bgp rr)
[root@master ~]# calicoctl node status
Calico process is running.
IPv4 BGP status
+-----------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+-----------------+-------------------+-------+----------+-------------+
| 192.168.247.131 | node-to-node mesh | up | 14:13:52 | Established |
| 192.168.247.132 | node-to-node mesh | up | 14:16:35 | Established |
+-----------------+-------------------+-------+----------+-------------+
node1節(jié)點、與nod2節(jié)點配置:
-e NODENAME=node1 \
-e NODENAME=node2 \
其它與master相同。
八、Calico網(wǎng)絡(luò)
IP-in-IP和VXLAN僅支持IPv4地址。
- 查看當前ipPool
# 運行calico服務(wù)后,默認含1個192.168.0.0/16的ipv4地址池,1個64位的ipv6的地址池,后續(xù)網(wǎng)絡(luò)分配即地址池獲取;
# NAT:容器獲得的地址是否可nat出host;
# IPIP:ipip是在宿主機網(wǎng)絡(luò)不完全支持bgp時,一種妥協(xié)的overlay機制,在宿主機創(chuàng)建1個”tunl0”虛擬端口;設(shè)置為false時,路由即純bgp模式,理論上ipip模式的網(wǎng)絡(luò)傳輸性能低于純bgp模式;設(shè)置為true時,又分ipip always模式(純ipip模式)與ipip cross-subnet模式(ipip-bgp混合模式),后者指“同子網(wǎng)內(nèi)路由采用bgp,跨子網(wǎng)路由采用ipip”
[root@master ~]# calicoctl get ipPool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR
default-ipv4-ippool 192.168.0.0/16 true Never Never false all()
default-ipv6-ippool fd32:109b:5171::/48 false Never Never false all()
- 創(chuàng)建ipPool
# 在任意節(jié)點上定義都可以,ipPool屬于全局;
# calicov2與v3對資源的定義邏輯基本相同,但命令參數(shù)區(qū)別較大
[root@master ~]# vi new-pool-1.yaml
# 內(nèi)容
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: external-pool
spec:
cidr: 172.16.0.0/26
blockSize: 29
ipipMode: Always
natOutgoing: true
---
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: internal-pool
spec:
cidr: 192.169.0.0/24
blockSize: 29
ipipMode: Always
natOutgoing: true
# 下發(fā)ipPool資源
[root@master ~]# calicoctl create -f new-pool-1.yaml
Successfully created 2 'IPPool' resource(s)
# 查看ipPool
[root@master ~]# calicoctl get ipPool
NAME CIDR SELECTOR
default-ipv4-ippool 192.168.0.0/16 all()
default-ipv6-ippool fd32:109b:5171::/48 all()
external-pool 172.16.0.0/26 all()
internal-pool 192.169.0.0/24 all()
[root@master ~]# calicoctl get ipPool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR
default-ipv4-ippool 192.168.0.0/16 true Never Never false all()
default-ipv6-ippool fd32:109b:5171::/48 false Never Never false all()
external-pool 172.16.0.0/26 true Always Never false all()
internal-pool 192.169.0.0/24 true Always Never false all()
# 刪除默認ipPool(option)
[root@master ~]# calicoctl delete ipPool default-ipv6-ippool
Successfully deleted 1 'IPPool' resource(s)
# 資源下發(fā)后,各節(jié)點從ipPool獲得1個/26位的subnet網(wǎng)段;
# 同時注意前往其余節(jié)點的下一跳網(wǎng)口是“tunl0”,這里因為ipip設(shè)置為enable: true;
# 如果不啟用ipip模式,則不會新增”tunl0”網(wǎng)口,下一跳網(wǎng)口應(yīng)是“eth0”
[root@node1 ~]# ip route show
default via 192.168.247.2 dev ens33 proto static metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.247.0/24 dev ens33 proto kernel scope link src 192.168.247.131 metric 100
如果不啟用ipip模式,則不會新增”tunl0”網(wǎng)口,下一跳網(wǎng)口應(yīng)是“eth0”
- IPIP模式設(shè)置為crosssubnet
[root@master ~]# vi new-pool-1.yaml
內(nèi)容:
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-ipip-cross-subnet-1
spec:
cidr: 172.16.0.0/26
ipipMode: CrossSubnet
natOutgoing: true
# 資源下發(fā)
[root@master ~]# calicoctl create -f new-pool-1.yaml
Successfully created 1 'IPPool' resource(s)
# master 節(jié)點
[root@master ~]# ip route show
default via 192.168.247.2 dev ens33 proto dhcp metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.247.0/24 dev ens33 proto kernel scope link src 192.168.247.130 metric 100
# node1節(jié)點
[root@node1 ~]# ip route show
default via 192.168.247.2 dev ens33 proto static metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.247.0/24 dev ens33 proto kernel scope link src 192.168.247.131 metric 100
# 顯示Calico分配的IP地址的詳細信息
[root@master ~]# calicoctl ipam show
+----------+----------------+-----------+------------+--------------+
| GROUPING | CIDR | IPS TOTAL | IPS IN USE | IPS FREE |
+----------+----------------+-----------+------------+--------------+
| IP Pool | 192.168.0.0/16 | 65536 | 0 (0%) | 65536 (100%) |
| IP Pool | 172.16.0.0/26 | 64 | 0 (0%) | 64 (100%) |
+----------+----------------+-----------+------------+--------------+
- 工作負載間通信配置IP-in-IP
ipipMode設(shè)置為Always時,Calico使用IP-in-IP將來自啟用Calico的主機的所有流量路由到IP池中的所有Calico網(wǎng)絡(luò)容器和虛擬機。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-ipip-1
spec:
cidr: 192.168.0.0/16
ipipMode: Always
natOutgoing: true
- 跨子網(wǎng)通信配置VXLAN
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-vxlan-cross-subnet-1
spec:
cidr: 192.168.0.0/16
vxlanMode: CrossSubnet
natOutgoing: true
- 所有工作負載間通信配置vxlan
當vxlanmode設(shè)置為always時,calico使用vxlan將來自啟用calico的主機的所有流量路由到ip池中的所有calico網(wǎng)絡(luò)容器和vm。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-vxlan-1
spec:
cidr: 192.168.0.0/16
vxlanMode: Always
natOutgoing: true
如果只使用vxlan池,則不需要bgp網(wǎng)絡(luò)??梢越肂GP。
九、驗證容器之間的通信
節(jié)點主機名和ETCD_NAME以及NODENAME一定要保持相同。
# 查看各個節(jié)點上的路由情況
[root@master ~]# route -n
- 容器與宿主機通信
[root@master ~]# docker run -ti centos bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
[root@4eefcbc7e85e /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@4eefcbc7e85e /]# ping 192.168.247.130
PING 192.168.247.130 (192.168.247.130) 56(84) bytes of data.
64 bytes from 192.168.247.130: icmp_seq=1 ttl=64 time=0.185 ms
- 容器與物理主機通信
# master主機
[root@master ~]# docker run -ti centos bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
[root@4eefcbc7e85e /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 容器與物理主機通信-node1
[root@4eefcbc7e85e /]# ping 192.168.247.131
PING 192.168.247.131 (192.168.247.131) 56(84) bytes of data.
64 bytes from 192.168.247.131: icmp_seq=1 ttl=63 time=2.05 ms
- 容器與容器通信
master主機容器:
node1主機容器:
常見問題
- Loaded: loaded (/usr/lib/systemd/system/calico-node.service; bad; vendor preset: disabled)
重啟Docker。
[root@master ~]# systemctl restart docker
calicoctl 發(fā)現(xiàn)不了節(jié)點 的解決方法 No IPv4 peers found.
原因:
其它節(jié)點服務(wù)沒有啟動。
IP地址錯誤。
一定要使用:
quay.io/calico/node:v2.6.10
而不要使用:
calico/node:v3.10.0卸載tunl0
# 查看網(wǎng)絡(luò)設(shè)備信息
[root@master ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
ens33 ethernet connected ens33
docker0 bridge connected docker0
tunl0 iptunnel disconnected --
vxlan.calico vxlan disconnected --
# 列出模塊
[root@master ~]# lsmod
# 卸載模塊ipip
[root@master ~]# modprobe -r ipip
# 卸載模塊vxlan
[root@master ~]# modprobe -r vxlan
[root@master ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
ens33 ethernet connected ens33
docker0 bridge connected docker0
lo loopback unmanaged --

