第 4 章 在 AWS 上配置红帽高可用性集群
本章包含使用 EC2 实例作为集群节点在 Amazon Web Services(AWS)上配置红帽高可用性(HA)集群的信息和步骤。您有多个选项来获取您用于集群的 Red Hat Enterprise Linux(RHEL)镜像。有关 AWS 镜像选项的详情,请查看 AWS 的 Red Hat Enterprise Linux 镜像选项。
本章包含为 AWS 设置环境的先决条件。设置环境后,您可以创建并配置 EC2 实例。
本章还包含与创建 HA 集群相关的流程,该集群将单个节点转换为 AWS 上的一个 HA 节点集群。这包括在每个集群节点上安装高可用性软件包和代理、配置隔离以及安装 AWS 网络资源代理的步骤。
本章在很多位置使用了 Amazon 文档。更多信息,请参阅引用的 Amazon 文档来获得更多信息。
先决条件
- 您需要安装 AWS 命令行界面(CLI)。有关安装 AWS CLI 的更多信息,请参阅安装 AWS CLI。
- 在 Red Hat Cloud Access 程序中启用您的订阅。Red Hat Cloud Access 程序允许您在红帽的完全支持下将红帽订阅从物理或内部系统移到 AWS。
其它资源
4.1. 创建 AWS 访问密钥和 AWS Secret 访问密钥
在安装 AWS CLI 前,您需要创建一个 AWS 访问密钥和 AWS Secret 访问密钥。隔离和资源代理 API 使用 AWS 访问密钥和 Secret 访问密钥连接到集群中的每个节点。
完成以下步骤以创建这些密钥。
先决条件
您的 IAM 用户帐户必须具有 Programmatic 访问权限。如需更多信息,请参阅设置 AWS 环境。
流程
- 启动 AWS 控制台。
- 点击 AWS Account ID 以显示下拉菜单并选择 My Security Credentials。
- 点 Users。
- 选择用户以打开 Summary 屏幕。
- 点 Security credentials 选项卡。
- 点 Create access key。
-
下载
.csv文件(或者保存这两个密钥)。创建隔离设备时需要输入这些密钥。
4.2. 安装 HA 软件包和代理
在所有节点上完成以下步骤以安装 HA 软件包和代理。
流程
输入以下命令删除 AWS Red Hat Update Infrastructure(RHUI)客户端。由于您要使用 Red Hat Cloud Access 订阅,所以您不应该在订阅之外使用 AWS RHUI。
$ sudo -i # yum -y remove rh-amazon-rhui-client*
在红帽注册虚拟机。
# subscription-manager register --auto-attach
禁用所有软件仓库。
# subscription-manager repos --disable=*
启用 RHEL 7 Server 和 RHEL 7 Server HA 软件仓库。
# subscription-manager repos --enable=rhel-7-server-rpms # subscription-manager repos --enable=rhel-ha-for-rhel-7-server-rpms
更新所有软件包。
# yum update -y
如果内核被更新,则需要重启。
# reboot
安装 pcs、pacemaker、隔离代理和资源代理。
# yum -y install pcs pacemaker fence-agents-aws resource-agents
用户
hacluster在上一步中的pcs和pacemaker安装中创建。在所有集群节点上为hacluster创建密码。所有节点都使用相同的密码。# passwd hacluster
如果启用了
firewalld.service,在 RHEL 防火墙中添加high availability服务。# firewall-cmd --permanent --add-service=high-availability # firewall-cmd --reload
启动
pcs服务并在引导时启用它。# systemctl enable pcsd.service --now
验证步骤
确定 pcs 服务正在运行。
# systemctl is-active pcsd.service
4.3. 创建集群
完成以下步骤以创建节点集群。
流程
在其中一个节点上,输入以下命令验证 pcs 用户
hacluster。指定集群中的每个节点的名称。# pcs host auth _hostname1_ _hostname2_ _hostname3_
例如:
[root@node01 clouduser]# pcs host auth node01 node02 node03 Username: hacluster Password: node01: Authorized node02: Authorized node03: Authorized
创建集群。
# pcs cluster setup --name _hostname1_ _hostname2_ _hostname3_
例如:
[root@node01 clouduser]# pcs cluster setup --name newcluster node01 node02 node03 ...omitted Synchronizing pcsd certificates on nodes node01, node02, node03... node02: Success node03: Success node01: Success Restarting pcsd on the nodes in order to reload the certificates... node02: Success node03: Success node01: Success
验证步骤
启用集群。
# pcs cluster enable --all
启动集群。
# pcs cluster start --all
例如:
[root@node01 clouduser]# pcs cluster enable --all node02: Cluster Enabled node03: Cluster Enabled node01: Cluster Enabled [root@node01 clouduser]# pcs cluster start --all node02: Starting Cluster... node03: Starting Cluster... node01: Starting Cluster...
4.4. 创建隔离设备
完成以下步骤来配置隔离。
流程
输入以下 AWS 元数据查询以获取每个节点的实例 ID。您需要这些 ID 来配置隔离设备。如需更多信息,请参阅实例元数据和用户数据。
# echo $(curl -s http://169.254.169.254/latest/meta-data/instance-id)
例如:
[root@ip-10-0-0-48 ~]# echo $(curl -s http://169.254.169.254/latest/meta-data/instance-id) i-07f1ac63af0ec0ac6
创建隔离设备。使用
pcmk_host_map命令将 RHEL 主机名映射到实例 ID。使用之前在创建 AWS 访问密钥和 AWS Secret 访问密钥中设置的 AWS 访问密钥和 AWS Secret 访问密钥。# pcs stonith create cluster_fence fence_aws access_key=access-key secret_key=_secret-access-key_ region=_region_ pcmk_host_map="rhel-hostname-1:Instance-ID-1;rhel-hostname-2:Instance-ID-2;rhel-hostname-3:Instance-ID-3"
例如:
[root@ip-10-0-0-48 ~]# pcs stonith create clusterfence fence_aws access_key=AKIAI*******6MRMJA secret_key=a75EYIG4RVL3h*******K7koQ8dzaDyn5yoIZ/ region=us-east-1 pcmk_host_map="ip-10-0-0-48:i-07f1ac63af0ec0ac6;ip-10-0-0-46:i-063fc5fe93b4167b2;ip-10-0-0-58:i-08bd39eb03a6fd2c7" power_timeout=240 pcmk_reboot_timeout=480 pcmk_reboot_retries=4
验证步骤
测试其他其中一个节点的隔离代理。
# pcs stonith fence _awsnodename_
例如:
[root@ip-10-0-0-48 ~]# pcs stonith fence ip-10-0-0-58 Node: ip-10-0-0-58 fenced
检查状态以验证该节点是否已隔离。
# watch pcs status
例如:
[root@ip-10-0-0-48 ~]# pcs status Cluster name: newcluster Stack: corosync Current DC: ip-10-0-0-46 (version 1.1.18-11.el7-2b07d5c5a9) - partition with quorum Last updated: Fri Mar 2 20:01:31 2018 Last change: Fri Mar 2 19:24:59 2018 by root via cibadmin on ip-10-0-0-48 3 nodes configured 1 resource configured Online: [ ip-10-0-0-46 ip-10-0-0-48 ip-10-0-0-58 ] Full list of resources: clusterfence (stonith:fence_aws): Started ip-10-0-0-46 Daemon Status: corosync: active/disabled pacemaker: active/disabled pcsd: active/enabled
4.5. 在集群节点上安装 AWS CLI
在以前的版本中,您在主机系统中安装了 AWS CLI。现在,在配置网络资源代理前,您需要在集群节点上安装 AWS CLI。
在每个集群节点上完成以下步骤。
先决条件
您必须已创建了 AWS Access Key 和 AWS Secret 访问密钥。如需更多信息,请参阅创建 AWS 访问密钥和 AWS Secret 访问密钥。
流程
- 执行安装 AWS CLI 的步骤。
输入以下命令验证 AWS CLI 是否已正确配置。应该会显示实例 ID 和实例名称。
例如:
[root@ip-10-0-0-48 ~]# aws ec2 describe-instances --output text --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value]' i-07f1ac63af0ec0ac6 ip-10-0-0-48 i-063fc5fe93b4167b2 ip-10-0-0-46 i-08bd39eb03a6fd2c7 ip-10-0-0-58
4.6. 安装网络资源代理
要使 HA 操作正常工作,集群使用 AWS 网络资源代理来启用故障切换功能。如果节点在设定的时间里不响应 heartbeat 检查,则该节点会被隔离,操作切换到集群中的额外节点。需要配置网络资源代理才能正常工作。
将两个资源添加到 同一组 以强制 order 和 colocation 限制。
创建二级私有 IP 资源及虚拟 IP 资源
完成以下步骤以添加二级专用 IP 地址并创建虚拟 IP。您可以从集群中的任何节点完成此步骤。
流程
输入以下命令查看
AWS Secondary Private IP Address资源代理(awsvip)描述。这显示了这个代理的选项和默认操作。# pcs resource describe awsvip
输入以下命令使用
VPC CIDR块中未使用的私有 IP 地址创建二级私有 IP 地址。# pcs resource create privip awsvip secondary_private_ip=_Unused-IP-Address_ --group _group-name_
例如:
[root@ip-10-0-0-48 ~]# pcs resource create privip awsvip secondary_private_ip=10.0.0.68 --group networking-group
创建虚拟 IP 资源。这是一个 VPC IP 地址,可以从隔离的节点快速迁移到故障切换节点,从而使子网中隔离的节点失败。
# pcs resource create vip IPaddr2 ip=_secondary-private-IP_ --group _group-name_
例如:
root@ip-10-0-0-48 ~]# pcs resource create vip IPaddr2 ip=10.0.0.68 --group networking-group
验证步骤
输入 pcs status 命令来验证资源是否正在运行。
# pcs status
例如:
[root@ip-10-0-0-48 ~]# pcs status
Cluster name: newcluster
Stack: corosync
Current DC: ip-10-0-0-46 (version 1.1.18-11.el7-2b07d5c5a9) - partition with quorum
Last updated: Fri Mar 2 22:34:24 2018
Last change: Fri Mar 2 22:14:58 2018 by root via cibadmin on ip-10-0-0-46
3 nodes configured
3 resources configured
Online: [ ip-10-0-0-46 ip-10-0-0-48 ip-10-0-0-58 ]
Full list of resources:
clusterfence (stonith:fence_aws): Started ip-10-0-0-46
Resource Group: networking-group
privip (ocf::heartbeat:awsvip): Started ip-10-0-0-48
vip (ocf::heartbeat:IPaddr2): Started ip-10-0-0-58
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled创建弹性 IP 地址
弹性 IP 地址是一个公共 IP 地址,可以从隔离的节点快速迁移到故障转移节点,从而使隔离的节点失败。
请注意,这与之前创建的虚拟 IP 资源不同。弹性 IP 地址用于面向公共的互联网连接,而不是子网连接。
-
将两个资源添加到之前创建的用来强制
order和colocation约束的 同一组 中。 输入以下 AWS CLI 命令来创建弹性 IP 地址。
[root@ip-10-0-0-48 ~]# aws ec2 allocate-address --domain vpc --output text eipalloc-4c4a2c45 vpc 35.169.153.122
输入以下命令查看 AWS 二级 Elastic IP 地址资源代理(awseip)描述。这显示了这个代理的选项和默认操作。
# pcs resource describe awseip
使用步骤 1 中创建的分配的 IP 地址创建二级 Elastic IP 地址资源。
# pcs resource create elastic awseip elastic_ip=_Elastic-IP-Address_allocation_id=_Elastic-IP-Association-ID_ --group networking-group
例如:
# pcs resource create elastic awseip elastic_ip=35.169.153.122 allocation_id=eipalloc-4c4a2c45 --group networking-group
验证步骤
输入 pcs status 命令来验证资源是否正在运行。
# pcs status
例如:
[root@ip-10-0-0-58 ~]# pcs status
Cluster name: newcluster
Stack: corosync
Current DC: ip-10-0-0-58 (version 1.1.18-11.el7-2b07d5c5a9) - partition with quorum
Last updated: Mon Mar 5 16:27:55 2018
Last change: Mon Mar 5 15:57:51 2018 by root via cibadmin on ip-10-0-0-46
3 nodes configured
4 resources configured
Online: [ ip-10-0-0-46 ip-10-0-0-48 ip-10-0-0-58 ]
Full list of resources:
clusterfence (stonith:fence_aws): Started ip-10-0-0-46
Resource Group: networking-group
privip (ocf::heartbeat:awsvip): Started ip-10-0-0-48
vip (ocf::heartbeat:IPaddr2): Started ip-10-0-0-48
elastic (ocf::heartbeat:awseip): Started ip-10-0-0-48
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled测试弹性 IP 地址
输入以下命令验证虚拟 IP(awsvip)和弹性 IP(awseip)资源是否可以正常工作。
流程
从本地工作站启动 SSH 会话到之前创建的弹性 IP 地址。
$ ssh -l ec2-user -i ~/.ssh/<KeyName>.pem elastic-IP
例如:
$ ssh -l ec2-user -i ~/.ssh/cluster-admin.pem 35.169.153.122
- 验证您通过 SSH 连接到的主机是否与创建的弹性资源关联。
4.7. 配置共享块存储
本节提供了使用 Amazon EBS Multi-Attach 卷为红帽高可用性集群配置共享块存储的可选步骤。此流程假设三个带有 1TB 共享磁盘的实例(三节点集群)。
流程
使用 AWS 命令 create-volume 创建共享块卷。
$ aws ec2 create-volume --availability-zone availability_zone --no-encrypted --size 1024 --volume-type io1 --iops 51200 --multi-attach-enabled例如,以下命令在
us-east-1a可用区中创建卷。$ aws ec2 create-volume --availability-zone us-east-1a --no-encrypted --size 1024 --volume-type io1 --iops 51200 --multi-attach-enabled { "AvailabilityZone": "us-east-1a", "CreateTime": "2020-08-27T19:16:42.000Z", "Encrypted": false, "Size": 1024, "SnapshotId": "", "State": "creating", "VolumeId": "vol-042a5652867304f09", "Iops": 51200, "Tags": [ ], "VolumeType": "io1" }注意下一步需要
VolumeId。对于集群中的每个实例,使用 AWS 命令 attach-volume 附加一个共享块卷。使用您的
<instance_id>和<volume_id>。$ aws ec2 attach-volume --device /dev/xvdd --instance-id instance_id --volume-id volume_id
例如:以下命令将共享块卷
vol-042a5652867304f09附加到instance i-0eb803361c2c887f2。$ aws ec2 attach-volume --device /dev/xvdd --instance-id i-0eb803361c2c887f2 --volume-id vol-042a5652867304f09 { "AttachTime": "2020-08-27T19:26:16.086Z", "Device": "/dev/xvdd", "InstanceId": "i-0eb803361c2c887f2", "State": "attaching", "VolumeId": "vol-042a5652867304f09" }
验证步骤
对于集群中的每个实例,使用带有实例
<ip_address>的 SSH 命令验证块设备是否可用。# ssh <ip_address> "hostname ; lsblk -d | grep ' 1T '"
例如:以下命令列出了包括实例 IP
198.51.100.3的主机名和块设备的详情。# ssh 198.51.100.3 "hostname ; lsblk -d | grep ' 1T '" nodea nvme2n1 259:1 0 1T 0 disk
使用
ssh命令验证集群中的每个实例是否使用相同的共享磁盘。# ssh ip_address "hostname ; lsblk -d | grep ' 1T ' | awk '{print \$1}' | xargs -i udevadm info --query=all --name=/dev/{} | grep '^E: ID_SERIAL='"例如,以下命令列出了包括实例 IP 地址
198.51.100.3的主机名和共享磁盘卷 ID 的详情。# ssh 198.51.100.3 "hostname ; lsblk -d | grep ' 1T ' | awk '{print \$1}' | xargs -i udevadm info --query=all --name=/dev/{} | grep '^E: ID_SERIAL='" nodea E: ID_SERIAL=Amazon Elastic Block Store_vol0fa5342e7aedf09f7
在确认将共享磁盘附加到每个实例后,您可以为集群配置弹性存储。有关为红帽高可用性集群配置弹性存储的详情,请参考在集群中配置 GFS2 文件系统。有关 GFS2 文件系统的常规信息,请参考配置和管理 GFS2 文件系统。