欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

etcd集群

程序员文章站 2022-07-13 22:31:49
...

This is the documentation for etcd2 releases. Read etcd3 doc for etcd3 releases.

集群指南

概观

静态启动etcd集群需要每个成员都知道集群中的另一个成员。在许多情况下,集群成员的IP可能未知。在这些情况下,可以在发现服务的帮助下引导etcd集群。

一旦etcd集群启动并运行,就可以通过 runtime reconfiguration. 添加或删除成员。为了更好地理解运行时重配置的设计,我们建议阅读 the runtime configuration design document.

本指南将介绍以下引导一个etcd集群的机制:

每个引导机制都将用于创建三台机器的etcd集群,其中包含以下详细信息:

名称 地址 主机名
infra0 10.0.1.10 infra0.example.com
infra1 10.0.1.11 infra1.example.com
infra2 10.0.1.12 infra2.example.com

静态的

正如我们在启动之前知道集群成员,集群地址和集群大小一样,我们可以通过设置initial-cluster标志来使用脱机引导配置。每台机器都将获得以下环境变量或命令行:

ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380"
ETCD_INITIAL_CLUSTER_STATE=new
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state new

请注意,在中指定的URL initial-cluster通告的对等URL,即它们应该匹配initial-advertise-peer-urls各个节点上的值。

如果为了测试目的而旋转多个集群(或创建并销毁单个集群)具有相同的配置,强烈建议您initial-cluster-token为不同的集群指定一个唯一的集群。通过这样做,etcd可以为集群生成唯一的集群ID和成员ID,即使它们具有完全相同的配置。这可以保护您免受可能破坏集群的跨集群交互。

etcd监听listen-client-urls接受客户端流量。etcd成员将指定的URL广告advertise-client-urls给其他成员,代理,客户端。请确保advertise-client-urls可以从预期的客户到达。常见的错误是设置advertise-client-urls为localhost,或者当您希望远程客户端到达etcd时将其保留为默认值。

在每台机器上,您都可以使用这些标志启动etcd:

$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
  --listen-peer-urls http://10.0.1.10:2380 \
  --listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.10:2379 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
  --initial-cluster-state new
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
  --listen-peer-urls http://10.0.1.11:2380 \
  --listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.11:2379 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
  --initial-cluster-state new
$ etcd --name infra2 --initial-advertise-peer-urls http://10.0.1.12:2380 \
  --listen-peer-urls http://10.0.1.12:2380 \
  --listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.12:2379 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
  --initial-cluster-state new

--initial-cluster在随后的etcd运行中,以开头的命令行参数将被忽略。初始引导过程后,您可以*删除环境变量或命令行标志。如果稍后需要对配置进行更改(例如,将成员添加到集群或从集群删除成员),请参阅运行时配置指南。

错误案例

在下面的例子中,我们没有将我们的新主机包含在枚举节点列表中。如果这是一个新集群,则该节点必须添加到初始集群成员列表中。

$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
  --listen-peer-urls https://10.0.1.11:2380 \
  --listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.11:2379 \
  --initial-cluster infra0=http://10.0.1.10:2380 \
  --initial-cluster-state new
etcd: infra1 not listed in the initial cluster config
exit 1

在这个例子中,我们试图将一个节点(infra0)映射到不同的地址(127.0.0.1:2380),而不是它在集群列表(10.0.1.10:2380)中的枚举地址。如果此节点要侦听多个地址,则所有地址必须反映在“initial-cluster”配置指令中。

$ etcd --name infra0 --initial-advertise-peer-urls http://127.0.0.1:2380 \
  --listen-peer-urls http://10.0.1.10:2380 \
  --listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.10:2379 \
  --initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
  --initial-cluster-state=new
etcd: error setting up initial cluster: infra0 has different advertised URLs in the cluster and advertised peer URLs list
exit 1

如果您使用不同的配置集配置对等设备并尝试加入此群集,则会出现群集ID不匹配,并且etcd将退出。

$ etcd --name infra3 --initial-advertise-peer-urls http://10.0.1.13:2380 \
  --listen-peer-urls http://10.0.1.13:2380 \
  --listen-client-urls http://10.0.1.13:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.13:2379 \
  --initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra3=http://10.0.1.13:2380 \
  --initial-cluster-state=new
etcd: conflicting cluster ID to the target cluster (c6ab534d07e8fcc4 != bc25ea2a74fb18b0). Exiting.
exit 1

发现

在许多情况下,您可能未提前知道集群对等方的IP。这在使用云提供商或您的网络使用DHCP时很常见。在这些情况下,您可以使用现有的etcd集群来引导新的集群,而不是指定静态配置。我们称这个过程为“发现”。

