• Docker使用Calico网络模式配置及问题处理


    一.Calico介绍

    Calico是一种容器之间互通的网络方案,在虚拟化平台中,比如OpenStack、Docker等都需要实现workloads之间互连,但同时也需要对容器做隔离控制,就像在Internet中的服务仅开放80端口、公有云的多租户一样,提供隔离和管控机制。而在多数的虚拟化平台实现中,通常都使用二层隔离技术来实现容器的网络,这些二层技术有一些弊端,比如需要依赖VLAN、Bridge和隧道技术。其中Bridge带来了复杂性,Vlan隔离和Tunnel隧道则消耗等多的资源并对物理环境有要求。随着网络规模的增大,整体会变得更加复杂。我们尝试把Host当做Internet中的路由器,使用BGP同步路由,并使用Iptables来做安全访问策略,最终设计出了Calico方案。

    设计思想:Calico不使用隧道或者NAT来实现转发,而是巧妙的把所有二三层流量转换成三层流量,并通过host上路由配置完成跨host转发。

    二.Calico优势

    • 更优的资源利用

    二层网络通讯需要依赖广播消息机制,广播消息的开销与host的数量呈指数级增长,Calico使用的三层路由方法,则完全抑制了二层广播,减少了资源开销。此外,二层网络使用Vlan隔离技术,天生有4096个规格限制,即便可以使用Vxlan解决,但Vxlan又带来了隧道开销的问题。Calico不使用vlan或者vxlan技术,使资源利用率更高。

    • 可扩展性

    Calico使用与Internet类似的方案,Internet的网络比任何数据中心都大,Calico同样天然具有扩展性。

    • 简单更容易调试

    由于没有隧道,意味着workloads之间路径更短,配置更少,在host之间更容易进行debug调试。

    • 更少的依赖

    Calico仅依赖三层路由可达

    • 可适配性

    Calico较少的依赖性使它能适配所有的VM、Container、白盒或者混合环境场景。

    三、环境介绍:

    1、操作系统:CentOS 7

    2、主机结点:node1(192.168.223.131) node2(192.168.223.130)

    3、软件版本:calicoctl(version v1.6.1) etcdctl(version: 3.3.11)  docker(version:20.10.21-ce)

    复制代码
    [root@node2 ~]# cat /etc/redhat-release
    CentOS Linux release 7.9.2009 (Core)
    修改两个节点的主机名
    [root@node1 ~]# hostnamectl --static set-hostname node1
    [root@node1 ~]# echo "node1" > /etc/hostname
       
    [root@node2 ~]# hostnamectl --static set-hostname node2
    [root@node2 ~]# echo "node2" > /etc/hostname
    关闭两台主机的防火墙。若开启iptables防火墙,则需要打开2380端口通信。
    [root@node1 ~]# systemctl disable firewalld.service
    [root@node1 ~]# systemctl stop firewalld.service
    [root@node1 ~]# iptables -F
    [root@node1 ~]# firewall-cmd --state
    not running
    在两台机器上都要设置hosts,均执行如下命令:
    [root@node1 ~]# vim /etc/hosts
    192.168.223.131     node1
    192.168.223.130     node2
    两台集机器上的ip转发功能打开
    [root@node1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
    [root@node1 ~]# vim /etc/sysctl.conf
    ......
    net.ipv4.conf.all.rp_filter=1
    net.ipv4.ip_forward=1
    [root@node1 ~]# sysctl -p
    复制代码

    四、配置ETCD集群

    复制代码
    1、两台结点安装Etcd软件包
    [root@node1 ~]# yum install etcd -y
    
    2、两台结点配置ETCD集群模式
    [root@node1 ~]# vim /etc/etcd/etcd.conf 
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="http://192.168.223.131:2380"
    ETCD_LISTEN_CLIENT_URLS="http://192.168.223.131:2379"
    根据不同主机进行相应修改,分别为node1 node2
    ETCD_NAME="node1"
    
    根据不同主机进行相应修改,分别为192.168.223.131\192.168.223.130
    ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.223.131:2380"
    ETCD_ADVERTISE_CLIENT_URLS="http://192.168.223.131:2379"
    ETCD_INITIAL_CLUSTER="node2=http://192.168.223.130:2380,node1=http://192.168.223.131:2380"
    3、启用Etcd服务,并测试是集群是否配置正确
    [root@node1 ~]# systemctl start etcd
    [root@node1 ~]# export ETCDCTL_API=2   #根据节点设置数量
    [root@node1 ~]# etcdctl member list
    afc1b952a7b88713: name=node1 peerURLs=http://192.168.223.131:2380 clientURLs=http://192.168.223.1 31:2379 isLeader=true
    fd636eb41152ae48: name=node2 peerURLs=http://192.168.223.130:2380 clientURLs=http://192.168.223.1 30:2379 isLeader=false
    复制代码
    • 错误处理:Job for etcd.service failed because the control process exited with error code. See "systemctl status etcd.service" and "journalctl -xe" for details.
    cd /var/lib/etcd/default.etcd 删除这个目录下所有文件,如有重要数据请谨慎操作。
    • 错误处理:etcdctl member list
    复制代码
    Error:  client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:4001: connect: connection refused
    ; error #1: dial tcp 127.0.0.1:2379: connect: connection refused
    error #0: dial tcp 127.0.0.1:4001: connect: connection refused error #1: dial tcp 127.0.0.1:2379: connect: connection refused

    解决:
    vim /etc/etcd/etcd.conf 第六行结尾加上 ,http://127.0.0.1:2379
    systemctl restart etcd 重启解决
    复制代码
    • 错误处理:publish error: etcdserver: request timed out
    解决:所有节点同时启动

    五、 安装Docker,配置使用集群存储

    复制代码
    1、安装docker

    2
    、配置Docker守护程序使用有群集存储 [root@node1 ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://7i5u59ls.mirror.aliyuncs.com"], "cluster-store": "etcd://192.168.223.131:2379" }
    3、重启Docker进程,并检查配置是否正确
    [root@node1 ~]# systemctl restart docker
    [root@node1 ~]# docker info | grep "Cluster Store"
    Cluster Store: etcd://192.168.223.131:2379
    复制代码

    六、配置calico基于sysinit方式启动

    复制代码
    1、两台主机分别添加calico-node配置文件
    [root@node1 calico]# vim /etc/calico/calico.env 
    ETCD_ENDPOINTS="http://192.168.223.131:2379,http://192.168.223.130:2379"
    ETCD_CA_FILE=""
    ETCD_CERT_FILE=""
    ETCD_KEY_FILE=""
    CALICO_NODENAME="node1"
    CALICO_NO_DEFAULT_POOLS=""
    CALICO_IP="192.168.223.131"
    CALICO_IP6=""
    CALICO_AS=""
    CALICO_LIBNETWORK_ENABLED=true
    CALICO_NETWORKING_BACKEND=bird
    2、两台主机分别添加calico-node sysinit配置文件
    [root@node1 calico]# vim /etc/systemd/system/calico-node.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/run/docker.sock:/var/run/docker.sock \
    -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 \
    calico/node:v2.6.1
    ExecStop=-/usr/bin/docker stop calico-node
    Restart=on-failure
    StartLimitBurst=3
    StartLimitInterval=60s

    [Install]
    WantedBy=multi-user.target
    3、两台主机分别启动calico-node服务
    [root@node1 calico]# systemctl daemon-reload
    [root@node1 calico]# systemctl start calico-node
    [root@node1 calico]# tail -f /var/log/messages
    ...
    Mar 11 12:23:46 node1 docker: Starting libnetwork service
    Mar 11 12:23:46 node1 docker: Calico node started successfully
    4、下载calicoctl二进制文件,并添加执行权限
    [root@node1 calico]# wget -O /usr/local/bin/calicoctl https://github.com/projectcalico/calicoctl/releases/download/v1.6.1/calicoctl
    [root@node1 calico]# chmod +x /usr/local/bin/calicoctl
    [root@node1 system]# calicoctl node status
    Calico process is running.
    IPv4 BGP status
    +-----------------+-------------------+-------+----------+-------------+
    | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
    +-----------------+-------------------+-------+----------+-------------+
    | 192.168.223.131 | node-to-node mesh | up | 10:29:48 | Established |
    +-----------------+-------------------+-------+----------+-------------+
    IPv6 BGP status
    No IPv6 peers found.
    [root@node1 calico]# calicoctl get node
    NAME    
    node1   
    node2   
    node3   
    复制代码

    七、测试calico网络

    复制代码
    1、创建网络
    [root@node1 ~]# docker network create --driver calico --ipam-driver calico-ipam net1
    #在任意一台主机,都可以看到新增的网络插件
    [root@node1 ~]# docker network ls
    2、在node1 node2 node3分别建立一个容器,查看IP地址
    [root@node1 ~]# docker run --net net1 --name workload-A -tid busybox
    [root@node1 ~]# docker exec -it workload-A ip addr
    4: cali0@if5: mtu 1500 qdisc noqueue
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.166.128/32 scope global cali0
    valid_lft forever preferred_lft forever
    [root@node2 ~]# docker run --net net1 --name workload-B -tid busybox
    [root@node2 ~]# docker exec -it workload-B ip addr
    4: cali0@if5: mtu 1500 qdisc noqueue
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.104.0/32 scope global cali0
    valid_lft forever preferred_lft forever
    3、在node1的容器中(workload-A),ping各结点的容器IP,测试网络是否正常
    docker exec workload-A ping 192.168.104.0

    PING 192.168.104.0 (192.168.104.0): 56 data bytes
    64 bytes from 192.168.104.0: seq=0 ttl=62 time=0.435 ms
    64 bytes from 192.168.104.0: seq=1 ttl=62 time=0.507 ms
     
    4、查看各结点的路由表
    [root@node1 ~]# route -n
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    0.0.0.0 192.168.223.2 0.0.0.0 UG 100 0 0 ens33
    172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
    192.168.104.0 192.168.223.130 255.255.255.192 UG 0 0 0 ens33
    192.168.166.128 0.0.0.0 255.255.255.255 UH 0 0 0 calic5c95dfa8ad
    192.168.166.128 0.0.0.0 255.255.255.192 U 0 0 0 *
    192.168.223.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
    复制代码

     

    参考:

    Docker 使用Calico插件配置网络 - 重启一把梭 - 博客园 (cnblogs.com)

    【错误解决】新建etcd集群报错:publish error: etcdserver: request timed out_安安csdn的博客-CSDN博客

    Error: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:4001: getsockopt: connection refused - 无踪无影 - 博客园 (cnblogs.com)

     

  • 相关阅读:
    系统架构师
    <C/C++内存管理>——《C++初阶》
    【JAVA刷题初阶】刷爆力扣第四弹——栈
    js控制台输出佛祖保佑图形图案/彩色图形图案实例代码
    基于SSH开发网上机票销售系统
    【大数据开发技术】实验01-Hadoop安装部署
    Pytorch plt.scatter()函数用法
    c语言:汽车时代
    CentOS Linux release 7.9.2009 (Core)中安装配置Tomcat
    Casbin之Model模型存储(动态初始化)、Model模型存储(字符串加载)
  • 原文地址:https://www.cnblogs.com/Biuget-Golang/p/16936126.html