在 Amazon Web Services 上部署 RHEL 8

Red Hat Enterprise Linux 8

获取 RHEL 系统镜像并在 AWS 上创建 RHEL 实例

Red Hat Customer Content Services

摘要

要在公有云环境中使用 Red Hat Enterprise Linux (RHEL),您可以在各种云平台(包括 Microsoft Azure)上创建和部署 RHEL 系统镜像。您还可以在 Azure 上创建和配置红帽高可用性(HA)集群。
以下章节提供了在 Azure 上创建云 RHEL 实例和 HA 集群的说明。这些进程包括安装所需的软件包和代理、配置隔离以及安装网络资源代理。

使开源包含更多

红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

对红帽文档提供反馈

我们感谢您对我们文档的反馈。让我们了解如何改进它。

通过 Jira 提交反馈(需要帐户)

  1. 登录到 Jira 网站。
  2. 单击顶部导航栏中的 Create
  3. Summary 字段中输入描述性标题。
  4. Description 字段中输入您对改进的建议。包括文档相关部分的链接。
  5. 点对话框底部的 Create

第 1 章 公有云平台上的 RHEL 简介

公有云平台提供计算资源即服务。您可以运行您的 IT 工作负载,包括 Red Hat Enterprise Linux (RHEL)系统,作为公共云实例,而不是使用内部硬件。

要了解更多有关公有云平台上 RHEL 的信息,请参阅:

1.1. 在公有云中使用 RHEL 的好处

RHEL 作为公共云平台上的云实例与内部物理系统或虚拟机(VM)的 RHEL 相比有以下优点:

  • 灵活精细的资源分配

    RHEL 的云实例作为虚拟机在云平台上运行,这通常意味着由云服务提供商维护远程服务器集群。因此,给实例分配硬件资源(如特定类型的 CPU 或存储)发生在软件层面上,可轻松自定义。

    与本地 RHEL 系统相比,您也不会受物理主机功能的限制。相反,您可以根据云提供商提供的选择,从各种功能中进行选择。

  • 空间及成本效率

    您不需要拥有任何内部服务器来托管您的云工作负载。这可避免与物理硬件关联的空间、电源和维护要求。

    相反,在公有云平台上,您可以直接向云提供商支付使用云实例的费用。成本通常基于分配给实例的硬件以及您使用的时间。因此,您可以根据要求优化成本。

  • 软件控制的配置

    云实例的整个配置都作为数据保存在云平台上,并由软件控制。因此,您可以轻松地创建、删除、克隆或迁移实例。云实例也在云提供商控制台中远程操作,默认连接到远程存储。

    另外,您可以随时将云实例的当前状态备份为快照。之后,您可以加载快照,将实例恢复到保存的状态。

  • 与主机分离和软件兼容性

    与本地虚拟机类似,云实例上的 RHEL 客户机操作系统运行在虚拟化内核上。这个内核与主机操作系统以及用来连接实例的 客户端 系统分开。

    因此,任何操作系统都可以安装在云实例上。这意味着,在 RHEL 公有云实例中,您可以运行无法在本地操作系统上使用的特定于 RHEL 的应用程序。

    另外,即使实例的操作系统变得不稳定或被破坏,您的客户端系统也不会受到任何影响。

1.2. RHEL 的公有云用例

在公有云上部署会带来许多好处,但可能并非是每种场景中最有效的解决方案。如果您要评估是否将 RHEL 部署迁移到公共云,请考虑您的用例是否将从公共云的好处中受益。

有益的用例

  • 部署公有云实例对于灵活地增加和减少部署的活跃计算能力(也称为 扩展缩减)非常有效。因此,在以下情况下,建议在公有云上使用 RHEL:

    • 具有高峰值工作负载和一般性能要求的集群。在资源成本方面,根据您的需求扩展和缩减可能非常高效。
    • 快速设置或扩展集群。这可避免设置本地服务器的高前期成本。
  • 云实例不受本地环境中发生的情况的影响。因此,您可以使用它们进行备份和恢复。

有潜在问题的用例

  • 您正在运行一个无法调整的现有环境。与您当前的主机平台相比,自定义云实例以适应现有部署的特定需求可能并不划算。
  • 您有预算方面的硬限制。在本地数据中心中维护您的部署通常具有更大的灵活性,但与公有云相比,您对最大资源成本有更多的控制。

1.3. 迁移到公有云时的常见关注

将 RHEL 工作负载从本地环境移到公有云平台可能会带来有关涉及的变化的担忧。以下是最常见的问题。

作为云实例,我的 RHEL 是否与本地虚拟机工作不同?

在大部分方面,公有云平台上的 RHEL 实例的工作方式与本地主机上的 RHEL 虚拟机相同,如内部服务器。主要例外包括:

  • 公有云实例使用特定于提供商的控制台接口,而不是私有编排接口,来管理云资源。
  • 某些功能(如嵌套虚拟化)可能无法正常工作。如果特定功能对部署至关重要,请提前检查该功能与您选择的公有云提供商的兼容性。

与本地服务器相比,我的数据在公有云中是否保持安全?

RHEL 云实例中的数据归您所有,您的公共云提供商对齐没有任何访问权限。此外,主要的云提供商支持传输中的数据加密,这提高了将虚拟机迁移到公共云时数据的安全性。

RHEL 公共云实例的一般安全性如下:

  • 您的公有云供应商负责云 hypervisor 的安全性
  • 红帽在您的实例中提供 RHEL 客户机操作系统的安全功能
  • 您可以在云基础架构中管理特定的安全设置和实践

我的地理区域对 RHEL 公有云实例的功能有何影响?

无论您所在的地理位置如何,您都可以在公有云平台上使用 RHEL 实例。因此,您可以在与内部服务器相同的区域中运行实例。

但是,在物理上较远的区域中托管您的实例可能会在操作它们时造成高延迟。此外,取决于公有云提供商,某些区域可能会提供额外的功能或更具成本效益。在创建 RHEL 实例前,请查看您选择的云提供商提供的托管区域的属性。

1.4. 为公有云部署获取 RHEL

在公有云环境中部署 RHEL 系统:

  1. 根据您的需求和当前市场提供的,为您的使用案例选择最佳云提供商。

    当前认证的运行 RHEL 实例的云提供商有:

  2. 在您选择的云平台上创建 RHEL 云实例。如需更多信息,请参阅 创建 RHEL 云实例的方法
  3. 要让您的 RHEL 部署保持最新状态,请使用 红帽更新基础设施 (RHUI)。

