etcd提供了多种部署集群的方式,在「通过静态发现方式部署etcd集群」 一文中我们介绍了如何通过静态发现方式部署集群。

不过很多时候,你只知道你要搭建一个多大(包含多少节点)的集群,但是并不能事先知道这几个节点的ip,从而无法使用--initial-cluster参数。

这个时候,你就需要使用discovery的方式来搭建etcd集群。discovery方式有两种:etcd discoveryDNS discovery

这里我们先介绍下etcd discovery方式。这种启动方式依赖另外一个ETCD集群,在该集群中创建一个目录,并在该目录中创建一个_config的子目录,并且在该子目录中增加一个size节点,指定集群的节点数目。在这种情况下,将该目录在ETCD中的URL作为节点的启动参数,即可完成集群启动。

etcd discovery集群方式分为两种:自定义的etcd discovery和公共 etcd discovery。

  • 公共etcd discovery服务

公共的discovery就是通过CoreOS提供的公共discovery服务申请token。

获取集群标识

集群标识可以从已有的etcd集群中创建,这里通过CoreOS提供的公共discovery服务申请token

$ curl -w "\n" 'https://discovery.etcd.io/new?size=3'
https://discovery.etcd.io/c5b52d9d8fd7af9017bd7b54cf13e420

以上命令会生成一个链接样式的token,参数size代表要创建的集群大小。

修改etcd配置

依次编辑三个节点的etcd配置文件,删除ETCD_INITIAL_CLUSTERETCD_INITIAL_CLUSTER_STATEETCD_INITIAL_CLUSTER_TOKEN配置参数并加上ETCD_DISCOVERY参数为获取的集群标识即可。

这里以etcd1节点为例(etcd2、etcd3同理):

# 编辑etcd配置文件
$ vim /opt/etcd/config/etcd.conf ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd/etcd1"
ETCD_LISTEN_PEER_URLS="http://192.168.2.210:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.2.210:2379,http://192.168.2.210:4001"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.2.210:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.2.210:2379,http://192.168.2.210:4001"
ETCD_DISCOVERY="https://discovery.etcd.io/c5b52d9d8fd7af9017bd7b54cf13e420"

测试etcd集群

按上面配置好各集群节点后,分别在各节点启动etcd。

$ systemctl start etcd

启动完成后,执行以下命令:

$ curl -w '\n' https://discovery.etcd.io/c5b52d9d8fd7af9017bd7b54cf13e420
{"action":"get","node":{"key":"/_etcd/registry/c5b52d9d8fd7af9017bd7b54cf13e420","dir":true,"nodes":[{"key":"/_etcd/registry/c5b52d9d8fd7af9017bd7b54cf13e420/a44795c1770e34ec","value":"etcd1=http://192.168.2.210:2380","modifiedIndex":1301600912,"createdIndex":1301600912},{"key":"/_etcd/registry/c5b52d9d8fd7af9017bd7b54cf13e420/a085e7281cb15be2","value":"etcd2=http://192.168.2.211:2380","modifiedIndex":1301601030,"createdIndex":1301601030},{"key":"/_etcd/registry/c5b52d9d8fd7af9017bd7b54cf13e420/173070ace158b9d1","value":"etcd3=http://192.168.2.212:2380","modifiedIndex":1301601101,"createdIndex":1301601101}],"modifiedIndex":1301571633,"createdIndex":1301571633}}

从输出结果看,说明集群已在discovery.etcd.io注册成功。

查看集群成员

$ etcdctl --endpoints "http://192.168.2.210:2379" member list
173070ace158b9d1: name=etcd3 peerURLs=http://192.168.2.212:2380 clientURLs=http://192.168.2.212:2379,http://192.168.2.212:4001 isLeader=false
a085e7281cb15be2: name=etcd2 peerURLs=http://192.168.2.211:2380 clientURLs=http://192.168.2.211:2379,http://192.168.2.211:4001 isLeader=false
a44795c1770e34ec: name=etcd1 peerURLs=http://192.168.2.210:2380 clientURLs=http://192.168.2.210:2379,http://192.168.2.210:4001 isLeader=true

更多集群使用方法可参考「通过静态发现方式部署etcd集群」一文。

自定义的etcd discovery服务

这种方式就是利用一个已有的etcd集群来提供discovery服务,从而搭建一个新的etcd集群。

假设已有的etcd集群的一个访问地址是:192.168.2.210,那么我们首先需要在已有etcd中创建一个特殊的key,方法如下:

$ curl http://192.168.2.210:2379/v2/keys/discovery/8ebee6723eaf3f5c7724e879f8797e85/_config/size -d value=3

{"action":"create","node":{"key":"/discovery/8ebee6723eaf3f5c7724e879f8797e85/_config/size/00000000000000000011","value":"3","modifiedIndex":11,"createdIndex":11}}

其中value=3表示本集群的大小,即: 有多少集群节点。而 8ebee6723eaf3f5c7724e879f8797e85就是用来做discovery的token。

值得注意的是:如果实际启动的etcd节点个数大于discovery token创建时指定的size,多余的节点会自动变为proxy节点。

etcd proxy模式简介:

作为反向代理把客户的请求转发给可用的etcd集群,新节点加入集群如果核心节点数已满足要求,则自动转化为proxy模式,此项不会在节点不足时逆向转化为实际节点。

