calico

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

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