基于etcd服务发现的overlay跨多宿主机容器网络
时间:2022-07-25
本文章向大家介绍基于etcd服务发现的overlay跨多宿主机容器网络,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
向您推荐
基于etcd服务发现的overlay跨多宿主机容器网络
环境限制
最简单的时间同步方式,在各个宿主机上执行sudo ntpdate cn.pool.ntp.org 这通常是临时方案.终极方案是搭建时间同步的ntp服务.
环境准备及角色分配
- 三台ubuntu14.04的server 由于etcd采用Raft算法, 因此在做决策时需要多数节点的投票, 所以一般部署为奇数节点: 3, 5, 7 主机名 ip 内核 启动docker容器名称 docker engine版本 DC-server1 192.168.1.158 4.2.0-27-generic server1(centOS7) 1.10.3 DC-server2 192.168.1.60 4.2.0-27-generic server2(centOS7) 1.10.3 DC-server3 192.168.1.24 4.2.0-27-generic 1.10.3
- 实验目标:两个CentOS7容器server1,server2网络互通
下载分布式发现服务协调软件:etcd
下载cetcd软件并解压,实际就是将其二进制文件放到$PATH下面即可
aixin@DC-server1$ curl -L https://github.com/coreos/etcd/releases/download/v2.2.1/etcd-v2.2.1-linux-amd64.tar.gz -o etcd-v2.2.1-linux-amd64.tar.gz
aixin@DC-server1$ tar xzvf etcd-v2.2.1-linux-amd64.tar.gz
aixin@DC-server1$ sudo mv etcd etcdctl /bin
将以上的命令在三台机器上都执行一遍,或者使用scp将以上文件分发到另外两个主机
文件解压之后有如下几个文件:
Documentation etcd etcdctl
- Documents是文档
- etcd是服务的主执行文件
- etcdctl是用户客户端命令
启动etcd服务
aixin@DC-server1$ etcd -name node1
-initial-advertise-peer-urls http://192.168.1.158:2380
-listen-peer-urls http://192.168.1.158:2380
-listen-client-urls http://192.168.1.158:2379,http://127.0.0.1:2379
-advertise-client-urls http://192.168.1.158:2379
-initial-cluster-token etcd-cluster
-initial-cluster node1=http://${CLUSTER_IPS[0]}:2380,node2=http://${CLUSTER_IPS[1]}:2380,node3=http://${CLUSTER_IPS[2]}:2380
-initial-cluster-state new
-data-dir $ETCD_DATADIR &
aixin@DC-server2$ etcd -name node2
-initial-advertise-peer-urls http://192.168.1.60:2380
-listen-peer-urls http://192.168.1.60:2380
-listen-client-urls http://192.168.1.60:2379,http://127.0.0.1:2379
-advertise-client-urls http://192.168.1.60:2379
-initial-cluster-token etcd-cluster
-initial-cluster node1=http://${CLUSTER_IPS[0]}:2380,node2=http://${CLUSTER_IPS[1]}:2380,node3=http://${CLUSTER_IPS[2]}:2380
-initial-cluster-state new
-data-dir $ETCD_DATADIR &
aixin@DC-server3$ etcd -name node3
-initial-advertise-peer-urls http://192.168.1.24:2380
-listen-peer-urls http://192.168.1.24:2380
-listen-client-urls http://192.168.1.24:2379,http://127.0.0.1:2379
-advertise-client-urls http://192.168.1.24:2379
-initial-cluster-token etcd-cluster
-initial-cluster node1=http://${CLUSTER_IPS[0]}:2380,node2=http://${CLUSTER_IPS[1]}:2380,node3=http://${CLUSTER_IPS[2]}:2380
-initial-cluster-state new
-data-dir $ETCD_DATADIR &
在三台机器上分别启动etcd服务.CLUSTER_IPS=(192.168.1.158 192.168.1.60 192.168.1.24)
这是一个ip数组.
配置解析
- listen-peer-urls 用于节点与节点之间数据交换, 因此需要监听在其他节点可以访问的IP地址上 默认端口为: 2380 & 7001 (7001不推荐使用, 已基本废弃, 主要用于兼容老服务)
- listen-client-urls 用户客户机访问etcd数据, 一般监听在本地, 如果需要集中管理, 可以监听在管理服务器可以访问的IP地址上 默认端口为: 2379 & 4001 (4001不推荐使用, 已基本废弃, 主要用于兼容老服务)
- initial-advertise-peer-urls 该参数表示节点监听其他节点同步信号的地址 默认端口为: 2380 & 7001 (7001不推荐使用, 已基本废弃, 主要用于兼容老服务)
- advertise-client-urls 在加入proxy节点后, 会使用该广播地址, 因此需要监听在一个proxy节点可以访问的IP地址上 默认端口为: 2379 & 4001 (7001不推荐使用, 已基本废弃, 主要用于兼容老服务)
检查集群的启动是否正确
aixin@DC-server2$ etcdctl cluster-health
member 5a2567911e869c1 is healthy: got healthy result from http://192.168.1.158:2379
member 5a125ed3c29f1acb is healthy: got healthy result from http://192.168.1.24:2379
member 70622961dfd72d05 is healthy: got healthy result from http://192.168.1.60:2379
cluster is healthy
配置Docker并重启
- 在每一台docker宿主机上做如下配置,并重启docker
sudo vi /etc/default/docker
DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store etcd://<三个IP任选其一>:2379 --cluster-advertise eth0:2375"
sudo service docker restart
- 集群配置
--cluster-store= 参数指向docker daemon所使用key value service的地址(本例中即etcd的服务地址) --cluster-advertise= 参数决定了所使用网卡以及docker daemon端口信息
- 宿主机配置
上面的-H 的参数分别指定了docker demon服务的地址和协议
自动启动shell脚本(优化启动过程)
#!/bin/bash
source ~/workspace/conf/project.cfg
source ./etcd.conf
if [ $# != 1 ] ; then
echo "USAGE: $0 <SUDO_PASSWD>"
echo " e.g.: $0 aixin"
exit 1;
fi
SUDO_PASSWD=$1
NODE_IP=$(hostname --all-ip-addresses | awk '{print $1}')
ETCD_NODENAME=""
for ((i=1; i<=${#CLUSTER_IPS[*]}; i++))
do
if [ $1 == ${CLUSTER_IPS[i-1]} ];then
ETCD_NODENAME="node"${i}
fi
done
if [ -z $ETCD_NODENAME ];then
echo "you must enter an ip in CLUSTER_IPS list. conf file is etcd.conf"
exit 0;
fi
ETCD_DATADIR=${DATA_DIR}/etcd/${ETCD_NODENAME}
if [ ! -d $ETCD_DATADIR ];then
echo ${SUDO_PASSWD}|sudo -S mkdir -p $ETCD_DATADIR
fi
echo ${SUDO_PASSWD}|sudo -S ./etcd/etcd -name ${ETCD_NODENAME}
-initial-advertise-peer-urls http://${NODE_IP}:2380
-listen-peer-urls http://${NODE_IP}:2380
-listen-client-urls http://${NODE_IP}:2379,http://127.0.0.1:2379
-advertise-client-urls http://${NODE_IP}:2379
-initial-cluster-token etcd-cluster
-initial-cluster node1=http://${CLUSTER_IPS[0]}:2380,node2=http://${CLUSTER_IPS[1]}:2380,node3=http://${CLUSTER_IPS[2]}:2380
-initial-cluster-state new
-data-dir $ETCD_DATADIR &
创建overlay网络,并进行容器联通测试
- 以下部分省略,和我的另一篇文章测试过程一致:《基于consul服务发现的overlay跨宿主机容器网络》
参考
http://my.oschina.net/funwun/blog/689861
http://chunqi.li/2015/11/09/docker-multi-host-networking/
- 萌新刷题(十三)买卖股票的最佳时机
- 萌新刷题(十一)有效数字
- Hive性能优化统计每日IP CREATE TABLE ip_2014_12_29 AS SELECT COUNT(DISTINCT ip) AS IP FROM logdfs WHERE logda
- 算法中描述复杂度的大O是什么意思?
- 优化Mysql:3个简单的调整
- Redis的5个常见应用场景
- Mysql 索引你了解多少?
- Mysql 8 新特性 window functions 有什么用?
- 用两张图告诉你,为什么你的App会卡顿?
- MapReduce设计模式
- 一个Sqrt函数引发的血案
- 小程序优秀开发资源
- Redis 新数据结构 - Streams
- Kafka 是否可以用做长期数据存储?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL复杂where条件分析
- 超链接标签
- 【剑指Offer】二叉树的镜像
- 【redis6.0.6】redis源码慢慢学,慢慢看 -- 第四天:提纲掣领main函数(server)
- redis学习(六)
- 原生JS实现一个Ajax跨域请求
- 深入理解类加载机制:拨开迷雾见真章
- 修复postgres安装错误 Problem running post-install step. Installation may not complete correctly The datab
- automagica 调用windows画图以及登录qq
- 数据库PostrageSQL-高级特性
- 数据库PostgreSQL-安装
- CentOS 7 安装 PHP 7.4.0 正式版
- ABAP实现设计模式里的观察者-发布者模式
- 如何在SAP S/4HANA里创建自定义的partner function
- Rust 往事 | Loop 和 While True 之争