calico目前最新版3.1,但是隻支持k8s、openstack、OpenShift。只有在2版本才支持docker、mesos等架構,不過calico打算在以後的V3版本中繼續支持mesos、docker等架構,所以目前我們就只能使用最新的V2版本了,是2.6版本,一下下載的軟件都是適配2.6版本的
需要依賴etcd,支持docker1.9及以上,calico要以plugin的模式在docker上運行,需要修改docker的配置,cluster-store,在docker 1.10以上可以修改daemon.json來實現
下載calicoctl:
wget 'https://github.com/projectcalico/calicoctl/releases/download/v1.6.4/calicoctl'
配置calicoctl使用etcdv2版本的數據存儲,calicoctl默認使用/etc/calico/calicoctl.cfg配置文件,不過也可以使用--config來覆蓋。配置也可以使用環境變量,不過爲了方便管理,我們使用配置文件。樣例:
apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
datastoreType: "etcdv2"
etcdEndpoints: "http://etcd1:2379,http://etcd2:2379"
更多參數參考:https://docs.projectcalico.org/v2.6/reference/calicoctl/setup/etcdv2
啓動一個calico/node
calicoctl node run --node-image=quay.io/calico/node:v2.6.10
calicoctl node status
使用docker run可以查看calico在啓動node的時候底層運行的docker命令:
calicoctl node run --init-system --dryrun --node-image=quay.io/calico/node:v2.6.10
docker run --net=host --privileged --name=calico-node --rm -e ETCD_AUTHORITY=127.0.0.1:2379 -e ETCD_SCHEME=http -e ETCD_ENDPOINTS= -e NODENAME=calico -e CALICO_NETWORKING_BACKEND=bird -e NO_DEFAULT_POOLS= -e CALICO_LIBNETWORK_ENABLED=true -e CALICO_LIBNETWORK_IFPREFIX=cali -v /var/run/calico:/var/run/calico -v /lib/modules:/lib/modules -v /var/log/calico:/var/log/calico -v /run/docker/plugins:/run/docker/plugins -v /var/run/docker.sock:/var/run/docker.sock quay.io/calico/node:v2.6.10
IPAM:
在docker1.10以後,calico網絡允許用戶在創建容器時選擇特定的IP地址。爲了使用此功能,Docker在運行docker network create時需要指定--subnet參數。
1 Create a Calico IP pool
cat << EOF | calicoctl create -f -
- apiVersion: v1
kind: ipPool
metadata:
cidr: 192.0.2.0/24
EOF
2 Create a Docker network using the IP pool
docker network create --driver calico --ipam-driver calico-ipam --subnet=192.0.2.0/24 my_net
3 Create a container using a specific IP address from the pool
docker run --net my_net --name my_workload --ip 192.0.2.100 -tid busybox
4 Verify that the IP address was assigned to the container
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_workload
Calico and Systemd:
calico node以service運行,方便管理
calico.env:配置文件
ETCD_ENDPOINTS=http://localhost:2379
ETCD_CA_FILE=""
ETCD_CERT_FILE=""
ETCD_KEY_FILE=""
CALICO_NODENAME=""
CALICO_NO_DEFAULT_POOLS=""
CALICO_IP=""
CALICO_IP6=""
CALICO_AS=""
CALICO_LIBNETWORK_ENABLED=true
CALICO_NETWORKING_BACKEND=bird
Configuring BGP Peers
calico-node.service:配置Systemd 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/log/calico:/var/log/calico \
-v /run/docker/plugins:/run/docker/plugins \
-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
Configuring BGP Peers:忽略
Route Reflector:
Configuring BIRD
The calico/routereflector container
IPv6 Support:不需要
External Connectivity:
Calico創建了一個路由網絡,您的容器看起來就像普通的IP服務。 您可以從其他IP地址連接到它們。討論了Calico端點與羣集外部主機之間的連接。
Outbound connectivity
出站連接是指從Calico端點到羣集外的目標的連接。獲得出站連接的最簡單方法是在您希望能夠訪問互聯網的所有Calico池上打開NAT Outgoing。
cat << EOF | calicoctl apply -f -
- apiVersion: v1
kind: ipPool
metadata:
cidr: 192.168.0.0/16
spec:
nat-outgoing: true
EOF
Inbound connectivity
入站連接是指源自羣集外部的Calico端點的連接有兩種主要方法:BGP與網絡基礎架構對等,或使用orchestrator特定選項(k8s、openstack)。
BGP與基礎網絡對等--這需要訪問Calico羣集前面的支持BGP的交換機或路由器。通常,這將涉及使用支持BGP的交換機對Calico集羣中的節點進行對等,這些交換機充當從外部到達集羣中的Calico端點的網關。常見的情況是您的容器主機位於其自己的隔離的第2層網絡上,例如服務器機房中的機架或整個數據中心。 通過路由器訪問該網絡,該路由器也是所有容器主機的默認路由器。
如果您擁有少量主機,則可以在路由器和每個啓用Calico的主機之間配置BGP會話。 對於許多主機,您可能希望使用路由反射器(route reflector)或設置第3層拓撲。
Configuring IP-in-IP:
如果你的網絡拓撲執行檢查源地址目的地址的網絡流量,並且在無法識別這些地址會丟棄流量時,你就需要開啓IP-in-IP封裝,尤其是在公有云環境,你無法在calico節點和網絡路由器之間設置BGP對等的情況下,你可以在ip資源池上啓用ipip選項,啓用後,calico將在將數據包路由到屬於ip池範圍的節點時使用IP-in-IP封裝。mode字段有兩種情況:
Configuring IP-in-IP for all inter-workload traffic:
如果設置mode爲always,calico則會使用ip-in-ip路由所有來自calico主機的流量到calico網絡的容器和vm上
$ calicoctl apply -f - << EOF
apiVersion: v1
kind: ipPool
metadata:
cidr: 192.168.0.0/16
spec:
ipip:
enabled: true
mode: always
nat-outgoing: true
EOF
Configuring cross-subnet IP-in-IP:
也可以選擇路由的流量
$ calicoctl apply -f - << EOF
apiVersion: v1
kind: ipPool
metadata:
cidr: 192.168.0.0/16
spec:
ipip:
enabled: true
mode: cross-subnet
nat-outgoing: true
EOF
Configuring a Node IP Address and Subnet:
Configure the IP and subnet through environment variables calicoctl node run --ip=10.0.2.10/24
Autodetect the IP and subnet calicoctl node run --ip=autodetect --ip-autodetection-method=can-reach=8.8.8.8
Manually configure the node resource: 下面
# Start by querying the current node configuration
$ calicoctl get node node2 -o yaml
- apiVersion: v1
kind: node
metadata:
name: node2
spec:
bgp:
ipv4Address: 10.0.2.10/32
ipv6Address: fd80:24e2:f998:72d6::/128
# Now reconfigure the node with updated ipv4Address to include the correct
# subnet.
$ calicoctl apply -f - << EOF
- apiVersion: v1
kind: node
metadata:
name: node2
spec:
bgp:
ipv4Address: 10.0.2.10/24
ipv6Address: fd80:24e2:f998:72d6::/120
EOF
=========================================================================
calico:
Calico在每個主機上通過一個自己的container與其他主機或者網絡通訊,即calico-node的container,這個container裏面包含了Bird路由管理、Felix協議等。在兩臺主機上分別運行,後面的ip是主機ip。calicoctl node --ip=10.11.150.72 運行後在兩個主機用docker ps可以看到正在運行calico-node的container
下面爲我們的calico網絡添加可用的ip pool(在72或者74一臺主機上運行即可):
calicoctl pool add 172.1.0.0/16 --nat-outgoing
calicoctl pool show
calicoctl pool remove 192.168.0.0/16
這裏由於我的兩個主機72和74本身就在同一個子網下,主機相互之間不需要L2 switch。如果是跨子網、跨機房、跨公網就需要加上--ipip選項,或者你有權限直接修改路由器的BGP協議,將兩個不同子網的主機連接爲BGP peer。
container啓動後,給容器註冊獨立ip
docker run --net=none --name worker-1 -tid iperf
docker run --net=none --name worker-2 -tid iperf
calicoctl container add worker-1 172.1.0.1
calicoctl container add worker-2 172.1.0.2
Calico通過profile的形式來控制ACL,也以此來完成安全策略。
添加兩個profile(72或者74均可):
./calicoctl profile add PROF_1
./calicoctl profile add PROF_2
calicoctl profile show
爲container添加策略:
./calicoctl container worker-1 profile append PROF_1
./calicoctl container worker-2 profile append PROF_1
./calicoctl container worker-3 profile append PROF_1
./calicoctl container worker-4 profile append PROF_2
Cluster Store模式和docker swarm模式衝突
====================================================================
2 查看網絡docker network ls
net1 是我們創建的網絡,docker_gwbridge是docker自動創建的網絡,他允許容器和他當前運行在的主機進行通訊,ingress也是docker自動創建的網絡,docker swarm使用該網絡暴露service到其他網絡或者提供routeing mesh
3 啓動容器,使用net1 y2hqtjir3i3u
docker service create --replicas 2 --name redis3 --network net1 172.31.68.241/library/redis
4 在/var/run下創建docker nets的軟連接
ln -s /var/run/docker/netns netns
ip netns
只有把該軟連接做好,ip netns纔會顯示
5 在容器裏面執行查看
ip link
6 在node節點上執行查看
ip netns exec 1-y2hqtjir3i ip link