有两种可用于发现的方法:

  • etcd发现服务
  • DNS SRV记录

etcd发现

为了更好地理解有关发现服务协议的设计,我们建议您阅读

发现网址的有效期

发现URL标识唯一的etcd群集。您应该始终为新群集创建发现URL,而不是重复使用发现URL。

而且,发现URL只能用于群集的初始引导。要在群集已经运行后更改群集成员身份,请参阅运行时重新配置指南。

自定义etcd发现服务

Discovery使用现有群集自行引导。如果您使用自己的etcd集群,则可以创建如下所示的URL:

$ curl -X PUT https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3

通过将大小关键字设置为URL,您可以创建一个预期簇大小为3的发现URL。

如果使用发现服务引导etcd集群的次数超过预期的etcd成员数量,则额外的etcd进程将默认回退代理服务器

在这种情况下您将使用的URL将是https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83etcd成员将在https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83开始时使用该目录进行注册。

每个成员必须指定不同的名称标志。Hostname或者machine-id可以是一个不错的选择。或者发现将由于重复的名称而失败。

现在我们用每个成员的相关标志开始etcd:

$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
  --listen-peer-urls http://10.0.1.10:2380 \
  --listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.10:2379 \
  --discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
  --listen-peer-urls http://10.0.1.11:2380 \
  --listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.11:2379 \
  --discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd --name infra2 --initial-advertise-peer-urls http://10.0.1.12:2380 \
  --listen-peer-urls http://10.0.1.12:2380 \
  --listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.12:2379 \
  --discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83

这将导致每个成员向自定义etcd发现服务注册自己,并在所有机器注册后开始集群。

公共etcd发现服务

如果您无权访问现有群集,则可以使用托管于的公共发现服务discovery.etcd.io。您可以使用“新”端点创建私人发现网址,如下所示:

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

这将创建初始预期大小为3个成员的群集。如果您未指定大小,则将使用默认值3。

如果使用发现服务引导etcd集群的次数超过预期的etcd成员数量,则额外的etcd进程将默认回退代理服务器

ETCD_DISCOVERY=https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
-discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de

每个成员必须指定不同的名称标志。Hostname或者machine-id可以是一个不错的选择。或者发现将由于重复的名称而失败。

现在我们用每个成员的相关标志开始etcd:

$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
  --listen-peer-urls http://10.0.1.10:2380 \
  --listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.10:2379 \
  --discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
  --listen-peer-urls http://10.0.1.11:2380 \
  --listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.11:2379 \
  --discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
$ etcd --name infra2 --initial-advertise-peer-urls http://10.0.1.12:2380 \
  --listen-peer-urls http://10.0.1.12:2380 \
  --listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.12:2379 \
  --discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de

这将导致每个成员在发现服务中注册自己,并在所有成员注册后开始集群。

您可以使用环境变量ETCD_DISCOVERY_PROXY使etcd使用HTTP代理连接到发现服务。

错误和警告事例

发现服务器错误
$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
  --listen-peer-urls http://10.0.1.10:2380 \
  --listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.10:2379 \
  --discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
etcd: error: the cluster doesn’t have a size configuration value in https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de/_config
exit 1
用户错误

如果发现群集已经具有配置数量的成员并且discovery-fallback被明确禁用,则会发生此错误

$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
  --listen-peer-urls http://10.0.1.10:2380 \
  --listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.10:2379 \
  --discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de \
  --discovery-fallback exit
etcd: discovery: cluster is full
exit 1
警告

这是一个无害的警告,通知您此计算机上的发现URL将被忽略。

$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
  --listen-peer-urls http://10.0.1.10:2380 \
  --listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.10:2379 \
  --discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
etcdserver: discovery token ignored since a cluster has already been initialized. Valid log found at /var/lib/etcd

DNS发现

DNS SRV记录可以用作发现机制。该-discovery-srv标志可用于设置发现SRV记录的DNS域名。以列出的顺序查找以下DNS SRV记录:

  • _etcd-server-ssl._tcp.example.com
  • _etcd-server._tcp.example.com

如果_etcd-server-ssl._tcp.example.com找到,etcd将尝试通过SSL进行引导过程。

为帮助客户端发现etcd集群,以列出的顺序查找以下DNS SRV记录:

  • _etcd-client._tcp.example.com
  • _etcd-client-ssl._tcp.example.com

如果_etcd-client-ssl._tcp.example.com找到,客户端将尝试通过SSL与etcd集群进行通信。