1.5. 创建 RHEL 云实例的方法

要在公有云平台上部署 RHEL 实例,您可以使用以下方法之一:

创建 RHEL 的系统镜像,并将其导入到云平台。

  • 要创建系统镜像,您可以使用 RHEL 镜像构建器,也可以手动构建镜像。
  • 此方法使用您现有的 RHEL 订阅,也称为 自带订阅 (BYOS)。
  • 您每年预付订阅费,您可以使用您的红帽客户折扣。
  • 您的客户服务由红帽提供。
  • 要有效地创建多个镜像,您可以使用 cloud-init 工具。

直接从云提供商市场购买 RHEL 实例。

  • 您按小时为使用的服务后付费。因此,此方法也称为 随用随付(PAYG)。
  • 您的客户服务由云平台提供商提供。
注意

有关使用各种方法在 Amazon Web Services 上部署 RHEL 实例的详细信息,请参阅本文档中的以下章节。

第 2 章 创建并上传 AWS AMI 镜像

要在 Amazon Web Services (AWS)云中使用自定义的 RHEL 系统镜像,请使用相应的输出类型使用镜像构建器创建系统镜像,配置您的系统以上传镜像,并将镜像上传到您的 AWS 帐户。

2.1. 准备上传 AWS AMI 镜像

在上传 AWS AMI 镜像前,您必须配置系统来上传镜像。

先决条件

流程

  1. 安装 Python 3 和 pip 工具:

    # yum install python3 python3-pip
  2. 使用 pip 安装 AWS 命令行工具

    # pip3 install awscli
  3. 运行以下命令设定您的配置集。终端提示您提供凭证、地区和输出格式:

    $ aws configure
    AWS Access Key ID [None]:
    AWS Secret Access Key [None]:
    Default region name [None]:
    Default output format [None]:
  4. 为存储桶定义名称,并使用以下命令创建存储桶:

    $ BUCKET=bucketname
    $ aws s3 mb s3://$BUCKET

    使用实际存储桶名称替换 bucketname。它必须是全局唯一的名称。因此,您的存储桶会被创建。

  5. 要授予访问 S3 存储桶的权限,如果您还没有这样做,请在 AWS Identity and Access Management (IAM) 中创建一个 vmimport S3 角色:

    1. 创建一个 JSON 格式的带有信任策略配置的 trust-policy.json 文件。例如:

      {
          "Version": "2022-10-17",
          "Statement": [{
              "Effect": "Allow",
              "Principal": {
                  "Service": "vmie.amazonaws.com"
              },
              "Action": "sts:AssumeRole",
              "Condition": {
                  "StringEquals": {
                      "sts:Externalid": "vmimport"
                  }
              }
          }]
      }
    2. 创建一个 JSON 格式的带有角色策略配置的 role-policy.json 文件。例如:

      {
          "Version": "2012-10-17",
          "Statement": [{
              "Effect": "Allow",
              "Action": ["s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket"],
              "Resource": ["arn:aws:s3:::%s", "arn:aws:s3:::%s/"] }, { "Effect": "Allow", "Action": ["ec2:ModifySnapshotAttribute", "ec2:CopySnapshot", "ec2:RegisterImage", "ec2:Describe"],
              "Resource": "*"
          }]
      }
      $BUCKET $BUCKET
    3. 使用 trust-policy.json 文件为您的 Amazon Web Services 帐户创建一个角色:

      $ aws iam create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json
    4. 使用 role-policy.json 文件嵌入一个内联策略文档:

      $ aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json

2.2. 使用 CLI 将 AMI 镜像上传到 AWS

您可以使用 RHEL 镜像构建器构建 ami 镜像,并使用 CLI 将它们直接推送到 Amazon AWS Cloud 服务提供商。

先决条件

  • 您已在 AWS IAM 账号管理器中配置了一个 Access Key ID
  • 您已准备好了一个可写的 S3 存储桶
  • 您有一个定义的蓝图。

流程

  1. 使用文本编辑器,使用以下内容创建配置文件:

    provider = "aws"
    
    [settings]
    accessKeyID = "AWS_ACCESS_KEY_ID"
    secretAccessKey = "AWS_SECRET_ACCESS_KEY"
    bucket = "AWS_BUCKET"
    region = "AWS_REGION"
    key = "IMAGE_KEY"

    将字段中的值替换为您的 accessKeyIDsecretAccessKeybucketregion 的凭证。IMAGE_KEY 值是要上传到 EC2 的虚拟机镜像的名称。

  2. 将文件保存为 CONFIGURATION-FILE.toml,然后关闭文本编辑器。
  3. 启动 compose 来将其上传到 AWS:

    # composer-cli compose start blueprint-name image-type image-key configuration-file.toml

    替换:

    • 使用您创建的蓝图名称替换 blueprint-name
    • 使用 ami 镜像类型替换 image-type
    • 使用要上传到 EC2 的虚拟机镜像的名称替换 image-key
    • 使用云提供商的配置文件的名称替换 configuration-file.toml。

      注意

      您必须有要将自定义镜像发送到的存储桶的正确 AWS 身份和访问管理(IAM)设置。在将镜像上传到存储桶前,您必须对存储桶设置策略。

  4. 检查镜像构建的状态:

    # composer-cli compose status

    完成镜像上传过程后,您可以看到"FINISHED"状态。

验证

要确认镜像上传成功:

  1. 访问菜单中的 EC2,并在 AWS 控制台中选择正确的区域。镜像必须具有 available 状态,以指示它已被成功上传。
  2. 在控制面板中,选择您的镜像并点 Launch

2.3. 将镜像推送到 AWS Cloud AMI

您可以使用 RHEL 镜像构建器创建一个 (.raw) 镜像,并选择 Upload to AWS 复选框,来将您创建的结果镜像直接推送到 Amazon AWS Cloud AMI 服务提供商。

先决条件

