虛擬化運維--容器網(wǎng)絡(luò)--Calico(十二)

一、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ò)方式:

  1. 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
  2. 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

六、安裝配置

  1. 安裝etcd
[root@master ~]# yum install etcd -y
[root@node1 ~]# yum install etcd -y
[root@node2 ~]# yum install etcd -y

  1. 配置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

  1. 安裝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

  1. 配置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

  1. 設(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

  1. 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)互相通信。

  1. 安裝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

  1. 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  

  1. 創(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

  1. 創(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地址。

  1. 查看當前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()  

  1. 創(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”

  1. 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%)    |
+----------+----------------+-----------+------------+--------------+

  1. 工作負載間通信配置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

  1. 跨子網(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

  1. 所有工作負載間通信配置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

  1. 容器與宿主機通信
[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

  1. 容器與物理主機通信
# 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

  1. 容器與容器通信
    master主機容器:

node1主機容器:


常見問題

  1. Loaded: loaded (/usr/lib/systemd/system/calico-node.service; bad; vendor preset: disabled)
    重啟Docker。
[root@master ~]# systemctl restart docker

  1. calicoctl 發(fā)現(xiàn)不了節(jié)點 的解決方法 No IPv4 peers found.
    原因:
    其它節(jié)點服務(wù)沒有啟動。
    IP地址錯誤。
    一定要使用:
    quay.io/calico/node:v2.6.10
    而不要使用:
    calico/node:v3.10.0

  2. 卸載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  --  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容