Calico是一个纯三层的虚拟网络方案,Calico为每个容器分配一个IP,每个host都是router,把不同host的容器连接起来。与vxlan不同的是:calico不对数据包进行封装,不需要NAT和端口映射,扩展性和性能都很好

与其他容器网络相比,calico还有一个优势:network policy。用户可以动态定义ACL规则,控制进出容器的数据包,实现业务需求

calico依赖etcd在不同主机间共享和交换信息,存储calico网络状态。calico网络中每个主机都要运行calico组件,提供容器interface管理,动态路由,动态ACL,报告状态等功能

部署calico

1.安装etcd

安装好后执行: etcd -listen-client-urls http://192.168.7.222:2379 -advertise-client-urls http://192.168.7.222:2379

2.修改docker1和docker2中的docker的配置文件:/etc/systecd/system/docker.service.d/10-machine.conf

重启docker服务

3。在docker1和docker2上部署calico

wget -O /usr/local/bin/calicoctl https://github.com/projectcalico/calicoctl/releases/download/v1.6.1/calicoctl   下载calico安装包

修改权限

启动calico服务:calicoctl  node run

注:calico服务启动的时候主要是运行一个calico容器

1.启动calico服务的时候,首先设置主机网络,例如enable IP forwarding

2.下载并启动calico-node容器,calico会以容器的形式运行(与weave类似)

注:在启动服务的时候如果报错,注意以上两点:1. ETCD_ENDPOINTS=http://127.0.0.1:2379这里应该是连接我们的etcd的服务器,是我们之前在docker配置文件中设置的/etc/systemd/system/docker.service.d/,在本实验中应该是 ETCD_ENDPOINTS=http://192.168.7.222:2379

2.由于通过calicoctl node run启动服务时,会自动下载镜像 quay.io/calico/node:latest,tag是latest默认的,所以我们可以提前下载好相关的镜像,使用 docker pull quay.io/calico/node:v2.6.2

3.由于docker node run 服务是写好了的代码进行启动的,但是我们也可以自己去手动运行容器启动,自己手动启动的时候注意以上两点即可

docker run --net=host --privileged --name=calico-node -d --restart=always -e NODENAME=docker2 -e CALICO_NETWORKING_BACKEND=bird -e CALICO_LIBNETWORK_ENABLED=true  -e ETCD_ENDPOINTS=http://192.168.7.222:2379  -v /var/log/calico:/var/log/calico  -v /var/run/calico:/var/run/calico  -v /lib/modules:/lib/modules -v /run:/run -v /run/docker/plugins:/run/docker/plugins -v /var/run/docker.sock:/var/run/docker.sock quay.io/calico/node:v2.6.2

这是官方文档的方式,在启动服务的时候指定镜像

启动calico服务一步搞定的办法是:ETCD_ENDPOINTS=http://172.17.8.101:2379 calicoctl node run --node-image=quay.io/calico/node:v2.6.2

指定自己的etcd的endpoints,指定镜像的tag

查看calico状态:

calicoctl node status

官网安装calico服务地址(centos)https://docs.projectcalico.org/v2.6/getting-started/docker/installation/vagrant-coreos/

2.创建calico网络

docker network create --driver calico --ipam-driver calico-ipam calico-net1

--driver calico:网络使用calico驱动

--ipam-driver calico-ipam:指定使用calico的IPAM驱动管理IP

calico是global网络,etcd会将calico-net1同步到所有主机

calico网络结构:

在docker2上运行容器:

docker run -itd --name calico1 --network=calico-net1 busybox

查看calico1的网络配置

calico0shi calico interface 分配的IP为192.168.100.64/32.calico0对应docker2上6的编号的interface

docker2将作为router负责转发目的的地址为calico1的数据包,所有发送到calico1的数据都会给 calie9fa9faf0fa,因为 calie9fa9faf0fa与cali0是一对veth pair,calico1能收到数据

docker2的网络结构如上盗图:

下面我们来看一下docker1上的网络结构

由于calico是global网络,所以我们不需要启动calico服务,也可以看到我们建立的calico网络:calico-net1

启动calico服务后,在docker1中运行容器:

