calico在docker上的部署及驗證

calico在docker上的部署及驗證

1. 背景

如下的部署以五臺服務器環境爲例:node

服務器1: hostname爲etcdnode1, IP爲192.168.56.100
服務器2: hostname爲etcdnode2, IP爲192.168.56.101
服務器3: hostname爲etcdnode3, IP爲192.168.56.102
服務器2: hostname爲hostnode1, IP爲192.168.56.200
服務器3: hostname爲hostnode2, IP爲192.168.56.201

其中,etcdnode1,etcdnode2和etcdnode3將部署etcd,做爲calico網絡的後端分佈式存儲;hostnode1和hostnode2將部署calico網絡。linux

軟件背景:git

•   Ubuntu 16.04
•   etcd - v3.1.10 
•   Docker
•   calicoctl - v1.6.1
•   calico/node image - v.2.6.2
•   calico, calico-ipam plugins - v1.11.0

2. 部署

2.1. etcd部署

etcdnode1,etcdnode2和etcdnode3部署etcd,分別執行下面的命令。github

2.1.1. 安裝etcd

# cd /usr/local
# curl -Lhttps://github.com/coreos/etcd/releases/download/v3.1.10/etcd-v3.1.10-linux-amd64.tar.gz-o etcd-v3.1.10-linux-amd64.tar.gz
# tar -zxf etcd-v3.1.9-linux-amd64.tar.gz
# cd etcd-v3.1.9-linux-amd64
# cp etcd etcdctl /usr/bin
# mkdir -p /var/lib/etcd
# chmod -R a+rw /var/lib/etcd

2.1.2. 建立systemd服務文件

使用vi打開/etc/systemd/system/etcd.service文件。docker