流程

  1. 在 RHEL 镜像构建器仪表盘中,点之前创建的 blueprint name
  2. 选择选项卡 Images
  3. Create Image 创建自定义镜像。

    Create Image 窗口打开。

    1. Type 下拉菜单中选择 Amazon Machine Image Disk (.raw)
    2. 选中 Upload to AWS 复选框,来将您的镜像上传到 AWS 云,然后点 Next
    3. 要验证您是否可以访问 AWS ,请在对应的字段中输入您的"AWS access key ID""AWS secret access key"。点击 Next

      注意

      您只能在创建新 Access Key ID 时查看 AWS secret access key 。如果您不知道您的 Secret Key,请生成一个新的 Access Key ID。

    4. Image name 字段中输入镜像名称,在 Amazon S3 bucket name 字段中输入 Amazon bucket 名称,并为您要添加自定义镜像的存储桶输入 AWS region 字段。点击 Next
    5. 查看信息并点 Finish

      可选,点 Back 来修改任何不正确的详情。

      注意

      您必须具有要发送自定义镜像的存储桶的正确 IAM 设置。此流程使用 IAM 导入和导出,因此您必须在将镜像上传到存储桶前为存储桶设置 策略。如需更多信息,请参阅 IAM 用户所需的权限

  4. 右上角的弹出窗口告诉您保存的进度。它还告知镜像创建过程、创建此镜像的过程以及后续的上传到 AWS Cloud。

    完成这个过程后,您可以看到 镜像构建完成状态。

  5. 在浏览器中,访问 Service→EC2

    1. 在 AWS 控制台仪表盘菜单中,选择 correct region。镜像必须具有 Available 状态,以指示它已被上传。
    2. 在 AWS 仪表盘中,选择您的镜像并点 Launch
  6. 此时会打开一个新窗口。根据启动镜像所需的资源选择实例类型。点击 Review and Launch
  7. 查看您的实例启动详情。如果需要进行任何更改,您可以编辑任何部分。点 Launch
  8. 在启动实例之前,选择一个访问它的公钥。

    您可以使用您已有的密钥对,也可以创建一个新的密钥对。

    按照以下步骤在 EC2 中创建新的密钥对,并将它连接到新实例。

    1. 在下拉菜单中选择 "Create a new key pair"
    2. 输入新密钥对名称。它生成一个新的密钥对。
    3. "下载密钥对" 在您的本地系统中保存新密钥对。
  9. 然后,您可以点 Launch Instance 来启动您的实例。

    您可以检查实例的状态,它显示为 Initializing

  10. 实例状态变为 running 后,连接按钮将变为可用。
  11. 连接。此时会出现一个窗口,其中包含有关如何使用 SSH 连接的说明。

    1. 选择 A standalone SSH client 作为首选连接方法并打开终端。
    2. 在您存储私钥的位置,确保您的密钥是公开可见的,以便 SSH 可以正常工作。要做到这一点,请运行以下命令:

      $ chmod 400 _your-instance-name.pem_>
    3. 使用其公共 DNS 连接到您的实例:

      $ ssh -i <_your-instance-name.pem_> ec2-user@<_your-instance-IP-address_>
    4. 键入 yes 以确认您要继续连接。

      因此,您使用 SSH 连接到实例。

验证

  • 检查在使用 SSH 连接到实例后您是否能够执行任何操作。

第 3 章 在 Amazon Web Services 上将 Red Hat Enterprise Linux 镜像部署为 EC2 实例

您有多个选择可以将 Red Hat Enterprise Linux(RHEL)8 镜像部署为 Amazon Web Services(AWS)上的 EC2 实例。本章讨论了您选择镜像的选项,并列出或引用了主机系统和虚拟机(VM)的系统要求。本章还提供了从 ISO 镜像创建自定义虚拟机、将其上传到 EC2 以及启动 EC2 实例的步骤。

要将 Red Hat Enterprise Linux 8(RHEL 8)部署为 Amazon Web Services(AWS)上的 EC2 实例,请按照以下信息操作。本章:

  • 讨论您选择镜像的选项
  • 列出或引用主机系统和虚拟机(VM)的系统要求。
  • 提供从 ISO 镜像创建自定义虚拟机、将其上传到 EC2 ,并启动 EC2 实例的流程
重要

虽然您可以从 ISO 镜像创建自定义虚拟机,但红帽建议您使用 Red Hat Image Builder 产品来创建自定义镜像,以便用于特定的云供应商。使用 Image Builder,您可以创建并上传 ami 格式的 Amazon Machine Image(AMI)。如需更多信息,请参阅生成自定义 RHEL 系统镜像

注意

如需可以在 AWS 上安全使用的红帽产品列表,请参阅 Amazon Web Services

先决条件

3.1. AWS 上的 Red Hat Enterprise Linux 镜像选项

下表列出了镜像的不同选择并记录镜像选项的不同。

表 3.1. 镜像选项

镜像选项订阅示例情境注意事项

部署红帽黄金镜像。

使用您现有的红帽订阅。

在 AWS 上选择红帽黄金镜像。有关黄金镜像以及如何在 Azure 上访问它们的详情,请查看 红帽云访问参考指南

订阅包括红帽产品成本 ; 您可以为 Amazon 提供所有其他实例成本。红帽直接为 Cloud Access 镜像提供支持。

部署已移至 AWS 的自定义镜像。

使用您现有的红帽订阅。

上传自定义镜像,并附加您的订阅。

订阅包括红帽产品成本 ; 您可以为 Amazon 提供所有其他实例成本。红帽直接为自定义 RHEL 镜像提供支持。

部署包含 RHEL 的现有 Amazon 镜像。

AWS EC2 镜像包括红帽产品。

AWS 管理控制台 上启动实例时,选择 RHEL 镜像,或者从 AWS 市场 中选择。

根据 随用随付 模式按小时向 Amazon 付费。这样的镜像称为 "on-demand" 镜像。Amazon 支持 on-demand 镜像。

红帽提供了镜像的更新。AWS 通过红帽更新基础架构(RHUI)提供更新。

注意

您可以使用 Red Hat Image Builder 为 AWS 创建自定义镜像。如需更多信息,请参阅生成自定义 RHEL 系统镜像

重要

您不能将按需实例转换为自定义 RHEL 实例。从按需镜像改为自定义 RHEL 自带订阅 (BYOS)镜像:

  1. 创建新的自定义 RHEL 实例,并从您的按需实例迁移数据。
  2. 在迁移数据后取消您的 on-demand 实例以避免出现重复账单。

3.2. 理解基础镜像

本节包括使用预配置的基础镜像及其配置设置的信息。

