docker(7、容器網絡5)Calico 網絡 單etcd 節點 Calico網絡結構 Calico 的默認連通性 定製 Calico 網絡 Policy 定製 Calico IP 池

Calico是一個純三層的協議,爲OpenStack虛機和Docker容器提供多主機間通信。Calico不使用重疊網絡比如flannel和libnetwork重疊網絡驅動,它是一個純三層的方法,使用虛擬路由代替虛擬交換,每一臺虛擬路由通過BGP協議傳播可達信息(路由)到剩餘數據中心。Calico還提供網絡安全規則的動態實施。使用Calico的簡單策略語言,您可以實現對容器,虛擬機工作負載和裸機主機端點之間通信的細粒度控制。
Calico在大規模生產方面經過驗證,可與Kubernetes,OpenShift,Docker,Mesos,DC / OS和OpenStack集成

calico3.0 開始不支持docker部署,使用k8s。 https://blog.51cto.com/ckl893/2334883最後安裝calico 最新不支持

Calico結構組成

Calico不使用重疊網絡比如flannel和libnetwork重疊網絡驅動,它是一個純三層的方法,使用虛擬路由代替虛擬交換,每一臺虛擬路由通過BGP協議傳播可達信息(路由)到剩餘數據中心;Calico在每一個計算節點利用Linux Kernel實現了一個高效的vRouter來負責數據轉發,而每個vRouter通過BGP協議負責把自己上運行的workload的路由信息像整個Calico網絡內傳播——小規模部署可以直接互聯,大規模下可通過指定的BGP route reflector來完成。

在這裏插入圖片描述

結合上面這張圖,我們來過一遍 Calico 的核心組件:

Felix: Calico agent,跑在每臺需要運行 workload 的節點上,主要負責配置路由及 ACLs 等信息來確保 endpoint 的連通狀態;

etcd: 分佈式鍵值存儲,主要負責網絡元數據一致性,確保 Calico 網絡狀態的準確性;

BGPClient(BIRD): 主要負責把 Felix 寫入 kernel 的路由信息分發到當前 Calico 網絡,確保 workload 間的通信的有效性;

BGP Route Reflector(BIRD): 大規模部署時使用,摒棄所有節點互聯的 mesh 模式,通過一個或者多個BGP Route Reflector來完成集中式的路由分發;

通過將整個互聯網的可擴展 IP 網絡原則壓縮到數據中心級別,Calico 在每一個計算節點利用Linux kernel實現了一個高效的vRouter來負責數據轉發而每個vRouter通過BGP
協議負責把自己上運行的 workload 的路由信息像整個 Calico 網絡內傳播 - 小規模部署可以直接互聯,大規模下可通過指定的BGP route reflector 來完成。這樣保證最終所有的 workload 之間的數據流量都是通過 IP 包的方式完成互聯的。


實驗環境描述
Calico 依賴 etcd 在不同主機間共享和交換信息,存儲 Calico 網絡狀態。我們將在 host 192.168.1.121上運行 etcd。
Calico 網絡中的每個主機都需要運行 Calico 組件,提供容器 interface 管理、動態路由、動態 ACL、報告狀態等功能。
實驗環境如下圖所示:

軟件版本:
calicoctl(version v1.6.5) etcdctl(etcdctl version: 3.3.11) docker(version:19.03.8)

1)機器環境(centos7系統)本環境單etcd的部署(可以etcd集羣部署)

1

2

3

192.168.1.121     部署etcd,docker                                  主機名:etcd   

192.168.1.122     部署calicoctl,docker                主機名:host1  

192.168.1.123               部署calicoctl,docker                主機名:host1

2)etcd(192.168.1.121)機器操作

 

設置主機名及綁定hosts
[root@etcd ~]# hostnamectl --static set-hostname  etcd
[root@etcd ~]# vim /etc/hosts
192.168.1.121    etcd
192.168.1.122    host1
192.168.1.123    host2  
關閉防火牆,如果開啓防火牆,則最好打開2379和4001端口
[root@etcd ~]# systemctl disable firewalld.service
[root@etcd ~]# systemctl stop firewalld.service  
安裝etcd
k8s運行依賴etcd,需要先部署etcd,下面採用yum方式安裝:
[root@etcd ~]# yum install etcd -y    
yum安裝的etcd默認配置文件在/etc/etcd/etcd.conf,編輯配置文件:
[root@etcd ~]# cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak

[root@etcd ~]# vim /etc/etcd/etcd.conf 
#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.121:2379"
......
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.121:2379"
......

