Ucloud雲上環境使用calico+libnetwork連通容器網路實踐

一、容器跨主機通信方式簡介

關於容器跨主機或跨DC通信,其實和底層的網路架構有著千絲萬縷的關係。單從連通性來講實現跨主機容器通信大致有以下幾種方式:

1. NAT方式

NAT就是傳統的docker網路,利用宿主機的IP和Iptables來達到容器,主機之間的通信。容器對外IP都是宿主機的IP。只要宿主機之間三層可達,容器之間就可以通信。圖例:

2. Tunnel(overlay)方式

VPN,ipip,VXLAN等都是tunnel技術,簡單講就是在容器的數據包間封裝一層或多層其他的數據協議頭,達到連通的效果。

Docker的Libnetwork就支持vxlan的overlay方式,weave也支持UDP和Vxlan的overlay模式,flannel,calico等都支持overlay模式。

? Overlay一般通過vSwitch來實現,比如OVS

? 一般需要一個全局的KVstore(sdn controller、etcd、consul)來保存控制信息。

3. Routing方式

路由方案主要是通過路由設置的方式讓容器對容器,容器對宿主機之間相通信。例如:calico的BGP路由方案

4. 「大二層」方式

大二層就是將物理網卡和容器網路橋接到同一個linux bridge。容器網路可以直接接入該linux bridge,也可以將容器網路接入容器網橋docker0,再把docker0橋接到linux bridge上。目的是使得容器網路和宿主機網路在同一個二層網路。

二、UCLOUD上使用calico+libnetwork搭建容器網路

本文所有步驟均在UCLOUD的雲主機Uhost上操作。

1. 實驗拓撲

三台運行容器機器A,B,C和運行etcd機器D均在同一個可用區,內網IP分別為:

A: 10.9.73.251

B: 10.9.78.38

C: 10.9.73.236

D: 10.9.75.77

2. Etcd安裝配置(10.9.75.77:2379)

本實驗僅使用了一個節點的etcd cluster。直接使用容器來運行,client監聽埠為2379,docker-compose.yml文件如下:

etcd: image: quay.io/coreos/etcd:v3.0.15 container_name: etcd net: host command: /usr/local/bin/etcd --data-dir=/data/etcd/data.etcd --name etcd-node-0 --initial-advertise-peer-urls http://10.9.75.77:2380 --listen-peer-urls http://10.9.75.77:2380 --advertise-client-urls http://10.9.75.77:2379 --listen-client-urls http://10.9.75.77:2379 --initial-cluster etcd-node-0=http://10.9.75.77:2380 --initial-cluster-state new --initial-cluster-token etcd-calico volumes: - /data/etcd/data.etcd:/data/etcd/data.etcd restart: always

3. Docker daemon啟動參數設置

使用Docker libnetwork來實現docker跨主機通信需要設置KV存儲的地址,這個參數需要在docker daemon中設置,本實驗用的是etcd,所以docker啟動添加參數--cluster-store=etcd://10.9.75.77:2379/calico. 重啟docker服務。

4. 下載並運行calico-libnetwork

4.1 下載calicoctl

本實驗使用calicoctl版本0.23.0。calicoctl為一個calico的cli,包括calico的安裝和控制都在這個程序中實現。

wget https://github.com/projectcalico/calico-containers/releases/download/v0.23.0/calicoctlchmod +x calicoctl*可以將calicoctl加入系統PATH中

4.2 配置ETCD環境變數

export ETCD_ENDPOINTS=http://10.9.75.77:2379

4.3 啟動calico with libnetwork

A:./calicoctl node --ip=10.9.73.251 --libnetworkB:./calicoctl node --ip=10.9.78.38 --libnetworkC:./calicoctl node --ip=10.9.73.236 –libnetwork檢查calico BGP狀態,可以看到三個節點互為bgp peer:./calicoctl status

5. 使用Calico創建IP pool