3.2.1. 使用自定义基础镜像

要手动配置虚拟机(VM),首先创建一个基础(起步)虚拟机镜像。然后,您可以修改配置设置,并添加 VM 在云上操作所需的软件包。您可在上传镜像后为特定应用程序进行额外的配置更改。

3.2.2. 虚拟机配置设置

云虚拟机必须具有以下配置设置。

表 3.2. 虚拟机配置设置

设置建议

ssh

必须启用 SSH 来提供虚拟机的远程访问。

dhcp

应该为 dhcp 配置主虚拟适配器。

3.3. 从 ISO 镜像创建基本虚拟机

按照本节中的流程从 ISO 镜像创建 RHEL 8 基础镜像。

先决条件

3.3.1. 从 RHEL ISO 镜像创建虚拟机

流程

  1. 确保已为虚拟化启用主机机器。有关信息和流程,请参阅在 RHEL 8 中启用虚拟化
  2. 创建并启动基本 Red Hat Enterprise Linux 虚拟机。有关说明,请参阅 创建虚拟机

    1. 如果使用命令行创建虚拟机,请确保将默认内存和 CPU 设置为您所需的容量。将您的虚拟网络接口设置为 virtio

      例如,以下命令使用 /home/username/Downloads/rhel8.iso 镜像创建一个 kvmtest 虚拟机:

      # virt-install \
          --name kvmtest --memory 2048 --vcpus 2 \
          --cdrom /home/username/Downloads/rhel8.iso,bus=virtio \
          --os-variant=rhel8.0
    2. 如果使用 Web 控制台来创建虚拟机,请按照 使用 web 控制台创建虚拟机 中的流程进行操作,包括以下注意事项:

      • 不要选择 Immediately Start VM
      • Memory 大小更改为你希望的设置。
      • 在开始安装前,请确保将 Virtual Network Interface Settings 中的 Model 更改为 virtio,并将您的 vCPU 更改为您想要的虚拟机容量设置。

3.3.2. 完成 RHEL 安装

执行以下步骤完成安装并在虚拟机启动后启用 root 访问。

流程

  1. 选择您要在安装过程中使用的语言。
  2. Installation Summary 视图中:

    1. Software Selection,选择 Minimal Install
    2. Done
    3. 点击 Installation Destination 并检查 Storage Configuration 中的 Custom

      • 验证 /boot 至少 500 MB。将剩余空间用于根 /
      • 建议使用标准分区,但您也可以使用逻辑卷管理(LVM)。
      • 您可以将 xfs、ext4 或者 ext3 用于文件系统。
      • 完成更改后点 Done
  3. Begin Installation
  4. 设置 Root 密码。根据情况创建其他用户。
  5. 重新启动虚拟机,并在安装完成后以 root 身份登录。
  6. 配置镜像。

    1. 注册虚拟机并启用 Red Hat Enterprise Linux 8 软件仓库。

      # subscription-manager register --auto-attach
    2. 确保已安装并启用了 cloud-init 软件包。

      # yum install cloud-init
      # systemctl enable --now cloud-init.service
  7. 重要:此步骤只适用于您要上传到 AWS 的虚拟机。

    1. 对于 AMD64 或 Intel 64(x86_64)VM,安装 nvme,xen-netfrontxen-blkfront 驱动程序。

      # dracut -f --add-drivers "nvme xen-netfront xen-blkfront"
    2. 对于 ARM 64(aarch64)虚拟机,安装 nvme 驱动程序。

      # dracut -f --add-drivers "nvme"

      包括这些驱动程序会删除 dracut 超时的可能性。

      或者,您可以将驱动程序添加到 /etc/dracut.conf.d/,然后输入 dracut -f 来覆盖现有的 initramfs 文件。

  8. 关闭虚拟机。

3.4. 将 Red Hat Enterprise Linux 镜像上传到 AWS

按照本节中的步骤将您的镜像上传到 AWS。

3.4.1. 安装 AWS CLI

在 AWS 中管理 HA 集群所需的许多流程包括 AWS CLI:完成以下步骤以安装 AWS CLI。

先决条件

  • 您已创建了 AWS Access Key ID 和 AWS Secret Access Key,并可以访问它们。具体说明和详情,请参考 快速配置 AWS CLI

流程

  1. 使用 yum 命令安装 AWS 命令行工具

    # yum install awscli
  2. 使用 aws --version 命令验证您是否安装了 AWS CLI。

    $ aws --version
    aws-cli/1.19.77 Python/3.6.15 Linux/5.14.16-201.fc34.x86_64 botocore/1.20.77
  3. 根据 AWS 访问详情配置 AWS 命令行客户端。

    $ aws configure
    AWS Access Key ID [None]:
    AWS Secret Access Key [None]:
    Default region name [None]:
    Default output format [None]:

3.4.2. 创建 S3 存储桶

导入到 AWS 需要 Amazon S3 存储桶。Amazon S3 存储桶是一个 Amazon 资源用于存储对象。作为上传镜像过程的一部分,您可以创建一个 S3 存储桶,然后将镜像移到存储桶。完成以下步骤以创建存储桶。

流程

  1. 启动 Amazon S3 控制台
  2. Create Bucket。此时会出现 Create Bucket 对话框。
  3. Name and region 视图中:

    1. 输入 Bucket name
    2. 输入 Region
    3. Next
  4. Configure options 视图中,选择所需的选项,然后单击 Next
  5. Set permissions 视图中,更改或者接受默认选项并点 Next
  6. 查看存储桶配置。
  7. Create bucket

    注意

    另外,您可以使用 AWS CLI 创建存储桶。例如,aws s3 mb s3://my-new-bucket 命令会创建一个名为 my-new-bucket 的 S3 存储桶。有关 mb 命令的更多信息,请参阅 AWS CLI 命令参考

3.4.3. 创建 vmimport 角色

执行以下流程来创建 vmimport 角色,这是 VM 导入所要求的。如需更多信息,请参阅 Amazon 文档中的 VM Import Service Role 部分。

