• calico在docker上的部署及验证


    1. 背景

    以下的部署以五台服务器环境为例:

    服务器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网络。

    软件背景:

    •	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,分别执行下面的命令。

    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文件。

    [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地址。

    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部署

    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
    

    重启需要一定的时间,完成后,确认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
    

    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
    

    2.3.2. 增加calico配置

    # mkdir -p /etc/calico
    

    然后修改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"
    

    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
    

    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}
    

    检查连接状态。

    # 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.
    

    2.3.5. 创建docker网络

    注意:这一步只需要在任意一个dockerhost节点上创建即可,不同节点是共享calico网络的。

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

    这里,我们创建一个名为“calico-network”的calico网络。

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

    2.3.6. 验证calico网络

    在hostnode1上执行命令

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

    在hostnode2上执行命令

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

    然后在容器workload-A上ping容器workload-B的IP地址,可以通就说明配置成功。

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

    # docker exec workload-B hostname –i
    192.168.0.17
    

    然后在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
    …
    

    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
    

    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通。

  • 相关阅读:
    App Inventor
    App Inventor趣味编程(网易课堂)
    学习App Inventor
    小学课程资源网
    mariadb数据类型
    docker监控容器
    docker网络
    项目——基于httpd镜像演示Dockerfile所有的指令
    Dockerfile介绍及指令详情
    docker——harbor
  • 原文地址:https://www.cnblogs.com/styshoo/p/9000772.html
Copyright © 2020-2023  润新知