一.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]# cat /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: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> 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: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> 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)

Docker使用Calico配置网络模式的更多相关文章

  1. docker学习3-虚拟网络模式

    一.虚拟机网络模式 在理解docker网络隔离前,先看下之前虚拟机里对网络的处理,VirtualBox中有4中网络连接方式: NAT Bridged Adapter Internal Host-onl ...

  2. Docker的4种网络模式

    我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: · host模式,使用--net=host指定. · container ...

  3. Docker的4种网络模式详细介绍

    docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式: bridge模式:使用–net =bridge指定: host模式:使用–net = ...

  4. 1021 docker搭建mysql、网络模式、grid

    1.搭建并连接mysql服务 1.1.mysql官方命令 https://hub.docker.com/_/mysql/ #下载mysql镜像: docker pull mysql #启动mysql: ...

  5. docker的四种网络模式

    /* 1. host模式 : docker run 使用 --net=host指定 docker使用的网络实际上和宿主机一样 2. container模式: 使用 --net=container:co ...

  6. Docker系列04—Docker的网络模式详解

    本文收录在容器技术学习系列文章总目录 1.Docker的四种网络模式 (1)docker四种网络模式如下: Bridge contauner   桥接式网络模式 Host(open) containe ...

  7. docker之 网络模式和跨主机通信

    Docker的四种网络模式Bridge模式 当Docker进程启动时,会在主机上创建一个名为docker0... Docker的四种网络模式 Bridge模式 当Docker进程启动时,会在主机上创建 ...

  8. Docker 网络模式和跨主机通信

    Docker的四种网络模式 Bridge模式 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上.虚拟网桥的工作方式和物理交 ...

  9. 一分钟看懂Docker的网络模式和跨主机通信

    文章转载自:http://www.a-site.cn/article/169899.html   Docker的四种网络模式Bridge模式 当Docker进程启动时,会在主机上创建一个名为docke ...

  10. docker网络模式----入门docker的难点

    众所周知,现在docker是轻量级虚拟化的典型代表!这段时间想要建立一个分布式系统,但是手头上主机没那么多,所以使用docker进行虚拟化,但是在使用的过程中对网络这一部分是一直不太理解,特别找了一篇 ...

随机推荐

  1. 命令行配置Windows高级防火墙

    今天正好看到个帖子,询问如何通过命令行配置防火墙策略中远程IP的地址,特别是添加新的地址. 就是图中Scope里Remote IP address的地址. 第一反应就是用netsh firewall来 ...

  2. Kubernetes 监控--Prometheus

    在早期的版本中 Kubernetes 提供了 heapster.influxDB.grafana 的组合来监控系统,在现在的版本中已经移除掉了 heapster,现在更加流行的监控工具是 Promet ...

  3. 案例分享-https证书链不完整导致请求失败

    背景 话不多说,直接上堆栈 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX p ...

  4. Linux基础_1_简介

    Linux是什么 一款优秀的操作系统软件,特性是一切皆文件:一切设备皆文件!一切设备的设置皆修改配置文件!一切服务的搭建皆修改配置文件!(庞大的树形结构文件系统) 根据FHS标准,Linux目录有以下 ...

  5. springMVC必要jar包

    spring-aop-4.3.2.RELEASE.jar :: 包含在应用中使用Spring 的AOP 特性时所需的类和源码级元数据支持. spring-beans-4.3.2.RELEASE.jar ...

  6. 四、docker容器管理

    一.docker容器管理 1.1 容器查看-ps命令 显示本地容器列表,但是默认不显示关闭的容器,只显示运行中的容器,除非加上命令选项 -a 用法:docker ps [-a 显示所有容器,默认只显示 ...

  7. 九、Django3的ASGI

    九.Django3的ASGI 9.1.Web应用程序和web服务器 Web应用程序(Web)是一种能完成web业务逻辑,能让用户基于web浏览器访问的应用程序,它可以是一个实现http请求和响应功能的 ...

  8. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)-L Bit Sequence

    题意 给你两个数l,m,大小为m的数组a,求[0,l]之间满足以下条件的数x的个数: 对于任何i输入[0,m-1],f(x+i)%2=a[i]:f(k):代表k在二进制下1的个数 m的范围<=1 ...

  9. Flutter 构建windows应用

    Flutter Windows 桌面端支持进入稳定版 | Flutter 中文文档 | Flutter 中文开发者网站 从2.10之后的版本,flutter已经正式支持构建windows应用.不过距离 ...

  10. Day13 note

    super注意点: 1.super调用父类的构造方法,必须在构造方法的第一行 2.super必须只能出现在子类的方法或者构造方法中 3.super和this不能同时调用构造方法对比this: 1.代表 ...