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通。
calico在docker上的部署及验证的更多相关文章
- LinuxMint下Docker的安装部署和验证
通过lsb_release命令查看以下我的LinuxMint发行版, 查看以下我的Linux内核版本, Docker要求Linux内核版本必须在要在3.10以上,显然我们的系统是满足的. 1. Doc ...
- Spring Boot在Docker上的部署
一.准备工作 1.1 安装Docker环境 Docker 给旧版本的WIN系统提供的是Docker Toolbox下载(https://docs.docker.com/toolbox/overview ...
- .net core 在 Docker 上的部署
Docker可以说是现在微服务,DevOps的基础,咱们.Net Core自然也得上Docker..Net Core发布到Docker容器的教程网上也有不少,但是今天还是想来写一写.你搜.Net co ...
- CentOS7+Docker+MangoDB下部署简单的MongoDB分片集群
简单的在Docker上快速部署MongoDB分片集群 前言 文中使用的环境如下 OS:CentOS Linux release 7.5.1804 (Core) Docker:Docker versio ...
- (1)RabbitMQ在Docker上安装
1.简介 在来学习RabbitMQ时候,我觉得很有必要先把它的环境先搭建起来,这样后面的示例才能进行.因为之前自己手动在Linux服务器上搭建过Elasticsearch,当时踩过太多坑了,浪费太多时 ...
- Flask 教程 第十九章:Docker容器上的部署
本文翻译自The Flask Mega-Tutorial Part XIX: Deployment on Docker Containers 这是Flask Mega-Tutorial系列的第十九部分 ...
- 在Docker上部署使用Azure CLI镜像
Docker是非常流行的容器技术,在Docker中安装部署多种工具非常快速和方便:而Azure CLI是微软提供的可以在Linux/Mac上运行的跨平台命令行管理工具,本文介绍如何在Azure上安装部 ...
- 定期从Docker上部署的MySQL备份数据
前段时间公司停电,正巧赶上周一领导要开会要过一遍项目,然而项目所依赖的MySQL数据库是直接部署在宿主机,且因为各人部署方式不同的原因,花了很久才在开会前启动起来.于是开完会后,我第一件事就是把原先依 ...
- .NET Core 3.0 部署在docker上运行
自从.NET Core3.0发布之后,写了几篇关于.NET Core 3.0的文章,有助于你快速入门.NET Core3.0. 本篇文章主要讲解如何一步步创建一个mvc项目,然后发布并部署在Docke ...
随机推荐
- android客户端向服务器端验证登陆方法的实现1
遇到的问题:一个条件查询与多个条件查询,所用到的方式不一样 参考文档: http://www.oschina.net/question/1160609_133366 mybatis多条件查询的一 ...
- [RFC] Simplifying kernel configuration for distro issues
http://lwn.net/Articles/507276/ From: Linus Torvalds <torvalds-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b-A ...
- Hive merge(小文件合并)
当Hive的输入由非常多个小文件组成时.假设不涉及文件合并的话.那么每一个小文件都会启动一个map task. 假设文件过小.以至于map任务启动和初始化的时间大于逻辑处理的时间,会造成资源浪费.甚至 ...
- 在命令行下运行Matlab
2014-04-20 22:08:11 在命令行下执行: matlab -help 可以得到帮助文件: Usage: matlab [-h|-help] | [-n | -e] [-arch | v= ...
- mac下执行文件出现Permission Denied的解决
mac 下终端访问文件出现“Permission Denied”解决方案: 一个文件有3种权限,读.写.可执行,你这个文件没有可执行权限,需要加上可执行权限. 1. 终端下先 cd到该文件的目录下 2 ...
- 10个必需的iOS开发工具和资源
本文转载至 http://mobile.51cto.com/iphone-418166.htm 界面总不是一件很容易事,尤其是iPhone/iPad的界面,做过iOS开发的程序员,一定会感到开发iPh ...
- stretchableImageWithLeftCapWidth
本文转载至 http://www.cnblogs.com/bandy/archive/2012/04/25/2469369.html (NSInteger)topCapHeight 这个函数是UIIm ...
- kubernetes-handbook 阅读笔记
文档地址 https://jimmysong.io/kubernetes-handbook/concepts/ Pod是在Kubernetes集群中运行部署应用或服务的最小单元,它是可以支持多容器的. ...
- Tomcat设置虚拟文件夹
需求 在做B/S的应用时.常常会遇到一个问题,站点上传的一些图片不是保存在应用server以下.而是保存在别的文件夹,可是页面中又需要能訪问到这些图片.这时,应用server的"虚拟文件夹& ...
- 给js设定一个统一的入口
javascript是种脚本语言,浏览器下载到哪儿就会运行到哪儿,这样的特性会为编程提供方便,但也easy使程序过于凌乱.支离破碎. js从功能上能够分为两大部分--框架部分和应用部分,框架部分提供的 ...