[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd

[Service]
Type=notify
Restart=always
RestartSec=5s
LimitNOFILE=40000
TimeoutStartSec=0 

ExecStart=/usr/bin/etcd --name ${local_hostname} \
   --data-dir /var/lib/etcd \
   --listen-client-urls http://0.0.0.0:2379 \
   --listen-peer-urls http://0.0.0.0:2380 \
   --advertise-client-urls http://${local_IP}:2379\
   --initial-advertise-peer-urls http://${local_IP}:2380 \
   --initial-cluster *etcdnode1=http://192.168.56.100:2380,etcdnode2=http://192.168.56.101:2380, etcdnode3=http:// 192.168.56.102:2380 *
   --initial-cluster-token my-etcd-token \
   --initial-cluster-state new

[Install]
WantedBy=multi-user.target

這裏須要注意的是,須要將local_hostname、local_IP都替換爲節點本身的hostname和IP地址。json

2.1.3. 啓動etcd服務

待全部etcd節點都同時執行上面的步驟後,再同時執行下面的步驟。後端

# systemctl daemon-reload
# systemctl enable etcd.service
# systemctl start etcd.service

2.1.4. 檢查etcd狀態

# etcdctl cluster-health               // 檢查集羣的健康狀態
# etcdctl member list                  // 返回集羣的成員列表

2.2. docker部署api

hostnode1和hostnode2節點都須要配置。服務器

2.2.1. 安裝docker

# apt -y install docker.io

2.2.2. 修改daemon.json

Docker守護進程須要/etc/docker/daemon.json文件中配置etcd的存儲和通知功能。可經過vi打開/etc/docker/daemon.json,並將${local_IP}替換爲各dockerhost本身的IP地址。網絡

{
    "cluster-store":"**etcd://192.168.56.100:2379, 192.168.56.101:2379,192.168.56.102:2379**",
    "cluster-advertise":"${local_IP}:2375",
    "hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
}

2.2.3. 重啓docker服務

# systemctl restart docker.service
  • 1

重啓須要必定的時間,完成後,確認docker配置是否生效

# docker info
…
Cluster Store: etcd://192.168.56.100:2379,192.168.56.101:2379, 192.168.56.102:2379
Cluster Advertise: 192.168.56.200:2375
Insecure Registries:
  127.0.0.0/8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.3. calico部署

每一個docker host都須要配置。

2.3.1. 下載calico

PS:這裏咱們下載和使用的是v1.6.1版本,截止到如今,calico已經出現v3.1.1版本了。

# wget -O /usr/local/bin/calicoctlhttps://github.com/projectcalico/calicoctl/releases/download/v1.6.1/calicoctl
# chmod +x /usr/local/bin/calicoctl
# mkdir /var/lib/calico
# curl -L -o /var/lib/calico/calicohttps://github.com/projectcalico/cni-plugin/releases/download/v1.11.0/calico
# curl -L -o/var/lib/calico/calico-ipamhttps://github.com/projectcalico/cni-plugin/releases/download/v1.11.0/calico-ipam
# chmod +x /var/lib/calico/calico
# chmod +x/var/lib/calico/calico-ipam
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.3.2. 增長calico配置

# mkdir -p /etc/calico
  • 1

而後修改calico的配置,在/etc/calico/calicoctl.cfg文件增長如下內容。這裏,主要是增長etcd終端的配置,若是有多個etcd節點,可使用逗號鏈接。

apiVersion: v1

kind: calicoApiConfig

metadata:

spec:

 datastoreType: "etcdv2"

 etcdEndpoints: "http:// 192.168.56.100:2379,http:// 192.168.56.101:2379,http://192.168.56.102:2379"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.3.3. 設置內核網絡參數

Calico要求開啓「net.ipv4.conf.all.rp_filter」和「net.ipv4.ip_forward」等參數,但有些發行版默認並未開啓這些參數,所以須要手動開啓。

# echo 「net.ipv4.conf.all.rp_filter=1」>> /etc/sysctl.conf

# echo 「net.ipv4.ip_forward=1」 >>/etc/sysctl.conf

# sysctl -p
  • 1
  • 2
  • 3
  • 4
  • 5

2.3.4. 啓動calico/node容器

啓動calico/node容器,可能須要聯網下載對應的鏡像。另外,${local_IP}須要替換爲各自的docker host的IP地址。

而後:

# calicoctl node run--node-image=calico/node:v2.6.2 --ip={local_IP}
  • 1

檢查鏈接狀態。

# calicoctl node status
Calico process is running.

IPv4 BGP status
+----------------+-------------------+-------+------------+-------------+
| PEER ADDRESS  |     PEER TYPE     | STATE |  SINCE    |    INFO    |
+----------------+-------------------+-------+------------+-------------+
| 192.168.56.201 | node-to-node mesh| up    | 2017-11-06 | Established |
+----------------+-------------------+-------+------------+-------------+
IPv6 BGP status
No IPv6 peers found.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.3.5. 建立docker網絡

注意:這一步只須要在任意一個dockerhost節點上建立便可,不一樣節點是共享calico網絡的。

# docker network create --driver calico--ipam-driver calico-ipam ${network name}
  • 1

這裏,咱們建立一個名爲「calico-network」的calico網絡。

# docker network create --driver calico--ipam-driver calico-ipam "calico-network"
  • 1

2.3.6. 驗證calico網絡

在hostnode1上執行命令

# docker run --net calico-network--name workload-A -tid busybox
  • 1

在hostnode2上執行命令

# docker run --net calico-network--name workload-B -tid busybox
  • 1

而後在容器workload-A上ping容器workload-B的IP地址,能夠通就說明配置成功。

首先獲取workload-B的IP地址,在hostnode2上執行命令。

# docker exec workload-B hostname –i
192.168.0.17
  • 1
  • 2

而後在hostnode1上ping該IP地址。

# docker exec workload-A ping 192.168.0.17
PING 192.168.0.17 (192.168.0.17) 56(84)bytes of data.
64 bytes from 192.168.0.17: icmp_seq=1ttl=64 time=0.165 ms
…
  • 1
  • 2
  • 3
  • 4

Ping通即表示不一樣docker host上使用同一個calico網絡的兩個容器網絡互通。

2.3.7. 配置ingress特性

若是須要docker host能夠訪問容器網絡,以上面的例子,若是想在hostnode2上能訪問workload-A的IP地址,就須要配置該calico網絡的ingress特性。

先導出現有的配置。

# calicoctl get profile "calico-network"-o json > profile.json
  • 1

profile.json的ingress部分,這裏是一個進入流量的配置。咱們再增長一個配置,尤爲source->nets部分,內容大體以下:

"ingress": [
       {
          "action":"allow",
          "source": {
            "tag":"calico-network"
          },
          "destination": {}
       },
       {
          "action":"allow",
          "source": {
            "nets": [
               "192.168.56.1/24"
            ]
          },
          "destination": {}
       }
     ],

而後替換修改過的profile.json文件。

# calicoctl replace -f profile.json

而後,在hostnode2上再用ping嘗試workload-A的IP地址,便可ping通。

相關文章
相關標籤/搜索