流程

  1. 创建名为 trust-policy.json 的文件,并包含以下策略:在您的系统中保存该文件并记录其位置。

    {
       "Version": "2012-10-17",
       "Statement": [
          {
             "Effect": "Allow",
             "Principal": { "Service": "vmie.amazonaws.com" },
             "Action": "sts:AssumeRole",
             "Condition": {
                "StringEquals":{
                   "sts:Externalid": "vmimport"
                }
             }
          }
       ]
    }
  2. 使用 create role 命令创建 vmimport 角色。指定 trust-policy.json 文件所在位置的完整路径。为该路径加上前缀 file://。例如:

    $ aws iam create-role --role-name vmimport --assume-role-policy-document file:///home/sample/ImportService/trust-policy.json
  3. 创建名为 role-policy.json 的文件,并包含以下策略:将 s3-bucket-name 替换为 S3 存储桶的名称。

    {
       "Version":"2012-10-17",
       "Statement":[
          {
             "Effect":"Allow",
             "Action":[
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket"
             ],
             "Resource":[
                "arn:aws:s3:::s3-bucket-name",
                "arn:aws:s3:::s3-bucket-name/*"
             ]
          },
          {
             "Effect":"Allow",
             "Action":[
                "ec2:ModifySnapshotAttribute",
                "ec2:CopySnapshot",
                "ec2:RegisterImage",
                "ec2:Describe*"
             ],
             "Resource":"*"
          }
       ]
    }
  4. 使用 put-role-policy 命令将策略附加到您所创建的角色。指定 role-policy.json 文件的完整路径。例如:

    $ aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file:///home/sample/ImportService/role-policy.json

3.4.4. 将镜像转换为 S3

完成以下步骤,将您的镜像转换为 S3。示例具有代表性;它们将格式为 qcow2 文件格式的镜像转换为 raw 格式的文件。Amazon 接受 OVAVHDVHDXVMDKraw 格式的镜像。如需有关 Amazon 接受的镜像格式的更多信息,请参阅 VM Import/Export Works

流程

  1. 运行 qemu-img 命令来转换您的镜像。例如:

    # qemu-img convert -f qcow2 -O raw rhel-8.0-sample.qcow2 rhel-8.0-sample.raw
  2. 将镜像推送到 S3。

    $ aws s3 cp rhel-8.0-sample.raw s3://s3-bucket-name
    注意

    这个过程可能需要几分钟时间。完成后,您可以使用 AWS S3 控制台检查您的镜像是否已成功上传到 S3 存储桶

3.4.5. 将您的镜像导入为快照

执行以下步骤将镜像导入为快照。

流程

  1. 创建文件来指定镜像的存储桶和路径。将文件命名为 containers.json。在下面的示例中,将 s3-bucket-name 替换为您 的存储桶名称,将 s3-key 替换为您的密钥。您可以使用 Amazon S3 控制台获取镜像的密钥。

    {
        "Description": "rhel-8.0-sample.raw",
        "Format": "raw",
        "UserBucket": {
            "S3Bucket": "s3-bucket-name",
            "S3Key": "s3-key"
        }
    }
  2. 将镜像导入为快照。本例使用公有 Amazon S3 文件;您可以使用 Amazon S3 控制台 来更改存储桶的权限设置。

    aws ec2 import-snapshot --disk-container file://containers.json

    终端会显示如下信息。注意消息中的 ImportTaskID

    {
        "SnapshotTaskDetail": {
            "Status": "active",
            "Format": "RAW",
            "DiskImageSize": 0.0,
            "UserBucket": {
                "S3Bucket": "s3-bucket-name",
                "S3Key": "rhel-8.0-sample.raw"
            },
            "Progress": "3",
            "StatusMessage": "pending"
        },
        "ImportTaskId": "import-snap-06cea01fa0f1166a8"
    }
  3. 使用 describe-import-snapshot-tasks 命令来跟踪导入的进度。包含 ImportTaskID

    $ aws ec2 describe-import-snapshot-tasks --import-task-ids import-snap-06cea01fa0f1166a8

    返回的消息显示任务的当前状态。完成后,Status 显示为 completed。在状态中记录快照 ID。

3.4.6. 从上传的快照创建 AMI

在 EC2 中,在启动实例时,您必须选择一个 Amazon Machine Image(AMI)。执行以下步骤从上传的快照中创建 AMI。

流程

  1. 进入 AWS EC2 仪表板。
  2. Elastic Block Store 下,选择 Snapshots
  3. 搜索快照 ID(例如,snap-0e718930bd72bcda0)。
  4. 右键点击快照并选择 Create image
  5. 为您的镜像命名。
  6. Virtualization type 中,选择 Hardware-assisted virtualization
  7. Create。在关于镜像创建的备注中,有一个到您镜像的链接。
  8. 点击镜像链接。您的镜像显示在 Images>AMIs 下。

    注意

    另外,您可以使用 AWS CLI register-image 命令来从快照创建 AMI。如需更多信息,请参阅 register-image。下面是一个示例。

    $ aws ec2 register-image \
        --name "myimagename" --description "myimagedescription" --architecture x86_64 \
        --virtualization-type hvm --root-device-name "/dev/sda1" --ena-support \
        --block-device-mappings "{\"DeviceName\": \"/dev/sda1\",\"Ebs\": {\"SnapshotId\": \"snap-0ce7f009b69ab274d\"}}"

    您必须将根设备卷 /dev/sda1 指定为 root-device-name。有关 AWS 设备映射的概念信息,请参阅 块设备映射示例

3.4.7. 从 AMI 启动实例

执行以下步骤从 AMI 启动和配置实例。

流程

  1. 在 AWS EC2 Dashboard 中选择 Images,然后选择 AMI
  2. 右键点击您的镜像并选择 Launch
  3. 选择一个满足或超过工作负载要求的 Instance Type

    有关 实例类型的信息,请参阅 Amazon EC2 实例类型。

  4. Next: Configure Instance Details

    1. 输入您要创建的实例数量
    2. 对于 Network,选择您在设置 AWS 环境时创建的 VPC。为实例选择子网或创建新子网。
    3. 为 Auto-assign Public IP 选择 Enable

      注意

      这些是创建基本实例所需的最小配置选项。根据您的应用程序要求查看其他选项。

  5. 点击 Next: Add Storage。验证默认存储是否足够。
  6. 点击 Next: Add Tags

    注意

    标签可帮助您管理 AWS 资源。有关 标记的信息,请参阅标记您的 Amazon EC2 资源

  7. 点击 Next: Configure Security Group。选择设置 AWS 环境时创建的安全组。
  8. Review and Launch。验证您的选择。
  9. Launch。此时会提示您选择现有密钥对或创建新密钥对。选择设置 AWS 环境时创建的密钥对。

    注意

    验证您的私钥权限是否正确。如有必要,使用命令选项 chmod 400 <keyname>.pem 来更改权限。

  10. Launch Instances
  11. View Instances。您可以命名实例。

    现在,您可以通过选择一个实例并单击 Connect 来启动与实例的 SSH 会话。使用为 独立的 SSH 客户端 提供的示例。

    注意

    另外,您可以使用 AWS CLI 启动实例。如需更多信息,请参阅 Amazon 文档中的启动、列出和终止 Amazon EC2 实例