使用与docker2上相同的网段calico-net1后获得的IP为192.168.72.129/32

在docker1上新建容器后可以看到docker1上新添加了2条路由:

1.目的地址为dockwe2上得容器,网关是:192.168.7.226

2.目的地址为 calico-node容器的路由

下面我们来看一下docker1与docker2的网络是否能够ping通

注:如果启动calico node run 服务时没有任何输出的结果,或者使用caloci网络运行的容器无法和其他host上的容器ping通,可能是由于host上的calicoctl的安装包没有下载好,建议重新下载或者是在其他host上重新拷贝一份

现在docker1与docker2上的容器之间的通信如上图:盗图

1.根据docker2上的calico1的容器的路由表,将数据包从cali0发出

2.数据经过veth pair到达docker2,查看路由表,数据根据ens160发给daoker1(192.168.7.235)上

3.docker2收到数据后,根据路由表发送给 cali5224fe3869b,通过veth pair cali0发送到calicao2中

接下来我们看不同calico网络之间的连通性

1.创建calico-net2

2.运行容器calico3使用calico-net2网络:docker run -itd --name calico3 --network calico-net2 busybox

3.

calico为calico3容器分配了192.168。72.130/32网络,验证相同的host上的容器之间是否能ping通

虽然calico2和calico3在同一个host上,但是由于他们使用的是不同的calico网络,也是不能通的

calico默认的policy规则是:容器只能与同一个calico网络中的容器通信

calico的每个网络都有一个同名的profile,profile中定义了该网络的policy,我们具体看一下calico-net1的profile:

首先我们要编辑一个文件:/etc/calico/calicoctl.cfg

1.创建目录mkdir /etc/calico

2.vim /etc/calico/calicoctl.cfg

apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
  datastoreType: "etcdv2"
  etcdEndpoints: "http://etcd1:2379,http://etcd2:2379"

具体参考;https://docs.projectcalico.org/v2.6/reference/calicoctl/setup/etcdv2,

如果不编辑/etc/calico/calicoctl.cfg这个文件的话,会报一下错误:Failed to get resources: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:2379: getsockopt: connection refused

3.查看我们的calico-net1的profile

calico get  profile calico-net1 -o yaml

1.命名为calico-net1

2.为profile添加一个tag calico-net1,这个tag默认和网络名一致,但是是可以任意设置,这个tag和上面的name没有一点关系,这个tag后面会用到

3.egress:对容器个发出的数据包进行限制,当前没有任何限制

4.ingress:对进入容器的数据包进行限制,当前是接收来自tag calico-net1的容器,其实就是接收本网段的数据包

calicoctl:管理资源,资源通过yaml和json格式来定义,通过calicoctl create或者apply方式来创建或应用,通过calicoctl get来查看

calicoctl支持的资源类型有:bgpPeer, hostEndpoint, policy, ipPool, profile, workloadEndpoint等

制定policy

calico能够让用户定义灵活的policy规则,精细化控制容器的流量

试验:创建一个新的calico网络calico-web并部署一个httpd容器

定义calico-web中的容器允许被calico-net2中的容器访问

web2容器的IP是192.168.72.131

现在还无法访问192.168.72.131的80端口

创建policy文件web.yml

创建好后,使用命令:calicoctl create -f web.yuml使用这个资源

创建calico的IP池

首先查看IP pool:calicoctl get ippool

创建ippoll首先创建一个资源文件

vim pool.yaml

运行命令进行创建:calicoctl create -f ippool.yaml

我们在进行查看:calicoctl get ippool

有我们自定义的10.20.0.0/24的网段

验证连通性:

创建一个subnet为10.20.0.0/24的网络,通过--subnet=10.20.0.0/24来指定subnet

运行容器个,查看他的IP

使用calico-sub运行的容器的IP是10.20.0.129,验证同一host上的容器是否能通

另一个容器的IP是192.168.72.139

不能ping通

不同host上的相同subnet的容器是可以ping通的

