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. 模拟获取post数据的方式

    使用下面两种方法可以获取post数据 .通过$HTTP_RAW_POST_DATA获取 $post=$GLOBALS['HTTP_RAW_POST_DATA']; 但需要修改相应的php.ini指令 ...

  2. C-Linux_毫秒级随机值获取

    秒级随机值-常用方法: #include <stdlib.h> #include <stdio.h> #include <stdio.h> #include < ...

  3. vue-cli创建的项目的目录结构及说明

    转自:http://blog.csdn.net/qq_34543438/article/details/72868546?locationNum=3&fps=1 一. ├── build    ...

  4. vuejs2.0使用Sortable.js实现的拖拽功能

    简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jquery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...

  5. 【代码笔记】Web-JavaScript-JavaScript 类型转换

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  6. 吴恩达机器学习笔记 —— 7 Logistic回归

    http://www.cnblogs.com/xing901022/p/9332529.html 本章主要讲解了逻辑回归相关的问题,比如什么是分类?逻辑回归如何定义损失函数?逻辑回归如何求最优解?如何 ...

  7. Nginx 负载均衡4种模式

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/80541464 本文出自[赵彦军的博客] 4 种负载均衡算法 upstream 支持 ...

  8. SQL Server Alert发送告警邮件少了的原因

    最近突然发现我们部署在数据库上面的告警(Alert),当错误日志里面出现错误时,并不是每个错误日志都会发送邮件出来.如下所示,设置了告警"SQL Server Severity Event ...

  9. [20190321]smem的显示缺陷.txt

    [20190321]smem的显示缺陷.txt1.smem 加入-m参数显示存在缺陷,map的信息不全:# smem -tk -m -U oracle -P "oraclepeis|ora_ ...

  10. 通过Socket让远程电脑执行脚本

    实现功能: 客户端发送命令,服务器接收命令并执行 服务端: import socketserver, os class MyTCPHandler(socketserver.BaseRequestHan ...