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
命令,将值替换为您环境中的值。
创建一些环境变量:
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