使用 EC2 发现插件编辑

discovery-ec2 插件允许 Elasticsearch 通过查询 AWS API 获取运行这些节点的 EC2 实例的地址,从而在运行于 AWS EC2 上的集群中找到符合主节点条件的节点。

通常,将发现过程限制在集群中符合主节点条件的节点范围内是一个好主意。此插件允许您通过某些条件识别这些节点,包括它们的标签、它们所属的安全组以及它们在可用区内的位置。即使发现不符合主节点条件的节点,发现过程也能正常工作,但如果能避免这种情况,主节点选举的效率会更高。

可以使用 实例角色 对与 AWS API 的交互进行身份验证,或者可以提供自定义凭据。

启用 EC2 发现编辑

要启用 EC2 发现,请将 Elasticsearch 配置为使用 ec2 种子主机提供程序

discovery.seed_providers: ec2

配置 EC2 发现编辑

EC2 发现支持许多设置。有些设置是敏感的,必须存储在 Elasticsearch 密钥库 中。例如,要使用特定的访问密钥和密钥进行身份验证,请通过运行以下命令将这些密钥添加到密钥库中

bin/elasticsearch-keystore add discovery.ec2.access_key
bin/elasticsearch-keystore add discovery.ec2.secret_key

EC2 发现插件的可用设置如下。

discovery.ec2.access_key (安全, 可重新加载)
EC2 访问密钥。如果设置,则还必须设置 discovery.ec2.secret_key。如果未设置,discovery-ec2 将改为使用实例角色。此设置是敏感的,必须存储在 Elasticsearch 密钥库中。
discovery.ec2.secret_key (安全, 可重新加载)
EC2 密钥。如果设置,则还必须设置 discovery.ec2.access_key。此设置是敏感的,必须存储在 Elasticsearch 密钥库中。
discovery.ec2.session_token (安全, 可重新加载)
EC2 会话令牌。如果设置,则还必须设置 discovery.ec2.access_keydiscovery.ec2.secret_key。此设置是敏感的,必须存储在 Elasticsearch 密钥库中。
discovery.ec2.endpoint
要连接到的 EC2 服务端点。请参阅 https://docs.aws.amazon.com/general/latest/gr/rande.html#ec2_region 以找到该区域的相应端点。此设置默认为 ec2.us-east-1.amazonaws.com,适用于在 us-east-1 区域中运行的集群。
discovery.ec2.protocol
用于连接到 EC2 服务端点的协议,可以是 httphttps。默认为 https
discovery.ec2.proxy.host
用于连接到 EC2 的 HTTP 代理的地址或主机名。如果未设置,则不使用代理。
discovery.ec2.proxy.port
如果在 discovery.ec2.proxy.host 中给出了 HTTP 代理的地址,则此设置确定用于连接到代理的端口。默认为 80
discovery.ec2.proxy.scheme
通过 discovery.ec2.proxy.host 中指定的代理连接到 EC2 服务端点时使用的方案。有效值为 httphttps。默认为 http
discovery.ec2.proxy.username (安全, 可重新加载)
如果在 discovery.ec2.proxy.host 中给出了 HTTP 代理的地址,则此设置确定用于连接到代理的用户名。如果未设置,则不使用用户名。此设置是敏感的,必须存储在 Elasticsearch 密钥库中。
discovery.ec2.proxy.password (安全, 可重新加载)
如果在 discovery.ec2.proxy.host 中给出了 HTTP 代理的地址,则此设置确定用于连接到代理的密码。如果未设置,则不使用密码。此设置是敏感的,必须存储在 Elasticsearch 密钥库中。
discovery.ec2.read_timeout
连接到 EC2 的套接字超时,包括单位。例如,值 60s 指定 60 秒的超时。默认为 50 秒。
discovery.ec2.groups
用于发现的安全组的名称或 ID 列表。discovery.ec2.any_group 设置确定此设置的行为。默认为空列表,这意味着 EC2 发现会忽略安全组成员资格。
discovery.ec2.any_group
默认为 true,这意味着属于 discovery.ec2.groups 中指定的*任何*安全组的实例都将用于发现。如果设置为 false,则只有属于 discovery.ec2.groups 中指定的*所有*安全组的实例才会用于发现。
discovery.ec2.host_type