3.4.8. 附加红帽订阅

要将红帽订阅附加到 RHEL 实例,请使用以下步骤。

先决条件

  • 您必须已启用您的订阅。

流程

  1. 注册您的系统。

    # subscription-manager register --auto-attach
  2. 附加您的订阅。

3.4.9. 对 AWS 黄金镜像设置自动注册

要在 Amazon Web Services(AWS)上更快、更舒适地部署 RHEL 8 虚拟机,您可以将 RHEL 8 的黄金镜像设置为自动注册到 Red Hat Subscription Manager(RHSM)。

先决条件

  • 您已下载了 AWS 的最新 RHEL 8 黄金镜像。具体步骤请参阅 在 AWS 上使用黄金镜像

    注意

    一个 AWS 帐户一次只能附加到一个红帽帐户。因此,在将其附加到您的红帽帐户之前,请确保其他用户不需要访问 AWS 帐户。

流程

  1. 将黄金镜像上传到 AWS。具体步骤请参阅将 Red Hat Enterprise Linux 镜像上传到 AWS
  2. 使用上传的镜像创建虚拟机。他们将自动订阅 RHSM。

验证

  • 在使用上述说明创建的 RHEL 8 虚拟机中,通过执行 subscription-manager identity 命令来验证系统是否已注册到 RHSM。在成功注册的系统上,这会显示系统的 UUID。例如:

    # subscription-manager identity
    system identity: fdc46662-c536-43fb-a18a-bbcb283102b7
    name: 192.168.122.222
    org name: 6340056
    org ID: 6340056

3.5. 其他资源

第 4 章 在 AWS 上配置红帽高可用性集群

本章提供了在 Amazon Web Services(AWS)上配置红帽高可用性(HA)集群的信息和流程,其中使用 EC2 实例作为集群节点。请注意,您有多个选项可用来获取用于集群的 Red Hat Enterprise Linux(RHEL)镜像。有关 AWS 镜像选项的详情,请参考 AWS 上的 Red Hat Enterprise Linux 镜像选项

本章包括:

  • 为 AWS 设置环境的先决条件的流程。设置环境后,您可以创建并配置 EC2 实例。
  • 特定于创建 HA 集群的流程,其将单个节点转换为 AWS 上的 HA 节点的集群。这包括在每个集群节点上安装高可用性软件包和代理、配置隔离以及安装 AWS 网络资源代理的步骤。

先决条件

4.1. 在公共云平台上使用高可用性集群的好处

高可用性(HA)集群是一组计算机(称为 节点),它们链接在一起以运行特定工作负载。HA 集群的目的是在出现硬件或软件故障时提供冗余功能。如果 HA 集群中的节点失败,Pacemaker 集群资源管理器会将工作负载分发到其他节点,且在集群中运行的服务中不会出现显著停机时间。

您还可以在公有云平台上运行 HA 集群。在这种情况下,您要将云中的虚拟机(VM)实例用作单独的集群节点。在公有云平台上使用 HA 集群有以下优点:

  • 改进了可用性:如果出现虚拟机故障,工作负载会快速重新分发到其他节点,因此运行的服务不会中断。
  • 可扩展性:在需求高且需求较低时,可以启动其他节点。
  • 节约成本:采用现收现付定价时,您只需为正在运行的节点支付费用。
  • 简化管理:有些公共云平台提供管理界面,以便更轻松地配置 HA 集群。

要在 Red Hat Enterprise Linux (RHEL)系统上启用 HA,红帽提供了一个高可用性附加组件。High Availability Add-On 提供了在 RHEL 系统上创建 HA 集群的所有必要组件。这些组件包括高可用性服务管理和集群管理工具。

4.2. 创建 AWS 访问密钥和 AWS Secret 访问密钥

在安装 AWS CLI 前,您需要创建一个 AWS 访问密钥和 AWS Secret 访问密钥。隔离和资源代理 API 使用 AWS 访问密钥和 Secret 访问密钥连接到集群中的每个节点。

完成以下步骤以创建这些密钥。

先决条件

  • 您的 IAM 用户帐户必须具有 Programmatic 访问权限。如需更多信息,请参阅设置 AWS 环境

流程

  1. 启动 AWS 控制台
  2. 点击您的 AWS 帐户 ID 来显示下拉菜单,并选择 My Security Credentials
  3. Users
  4. 选择用户并打开 Summary 屏幕。
  5. Security credentials 选项卡。
  6. Create access key
  7. 下载 .csv 文件(或保存这两个密钥)。创建隔离设备时需要输入这些密钥。

4.3. 安装 AWS CLI

在 AWS 中管理 HA 集群所需的许多流程包括 AWS CLI:完成以下步骤以安装 AWS CLI。

先决条件

  • 您已创建了 AWS Access Key ID 和 AWS Secret Access Key,并可以访问它们。具体说明和详情,请参考 快速配置 AWS CLI

流程

  1. 使用 yum 命令安装 AWS 命令行工具

    # yum install awscli
  2. 使用 aws --version 命令验证您是否安装了 AWS CLI。

    $ aws --version
    aws-cli/1.19.77 Python/3.6.15 Linux/5.14.16-201.fc34.x86_64 botocore/1.20.77
  3. 根据 AWS 访问详情配置 AWS 命令行客户端。

    $ aws configure
    AWS Access Key ID [None]:
    AWS Secret Access Key [None]:
    Default region name [None]:
    Default output format [None]:

4.4. 创建 HA EC2 实例

完成以下步骤以创建用作 HA 集群节点的实例。请注意,您有几个选项可用于获取用于集群的 RHEL 镜像。如需有关 AWS 的镜像选项的信息,请参阅 AWS 上的 Red Hat Enterprise Linux 镜像选项

