`
m635674608
  • 浏览: 5031336 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

etcd集群部署

 
阅读更多

一、Docker下部署etcd时的docker配置

docker网络配置方式的选择:bridge和host方式都可以。具体配置见下:

bridge方式(缺省):   

    docker run -it -p 2380:2380 -p 2379:2379   --name   myetcd22   4e5b8fabb3af   /bin/sh

host方式:

    docker run -it --network host   --name   myetcd22   4e5b8fabb3af   /bin/sh

说明:

    4e5b8fabb3af 为etcd的docker imageID

    2379和2380为etcd在IANA 的注册端口。以前为私有端口4001和7001。

后续举例,都以bridge方式为例。

 

二、etcd启动参数说明及注意事项

 

参数
使用说明
 
--name etcd0 本member的名字  
--initial-advertise-peer-urls http://192.168.2.55:2380

其他member使用,其他member通过该地址与本member交互信息。一定要保证从其他member能可访问该地址。静态配置方式下,该参数的value一定要同时在--initial-cluster参数中存在。

memberID的生成受--initial-cluster-token和--initial-advertise-peer-urls影响。

 
--listen-peer-urls  http://0.0.0.0:2380 本member侧使用,用于监听其他member发送信息的地址。ip为全0代表监听本member侧所有接口  
--listen-client-urls http://0.0.0.0:2379 本member侧使用,用于监听etcd客户发送信息的地址。ip为全0代表监听本member侧所有接口  
--advertise-client-urls http://192.168.2.55:2379 etcd客户使用,客户通过该地址与本member交互信息。一定要保证从客户侧能可访问该地址  
--initial-cluster-token etcd-cluster-2 用于区分不同集群。本地如有多个集群要设为不同。   

--initial-cluster etcd0=http://192.168.2.55:2380,

etcd1=http://192.168.2.54:2380

,etcd2=http://192.168.2.56:2380

本member侧使用。描述集群中所有节点的信息,本member根据此信息去联系其他member。

memberID的生成受--initial-cluster-token和--initial-advertise-peer-urls影响。

 
--initial-cluster-state new

用于指示本次是否为新建集群。有两个取值new和existing。如果填为existing,则该member启动时会尝试与其他member交互。

集群初次建立时,要填为new,经尝试最后一个节点填existing也正常,其他节点不能填为existing。

集群运行过程中,一个member故障后恢复时填为existing,经尝试填为new也正常。

 
-data-dir 指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指定-wal-dir,还会存储WAL文件;如果不指定会用缺省目录。

 

-discovery http://192.168.1.163:20003/v2/keys/discovery/78b12ad7-2c1d-40db-9416-3727baf686cb 用于自发现模式下,指定第三方etcd上key地址,要建立的集群各member都会向其注册自己的地址。  

 

 

三、etcd几种集群部署方式

etcd部署分两个阶段:集群建立阶段,集群运行阶段。

两个阶段中操作etcd的方法不同。

下面各种部署方式也分两个阶段说明。

etcd有三种集群部署方式:

1、static配置方式(要配置本方地址和其他人地址)

适用于在配置前已经明确各种信息的情况,比如集群的大小,各member的ip,端口等信息。

各member依靠配置得知其他member的联系地址。当然ip等信息可以通过环境变量传进去,不一定要写死。

 

假设需要建一个有三个节点的集群,三个节点地址分别为:192.168.2.55,192.168.2.54,192.168.2.56。

1.1、集群建立阶段

在第一个节点上执行:

etcd --name etcd0 --initial-advertise-peer-urls http://192.168.2.55:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.2.55:2379 \
--initial-cluster-token etcd-cluster-2 \
--initial-cluster etcd0=http://192.168.2.55:2380,etcd1=http://192.168.2.54:2380,etcd2=http://192.168.2.56:2380 \
--initial-cluster-state new

在第二个节点上执行:

etcd --name etcd1 --initial-advertise-peer-urls http://192.168.2.54:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.2.54:2379 \
--initial-cluster-token etcd-cluster-2 \
--initial-cluster etcd0=http://192.168.2.55:2380,etcd1=http://192.168.2.54:2380,etcd2=http://192.168.2.56:2380 \
--initial-cluster-state new

在第三个节点上执行:
etcd --name etcd2 --initial-advertise-peer-urls http://192.168.2.56:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.2.56:2379 \
--initial-cluster-token etcd-cluster-2 \
--initial-cluster etcd0=http://192.168.2.55:2380,etcd1=http://192.168.2.54:2380,etcd2=http://192.168.2.56:2380 \
--initial-cluster-state new

 

1.2、运行阶段member异常恢复

假设一个节点etcd2异常重启,可以再执行如下命令拉起来

etcd --name etcd2  \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.2.56:2379 

static配置方式下,且处于运行阶段时,所有--initial-cluster参数没作用,带与不带都没有影响。

 

2、discovery自发现方式(只配置本方地址,其他人地址从中介处获取)

依赖于第三方etcd服务。在“集群建立阶段”各member都向第三方etcd服务注册,也从其获取其他member的信息。就像有个中介一样。

在“集群运行阶段”,对第三方etcd不再有依赖。

 

以私有etcd方式地址做中介为例说明:

2.1、集群建立阶段

a、首先在中介处申请一块地方

有两种方式,私有和官网方式任选其一

  • 私有etcd方式:

    uuidgen 先生成一个标识78b12ad7-2c1d-40db-9416-3727baf686cb

    curl -X PUT http://192.168.1.163:20003/v2/keys/discovery/78b12ad7-2c1d-40db-9416-3727baf686cb/_config/size -d value=3

  • 官网方式:

    curl https://discovery.etcd.io/new?size=3
    返回 https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de

b、在各个节点上分别执行

etcd --name etcd0 --initial-advertise-peer-urls http://192.168.2.55:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.2.55:2379 \
-discovery http://192.168.1.163:20003/v2/keys/discovery/78b12ad7-2c1d-40db-9416-3727baf686cb \
--initial-cluster-state new

etcd --name etcd1 --initial-advertise-peer-urls http://192.168.2.54:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.2.54:2379 \
-discovery http://192.168.1.163:20003/v2/keys/discovery/78b12ad7-2c1d-40db-9416-3727baf686cb \
--initial-cluster-state new

etcd --name etcd2 --initial-advertise-peer-urls http://192.168.2.56:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.2.56:2379 \
-discovery http://192.168.1.163:20003/v2/keys/discovery/78b12ad7-2c1d-40db-9416-3727baf686cb \
--initial-cluster-state new

 

2.1、运行阶段member异常恢复

下面两条命令任选其一都可以起来。优选第一条

etcd --name etcd2 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.2.56:2379

 

etcd --name etcd2 --initial-advertise-peer-urls http://192.168.2.56:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://192.168.2.56:2379 \
-discovery http://192.168.1.163:20003/v2/keys/discovery/78b12ad7-2c1d-40db-9416-3727baf686cb \
--initial-cluster-state existing

 

3、DNS方式 – 暂未研究,不作说明

 

四、etcd集群运行过程中的改配

主要用于故障节点替换,集群扩容需求。

集群运行过程中的改配不区分static和discovery方式。

1、替换的步骤:

比如集群中某一member重启后仍不能恢复时,就需要替换一个新member进来。

a、从集群中删除老member

etcdctl member remove 1609b5a3a078c227

b、向集群中新增新member

etcdctl member add <name> <peerURL> 
例子:敲命令 etcdctl member add etcd2 http://192.168.2.56:2380  后返回如下信息
Added member named etcd2 with ID b7d510356ee2e68b to cluster

ETCD_NAME="etcd2"
ETCD_INITIAL_CLUSTER="etcd0=http://192.168.2.55:2380,etcd2=http://192.168.2.56:2380,etcd1=http://192.168.2.54:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"

c、删除老节点data目录
如果不删除,启动后节点仍旧沿用之前的老id, 其他正常节点不认,不能建立联系

d、在新member上启动etcd进程

 

2、扩容的步骤:

执行上面第b,d两步即可。

 

五、常见使用场景

1、单节点故障

      在该节点重启后数据会自动同步。包括在该节点故障后与恢复前之间新变化的数据。

2、客户对etcd的读写访问

     对读写操作,客户可以从任一节点发起,数据都会同步到整个集群。

     读操作由各个接收member直接处理,写操作由各个接收member转发给leader处理。

3、集群可服务性对故障的容忍度

以3节点集群为例。

结论:

  • 在1个member故障时,即小部分节点故障:      集群处于健康态,读写都正常。
  • 在2个member故障时,即大部分节点故障情况:集群整体状态为”不健康“,剩下的member也为”不健康“。只能read,但不能write,可能是因为剩下的member竞选leader失败,拿不到多数票。
  • 在大部分节点恢复后,集群整体状态为”健康“,每个member也为”健康“

如下例子,终止掉了54和60,就剩下55

root@paas-controller-1:/home/yan# docker exec -it myetcd22 /bin/sh
/ # etcdctl cluster-health
failed to check the health of member 1018ddcc3ad118c8 on http://192.168.2.60:2379: Gethttp://192.168.2.60:2379/health: dial tcp 192.168.2.60:2379: getsockopt: connection refused
member 1018ddcc3ad118c8 is unreachable: [http://192.168.2.60:2379] are all unreachable
member 35d37c0c6139bb9a is unhealthy: got unhealthy result from http://192.168.2.55:2379
failed to check the health of member bd47c147acde4ad7 on http://192.168.2.54:2379: Gethttp://192.168.2.54:2379/health: dial tcp 192.168.2.54:2379: getsockopt: connection refused
member bd47c147acde4ad7 is unreachable: [http://192.168.2.54:2379] are all unreachable
cluster is unhealthy
/ # exit
root@paas-controller-1:/home/yan# curl http://192.168.2.55:2379/v2/keys/message
{"action":"get","node":{"key":"/message","value":"Hello everyone","modifiedIndex":8,"createdIndex":8}}
root@paas-controller-1:/home/yan# 
root@paas-controller-1:/home/yan# 
root@paas-controller-1:/home/yan# curl http://127.0.0.1:2379/v2/keys/message -XPUT -d value="Hello world"
{"errorCode":300,"message":"Raft Internal Error","cause":"etcdserver: request timed out","index":0}
root@paas-controller-1:/home/yan# curl http://192.168.2.55:2379/v2/keys/message -XPUT -d value="Hello world"
{"errorCode":300,"message":"Raft Internal Error","cause":"etcdserver: request timed out","index":0}
root@paas-controller-1:/home/yan# 
root@paas-controller-1:/home/yan# curl http://192.168.2.55:2379/health
{"health": "false"}
root@paas-controller-1:/home/yan# curl http://192.168.2.54:2379/health
curl: (7) Failed to connect to 192.168.2.54 port 2379: Connection refused
root@paas-controller-1:/home/yan# curl http://192.168.2.60:2379/health
curl: (7) Failed to connect to 192.168.2.60 port 2379: Connection refused

 

在恢复54节点后:

root@paas-controller-1:/home/yan# curl http://192.168.2.55:2379/health
{"health": "true"}root@paas-controller-1:/home/yan# curl http://192.168.2.54:2379/health
{"health": "true"}root@paas-controller-1:/home/yan# curl http://192.168.2.60:2379/health
curl: (7) Failed to connect to 192.168.2.60 port 2379: Connection refused
root@paas-controller-1:/home/yan# curl http://192.168.2.55:2379/v2/keys/message
{"action":"get","node":{"key":"/message","value":"Hello everyone","modifiedIndex":8,"createdIndex":8}}
root@paas-controller-1:/home/yan# curl http://192.168.2.55:2379/v2/keys/message -XPUT -d value="Hello world"
{"action":"set","node":{"key":"/message","value":"Hello world","modifiedIndex":20,"createdIndex":20},"prevNode":{"key":"/message","value":"Hello everyone","modifiedIndex":8,"createdIndex":8}}
root@paas-controller-1:/home/yan# docker exec -it myetcd22 /bin/sh
/ # etcdctl cluster-health
failed to check the health of member 1018ddcc3ad118c8 on http://192.168.2.60:2379: Gethttp://192.168.2.60:2379/health: dial tcp 192.168.2.60:2379: getsockopt: connection refused
member 1018ddcc3ad118c8 is unreachable: [http://192.168.2.60:2379] are all unreachable
member 35d37c0c6139bb9a is healthy: got healthy result from http://192.168.2.55:2379
member bd47c147acde4ad7 is healthy: got healthy result from http://192.168.2.54:2379
cluster is healthy

4、static方式下增加新member

cluster的member数之前已经根据initial-cluster描述的成员确定下来了,如果不先add member,直接启动etcd的话生成的clusterID和老clusterID不一致,根本加不进去。

后续要增加member走"运行中改配扩容"流程,即先add  member,然后启动新etcd。加入后都是正式member,不存在降为proxy的机制。

 

5、discovery方式下size对新加入节点的限制。

size这个key如果不存在或者不设置有效值,集群所有节点都建不起来。

在集群中已经存在size个member的情况下,以--initial-cluster-state new参数新加入的节点自动降为proxy。通过该proxy可进行读写操作。该proxy不在member列表中。原member之一退出后(member异常和remove member情况下相同),proxy无变化,不会自动加入集群。

要加入群,必须走"运行中改配替换"流程。

 

不执行add member直接启动etcd的情况下自动降为proxy,新加入节点打印如下信息:

2017-01-24 23:35:47.956624 I | etcdmain: stopping listening for peers on http://0.0.0.0:2380
2017-01-24 23:35:47.956637 N | etcdmain: discovery cluster full, falling back to proxy
2017-01-24 23:35:47.956643 N | etcdmain: proxy: this proxy supports v2 API only!
2017-01-24 23:35:47.965691 I | etcdmain: proxy: using peer urls [http://192.168.2.54:2380http://192.168.2.55:2380 http://192.168.2.60:2380
2017-01-24 23:35:47.988806 I | etcdmain: proxy: listening for client requests on http://0.0.0.0:2379
2017-01-24 23:35:47.989190 I | httpproxy: endpoints found ["http://192.168.2.54:2379" "http://192.168.2.60:2379" "http://192.168.2.55:2379"]

 

六、一些可能遇到的问题

1、各节点时钟相差过大导致集群建立不起来

     etcd启动信息中有提示错误信息

 

2、listen-url配为localhost或127.0.0.1导致集群建立不起来

     localhost为127.0.0.1,对应lo接口,只有同一空间内的进程之间才能通过此接口交互。

     分布在三个不同机器上的各member之间通过--initial-advertise-peer-urls地址交互,该地址与lo对应不同的接口。

 

3、--listen-client-urls配为--initial-advertise-peer-urls地址导致etcdctl工具执行不正常

     两全其美的方法:

     --listen-client-urls http://192.168.2.55:2379,http://localhost:2379 《–用逗号分隔,且不能有空格

 

4、-data-dir目录的问题

     该目录下保存了memberID,clusterID和数据等信息,如果集群归属有变化,一定要先删除该目录。

 

5、--initial- 前缀类参数的使用

     所有带此前缀的选项在集群启动后就没用了,member故障后再重起不用带,带了也没影响。

 

七、常用命令:

1、集群member管理类:

命令行:(在任一健康member上执行)

etcdctl  member list  

etcdctl  cluster-health

etcdctl  member  add   <membername>  <advertise-peer-url>

etcdctl  member  remove   <memberID>

 

RESTful:

curl http://127.0.0.1:2379/v2/members

curl http://10.0.0.10:2379/health

curl http://127.0.0.1:2379/v2/members -XPOST -H "Content-Type: application/json" -d '{"peerURLs":["http://192.168.2.61:2380"]}'

此处不能填name,在启动etcd时填写会更新member的name属性

curl http://127.0.0.1:2379/v2/members/272e204152 -XDELETE

 

http://blog.csdn.net/yasonan/article/details/54945066

分享到:
评论

相关推荐

    etcd 集群部署包 TLS.tar.gz

    **etcd集群部署详解** etcd是一个分布式的、高可用的键值存储系统,用于共享配置和服务发现。在Kubernetes(k8s)环境中,etcd扮演着核心角色,存储了集群的所有状态信息,包括Pod、Service、Deployment等对象的...

    kubeadm初始化高可用k8s1.20.4集群-etcd集群独立在k8s集群外详细笔记资料包

    2. **控制平面初始化**:创建etcd集群(这里是在集群外部),并部署Master节点上的核心组件,包括kube-apiserver、kube-controller-manager、kube-scheduler等。 3. **工作节点加入**:配置工作节点以连接到Master...

    01 搭建一个完整的K8S集群部署文档以及相关讲解.docx

    etcd 集群部署 在部署 etcd 集群之前,我们需要生成 etcd 证书,使用工具 cfssl 生成证书。 总结 在本文中,我们详细介绍了 Kubernetes 二进制部署的过程,包括角色 IP 组件、Master 节点、Node 节点、etcd 集群...

    rancher+k8s+etcd集群

    使用RKE构建企业生产Kubernetes集群 内容包含: 1.集群主机准备 2.daocker部署 3.docker compose安装 4.添加rancher用户 5.生成ssh证书用户部署集群 6.rke工具下载 7.初始化rke配置文件 ....

    Ansible-ansible-etcd.zip

    4. **Etcd 集群部署**:通过Ansible,我们可以自动化创建和扩展etcd集群,包括添加或移除节点,以及处理节点故障恢复。 5. **安全配置**:确保etcd通信的安全性至关重要。可能的配置包括启用TLS加密、设置认证和...

    Etcd3静态集群部署

    Etcd集群中的核心概念包括: - Raft:所采用的一致性算法,保证数据在集群中的强一致性。 - Node:一个Raft状态机的实例。 - Member:一个Etcd实例,管理一个Node并维护整个集群的数据一致性。 总的来说,Etcd3静态...

    基于k8s搭建Etcd集群

    利用k8s部署etcd集群教程

    二进制方式部署Kubernetes高可用集群.pdf

    Etcd集群部署 Etcd是Kubernetes集群的核心组件之一,负责存储集群的状态信息。使用cfssl证书工具生成Etcd证书,并部署Etcd集群。 Docker服务部署 Docker是Kubernetes集群的容器 runtime之一,需要安装Docker并...

    kubeadm初始化高可用k8s1.20.4集群-etcd集群独立在k8s集群外-kubernetes安装包和详细文档笔记整理

    这涉及到配置复制的etcd集群,因为etcd存储了所有的API对象,如节点、服务、部署等状态。将etcd集群独立于k8s集群之外运行,可以降低集群内部的复杂性,并提高etcd的稳定性和可管理性。 在etcd集群的设计上,至少...

    基于外部etcd+部署容器版kubernetes1.25.14集群资源合集

    在本资源合集中,我们关注的是如何利用外部的etcd集群和部署容器化的Kubernetes(k8s)1.25.14版本。Kubernetes(也称为k8s)是一个开源的容器编排系统,它允许自动化容器化应用程序的部署、扩展和管理。etcd是...

    prometheus-etcd集群监控模版

    使用prometheus监控二进制部署k8s的etcd集群 监控模版

    ansible-role-etcd:安装etcd集群的角色

    总结来说,`ansible-role-etcd` 是一个高效、可重复使用的Ansible解决方案,用于在多台服务器上快速、一致地部署和配置etcd集群。通过利用Ansible的自动化能力,你可以轻松地管理和扩展etcd集群,以满足高可用性和可...

    二进制部署k8s高可用集群(二进制-V1.20).docx

    * 部署 Etcd 集群:使用二进制文件部署 Etcd 集群。 4. 安装 Docker Docker 是 K8s 集群的容器 runtime,用于运行容器。安装 Docker 需要: * 解压二进制包:解压 Docker 二进制文件。 * systemd 管理 docker:...

    Kubernetesv1.12手动二进制部署集群

    #### 三、Etcd集群部署 Etcd是Kubernetes的核心组件之一,用于存储所有集群数据的状态。为了确保数据的安全性和高可用性,通常采用Etcd集群的形式。 ##### 1. 使用cfssl生成自签名证书 首先,需要通过`cfssl`工具...

    etcd-statefulset:在调控器中创建statefulset etcd集群

    因此对于快速部署一套高可用的Etcd集群的需求也越来越强烈,本次就带领大家一起使用Kubernetes的Statefulset特性快速部署一套Etcd集群。什么是Kubernetes?Kubernetes 是一个用于容器集群的自动化部署、扩容以及运维...

    lixd#daily-notes#0-install-二进制方式部署etcd集群1

    1. 搭建 etcd 集群 1. 下载 2. 配置文件 2. 简单测试

    etcd-v3.5.13-windows-amd64.zip

    etcd是CoreOS公司开发的一款分布式键值存储系统,它被设计用来在分布式环境中提供高可用性和一致性。...同时,也可以考虑将etcd集群部署到本地或者私有网络,以提高访问速度和减少对外部网络的依赖。

    ansible 安装etcd3集群

    使用时,编辑etcd-host.txt,将要部署etcd集群的集群主机名或者IP写入,组名为etcd [etcd] etcd-1 etcdname=etcd1 etcd-2 etcdname=etcd2 etcd-3 etcdname=etcd3 然后执行 ansible-playbook -i etcd-host.txt ...

    Docker搭建etcd集群

    etcd是CoreOS团队发起的一个开源项目(Go语言,其实很多这类项目都是Go语言实现的,只能说很强大),实现了分布式键值存储和服务发现,etcd 和ZooKeeper/Consul非常相似,都提供了类似的功能,以及RESTAPI的访问操作...

    Kubernetes v1.12 手动二进制部署集群.pdf

    Etcd 集群部署前需要准备自签证书,这里使用 cfssl 工具来生成证书。 1. **下载 cfssl 工具**:从 cfssl 官方提供的地址下载 cfssl、cfssljson 和 cfssl-certinfo 工具,并进行安装和配置。 2. **生成证书**:创建...

Global site tag (gtag.js) - Google Analytics