接下来的配置就和公共etcd discovery服务中的方法类似,就不再重复阐述了。

参考文档

http://www.google.com

http://t.cn/RXzZrI9

https://www.zhangluya.com/?p=147

https://segmentfault.com/a/1190000003852735

基于已有集群动态发现方式部署 Etcd 集群的更多相关文章

  1. 基于 DNS 动态发现方式部署 Etcd 集群

    使用discovery的方式来搭建etcd集群方式有两种:etcd discovery和DNS discovery.在 「基于已有集群动态发现方式部署etcd集群」一文中讲解了etcd discove ...

  2. 通过静态发现方式部署 Etcd 集群

    在「etcd使用入门」一文中对etcd的基本知识点和安装做了一个简要的介绍,这次我们来说说如何部署一个etcd集群. etcd构建自身高可用集群主要有三种形式: 静态发现: 预先已知etcd集群中有哪 ...

  3. Kubernetes后台数据库etcd:安装部署etcd集群,数据备份与恢复

    目录 一.系统环境 二.前言 三.etcd数据库 3.1 概述 四.安装部署etcd单节点 4.1 环境介绍 4.2 配置节点的基本环境 4.3 安装部署etcd单节点 4.4 使用客户端访问etcd ...

  4. 基于Docker部署ETCD集群

    基于Docker部署ETCD集群 关于ETCD要不要使用TLS? 首先TLS的目的是为了鉴权为了防止别人任意的连接上你的etcd集群.其实意思就是说如果你要放到公网上的ETCD集群,并开放端口,我建议 ...

  5. 使用二进制文件部署Etcd集群

    Etcd 是一个分布式键值存储系统,Kubernetes使用Etcd进行数据存储,所以先准备一个Etcd数据库,为解决Etcd单点故障,应采用集群方式部署,这里使用3台组建集群,可容忍1台机器故障,当 ...

  6. 部署etcd集群

    部署etcd集群 第一步:先拉取etcd二进制压缩包 wget https://github.com/coreos/etcd/releases/download/v3.3.2/etcd-v3.3.2- ...

  7. 2、二进制安装K8s 之 部署ETCD集群

    二进制安装K8s 之 部署ETCD集群 一.下载安装cfssl,用于k8s证书签名 二进制包地址:https://pkg.cfssl.org/ 所需软件包: cfssl 1.6.0 cfssljson ...

  8. suse 12 二进制部署 Kubernetets 1.19.7 - 第02章 - 部署etcd集群

    文章目录 1.2.部署etcd集群 1.2.0.下载etcd二进制文件 1.2.1.创建etcd证书和私钥 1.2.2.生成etcd证书和私钥 1.2.3.配置etcd为systemctl管理 1.2 ...

  9. centos6.5环境基于conga的web图形化界面方式配置rhcs集群

    一.简介 RHCS 即 RedHat Cluster Suite ,中文意思即红帽集群套件.红帽集群套件(RedHat Cluter Suite, RHCS)是一套综合的软件组件,可以通过在部署时采用 ...

随机推荐

  1. 【LINQ】Select与SelectMany的区别

    Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值.Select() 为每个源值生成一个结果值.因此,总体结果是一个与源集合具有相同元素数目的集合.与之相反,Sel ...

  2. 跟着9张思维导图学习Javascript js 关键字和保留字 css3中的BFC,IFC,GFC和FFC

    跟着9张思维导图学习Javascript   学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将 po 出我收集的 9 张 javascript 相关的思维导图(非原创). 思维导图小ti ...

  3. 解决securecrt连接慢(而xshell秒连)的问题

    打开securecrt的跟踪选项,观察输出信息来诊断 解决方法: 1)首先,将全局设置中,GSSAPI属性由自动改为GSSAPI   2)其次,将不支持的多余的密钥交换去掉   3)最后,可以将服务端 ...

  4. Mysql-MariaDB设置延迟同步

    CHANGE MASTER TO MASTER_DELAY = N; N为秒数

  5. 阿里云Mysql导入大数据文件

    1.查询数据保存为CSV文件 select * from account into outfile '/root/account.csv' fields terminated by ',' enclo ...

  6. python中的__init__(self)是什么意思呢

    python中的__init__(self)是什么意思呢 init(self)这个时类的初始化函数 1 2 3 4 class Obj: def init(self): print 1 obj = O ...

  7. discuz x3.2简化的搜索框代码

    这是在做一个模板时改的,并不代表这是一个美化或者优化,只是特殊情况下的需要.只有一个搜索框,默认帖子搜索,无搜索按钮,输入内容直接回车搜索. <!--{if $_G['setting']['se ...

  8. HashMap、HashTable 区别

    区别项 HashMap HashTable 继承和实现 public class HashMap<K,V> extends AbstractMap<K,V> implement ...

  9. selenium 中在 iframe 内的元素定位

    有些时候 元素明明就在 但是通过什么方式定位都提示 定位不到元素 此时就要考虑元素是不是内嵌在iframe 中 对于内嵌在 ifra中的元素定位 首先定位到 iframe 元素 例如 iframe = ...

  10. 【oracle】根据日、月、年分组

    --根据日期分组--------------------------------------------------- SELECT to_char(to_date(XXXX, 'yyyymmdd') ...