每个 EC2 实例都有许多不同的地址可能适用于发现。此设置允许您选择发现过程使用这些地址中的哪一个。它可以设置为 private_ippublic_ipprivate_dnspublic_dnstag:TAGNAME 之一,其中 TAGNAME 指的是标签的名称。此设置默认为 private_ip

如果将 discovery.ec2.host_type 设置为 tag:TAGNAME 形式的值,则附加到每个实例的标签 TAGNAME 的值将用作该实例用于发现的地址。没有设置此标签的实例将被发现过程忽略。

例如,如果您使用名为 elasticsearch-host-name 的标签标记一些 EC2 实例,并设置 host_type: tag:elasticsearch-host-name,则 discovery-ec2 插件将从 elasticsearch-host-name 标签的值中读取每个实例的主机名。阅读有关 EC2 标签的更多信息

discovery.ec2.availability_zones
用于发现的可用区名称列表。可用区的名称是 区域代码后跟一个字母,例如 us-east-1a。只有放置在给定可用区之一中的实例才会用于发现。
discovery.ec2.tag.TAGNAME

名为 TAGNAME 的标签的值列表,用于发现。如果设置,则只有使用给定值之一标记的实例才会用于发现。例如,以下设置将仅使用 role 标签设置为 masterenvironment 标签设置为 devstaging 的节点。

discovery.ec2.tag.role: master
discovery.ec2.tag.environment: dev,staging

用于发现的标签名称只能包含 ASCII 字母、数字、连字符和下划线。特别是,您不能使用名称包含冒号的标签。

discovery.ec2.node_cache_time
设置缓存发现的实例集合的时间长度。Elasticsearch 在从 EC2 API 请求发现信息之间至少等待这么长时间。如果请求过于频繁,AWS 可能会拒绝发现请求,这将导致发现失败。默认为 10s

此插件的所有 安全 设置都是 可重新加载的,允许您更新此插件的安全设置,而无需重新启动每个节点。

推荐的 EC2 权限编辑

discovery-ec2 插件通过对 AWS EC2 API 进行 DescribeInstances 调用来工作。您必须配置您的 AWS 帐户以允许这样做,这通常使用 IAM 策略完成。您可以通过 IAM 管理控制台创建自定义策略。它应该类似于这样。

{
  "Statement": [
    {
      "Action": [
        "ec2:DescribeInstances"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    }
  ],
  "Version": "2012-10-17"
}

自动节点属性编辑

discovery-ec2 插件可以自动将 aws_availability_zone 节点属性设置为每个节点的可用区。此节点属性允许您通过使用 分配感知 功能来确保每个分片都具有跨多个可用区冗余分配的副本。

为了启用 aws_availability_zone 属性的自动定义,请将 cloud.node.auto_attributes 设置为 true。例如

cloud.node.auto_attributes: true
cluster.routing.allocation.awareness.attributes: aws_availability_zone

在使用任何发现类型时,都可以像这样自动设置 aws_availability_zone 属性。不需要设置 discovery.seed_providers: ec2。但是,此功能确实需要安装 discovery-ec2 插件。

绑定到正确的地址编辑

在 EC2 上部署集群时,正确定义 network.host 非常重要。默认情况下,每个 Elasticsearch 节点仅绑定到 localhost,这将阻止其被运行在任何其他实例上的节点发现。

您可以使用 核心网络主机设置 将每个节点绑定到所需的地址,或者您可以将 network.host 设置为 discovery-ec2 插件提供的以下 EC2 特定设置之一

EC2 主机值 描述

_ec2:privateIpv4_

机器的私有 IP 地址 (ipv4)。

_ec2:privateDns_

机器的私有主机名。

_ec2:publicIpv4_

机器的公有 IP 地址 (ipv4)。

_ec2:publicDns_

机器的公有主机名。

_ec2:privateIp_

等效于 _ec2:privateIpv4_

_ec2:publicIp_

等效于 _ec2:publicIpv4_

_ec2_

等效于 _ec2:privateIpv4_

使用任何发现类型时,这些值都是可以接受的。它们不要求您设置 discovery.seed_providers: ec2。但是,它们确实需要安装 discovery-ec2 插件。