centos7下安装docker(15.7容器跨主机网络---calico)的更多相关文章

  1. centos7下安装docker(16.1docker跨主机存储--Rex-Ray)

    一.Rex-Ray以standalone进程的方式运行在docker主机上,安装方法很简单:在docker1和docker2上运行如下命令: curl -sSL https://dl.bintray. ...

  2. centos7下安装docker(15.5容器跨主机网络--flanneld)

    flannel是由CoreOS研究的一种覆盖网络(overlay network)网络工具,目的是帮助每一个host主机有一个完整的子网: 功能是:让集群中不同节点的主机创建的容器都有一个唯一的虚拟I ...

  3. centos7下安装docker(19容器架构)

    What,Why,How What:什么是容器? 说起容器大家想到的是什么?      集装箱(container),虚拟机,docker,k8s 1. 没毛病,因为容器与集装箱的英文都可以翻译成co ...

  4. centos7下安装docker(11容器操作总结)

    这段时间主要是学习了对容器的操作,包括:容器的状态:start,stop,restart,rename,pause,unpause,rm,attach,exec,kill,logs:还学习了对容器的资 ...

  5. centos7下安装docker(10容器底层--cgroup和namespace)

    cgroup和namespace是实现容器底层的重要技术 cgroup:实现资源限制 namespace:实现资源隔离 1.cgroup:control group Linux操作系统通过cgroup ...

  6. centos7下安装docker(9容器对资源的使用限制-内存)

                  一个docker Host上面会运行若干容器,每个容器都需要CPU,内存和IO资源.容器提供了控制分配多少CPU,内存给每个容器的机制,避免摸个容器因占用太多资源而影响其他 ...

  7. docker(一) Centos7下安装docker

    docker(一) Centos7下安装dockerdocker(二) windows10下安装dockerdocker(三) 镜像和容器常用命令 docker(四) 使用Dockerfile构建镜像 ...

  8. CentOS7下安装docker(Docker系列1)

    CentOS7下安装docker 系统要求 为了安装docker,需要准备 64-bit的CentOS 7 删除非官方的Docker包 yum的仓库中有一个很旧的Docker包, 现在Docker官方 ...

  9. centos7下安装docker与镜像加速

    1.背景 centos7下安装docker 2.安装 第一步:检查是否为centos7版本 第二步:依赖环境安装 执行如下两个命令: yum -y install gcc yum -y install ...

随机推荐

  1. SSM 设置静态资源处理

    使用weblogic的虚拟路径virtual-directory-mapping 在页面上展示文件服务器上的图片 <weblogic-web-app> ......省略其他部分 <c ...

  2. java——初识

    java是现在最火的高级编程语言之一,功能强,应用广. java可以做什么? 1. 开发桌面应用程序 2. 开发面向Internet的应用程序 开发java程序的基本步骤: 1. 编写源程序:mypr ...

  3. python中的魔法属性

    目录 1. __doc__ 2. __module__ 和 __class__ 3. __init__ 4. __del__ 5. __call__ 6. __dict__ 7. __str__ 8. ...

  4. 数据库sql语句常见面试题

    转载:本文转载自:https://blog.csdn.net/woshinidedege/article/details/78659202 一.有以下几张表及表结构Student(Sid,Sname, ...

  5. log4j介绍

    log4j.properties文件的三种加载方式 1.默认自动加载 满足以下条件时: 1).配置文件名为log4j.properties 2).在classpath根目录下(即resources根目 ...

  6. chartControl ViewType.Bar 用法测试

    使用方法 一. Datatable : chartControl1.Series.Clear(); DataTable dt = new DataTable(); dt.Columns.Add(&qu ...

  7. Appium+java 获取元素状态

    元素的属性我们经常会用到,当定位到某个元素后,有时会需要用到这个元素的text值.className.resource-id.checked等.  一般标准的属性我们都可以通过get_attribut ...

  8. RESTful相关理解

    just 一种接口规范,写法种类不止一种  类似python的那啥标准

  9. peewee基本操作

    本文将简单的介绍Peewee,一览它的主要特点,主要涉及到: 模型定义 存储数据 检索数据 注意:如果你偏爱稍微高级一点的教程, peewee建立类似twitter应用 是一篇结合Flask框架与pe ...

  10. 最详细的C++对应C#的数据类型转换

    C++ ---------------------- C# LDWORD ----------------IntPtr LLONG-------------------Intptr bool ---- ...