您可以创建和上传用于集群节点的自定义镜像,也可以使用黄金镜像或按需镜像。

先决条件

流程

  1. 在 AWS EC2 Dashboard 中选择 Images,然后选择 AMI
  2. 右键点击您的镜像并选择 Launch
  3. 选择一个满足或超过工作负载要求的 Instance Type。根据您的 HA 应用,每个实例可能需要具有更高的容量。

    有关 实例类型的信息,请参阅 Amazon EC2 实例类型。

  4. Next: Configure Instance Details

    1. 输入您要为集群创建的 Number of instances。这个示例流程使用三个集群节点。

      注意

      不要启动自动缩放组。

    2. 对于 Network,请选择您在 Set up AWS environment 中创建的 VPC。选择实例子网以创建新子网。
    3. 为 Auto-assign Public IP 选择 Enable。以下是 Configure Instance Details 所需的最小选择。根据您的特定 HA 应用,您可能需要进行其他选择。

      注意

      这些是创建基本实例所需的最小配置选项。根据您的 HA 应用程序要求查看其他选项。

  5. 单击 Next: Add Storage ,并验证默认存储是否足够。除非您的 HA 应用程序需要其他存储选项,您不需要修改这些设置。
  6. 点击 Next: Add Tags

    注意

    标签可帮助您管理 AWS 资源。有关 标记的信息,请参阅标记您的 Amazon EC2 资源

  7. 点击 Next: Configure Security Group。选择在 Setting the AWS environment 中创建的现有安全组。
  8. 点击 Review and Launch ,并验证您的选择。
  9. 点击 Launch。此时会提示您选择现有密钥对或创建新密钥对。选择在 Setting up the AWS environment 时创建的密钥对。
  10. 点击 Launch Instances
  11. View Instances。您可以命名实例。

    注意

    另外,您可以使用 AWS CLI 启动实例。如需更多信息,请参阅 Amazon 文档中的启动、列出和终止 Amazon EC2 实例

4.5. 配置私钥

在 SSH 会话中使用私有 SSH 密钥文件(.pem)之前,请完成以下配置任务来使用该文件。

流程

  1. 将密钥文件从 Downloads 目录移到您的 目录或 ~/.ssh 目录
  2. 更改密钥文件的权限,以便只有 root 用户可以读取它。

    # chmod 400 KeyName.pem

4.6. 连接到 EC2 实例

在所有节点上完成以下步骤来连接 EC2 实例。

流程

  1. 启动 AWS Console ,并选择 EC2 实例。
  2. 点击 Connect ,并选择 A standalone SSH client
  3. 在 SSH 终端会话中,使用弹出窗口中提供的 AWS 示例连接到实例。如果示例中没有显示路径,请为您的 KeyName.pem 文件添加正确的路径。

4.7. 安装高可用性软件包和代理

在所有节点上完成以下步骤,安装高可用性软件包和代理。

流程

  1. 删除 AWS Red Hat Update Infrastructure (RHUI)客户端。

    $ sudo -i
    # yum -y remove rh-amazon-rhui-client*
  2. 在红帽注册虚拟机。

    # subscription-manager register --auto-attach
  3. 禁用所有软件仓库。

    # subscription-manager repos --disable=*
  4. 启用 RHEL 8 服务器 HA 软件仓库。

    # subscription-manager repos --enable=rhel-8-for-x86_64-highavailability-rpms
  5. 更新 RHEL AWS 实例。

    # yum update -y
  6. 安装红帽高可用性附加组件软件包,以及高可用性通道的所有可用的隔离代理。

    # yum install pcs pacemaker fence-agents-aws
  7. 在上一步中的 pcspacemaker 安装过程中,创建了用户 hacluster 。在所有群集节点上为 hacluster 创建密码。所有节点都使用相同的密码。

    # passwd hacluster
  8. 如果安装了 firewalld.service,请在 RHEL Firewall 中添加 high availability 服务。

    # firewall-cmd --permanent --add-service=high-availability
    # firewall-cmd --reload
  9. 启动 pcs 服务,并使其在引导时启动。

    # systemctl start pcsd.service
    # systemctl enable pcsd.service
  10. 编辑 /etc/hosts ,并添加 RHEL 主机名和内部 IP 地址。详情请参阅如何在 RHEL 集群节点上设置 /etc/hosts 文件?

验证

  • 确保 pcs 服务正在运行。

    # systemctl status pcsd.service
    
    pcsd.service - PCS GUI and remote configuration interface
    Loaded: loaded (/usr/lib/systemd/system/pcsd.service; enabled; vendor preset: disabled)
    Active: active (running) since Thu 2018-03-01 14:53:28 UTC; 28min ago
    Docs: man:pcsd(8)
    man:pcs(8)
    Main PID: 5437 (pcsd)
    CGroup: /system.slice/pcsd.service
         └─5437 /usr/bin/ruby /usr/lib/pcsd/pcsd > /dev/null &
    Mar 01 14:53:27 ip-10-0-0-48.ec2.internal systemd[1]: Starting PCS GUI and remote configuration interface…
    Mar 01 14:53:28 ip-10-0-0-48.ec2.internal systemd[1]: Started PCS GUI and remote configuration interface.

4.8. 创建集群

完成以下步骤以创建节点集群。

流程

  1. 在其中一个节点上,输入以下命令来验证 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
  2. 创建集群。

    # pcs cluster setup <cluster_name> <hostname1> <hostname2> <hostname3>

    例如:

    [root@node01 clouduser]# pcs cluster setup new_cluster node01 node02 node03
    
    [...]
    
    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

验证

  1. 启用集群。

    [root@node01 clouduser]# pcs cluster enable --all
    node02: Cluster Enabled
    node03: Cluster Enabled
    node01: Cluster Enabled
  2. 启动集群。

    [root@node01 clouduser]# pcs cluster start --all
    node02: Starting Cluster...
    node03: Starting Cluster...
    node01: Starting Cluster...

4.9. 配置隔离

隔离配置可确保 AWS 集群上的故障节点被自动隔离,这样可防止节点消耗集群的资源或影响集群的功能。

您可以使用多种方法在 AWS 集群上配置隔离功能。本节提供以下内容:

  • 默认配置的标准过程。
  • 另一种配置过程,用于更高级的配置,专注于自动化。