该-discovery-srv-name标志还为发现期间查询的SRV名称配置后缀。使用此标志来区分同一个域下的多个etcd群集。例如,如果discovery-srv=example.com和-discovery-srv-name=foo设置,下面的DNS SRV查询由:

  • _etcd-server-ssl-foo._tcp.example.com
  • _etcd-server-foo._tcp.example.com

创建DNS SRV记录

$ dig +noall +answer SRV _etcd-server._tcp.example.com
_etcd-server._tcp.example.com. 300 IN  SRV  0 0 2380 infra0.example.com.
_etcd-server._tcp.example.com. 300 IN  SRV  0 0 2380 infra1.example.com.
_etcd-server._tcp.example.com. 300 IN  SRV  0 0 2380 infra2.example.com.
$ dig +noall +answer SRV _etcd-client._tcp.example.com
_etcd-client._tcp.example.com. 300 IN SRV 0 0 2379 infra0.example.com.
_etcd-client._tcp.example.com. 300 IN SRV 0 0 2379 infra1.example.com.
_etcd-client._tcp.example.com. 300 IN SRV 0 0 2379 infra2.example.com.
$ dig +noall +answer infra0.example.com infra1.example.com infra2.example.com
infra0.example.com.  300  IN  A  10.0.1.10
infra1.example.com.  300  IN  A  10.0.1.11
infra2.example.com.  300  IN  A  10.0.1.12

使用DNS引导etcd集群

etcd集群成员可以监听域名或IP地址,引导进程将解析DNS A记录。

已解析的地址--initial-advertise-peer-urls 必须与 SRV目标中已解析的地址之一匹配。etcd成员读取已解析的地址,以确定它是否属于在SRV记录中定义的集群。

$ etcd --name infra0 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://infra0.example.com:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://infra0.example.com:2379 \
--listen-client-urls http://infra0.example.com:2379 \
--listen-peer-urls http://infra0.example.com:2380
$ etcd --name infra1 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://infra1.example.com:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://infra1.example.com:2379 \
--listen-client-urls http://infra1.example.com:2379 \
--listen-peer-urls http://infra1.example.com:2380
$ etcd --name infra2 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://infra2.example.com:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://infra2.example.com:2379 \
--listen-client-urls http://infra2.example.com:2379 \
--listen-peer-urls http://infra2.example.com:2380

您还可以使用IP地址而不是域名引导群集:

$ etcd --name infra0 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://10.0.1.10:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://10.0.1.10:2379 \
--listen-client-urls http://10.0.1.10:2379 \
--listen-peer-urls http://10.0.1.10:2380
$ etcd --name infra1 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://10.0.1.11:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://10.0.1.11:2379 \
--listen-client-urls http://10.0.1.11:2379 \
--listen-peer-urls http://10.0.1.11:2380
$ etcd --name infra2 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://10.0.1.12:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://10.0.1.12:2379 \
--listen-client-urls http://10.0.1.12:2379 \
--listen-peer-urls http://10.0.1.12:2380

etcd代理配置

DNS SRV记录也可用于配置以代理模式运行的etcd服务器的对等端列表:

$ etcd --proxy on --discovery-srv example.com

etcd客户端配置

DNS SRV记录也可以用来帮助客户端发现etcd集群。

官方的etcd /客户端支持DNS发现

etcdctl通过指定--discovery-srv选项还支持DNS发现。

$ etcdctl --discovery-srv example.com set foo bar

错误案例

您可能会看到类似的错误cannot find local etcd $name from SRV records.。这意味着etcd成员无法从SRV记录中定义的集群中找到自己。已解析的地址--initial-advertise-peer-urls 必须与 SRV目标中已解析的地址之一匹配。

0.4至2.0+的迁移指南

在etcd 2.0中,我们引入了侦听多个地址并发布多个地址的功能。当你有复杂的网络时,这使得使用etcd更容易,比如各种云提供商的私有和公共网络。

为了更容易理解这个特性,我们改变了一些标志的命名,但是我们支持旧的标志使得从旧版到新版的迁移更容易。

Old Flag New Flag Migration Behavior
-peer-addr --initial-advertise-peer-urls If specified, peer-addr will be used as the only peer URL. Error if both flags specified.
-addr --advertise-client-urls If specified, addr will be used as the only client URL. Error if both flags specified.
-peer-bind-addr --listen-peer-urls If specified, peer-bind-addr will be used as the only peer bind URL. Error if both flags specified.
-bind-addr --listen-client-urls If specified, bind-addr will be used as the only client bind URL. Error if both flags specified.
-peers none Deprecated. The --initial-cluster flag provides a similar concept with different semantics. Please read this guide on cluster startup.
-peers-file none Deprecated. The --initial-cluster flag provides a similar concept with different semantics. Please read this guide on cluster startup.