4.3.2. 手动添加新 etcd 主机


如果您没有以静态 pod 用户身份在 master 节点上运行 etcd,您可能需要添加另一个 etcd 主机。

流程
修改当前的 etcd 集群

要创建 etcd 证书,请运行 openssl 命令,将值替换为您环境中的值。

  1. 创建一些环境变量:

    export NEW_ETCD_HOSTNAME="*etcd0.example.com*"
    export NEW_ETCD_IP="192.168.55.21"
    
    export CN=$NEW_ETCD_HOSTNAME
    export SAN="IP:${NEW_ETCD_IP}, DNS:${NEW_ETCD_HOSTNAME}"
    export PREFIX="/etc/etcd/generated_certs/etcd-$CN/"
    export OPENSSLCFG="/etc/etcd/ca/openssl.cnf"
    注意

    用作 etcd_v3_ca_* 的自定义 openssl 扩展包括 $SAN 环境变量作为 subjectAltName。如需更多信息,请参阅 /etc/etcd/ca/openssl.cnf

  2. 创建用于存储配置和证书的目录:

    # mkdir -p ${PREFIX}
  3. 创建服务器证书请求并为其签名:(server.csrserver.crt

    # openssl req -new -config ${OPENSSLCFG} \
        -keyout ${PREFIX}server.key  \
        -out ${PREFIX}server.csr \
        -reqexts etcd_v3_req -batch -nodes \
        -subj /CN=$CN
    
    # openssl ca -name etcd_ca -config ${OPENSSLCFG} \
        -out ${PREFIX}server.crt \
        -in ${PREFIX}server.csr \
        -extensions etcd_v3_ca_server -batch
  4. 创建对等证书请求并将其签名:(peer.csrpeer.crt

    # openssl req -new -config ${OPENSSLCFG} \
        -keyout ${PREFIX}peer.key \
        -out ${PREFIX}peer.csr \
        -reqexts etcd_v3_req -batch -nodes \
        -subj /CN=$CN
    
    # openssl ca -name etcd_ca -config ${OPENSSLCFG} \
      -out ${PREFIX}peer.crt \
      -in ${PREFIX}peer.csr \
      -extensions etcd_v3_ca_peer -batch
  5. 从当前节点复制当前的 etcd 配置和 ca.crt 文件,作为稍后修改的示例:

    # cp /etc/etcd/etcd.conf ${PREFIX}
    # cp /etc/etcd/ca.crt ${PREFIX}
  6. 当仍处于存活的 etcd 主机上时,将新主机添加到集群中。要在集群中添加额外的 etcd 成员,您必须首先调整第一个成员的 peerURLs 值中的默认 localhost peer:

    1. 使用 member list 命令获取第一个成员的成员 ID:

      # etcdctl --cert-file=/etc/etcd/peer.crt \
          --key-file=/etc/etcd/peer.key \
          --ca-file=/etc/etcd/ca.crt \
          --peers="https://172.18.1.18:2379,https://172.18.9.202:2379,https://172.18.0.75:2379" \ 1
          member list
      1
      请确定在 --peers 参数值中只指定活跃的 etcd 成员的 URL。
    2. 获取 etcd 侦听集群对等点的 IP 地址:

      $ ss -l4n | grep 2380
    3. 通过传递从上一步中获取的成员 ID 和 IP 地址,使用 etcdctl member update 命令更新 peerURLs 的值:

      # etcdctl --cert-file=/etc/etcd/peer.crt \
          --key-file=/etc/etcd/peer.key \
          --ca-file=/etc/etcd/ca.crt \
          --peers="https://172.18.1.18:2379,https://172.18.9.202:2379,https://172.18.0.75:2379" \
          member update 511b7fb6cc0001 https://172.18.1.18:2380
    4. 重新运行 member list 命令,并确保对等 URL 不再包含 localhost
  7. 将新主机添加到 etcd 集群。请注意,新主机尚未配置,因此在您配置新主机之前,状态将保持为 未启动

    警告

    您必须添加每个成员,并一次性使他们在线。将每个额外成员添加到集群时,您必须调整当前对等点的 peerURLs 列表。peerURLs 列表会针对每个添加的成员增长一个。etcdctl member add 命令输出在 etcd.conf 文件中设置的值,以添加每个成员,如下说明所述。

    # etcdctl -C https://${CURRENT_ETCD_HOST}:2379 \
      --ca-file=/etc/etcd/ca.crt     \
      --cert-file=/etc/etcd/peer.crt     \
      --key-file=/etc/etcd/peer.key member add ${NEW_ETCD_HOSTNAME} https://${NEW_ETCD_IP}:2380 1
    
    Added member named 10.3.9.222 with ID 4e1db163a21d7651 to cluster
    
    ETCD_NAME="<NEW_ETCD_HOSTNAME>"
    ETCD_INITIAL_CLUSTER="<NEW_ETCD_HOSTNAME>=https://<NEW_HOST_IP>:2380,<CLUSTERMEMBER1_NAME>=https:/<CLUSTERMEMBER2_IP>:2380,<CLUSTERMEMBER2_NAME>=https:/<CLUSTERMEMBER2_IP>:2380,<CLUSTERMEMBER3_NAME>=https:/<CLUSTERMEMBER3_IP>:2380"
    ETCD_INITIAL_CLUSTER_STATE="existing"
    1
    在这一行中,10.3.9.222 是 etcd 成员的标签。您可以指定主机名、IP 地址或简单名称。
  8. 更新示例 ${PREFIX}/etcd.conf 文件。

    1. 将以下值替换为上一步中生成的值:

      • ETCD_NAME
      • ETCD_INITIAL_CLUSTER
      • ETCD_INITIAL_CLUSTER_STATE
    2. 使用上一步中输出中的新主机 IP 修改以下变量:您可以使用 ${NEW_ETCD_IP} 作为值。

      ETCD_LISTEN_PEER_URLS
      ETCD_LISTEN_CLIENT_URLS
      ETCD_INITIAL_ADVERTISE_PEER_URLS
      ETCD_ADVERTISE_CLIENT_URLS
    3. 如果您之前使用 member 系统作为 etcd 节点,您必须覆盖 /etc/etcd/etcd.conf 文件中的当前值。
    4. 检查文件中的语法错误或缺少 IP 地址,否则 etcd 服务可能会失败:

      # vi ${PREFIX}/etcd.conf
  9. 在托管安装文件的节点上,更新 /etc/ansible/hosts 清单文件中的 [etcd] 主机组。删除旧的 etcd 主机并添加新主机。
  10. 创建一个包含证书、示例配置文件和 catgz 文件,并将其复制到新主机上:

    # tar -czvf /etc/etcd/generated_certs/${CN}.tgz -C ${PREFIX} .
    # scp /etc/etcd/generated_certs/${CN}.tgz ${CN}:/tmp/
修改新的 etcd 主机
  1. 安装 iptables-services 以提供 iptables 工具为 etcd 打开所需的端口:

    # yum install -y iptables-services
  2. 创建 OS_FIREWALL_ALLOW 防火墙规则以允许 etcd 进行通信:

    • 客户端的端口 2379/tcp
    • 端口 2380/tcp 用于对等通信

      # systemctl enable iptables.service --now
      # iptables -N OS_FIREWALL_ALLOW
      # iptables -t filter -I INPUT -j OS_FIREWALL_ALLOW
      # iptables -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m tcp --dport 2379 -j ACCEPT
      # iptables -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m tcp --dport 2380 -j ACCEPT
      # iptables-save | tee /etc/sysconfig/iptables
      注意

      在本例中,创建了一个新的链 OS_FIREWALL_ALLOW,这是 OpenShift Container Platform 安装程序用于防火墙规则的标准命名。

      警告

      如果环境托管在 IaaS 环境中,请修改实例的安全组,以允许传入到这些端口的流量。

  3. 安装 etcd:

    # yum install -y etcd

    确保安装了 etcd-2.3.7-4.el7.x86_64 或更高的版本,

  4. 通过删除 etcd pod 定义来确保 etcd 服务没有运行:

    # mkdir -p /etc/origin/node/pods-stopped
    # mv /etc/origin/node/pods/* /etc/origin/node/pods-stopped/
  5. 删除所有 etcd 配置和数据:

    # rm -Rf /etc/etcd/*
    # rm -Rf /var/lib/etcd/*
  6. 提取证书和配置文件:

    # tar xzvf /tmp/etcd0.example.com.tgz -C /etc/etcd/
  7. 在新主机上启动 etcd:

    # systemctl enable etcd --now
  8. 验证主机是否是集群的一部分以及当前的集群健康状况:

    • 如果使用 v2 etcd api,请运行以下命令:

      # etcdctl --cert-file=/etc/etcd/peer.crt \
                --key-file=/etc/etcd/peer.key \
                --ca-file=/etc/etcd/ca.crt \
                --peers="https://*master-0.example.com*:2379,\
                https://*master-1.example.com*:2379,\
                https://*master-2.example.com*:2379,\
                https://*etcd0.example.com*:2379"\
                cluster-health
      member 5ee217d19001 is healthy: got healthy result from https://192.168.55.12:2379
      member 2a529ba1840722c0 is healthy: got healthy result from https://192.168.55.8:2379
      member 8b8904727bf526a5 is healthy: got healthy result from https://192.168.55.21:2379
      member ed4f0efd277d7599 is healthy: got healthy result from https://192.168.55.13:2379
      cluster is healthy
    • 如果使用 v3 etcd api,请运行以下命令:

      # ETCDCTL_API=3 etcdctl --cert="/etc/etcd/peer.crt" \
                --key=/etc/etcd/peer.key \
                --cacert="/etc/etcd/ca.crt" \
                --endpoints="https://*master-0.example.com*:2379,\
                  https://*master-1.example.com*:2379,\
                  https://*master-2.example.com*:2379,\
                  https://*etcd0.example.com*:2379"\
                  endpoint health
      https://master-0.example.com:2379 is healthy: successfully committed proposal: took = 5.011358ms
      https://master-1.example.com:2379 is healthy: successfully committed proposal: took = 1.305173ms
      https://master-2.example.com:2379 is healthy: successfully committed proposal: took = 1.388772ms
      https://etcd0.example.com:2379 is healthy: successfully committed proposal: took = 1.498829ms
修改每个 OpenShift Container Platform master
  1. 修改每个 master 上 /etc/origin/master/master-config.yaml 文件的 etcClientInfo 部分中的 master 配置。将新的 etcd 主机添加到 OpenShift Container Platform 用来存储数据的 etcd 服务器列表中,并删除所有失败的 etcd 主机:

    etcdClientInfo:
      ca: master.etcd-ca.crt
      certFile: master.etcd-client.crt
      keyFile: master.etcd-client.key
      urls:
        - https://master-0.example.com:2379
        - https://master-1.example.com:2379
        - https://master-2.example.com:2379
        - https://etcd0.example.com:2379
  2. 重启 master API 服务:

    • 在每个 master 上:

      # master-restart api
      # master-restart controllers
      警告

      etcd 节点的数量必须是奇数,因此您必须至少添加两个主机。

  3. 如果使用 Flannel,修改每个 OpenShift Container Platform 主机的 /etc/sysconfig/flanneld 服务的 flanneld 服务配置,使其包含新的 etcd 主机:

    FLANNEL_ETCD_ENDPOINTS=https://master-0.example.com:2379,https://master-1.example.com:2379,https://master-2.example.com:2379,https://etcd0.example.com:2379
  4. 重启 flanneld 服务:

    # systemctl restart flanneld.service
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.