啓動etcd服務

    [root@etcd ~]# systemctl start etcd && systemctl enable etcd

查看版本

[root@etcd ~]# etcdctl --v
etcdctl version: 3.3.11
API version: 2

修改 host1 和 host2 的 Docker daemon 配置文件
連接 etcd:–cluster-store=etcd://192.168.1.121:2379

[root@host1 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"cluster-store": "etcd://192.168.1.121:2379"
}
#注意如果是集羣的話後面就etcd1://192.168.1.121:2379,etcd12://192.168.1.122:2379,etcd3://192.168.1.123:2379

說明:第一行的registry-mirrors是配置docker鏡像加速以後自動添加的。
重啓 Docker daemon

systemctl daemon-reload && systemctl restart docker.service

查看配置是否正確

    [root@host1 ~]# docker info | grep "Cluster Store"
    Cluster Store: etcd://192.168.1.121:2379
    [root@host1 ~]# 

部署calicoctl
官方參考文檔:https://docs.projectcalico.org/v2.6/getting-started/docker/installation/manual
在host1和host2上下載calicoctl並運行calico容器。
下載calicoctl

[root@host1 ~]# wget -O /usr/local/bin/calicoctl https://github.com/projectcalico/calicoctl/releases/download/v1.6.5/calicoctl
[root@host1 ~]# chmod +x /usr/local/bin/calicoctl
[root@host1 ~]# /usr/local/bin/calicoctl --version
calicoctl version v1.6.5, build 614fcf12

創建calico容器
首先創建calico配置文件

[root@host1 ~]# mkdir /etc/calico/
[root@host1 ~]# vim /etc/calico/calicoctl.cfg
apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
  datastoreType: "etcdv2"
  etcdEndpoints: "http://etcd:2379"
#如果是集羣的話etcdEndpoints: "http://etcd1:2379,http://etcd3:2379,http://etcd3:2379"

分別在兩個節點上創建calico容器,執行後會自動下載calico鏡像並運行容器,下載鏡像可能較慢,建議配置鏡像加速,啓動過程如下:

[root@host1 ~]# ETCD_ENDPOINTS=http://192.168.1.121:2379  calicoctl node run --node-image=quay.io/calico/node:v2.6.12
Running command to load modules: modprobe -a xt_set ip6_tables
Enabling IPv4 forwarding
Enabling IPv6 forwarding
Increasing conntrack limit
Removing old calico-node container (if running).
Running the following command to start calico-node:

docker run --net=host --privileged --name=calico-node -d --restart=always -e NODENAME=host1 -e CALICO_NETWORKING_BACKEND=bird -e CALICO_LIBNETWORK_ENABLED=true -e ETCD_ENDPOINTS=http://etcd: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.12

Image may take a short time to download if it is not available locally.
chmod +x /usr/local/bin/calicoctlContainer started, checking progress logs.

2020-03-12 14:05:53.467 [INFO][8] startup.go 173: Early log level set to info
2020-03-12 14:05:53.468 [INFO][8] client.go 202: Loading config from environment
2020-03-12 14:05:53.468 [INFO][8] startup.go 83: Skipping datastore connection test
2020-03-12 14:05:53.515 [INFO][8] startup.go 259: Building new node resource Name="host1"
2020-03-12 14:05:53.515 [INFO][8] startup.go 273: Initialise BGP data
2020-03-12 14:05:53.516 [INFO][8] startup.go 467: Using autodetected IPv4 address on interface ens33: 192.168.1.122/24
2020-03-12 14:05:53.516 [INFO][8] startup.go 338: Node IPv4 changed, will check for conflicts
2020-03-12 14:05:53.586 [INFO][8] startup.go 530: No AS number configured on node resource, using global value
2020-03-12 14:05:53.591 [INFO][8] etcd.go 111: Ready flag is already set
2020-03-12 14:05:53.598 [INFO][8] client.go 139: Using previously configured cluster GUID
2020-03-12 14:05:53.800 [INFO][8] compat.go 796: Returning configured node to node mesh
2020-03-12 14:05:53.812 [INFO][8] startup.go 131: Using node name: host1
2020-03-12 14:05:54.367 [INFO][12] client.go 202: Loading config from environment
Starting libnetwork service
Calico node started successfully

1.設置主機網絡,例如 enable IP forwarding。
2.下載並啓動 calico-node 容器,calico 會以容器的形式運行(與 weave 類似)。

