4.3.2. 手动添加新 etcd 主机
如果您没有以静态 pod 用户身份在 master 节点上运行 etcd,您可能需要添加另一个 etcd 主机。
流程
修改当前的 etcd 集群
要创建 etcd 证书,请运行 openssl
命令,将值替换为您环境中的值。
创建一些环境变量:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意用作
etcd_v3_ca_*
的自定义openssl
扩展包括 $SAN 环境变量作为subjectAltName
。如需更多信息,请参阅/etc/etcd/ca/openssl.cnf
。创建用于存储配置和证书的目录:
mkdir -p ${PREFIX}
# mkdir -p ${PREFIX}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建服务器证书请求并为其签名:(server.csr 和 server.crt)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建对等证书请求并将其签名:(peer.csr 和 peer.crt)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从当前节点复制当前的 etcd 配置和
ca.crt
文件,作为稍后修改的示例:cp /etc/etcd/etcd.conf ${PREFIX} cp /etc/etcd/ca.crt ${PREFIX}
# cp /etc/etcd/etcd.conf ${PREFIX} # cp /etc/etcd/ca.crt ${PREFIX}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当仍处于存活的 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" \ member list
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 请确定在
--peers
参数值中只指定活跃的 etcd 成员的 URL。
获取 etcd 侦听集群对等点的 IP 地址:
ss -l4n | grep 2380
$ ss -l4n | grep 2380
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过传递从上一步中获取的成员 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
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
重新运行
member list
命令,并确保对等 URL 不再包含 localhost。
将新主机添加到 etcd 集群。请注意,新主机尚未配置,因此在您配置新主机之前,状态将保持为
未启动
。警告您必须添加每个成员,并一次性使他们在线。将每个额外成员添加到集群时,您必须调整当前对等点的
peerURLs
列表。peerURLs
列表会针对每个添加的成员增长一个。etcdctl member add
命令输出在 etcd.conf 文件中设置的值,以添加每个成员,如下说明所述。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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
ETCD_LISTEN_PEER_URLS ETCD_LISTEN_CLIENT_URLS ETCD_INITIAL_ADVERTISE_PEER_URLS ETCD_ADVERTISE_CLIENT_URLS
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果您之前使用 member 系统作为 etcd 节点,您必须覆盖 /etc/etcd/etcd.conf 文件中的当前值。
检查文件中的语法错误或缺少 IP 地址,否则 etcd 服务可能会失败:
vi ${PREFIX}/etcd.conf
# vi ${PREFIX}/etcd.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
在托管安装文件的节点上,更新 /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/
# tar -czvf /etc/etcd/generated_certs/${CN}.tgz -C ${PREFIX} . # scp /etc/etcd/generated_certs/${CN}.tgz ${CN}:/tmp/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
修改新的 etcd 主机
安装
iptables-services
以提供 iptables 工具为 etcd 打开所需的端口:yum install -y iptables-services
# yum install -y iptables-services
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
OS_FIREWALL_ALLOW
防火墙规则以允许 etcd 进行通信:- 客户端的端口 2379/tcp
端口 2380/tcp 用于对等通信
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在本例中,创建了一个新的链
OS_FIREWALL_ALLOW
,这是 OpenShift Container Platform 安装程序用于防火墙规则的标准命名。警告如果环境托管在 IaaS 环境中,请修改实例的安全组,以允许传入到这些端口的流量。
安装 etcd:
yum install -y etcd
# yum install -y etcd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保安装了
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/
# mkdir -p /etc/origin/node/pods-stopped # mv /etc/origin/node/pods/* /etc/origin/node/pods-stopped/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除所有 etcd 配置和数据:
rm -Rf /etc/etcd/* rm -Rf /var/lib/etcd/*
# rm -Rf /etc/etcd/* # rm -Rf /var/lib/etcd/*
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提取证书和配置文件:
tar xzvf /tmp/etcd0.example.com.tgz -C /etc/etcd/
# tar xzvf /tmp/etcd0.example.com.tgz -C /etc/etcd/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在新主机上启动 etcd:
systemctl enable etcd --now
# systemctl enable etcd --now
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证主机是否是集群的一部分以及当前的集群健康状况:
如果使用 v2 etcd api,请运行以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果使用 v3 etcd api,请运行以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
修改每个 OpenShift Container Platform master
修改每个 master 上
/etc/origin/master/master-config.yaml
文件的etcClientInfo
部分中的 master 配置。将新的 etcd 主机添加到 OpenShift Container Platform 用来存储数据的 etcd 服务器列表中,并删除所有失败的 etcd 主机:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启 master API 服务:
在每个 master 上:
master-restart api master-restart controllers
# master-restart api # master-restart controllers
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
flanneld
服务:systemctl restart flanneld.service
# systemctl restart flanneld.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow