Ucloud雲上環境使用calico+libnetwork連通容器網路實踐
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.251B: 10.9.78.38C: 10.9.73.236 D: 10.9.75.772. 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
注:calico從1.0開始使用go重構,並在使用上有很大的不同,所以請注意版本。後面會加上一章詳細介紹1.0之後的calico使用。
./calicoctl pool add 10.5.10.0/24 --nat-outgoing (創建網路pool,並設置容器允許nat出)
Check:./calicoctl poolshow
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管理的都是資源(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
cat << EOF | calicoctl create -f -- apiVersion: v1 kind: ipPool metadata: cidr: 192.0.2.0/24EOF
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
calicoctl noderun --ip=x.x.x.x
5. calico ipam driver變為calico-ipamdocker 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 PolicyCalico-Mesos Usage Guide with the Docker Containerizer文章僅代表個人觀點!
推薦閱讀:
※Kubernetes和Mesos有啥區別,我該使用哪個好?
※Mesos優缺點有哪些?
※openstack,docker,mesos,k8s什麼關係?