[root@host1 ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
quay.io/calico/node   v2.6.12             401cc3e56a1a        16 months ago       281MB
[root@host1 ~]# docker ps
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS               NAMES
31ebe797a3f6        quay.io/calico/node:v2.6.12   "start_runit"       About an hour ago   Up About an hour                        calico-node

3.連接 etcd。
4.calico 啓動成功。

查看calico運行狀態

host1

[root@host1 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+---------------+-------------------+-------+----------+-------------+
| PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+---------------+-------------------+-------+----------+-------------+
| 192.168.1.123 | node-to-node mesh | up    | 14:24:10 | Established |
+---------------+-------------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

[root@host1 ~]# 

host2

root@host2 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+---------------+-------------------+-------+----------+-------------+
| PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+---------------+-------------------+-------+----------+-------------+
| 192.168.1.122 | node-to-node mesh | up    | 14:14:18 | Established |
+---------------+-------------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

[root@host2 ~]# 

創建 calico 網絡

在 host1 或 host2 上執行如下命令創建 calico 網絡 cal_ent1:

docker network create --driver calico --ipam-driver calico-ipam cal_net1
  • –driver calico 指定使用 calico 的 libnetwork CNM driver。
  • –ipam-driver calico-ipam 指定使用 calico 的 IPAM driver 管理 IP

calico 爲 global 網絡,etcd 會將 cal_net 同步到所有主機。

host2創建的calico 網絡 cal_ent1

[root@host2 ~]# docker network create --driver calico --ipam-driver calico-ipam cal_net1
9d3a6bbd6b7038b0b57f6d0828fa4f3b9938849b6dd307630fa380c7aefd59d3
[root@host2 ~]# docker network ls 
NETWORK ID          NAME                DRIVER              SCOPE
1e21a697f52c        bridge              bridge              local
9d3a6bbd6b70        cal_net1            calico              global
e75a72e83f90        host                host                local
ac72879f7ab4        none                null                local

一會之後同步的到host1

知識補充

還有一種方式連接 etcd是修改 host1 和 host2 的 Docker daemon 配置文件/usr/lib/systemd/system/docker.service, 連接 etcd:

Calico網絡結構

在 host1 中運行容器 bbox1 並連接到 cal_net1

在 host1 中運行容器 bbox1 並連接到 cal_net1:

[root@host1 ~]# docker  run --net cal_net1 --name bbox1 -tid busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
Image docker.io/library/busybox:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
0669b0daf1fb: Downloading 
latest: Pulling from library/busybox
0669b0daf1fb: Pull complete 
Digest: sha256:b26cd013274a657b86e706210ddd5cc1f82f50155791199d29b9e86e935ce135
Status: Downloaded newer image for busybox:latest
1969344ac07a316f307747b2ccc98236a09f0c4b5ed817c9e20879124ae93d8f

查看 bbox1 的網絡配置。

[root@host1 ~]# docker exec bbox1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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: 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.119.0/32 brd 192.168.119.0 scope global cali0
       valid_lft forever preferred_lft forever

cali0 是 calico interface,分配的 IP 爲 192.168.119.0。cali0 對應 host1 編號5 的 interface cali2e56c77f53e。

[root@host1 ~]# ip a
..........
5: cali2e56c77f53e@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 5e:42:5b:ba:c5:4c brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::5c42:5bff:feba:c54c/64 scope link 
       valid_lft forever preferred_lft forever

host1 將作爲 router 負責轉發目的地址爲 bbox1 的數據包。

[root@host1 ~]# ip route
default via 192.168.1.1 dev ens33 proto static metric 100 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.122 metric 100 
192.168.119.0 dev cali2e56c77f53e scope link 
blackhole 192.168.119.0/26 proto bird 

所有發送到 bbox1 的數據都會發給cali2e56c77f53e,因爲cali2e56c77f53e 與 cali0 是一對 veth pair,bbox1 能夠接收到數據。
接下來我們在 host2 中運行容器 bbox2,也連接到 cal_net1:

[root@host2 ~]# docker  run --net cal_net1 --name bbox2 -tid busybox

IP 爲 192.168.183.64。

[root@host2 ~]# docker exec bbox2 ip a 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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: 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.183.64/32 brd 192.168.183.64 scope global cali0
       valid_lft forever preferred_lft forever
[root@host2 ~]
[root@host2 ~]# ip route
default via 192.168.1.1 dev ens33 proto static metric 100 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.123 metric 100 
192.168.119.0/26 via 192.168.1.122 dev ens33 proto bird 
192.168.183.64 dev cali46ba0d99f46 scope link 
blackhole 192.168.183.64/26 proto bird 
  1. 目的地址爲 host1 容器 subnet 192.168.119.0/26 的路由。
  2. 目的地址爲本地 bbox2 容器 192.168.183.64 的路由。

同樣的,host1 也自動添加了到 192.168.183.64/26 的路由

[root@host1 ~]# ip route
default via 192.168.1.1 dev ens33 proto static metric 100 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.122 metric 100 
192.168.119.0 dev cali2e56c77f53e scope link 
blackhole 192.168.119.0/26 proto bird 
192.168.183.64/26 via 192.168.1.123 dev ens33 proto bird 

Calico 的默認連通性

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

[root@host1 ~]# docker exec bbox1 ping -c 4 bbox2
PING bbox2 (192.168.183.64): 56 data bytes
64 bytes from 192.168.183.64: seq=0 ttl=62 time=24.472 ms
64 bytes from 192.168.183.64: seq=1 ttl=62 time=0.573 ms
64 bytes from 192.168.183.64: seq=2 ttl=62 time=0.553 ms
64 bytes from 192.168.183.64: seq=3 ttl=62 time=0.467 ms

--- bbox2 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.467/6.516/24.472 ms
[root@host1 ~]# 

① 根據 bbox1 的路由表,將數據包從 cal0 發出。

    [root@host1 ~]# docker exec bbox1 ip route
    default via 169.254.1.1 dev cali0 
    169.254.1.1 dev cali0 scope link 
    [root@host1 ~]# 
② 數據經過 veth pair 到達 host1,查看路由表,數據由 ens33發給 host2(192.168.1.123)。
192.168.183.64/26 via 192.168.1.123 dev ens33 proto bird
③ host2 收到數據包,根據路由表發送給 cali2e56c77f53e,進而通過 veth pair cali0 到達 bbox2。
192.168.183.64 dev cali46ba0d99f46 scope link
接下來我們看看不同 calico 網絡之間的連通性。
創建 cal_net2。

創建 cal_net2。

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

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

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

calico 爲 bbox3 分配了 IP 192.168.119.1

[root@host1 ~]# docker exec bbox3 ip address show cali0
6: cali0@if7: <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.119.1/32 brd 192.168.119.1 scope global cali0
       valid_lft forever preferred_lft forever

驗證 bbox1 與 bbox3 的連通性。

    [root@host1 ~]# docker exec bbox1 ping -c 4 bbox3
    ping: bad address 'bbox3'
    [root@host1 ~]# 

雖然 bbox1 和 bbox3 都位於 host1,而且都在一個 subnet 192.168.119.0/26,但它們屬於不同的 calico 網絡,默認不能通行。
calico 默認的 policy 規則是:容器只能與同一個 calico 網絡中的容器通信。
calico 的每個網絡都有一個同名的 profile,profile 中定義了該網絡的 policy。我們具體看一下 cal_net1 的 profile:

[root@host1 ~]# calicoctl get profile cal_net1 -o yaml
- apiVersion: v1
  kind: profile
  metadata:
    name: cal_net1
    tags:
    - cal_net1
  spec:
    egress:
    - action: allow
      destination: {}
      source: {}
    ingress:
    - action: allow
      destination: {}
      source:
        tag: cal_net1
[root@host1 ~]# 

① 命名爲 cal_net1,這就是 calico 網絡 cal_net1 的 profile。
② 爲 profile 添加一個 tag cal_net1。注意,這個 tag 雖然也叫 cal_net1,其實可以隨便設置,這跟上面的 name: cal_net1 沒有任何關係。此 tag 後面會用到。
③ egress 對從容器發出的數據包進行控制,當前沒有任何限制。
④ ingress 對進入容器的數據包進行限制,當前設置是接收來自 tag cal_net1 的容器,根據第 ① 步設置我們知道,實際上就是隻接收本網絡的數據包,這也進一步解釋了前面的實驗結果。
既然這是默認 policy,那就有方法定製 policy,這也是 calico 較其他網絡方案最大的特性。下一節就我們討論如何定製 calico policy。


定製 Calico 網絡 Policy

Calico 默認的 policy 規則是:容器只能與同一個 calico 網絡中的容器通信。calico 能夠讓用戶定義靈活的 policy 規則,精細化控制進出容器的流量,下面我們就來實踐一個場景:
創建一個新的 calico 網絡 cal_web 並部署一個 httpd 容器 web1。
定義 policy 允許 cal_net2 中的容器訪問 web1 的 80 端口。
首先創建 cal_web。

[root@host1 ~]# docker network create --driver calico --ipam-driver calico-ipam cal_web 
086c6d54b84371425f5e6e60252b4e9f615ec28f88b2dd4976ccc39f755c19ae

在 host1 中運行容器 web1,連接到 cal_web:

[root@host1 ~]# docker  run --net cal_web --name web1 -d httpd
Digest: sha256:946c54069130dbf136903fe658fe7d113bd8db8004de31282e20b262a3e106fb
Status: Downloaded newer image for httpd:latest
535876687e3279889d28f7a5a4f2a063b2e03480877431dd43a5b06cf5a87907
[root@host1 ~]# docker exec -it web1 bash
root@535876687e32:/usr/local/apache2# apt-get update
root@535876687e32:/usr/local/apache2# apt-get install iproute
 ...
Setting up iproute2 (3.16.0-2) ...
Setting up libatm1:amd64 (1:2.5.1-1.5) ...
Setting up libxtables10 (1.4.21-2+b1) ...
Setting up iproute (1:3.16.0-2) ...
root@535876687e32:/usr/local/apache2# exit
exit
[root@host1 ~]# 

web1 的 IP 爲 192.168.119.2

[root@host1 ~]# docker container exec web1 ip address show cali0
8: cali0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.119.2/32 brd 192.168.119.2 scope global cali0
       valid_lft forever preferred_lft forever

目前 bbox3 還無法訪問 web1 的 80 端口。

[root@host1 ~]# docker exec bbox3 wget 192.168.119.2
Connecting to 192.168.119.2 (192.168.119.2:80)
wget: can't connect to remote host (192.168.119.2): Connection timed out
[root@host1 ~]# 

創建 policy 文件 web.yml,內容爲:

[root@host1 ~]# vim web.yml

- apiVersion: v1
  kind: profile
  metadata:
    name: cal_web
  spec:
    ingress:
    - action: allow
      protocol: tcp
      source:
        tag: cal_net2
      destination:
        ports:
        - 80

① profile 與 cal_web 網絡同名,cal_web 的所有容器(web1)都會應用此 profile 中的 policy。
② ingress 允許 cal_net2 中的容器(bbox3)訪問。
③ 只開放 80 端口。
應用該 policy。

[root@host1 ~]# calicoctl apply -f web.yml
Successfully applied 1 'profile' resource(s)

現在 bbox3 已經能夠訪問 web1 的 http 服務了。 

[root@host1 ~]# docker exec bbox3 wget 192.168.119.2
Connecting to 192.168.119.2 (192.168.119.2:80)
saving to 'index.html'
index.html           100% |********************************|    45  0:00:00 ETA
'index.html' saved

不過 ping 還是不行,因爲只放開了 80 端口。

[root@host1 ~]# docker  exec bbox3 ping -c 4 192.168.119.2
PING 192.168.119.2 (192.168.119.2): 56 data bytes

--- 192.168.119.2 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss

上面這個例子比較簡單,不過已經向我們展示了 calico 強大的 policy 功能。通過 policy,可以動態實現非常複雜的容器訪問控制。有關 calico policy 更多的配置,可參看官網文檔 http://docs.projectcalico.org/v2.0/reference/calicoctl/resources/policy
 

定製 Calico IP 池

calico 會爲自動爲網絡分配 subnet,當然我們也可以定製。
首先定義一個 IP Pool,比如:

[root@host1 ~]# vim ipPool.yaml

- apiVersion: v1
  kind: ipPool
  metadata:
    cidr: 17.2.0.0/16
[root@host1 ~]# calicoctl create -f ipPool.yaml
Successfully created 1 'ipPool' resource(s)
[root@host1 ~]#               

用此 IP Pool 創建 calico 網絡。

[root@host1 ~]# docker network create --driver calico --ipam-driver calico-ipam --subnet=17.2.0.0/16 my_net
b1d91494b9446243dc6bf7e181de4f6d7d9f8c421732ee35b0e2f33e15bd2111

此時運行容器將分配到指定 subnet 中的 IP。

[root@host1 ~]# docker  run --net my_net -ti busybox
/ # ip address show cali0
10: cali0@if11: <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 17.2.119.0/32 brd 17.2.119.0 scope global cali0
       valid_lft forever preferred_lft forever
/ # 

當然也可以通過 --ip 爲容器指定 IP,但必須在 subnet 範圍之內。

[root@host1 ~]# docker  run --net my_net --ip 17.2.3.11 -ti busybox
/ # ip address show cali0
12: cali0@if13: <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 17.2.3.11/32 brd 17.2.3.11 scope global cali0
       valid_lft forever preferred_lft forever
/ # 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章