4.3.2. 手动添加新 etcd 主机
如果您没有以静态 pod 用户身份在 master 节点上运行 etcd,您可能需要添加另一个 etcd 主机。
流程
修改当前的 etcd 集群
要创建 etcd 证书,请运行 openssl
命令,将值替换为您环境中的值。
创建一些环境变量:
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
。创建用于存储配置和证书的目录:
# mkdir -p ${PREFIX}
创建服务器证书请求并为其签名:(server.csr 和 server.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
创建对等证书请求并将其签名:(peer.csr 和 peer.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
从当前节点复制当前的 etcd 配置和
ca.crt
文件,作为稍后修改的示例:# cp /etc/etcd/etcd.conf ${PREFIX} # cp /etc/etcd/ca.crt ${PREFIX}
当仍处于存活的 etcd 主机上时,将新主机添加到集群中。要在集群中添加额外的 etcd 成员,您必须首先调整第一个成员的
peerURLs
值中的默认 localhost peer:使用
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。
获取 etcd 侦听集群对等点的 IP 地址:
$ ss -l4n | grep 2380
通过传递从上一步中获取的成员 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
-
重新运行
member list
命令,并确保对等 URL 不再包含 localhost。
将新主机添加到 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 地址或简单名称。
更新示例
${PREFIX}/etcd.conf
文件。将以下值替换为上一步中生成的值:
- ETCD_NAME
- ETCD_INITIAL_CLUSTER
- ETCD_INITIAL_CLUSTER_STATE
使用上一步中输出中的新主机 IP 修改以下变量:您可以使用
${NEW_ETCD_IP}
作为值。ETCD_LISTEN_PEER_URLS ETCD_LISTEN_CLIENT_URLS ETCD_INITIAL_ADVERTISE_PEER_URLS ETCD_ADVERTISE_CLIENT_URLS
- 如果您之前使用 member 系统作为 etcd 节点,您必须覆盖 /etc/etcd/etcd.conf 文件中的当前值。
检查文件中的语法错误或缺少 IP 地址,否则 etcd 服务可能会失败:
# vi ${PREFIX}/etcd.conf
-
在托管安装文件的节点上,更新 /etc/ansible/hosts 清单文件中的
[etcd]
主机组。删除旧的 etcd 主机并添加新主机。 创建一个包含证书、示例配置文件和
ca
的tgz
文件,并将其复制到新主机上:# tar -czvf /etc/etcd/generated_certs/${CN}.tgz -C ${PREFIX} . # scp /etc/etcd/generated_certs/${CN}.tgz ${CN}:/tmp/
修改新的 etcd 主机
安装
iptables-services
以提供 iptables 工具为 etcd 打开所需的端口:# yum install -y iptables-services
创建
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 环境中,请修改实例的安全组,以允许传入到这些端口的流量。
安装 etcd:
# yum install -y etcd
确保安装了
etcd-2.3.7-4.el7.x86_64
或更高的版本,通过删除 etcd pod 定义来确保 etcd 服务没有运行:
# mkdir -p /etc/origin/node/pods-stopped # mv /etc/origin/node/pods/* /etc/origin/node/pods-stopped/
删除所有 etcd 配置和数据:
# rm -Rf /etc/etcd/* # rm -Rf /var/lib/etcd/*
提取证书和配置文件:
# tar xzvf /tmp/etcd0.example.com.tgz -C /etc/etcd/
在新主机上启动 etcd:
# systemctl enable etcd --now
验证主机是否是集群的一部分以及当前的集群健康状况:
如果使用 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
修改每个 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
重启 master API 服务:
在每个 master 上:
# master-restart api # master-restart controllers
警告etcd 节点的数量必须是奇数,因此您必须至少添加两个主机。
如果使用 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
重启
flanneld
服务:# systemctl restart flanneld.service