:calico從1.0開始使用go重構,並在使用上有很大的不同,所以請注意版本。後面會加上一章詳細介紹1.0之後的calico使用。

./calicoctl pool add 10.5.10.0/24 --nat-outgoing (創建網路pool,並設置容器允許nat出)

Check:./calicoctl poolshow

6. 使用libnetwork創建網路net-test

docker network create -d calico --ipam-driver calico --subnet 10.5.10.0/24 net-test (創建net-test網路,ipam驅動為calico,ip子網為10.5.10.0/24)

如果想給此網路設置網關的話,需要添加參數

--aux-address "DefaultGatewayIPv4=x.x.x.x"

Check: docker network ls

返回值為該網路的profile id (bd0390b271cb9154dde27ec235119879e4165acf431c5ff67f49542a21dec2a2)。

7. 使用剛創建的網路啟動容器

docker run -d --net=net-test --name=nginx-A nginxdocker exec nginx-A ip addr

8. Marathon+mesos使用剛創建的網路

對於Marathon v1.2.0+,需要設置container.docker.network 為USER;並且指定ipAddress.networkName為你創建的網路名稱。實例app.json如下:

{ "id": "my-docker-task", "cpus": 0.1, "mem": 64.0, "container": { "type": "DOCKER", "docker": { "network": "USER", "image": "nginx" } }, "ipAddress": { "networkName": "net-test" }}

Calico-Mesos Usage Guide with the Docker Containerizer

9. 連通性測試

Calico libnetwork默認創建的網路容器之間可以互相訪問;容器訪問外部網路通過設置nat-outing來實現,是通過宿主機NAT來實現的;默認外部無法訪問內部容器網路。

可以通過設置網路的profile(ACL)來設置網路的准入和准出。

例如:運行所有外部網路訪問容器網路。

./calicoctl profile bd0390b271cb9154dde27ec235119879e4165acf431c5ff67f49542a21dec2a2 rule remove inbound --at=1./calicoctl profile bd0390b271cb9154dde27ec235119879e4165acf431c5ff67f49542a21dec2a2 rule add inbound allow

三、calicoctl 1.0

calicoctl 1.0之後calicoctl管理的都是資源(resource),資源通過yaml或者json格式方式來定義,這一點和k8s的定義方法一致。之前版本的ip pool,profile, policy等都是資源, 通過calicoctl create 或者apply來定義,獲取是通過calicoctl get 的方式。

apiVersion: v1kind: <type of resource>metadata: # Identifying information name: <name of resource> ...spec: # Specification of the resource ...

一些變化:

1. calicoctl status- > calicoctl node status

2. calicoctl pool show -> calicoctl get ipPool

創建ip pool:

cat << EOF | calicoctl create -f -- apiVersion: v1 kind: ipPool metadata: cidr: 192.0.2.0/24EOF

3. calicoctl profile show -> calicoctl get profile

創建profile:

cat << EOF | calicoctl apply -f -- apiVersion: v1 kind: profile metadata: name: database labels: role: database spec: ingress: - action: allow protocol: tcp source: selector: role == frontend destination: ports: - 3306 - action: allow source: selector: role == database egress: - action: allow destination: selector: role == database

4. calico啟動

calicoctl noderun --ip=x.x.x.x

5. calico ipam driver變為calico-ipam

docker network create --driver=calico --ipam-driver=calico-ipam my-calico-net

。。。

calico resource definitions: Resource Definitions

calico command reference: Command Reference

Calico - Advanced Policy

Calico - IPAM

四、Reference

Configuring Calico

BGP Configuration BGP配置

Advanced Network Policy

Calico-Mesos Usage Guide with the Docker Containerizer

文章僅代表個人觀點!

推薦閱讀:

Kubernetes和Mesos有啥區別,我該使用哪個好?
Mesos優缺點有哪些?
openstack,docker,mesos,k8s什麼關係?

TAG:Docker | Mesos | UCloud |