天天看點

Calico 的預設連通性 - 每天5分鐘玩轉 Docker 容器技術(69)

前面我們完成了 Calico 網絡的部署并運作了容器,今天将讨論 Calico 的連通性。

測試一下 bbox1 與 bbox2 的連通性:

Calico 的預設連通性 - 每天5分鐘玩轉 Docker 容器技術(69)

ping 成功,資料包流向如下圖所示。

Calico 的預設連通性 - 每天5分鐘玩轉 Docker 容器技術(69)

① 根據 bbox1 的路由表,将資料包從 <code>cal0</code> 發出。

Calico 的預設連通性 - 每天5分鐘玩轉 Docker 容器技術(69)

② 資料經過 veth pair 到達 host1,檢視路由表,資料由 <code>enp0s8</code> 發給 host2(192.168.56.105)。

192.168.183.64/26 via 192.168.56.105 dev enp0s8  proto bird

③ host2 收到資料包,根據路由表發送給 <code>calic8bf9e68397</code>,進而通過 veth pair <code>cali0</code> 到達 bbox2。

192.168.183.65 dev calic8bf9e68397  scope link

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

建立 cal_net2。

docker network create --driver calico --ipam-driver calico-ipam cal_net2

在 host1 中運作容器 bbox3,連接配接到 cal_net2:

docker container run --net cal_net2 --name bbox3 -tid busybox

calico 為 bbox3 配置設定了 IP <code>192.168.119.5</code>。

Calico 的預設連通性 - 每天5分鐘玩轉 Docker 容器技術(69)

驗證 bbox1 與 bbox3 的連通性。

Calico 的預設連通性 - 每天5分鐘玩轉 Docker 容器技術(69)

雖然 bbox1 和 bbox3 都位于 host1,而且都在一個 subnet 192.168.119.0/26,但它們屬于不同的 calico 網絡,預設不能通行。

calico 預設的 policy 規則是:容器隻能與同一個 calico 網絡中的容器通信。

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

calicoctl get profile cal_net1 -o yaml

Calico 的預設連通性 - 每天5分鐘玩轉 Docker 容器技術(69)

① 命名為 <code>cal_net1</code>,這就是 calico 網絡 <code>cal_net1</code> 的 profile。

② 為 profile 添加一個 tag <code>cal_net1</code>。注意,這個 tag 雖然也叫 <code>cal_net1</code>,其實可以随便設定,這跟上面的 <code>name: cal_net1</code> 沒有任何關系。此 tag 後面會用到。

③ <code>egress</code> 對從容器發出的資料包進行控制,目前沒有任何限制。

④ <code>ingress</code> 對進入容器的資料包進行限制,目前設定是接收來自 tag <code>cal_net1</code> 的容器,根據第 ① 步設定我們知道,實際上就是隻接收本網絡的資料包,這也進一步解釋了前面的實驗結果。

既然這是預設 policy,那就有方法定制 policy,這也是 calico 較其他網絡方案最大的特性。下一節就我們讨論如何定制 calico policy。

Calico 的預設連通性 - 每天5分鐘玩轉 Docker 容器技術(69)