Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

3.6.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