一、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, |
本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集群部署详解** etcd是一个分布式的、高可用的键值存储系统,用于共享配置和服务发现。在Kubernetes(k8s)环境中,etcd扮演着核心角色,存储了集群的所有状态信息,包括Pod、Service、Deployment等对象的...
2. **控制平面初始化**:创建etcd集群(这里是在集群外部),并部署Master节点上的核心组件,包括kube-apiserver、kube-controller-manager、kube-scheduler等。 3. **工作节点加入**:配置工作节点以连接到Master...
etcd 集群部署 在部署 etcd 集群之前,我们需要生成 etcd 证书,使用工具 cfssl 生成证书。 总结 在本文中,我们详细介绍了 Kubernetes 二进制部署的过程,包括角色 IP 组件、Master 节点、Node 节点、etcd 集群...
使用RKE构建企业生产Kubernetes集群 内容包含: 1.集群主机准备 2.daocker部署 3.docker compose安装 4.添加rancher用户 5.生成ssh证书用户部署集群 6.rke工具下载 7.初始化rke配置文件 ....
4. **Etcd 集群部署**:通过Ansible,我们可以自动化创建和扩展etcd集群,包括添加或移除节点,以及处理节点故障恢复。 5. **安全配置**:确保etcd通信的安全性至关重要。可能的配置包括启用TLS加密、设置认证和...
Etcd集群中的核心概念包括: - Raft:所采用的一致性算法,保证数据在集群中的强一致性。 - Node:一个Raft状态机的实例。 - Member:一个Etcd实例,管理一个Node并维护整个集群的数据一致性。 总的来说,Etcd3静态...
利用k8s部署etcd集群教程
Etcd集群部署 Etcd是Kubernetes集群的核心组件之一,负责存储集群的状态信息。使用cfssl证书工具生成Etcd证书,并部署Etcd集群。 Docker服务部署 Docker是Kubernetes集群的容器 runtime之一,需要安装Docker并...
这涉及到配置复制的etcd集群,因为etcd存储了所有的API对象,如节点、服务、部署等状态。将etcd集群独立于k8s集群之外运行,可以降低集群内部的复杂性,并提高etcd的稳定性和可管理性。 在etcd集群的设计上,至少...
在本资源合集中,我们关注的是如何利用外部的etcd集群和部署容器化的Kubernetes(k8s)1.25.14版本。Kubernetes(也称为k8s)是一个开源的容器编排系统,它允许自动化容器化应用程序的部署、扩展和管理。etcd是...
使用prometheus监控二进制部署k8s的etcd集群 监控模版
总结来说,`ansible-role-etcd` 是一个高效、可重复使用的Ansible解决方案,用于在多台服务器上快速、一致地部署和配置etcd集群。通过利用Ansible的自动化能力,你可以轻松地管理和扩展etcd集群,以满足高可用性和可...
* 部署 Etcd 集群:使用二进制文件部署 Etcd 集群。 4. 安装 Docker Docker 是 K8s 集群的容器 runtime,用于运行容器。安装 Docker 需要: * 解压二进制包:解压 Docker 二进制文件。 * systemd 管理 docker:...
#### 三、Etcd集群部署 Etcd是Kubernetes的核心组件之一,用于存储所有集群数据的状态。为了确保数据的安全性和高可用性,通常采用Etcd集群的形式。 ##### 1. 使用cfssl生成自签名证书 首先,需要通过`cfssl`工具...
因此对于快速部署一套高可用的Etcd集群的需求也越来越强烈,本次就带领大家一起使用Kubernetes的Statefulset特性快速部署一套Etcd集群。什么是Kubernetes?Kubernetes 是一个用于容器集群的自动化部署、扩容以及运维...
1. 搭建 etcd 集群 1. 下载 2. 配置文件 2. 简单测试
etcd是CoreOS公司开发的一款分布式键值存储系统,它被设计用来在分布式环境中提供高可用性和一致性。...同时,也可以考虑将etcd集群部署到本地或者私有网络,以提高访问速度和减少对外部网络的依赖。
使用时,编辑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 ...
etcd是CoreOS团队发起的一个开源项目(Go语言,其实很多这类项目都是Go语言实现的,只能说很强大),实现了分布式键值存储和服务发现,etcd 和ZooKeeper/Consul非常相似,都提供了类似的功能,以及RESTAPI的访问操作...
Etcd 集群部署前需要准备自签证书,这里使用 cfssl 工具来生成证书。 1. **下载 cfssl 工具**:从 cfssl 官方提供的地址下载 cfssl、cfssljson 和 cfssl-certinfo 工具,并进行安装和配置。 2. **生成证书**:创建...