标准流程

  1. 输入以下 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
  2. 输入以下命令配置隔离设备。使用 pcmk_host_map 命令将 RHEL 主机名映射到实例 ID。使用您之前设置的 AWS 访问密钥和 AWS Secret 访问密钥。

    # pcs stonith \
        create <name> 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" \
        power_timeout=240 pcmk_reboot_timeout=480 pcmk_reboot_retries=4

    例如:

    [root@ip-10-0-0-48 ~]# pcs stonith \
    create clusterfence fence_aws access_key=AKIAI123456MRMJA secret_key=a75EYIG4RVL3hdsdAslK7koQ8dzaDyn5yoIZ/ \
    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

备用步骤

  1. 获取集群的 VPC ID。

    # aws ec2 describe-vpcs --output text --filters "Name=tag:Name,Values=clustername-vpc" --query 'Vpcs[*].VpcId'
    vpc-06bc10ac8f6006664
  2. 使用集群的 VPC ID,获取 VPC 实例。

    $ aws ec2 describe-instances --output text --filters "Name=vpc-id,Values=vpc-06bc10ac8f6006664" --query 'Reservations[*].Instances[*].{Name:Tags[? Key==Name]|[0].Value,Instance:InstanceId}' | grep "\-node[a-c]"
    i-0b02af8927a895137     clustername-nodea-vm
    i-0cceb4ba8ab743b69     clustername-nodeb-vm
    i-0502291ab38c762a5     clustername-nodec-vm
  3. 使用获得的实例 ID 在集群的每个节点中配置隔离。例如:

    [root@nodea ~]# CLUSTER=clustername && pcs stonith create fence${CLUSTER} fence_aws access_key=XXXXXXXXXXXXXXXXXXXX pcmk_host_map=$(for NODE \
    in node{a..c}; do ssh ${NODE} "echo -n \${HOSTNAME}:\$(curl -s http://169.254.169.254/latest/meta-data/instance-id)\;"; done) \
    pcmk_reboot_retries=4 pcmk_reboot_timeout=480 power_timeout=240 region=xx-xxxx-x secret_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    
    [root@nodea ~]# pcs stonith config fence${CLUSTER}
    
    Resource: clustername (class=stonith type=fence_aws)
    Attributes: access_key=XXXXXXXXXXXXXXXXXXXX pcmk_host_map=nodea:i-0b02af8927a895137;nodeb:i-0cceb4ba8ab743b69;nodec:i-0502291ab38c762a5;
    pcmk_reboot_retries=4 pcmk_reboot_timeout=480 power_timeout=240 region=xx-xxxx-x secret_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Operations: monitor interval=60s (clustername-monitor-interval-60s)

验证

  1. 测试其中一个集群节点的隔离代理。

    # pcs stonith fence awsnodename
    注意

    这个命令的响应可能需要几分钟时间来显示。如果您监视节点被隔离的活跃终端会话,您会在进入 fence 命令后马上终止终端连接。

    例如:

    [root@ip-10-0-0-48 ~]# pcs stonith fence ip-10-0-0-58
    
    Node: ip-10-0-0-58 fenced
  2. 检查状态以验证该节点是否已隔离。

    # 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 19:55:41 2018
    Last change: Fri Mar  2 19:24:59 2018 by root via cibadmin on ip-10-0-0-46
    
    3 nodes configured
    1 resource configured
    
    Online: [ ip-10-0-0-46 ip-10-0-0-48 ]
    OFFLINE: [ 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
  3. 启动上一步中隔离的节点。

    # pcs cluster start awshostname
  4. 检查状态以验证节点已启动。

    # 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.10. 在集群节点上安装 AWS CLI

在以前的版本中,您在主机系统中安装了 AWS CLI。在配置网络资源代理前,您需要在集群节点上安装 AWS CLI。

在每个集群节点上完成以下步骤。

先决条件

流程

  1. 安装 AWS CLI。具体步骤请参阅安装 AWS CLI
  2. 验证 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.11. 安装网络资源代理

要使 HA 操作正常工作,集群使用 AWS 网络资源代理来启用故障切换功能。如果节点在一定时间内没有响应心跳检查,则该节点会被隔离,操作会切换到集群中的其它节点。需要配置网络资源代理才能正常工作。

将两个资源 添加到同一组中,以强制 ordercolocation 约束。

创建二级私有 IP 资源及虚拟 IP 资源

完成以下步骤以添加二级专用 IP 地址并创建虚拟 IP。您可以从集群中的任何节点完成此步骤。

流程

  1. 查看 AWS Secondary Private IP Address 资源代理(awsvip)描述。这显示了这个代理的选项和默认操作。

    # pcs resource describe awsvip
  2. 使用 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
  3. 创建虚拟 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

    例如:

    [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 地址用于面向公共的互联网连接,而不是子网连接。

  1. 将两个资源添加到之前创建的 同一组中,以强制 顺序共处约束
  2. 输入以下 AWS CLI 命令来创建弹性 IP 地址。

    [root@ip-10-0-0-48 ~]# aws ec2 allocate-address --domain vpc --output text
    eipalloc-4c4a2c45   vpc 35.169.153.122
  3. 查看 AWS Secondary Elastic IP Address 资源代理(awseip)描述。以下命令显示此代理的选项和默认操作。

    # pcs resource describe awseip
  4. 使用步骤 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)资源是否正常工作。

流程

  1. 从本地工作站启动 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
  2. 验证您通过 SSH 连接到的主机是否与创建的弹性资源关联。

4.12. 配置共享块存储

要为带有 Amazon Elastic Block Storage (EBS) Multi-Attach 卷的 Red Hat High Availability 集群配置共享块存储,请使用以下流程。请注意,这个流程是可选的,以下步骤假设三个带有 1TB 共享磁盘的实例(三节点集群)。

先决条件

流程

  1. 使用 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

  2. 对于集群中的每个实例,使用 AWS 命令 attach-volume 附加一个共享块卷。使用您的 <instance_id><volume_id>

    $ aws ec2 attach-volume --device /dev/xvdd --instance-id <instance_id> --volume-id <volume_id>

    例如,以下命令将共享块卷 vol-042a5652867304f09 附加到 实例 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"
    }

验证

  1. 对于集群中的每个实例,使用带有 <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
  2. 使用 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

4.13. 其他资源

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.