Red Hat Training

A Red Hat training course is available for RHEL 8

在公共云平台上部署 Red Hat Enterprise Linux 8

Red Hat Enterprise Linux 8

创建自定义 Red Hat Enterprise Linux 镜像并为公共云平台配置红帽高可用性集群

Red Hat Customer Content Services

摘要

您可以将自定义 Red Hat Enterprise Linux 镜像创建并部署到各种云平台,包括 Microsoft Azure、Amazon Web Services(AWS)和 Google Cloud Platform(GCP)。
您还可以在每个云平台中创建和配置红帽高可用性集群。本文档包含创建 HA 集群的步骤,包括安装所需的软件包和代理、配置隔离和安装网络资源代理。
每个云供应商都有自己的章节,介绍了创建和部署自定义镜像的信息。另外,还有一个单独章节用于为每个云供应商配置 HA 集群。

使开源包含更多

红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始: master、slave、blacklist 和 whitelist。这些更改将在即将发行的几个发行本中逐渐实施。如需了解更多详细信息,请参阅 CTO Chris Wright 信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。要做到这一点:

  • 关于特定内容的简单评论:

    1. 请确定您使用 Multi-page HTML 格式查看文档。另外,确定 Feedback 按钮出现在文档页的右上方。
    2. 用鼠标指针高亮显示您想评论的文本部分。
    3. 点在高亮文本上弹出的 Add Feedback
    4. 按照显示的步骤操作。
  • 要提交更复杂的反馈,请创建一个 Bugzilla ticket:

    1. 进入 Bugzilla 网站。
    2. 在 Component 中选择 Documentation
    3. Description 中输入您要提供的信息。包括文档相关部分的链接。
    4. Submit Bug

第 1 章 在 Microsoft Azure 上将 Red Hat Enterprise Linux 8 镜像部署为虚拟机

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

重要

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

本章在很多位置使用了 Azure 文档。如需了解更多详细信息,请参阅相关的 Azure 文档。

注意

有关您可以在 Azure 上安全使用的红帽产品列表,请参阅 Microsoft Azure 上的红帽产品

先决条件

1.1. Azure 上的 Red Hat Enterprise Linux 镜像选项

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

表 1.1. 镜像选项

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

选择部署一个 Red Hat Gold Image。

利用您现有的红帽订阅。

通过 Red Hat Cloud Access 程序 启用订阅,然后在 Azure 上选择 Red Hat Gold Image。如需了解有关 Gold Images 以及如何在 Azure 上访问它们的详细信息,请参阅 Red Hat Cloud Access 指南

订阅包括了红帽产品的成本;您需要向 Microsoft 支付其他费用。

Red Hat Gold Images 被称为 "Cloud Access" 镜像,因为您使用现有的红帽订阅。红帽直接为 Cloud Access 镜像提供支持。

选择部署一个要移至 Azure 的自定义镜像。

利用您现有的红帽订阅。

通过 Red Hat Cloud Access 程序启用订阅,上传您的自定义镜像并附加您的订阅。

订阅包括了红帽产品的成本;您需要向 Microsoft 支付其他费用。

移动到 Azure 的自定义镜像是 "Cloud Access" 镜像,因为您利用了您现有的红帽订阅。红帽直接为 Cloud Access 镜像提供支持。

选择部署一个包含 RHEL 的现有 Azure 镜像。

Azure 镜像包括一个红帽产品。

使用 Azure 控制台创建虚拟机时选择 RHEL 镜像,或者从 Azure Marketplace 中选择虚拟机。

根据 pay-as-you-go 模式每小时向微软支付。这样的镜像名为 "on-demand"。 Azure 通过支持协议提供对 on-demand 镜像的支持。

红帽提供了镜像的更新。Azure 通过 Red Hat Update Infrastructure(RHUI)提供更新。

注意

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

本章的以下部分包括了与 Red Hat Enterprise Linux 自定义镜像相关的信息和流程。

1.2. 理解基础镜像

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

1.2.1. 使用自定义基础镜像

要手动配置虚拟机,请以基础(启动程序)虚拟机镜像开始。创建基本虚拟机镜像后,您可以修改配置设置并添加虚拟机在云中操作的软件包。您可在上传镜像后为特定应用程序进行额外的配置更改。

要准备 RHEL 的云镜像,请按照以下步骤操作。要准备 RHEL 的 Hyper-V 云镜像,请参阅 从 Hyper-V Manager 准备基于红帽的虚拟机

1.2.2. 所需的系统软件包

本章的步骤假设您使用运行 Red Hat Enterprise Linux 的主机系统。要成功完成这些操作,主机系统必须安装以下软件包。

表 1.2. 系统软件包

软件包软件仓库描述

libvirt

rhel-8-for-x86_64-appstream-rpms

用于管理平台虚拟化的开源 API、守护进程和管理工具

virt-install

rhel-8-for-x86_64-appstream-rpms

用于构建虚拟机的命令行工具

libguestfs

rhel-8-for-x86_64-appstream-rpms

用于访问和修改虚拟机文件系统的库

libguestfs-tools

rhel-8-for-x86_64-appstream-rpms

虚拟机的系统管理工具 ; 包括 guestfish 工具

1.2.3. Azure VM 配置设置

Azure 虚拟机必须具有以下配置设置。其中一些设置会在初始创建虚拟机期间启用。为 Azure 置备虚拟机镜像时会设置其他设置。在进行操作时请记住这些设置。如有必要,请参阅它们。

表 1.3. 虚拟机配置设置

设置建议

ssh

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

dhcp

应该为 dhcp 配置主虚拟适配器(仅限 IPv4)。

swap 空间

不要创建一个专用的交换文件或者交换分区。您可以使用 Windows Azure Linux Agent(WALinuxAgent)配置 swap 空间。

NIC

为主虚拟网络适配器选择 virtio

encryption

对于自定义镜像,请使用 Network Bound Disk Encryption(NBDE)在 Azure 上进行完整磁盘加密。

1.2.4. 从 ISO 镜像创建基础镜像

以下流程列出了创建自定义 ISO 镜像的步骤和初始配置要求。配置了镜像后,您可以使用镜像作为模板来创建额外的虚拟机实例。

流程

  1. 从红帽 客户门户网站下载最新的 Red Hat Enterprise Linux 8 Binary DVD ISO 镜像
  2. 确保已为虚拟化启用主机机器。有关信息和流程,请参阅在 RHEL 8 中启用虚拟化
  3. 创建并启动基本 Red Hat Enterprise Linux 虚拟机。具体步骤请参阅 创建虚拟机

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

      下面是一个基本的命令行示例。

      virt-install --name isotest --memory 2048 --vcpus 2 --disk size=8,bus=virtio --location rhel-8.0-x86_64-dvd.iso --os-variant=rhel8.0
    2. 如果使用 web 控制台创建虚拟机,请按照 使用 web 控制台创建虚拟机中的 步骤进行操作:

      • 不要选择 Immediately Start VM
      • MemoryStorage Size 设置为您需要的值。
      • 在开始安装前,请确保将 Virtual Network Interface Settings 中的 Model 更改为 virtio,并将您的 vCPU 更改为您想要的虚拟机容量设置。
  4. 查看以下额外的安装选择和修改。

    • 选择带有 standard RHEL 选项的 Minimal Install
    • 对于 Installation Destination,选择 Custom Storage Configuration。使用以下配置信息进行选择。

      • 确保 /boot 验证至少 500 MB。
      • 对于文件系统,在 bootroot 分区中使用 xfs、ext4 或 ext3。
      • 删除 swap 空间。swap 空间由 WALinuxAgent 在 Azure 中的物理 blade 服务器中配置。
    • Installation Summary 屏幕中,选择 Network and Host Name。将 Ethernet 切换到 On
  5. 安装开始:

    • 创建 root 密码。
    • 创建管理用户帐户。
  6. 安装完成后,重启虚拟机并登录到 root 帐户。
  7. 登录后,您可以配置镜像 root

1.3. 为 Microsoft Azure 配置基础镜像

基础镜像需要更改配置,才能作为 Azure 中的 RHEL 8 虚拟机镜像。以下小节提供 Azure 所需的其他配置更改。

1.3.1. 安装 Hyper-V 设备驱动程序

Microsoft 为 Hyper-V 软件包提供网络和存储设备驱动程序作为其 Linux 集成服务(LIS)的一部分。在将 Hyper-V 设备驱动程序置备为 Azure 虚拟机之前,您可能需要在虚拟机镜像上安装 Hyper-V 设备驱动程序。使用 lsinitrd | grep hv 命令验证是否安装了驱动程序。

流程

  1. 输入以下 grep 命令来确定是否安装了所需的 Hyper-V 设备驱动程序。

    # lsinitrd | grep hv

    在以下示例中安装了所有必需的驱动程序。

    # lsinitrd | grep hv
    drwxr-xr-x   2 root     root            0 Aug 12 14:21 usr/lib/modules/3.10.0-932.el7.x86_64/kernel/drivers/hv
    -rw-r--r--   1 root     root        31272 Aug 11 08:45 usr/lib/modules/3.10.0-932.el7.x86_64/kernel/drivers/hv/hv_vmbus.ko.xz
    -rw-r--r--   1 root     root        25132 Aug 11 08:46 usr/lib/modules/3.10.0-932.el7.x86_64/kernel/drivers/net/hyperv/hv_netvsc.ko.xz
    -rw-r--r--   1 root     root         9796 Aug 11 08:45 usr/lib/modules/3.10.0-932.el7.x86_64/kernel/drivers/scsi/hv_storvsc.ko.xz

    如果没有安装所有驱动程序,请完成剩余的步骤。

    注意

    环境中可能会存在 hv_vmbus 驱动程序。即使存在这个驱动程序,请完成以下步骤。

  2. /etc/dracut.conf.d 中创建名为 hv.conf 的文件。
  3. hv.conf 文件中添加以下驱动程序参数。

    add_drivers+=" hv_vmbus "
    add_drivers+=" hv_netvsc "
    add_drivers+=" hv_storvsc "
    注意

    请注意引号之前和之后的空格,如 add_drivers+=" hv_vmbus "。这样可确保在环境中存在其他 Hyper-V 驱动程序时载入唯一驱动程序。

  4. 重新生成 initramfs 镜像。

    # dracut -f -v --regenerate-all

验证步骤

  1. 重启机器。
  2. 运行 lsinitrd | grep hv 命令验证是否安装了驱动程序。

1.3.2. 进行额外的配置更改

虚拟机需要进行进一步的配置更改才能在 Azure 中操作。执行以下步骤进行额外的更改。

流程

  1. 如有必要,启动虚拟机。
  2. 注册虚拟机并启用 Red Hat Enterprise Linux 8 软件仓库。

    # subscription-manager register --auto-attach

停止和删除 cloud-init

  1. 停止 cloud-init 服务(如果存在)。

    # systemctl stop cloud-init
  2. 删除 cloud-init 软件。

    # yum remove cloud-init

完成其他虚拟机更改

  1. 编辑 /etc/ssh/sshd_config 文件并启用密码验证。

    PasswordAuthentication yes
  2. 设置通用主机名。

    # hostnamectl set-hostname localhost.localdomain
  3. 编辑(或创建) /etc/sysconfig/network-scripts/ifcfg-eth0 文件。仅使用以下列出的参数。

    注意

    RHEL 8 DVD ISO 镜像中没有 ifcfg-eth0 文件,它必须被创建。

    DEVICE="eth0"
    ONBOOT="yes"
    BOOTPROTO="dhcp"
    TYPE="Ethernet"
    USERCTL="yes"
    PEERDNS="yes"
    IPV6INIT="no"
  4. 删除所有持久的网络设备规则(如果存在)。

    # rm -f /etc/udev/rules.d/70-persistent-net.rules
    # rm -f /etc/udev/rules.d/75-persistent-net-generator.rules
    # rm -f /etc/udev/rules.d/80-net-name-slot-rules
  5. ssh 设置为自动启动。

    # systemctl enable sshd
    # systemctl is-enabled sshd
  6. 修改内核引导参数。

    1. /etc/default/grub 文件中的 GRUB_CMDLINE_LINUX 行的开头添加 crashkernel=256M。如果 crashkernel=auto 存在,请将其改为 crashkernel=256M
    2. 如果不存在,在 GRUB_CMDLINE_LINUX 行的末尾添加以下行。

      earlyprintk=ttyS0
      console=ttyS0
      rootdelay=300
    3. 如果存在,请删除以下选项。

      rhgb
      quiet
  7. 重新生成 grub.cfg 文件。

    # grub2-mkconfig -o /boot/grub2/grub.cfg
  8. 安装并启用 Windows Azure Linux Agent(WALinuxAgent)。Red Hat Enterprise Linux 8 Application Stream(AppStream)包括 WALinuxAgent。如需更多信息,请参阅 使用 AppStream

    # yum install WALinuxAgent -y
    # systemctl enable waagent
  9. 编辑 /etc/waagent.conf 文件中的以下行,为置备的虚拟机配置 swap 空间。为您置备的虚拟机设置 swap 空间。

    Provisioning.DeleteRootPassword=n
    ResourceDisk.Filesystem=ext4
    ResourceDisk.EnableSwap=y
    ResourceDisk.SwapSizeMB=2048

准备置备

  1. 从 Red Hat Subscription Manager 取消注册虚拟机。

    # subscription-manager unregister
  2. 通过清理现有置备详情来准备 Azure 置备。Azure 在 Azure 中重新置备虚拟机。这个命令会生成警告,这是预期的。

    # waagent -force -deprovision
  3. 清理 shell 历史记录并关闭虚拟机。

    # export HISTSIZE=0
    # poweroff

1.4. 将镜像转换为固定 VHD 格式

所有 Microsoft Azure VM 镜像都必须采用固定的 VHD 格式。镜像必须在将镜像转换为 VHD 之前被对齐到 1 MB 边界。本节论述了如何将镜像从 qcow2 转换为固定的 VHD 格式,并在需要时匹配镜像。转换镜像后,您可以将其上传到 Azure。

流程

  1. 将镜像从 qcow2 转换为 raw 格式。

    $ qemu-img convert -f qcow2 -O raw <image-name>.qcow2 <image-name>.raw
  2. 使用以下内容创建一个 shell 脚本。

    #!/bin/bash
    MB=$((1024 * 1024))
    size=$(qemu-img info -f raw --output json "$1" | gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    rounded_size=$((($size/$MB + 1) * $MB))
    if [ $(($size % $MB)) -eq  0 ]
    then
     echo "Your image is already aligned. You do not need to resize."
     exit 1
    fi
    echo "rounded size = $rounded_size"
    export rounded_size
  3. 运行脚本。这个示例使用名称 align.sh

    $ sh align.sh <image-xxx>.raw
    • 如需显示 "Your image is already aligned.You do not need to resize.",执行以下步骤。
    • 如果显示了一个值,代表您的镜像没有被对齐。
  4. 使用以下命令将文件转换为固定的 VHD 格式。

    示例使用 qemu-img 版本 2.12.0。

    $ qemu-img convert -f raw -o subformat=fixed,force_size -O vpc <image-xxx>.raw <image.xxx>.vhd

    转换后,VHD 文件就可以上传到 Azure。

对齐镜像

只有在 raw 文件没有被对齐时才执行以下步骤。

  1. 使用在运行验证脚本时显示的舍入值重新定义 raw 文件大小。

    $ qemu-img resize -f raw <image-xxx>.raw <rounded-value>
  2. raw 镜像文件转换为 VHD 格式。

    示例使用 qemu-img 版本 2.12.0。

    $ qemu-img convert -f raw -o subformat=fixed,force_size -O vpc <image-xxx>.raw <image.xxx>.vhd

    转换后,VHD 文件就可以上传到 Azure。

1.5. 安装 Azure CLI

完成以下步骤以安装 Azure 命令行界面(Azure CLI 2.1)。Azure CLI 2.1 是基于 Python 的实用程序,可在 Azure 中创建和管理虚拟机。

先决条件

  • 在使用 Azure CLI 之前,您需要具有 Microsoft Azure 帐户。
  • Azure CLI 安装需要 Python 3.x。

流程

  1. 导入 Microsoft 软件仓库密钥。

    $ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
  2. 创建本地 Azure CLI 存储库条目。

    $ sudo sh -c 'echo -e "[azure-cli]\nname=Azure CLI\nbaseurl=https://packages.microsoft.com/yumrepos/azure-cli\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/azure-cli.repo'
  3. 更新 yum 软件包索引。

    $ yum check-update
  4. 检查您的 Python 版本(python --version),如果需要安装 Python 3.x。

    $ sudo yum install python3
  5. 安装 Azure CLI。

    $ sudo yum install -y azure-cli
  6. 运行 Azure CLI。

    $ az

1.6. 在 Azure 中创建资源

完成以下步骤,在上传 VHD 文件并创建 Azure 镜像前创建所需的 Azure 资源。

流程

  1. 输入以下命令使用 Azure 验证您的系统并登录。

    $ az login
    注意

    如果在您的环境中有浏览器,则 CLI 会打开浏览器到 Azure 登录页面。如需更多信息和选项,请参阅使用 Azure CLI 登录

  2. 在 Azure 区域中创建资源组。

    $ az group create --name <resource-group> --location <azure-region>

    例如:

    [clouduser@localhost]$ az group create --name azrhelclirsgrp --location southcentralus
    {
      "id": "/subscriptions//resourceGroups/azrhelclirsgrp",
      "location": "southcentralus",
      "managedBy": null,
      "name": "azrhelclirsgrp",
      "properties": {
        "provisioningState": "Succeeded"
      },
      "tags": null
    }
  3. 创建存储帐户。有关有效 SKU 值的更多信息,请参阅 SKU Types

    $ az storage account create -l <azure-region> -n <storage-account-name> -g <resource-group> --sku <sku_type>

    例如:

    [clouduser@localhost]$ az storage account create -l southcentralus -n azrhelclistact -g azrhelclirsgrp --sku Standard_LRS
    {
      "accessTier": null,
      "creationTime": "2017-04-05T19:10:29.855470+00:00",
      "customDomain": null,
      "encryption": null,
      "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Storage/storageAccounts/azrhelclistact",
      "kind": "StorageV2",
      "lastGeoFailoverTime": null,
      "location": "southcentralus",
      "name": "azrhelclistact",
      "primaryEndpoints": {
        "blob": "https://azrhelclistact.blob.core.windows.net/",
        "file": "https://azrhelclistact.file.core.windows.net/",
        "queue": "https://azrhelclistact.queue.core.windows.net/",
        "table": "https://azrhelclistact.table.core.windows.net/"
    },
    "primaryLocation": "southcentralus",
    "provisioningState": "Succeeded",
    "resourceGroup": "azrhelclirsgrp",
    "secondaryEndpoints": null,
    "secondaryLocation": null,
    "sku": {
      "name": "Standard_LRS",
      "tier": "Standard"
    },
    "statusOfPrimary": "available",
    "statusOfSecondary": null,
    "tags": {},
      "type": "Microsoft.Storage/storageAccounts"
    }
  4. 获取存储帐户连接字符串。

    $ az storage account show-connection-string -n <storage-account-name> -g <resource-group>

    例如:

    [clouduser@localhost]$ az storage account show-connection-string -n azrhelclistact -g azrhelclirsgrp
    {
      "connectionString": "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=azrhelclistact;AccountKey=NreGk...=="
    }
  5. 通过复制连接字符串并将其粘贴到以下命令来导出连接字符串。这个字符串将您的系统连接到存储帐户。

    $ export AZURE_STORAGE_CONNECTION_STRING="<storage-connection-string>"

    例如:

    [clouduser@localhost]$ export AZURE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=azrhelclistact;AccountKey=NreGk...=="
  6. 创建存储容器。

    $ az storage container create -n <container-name>

    例如:

    [clouduser@localhost]$ az storage container create -n azrhelclistcont
    {
      "created": true
    }
  7. 创建虚拟网络。

    $ az network vnet create -g <resource group> --name <vnet-name> --subnet-name <subnet-name>

    例如:

    [clouduser@localhost]$ az network vnet create --resource-group azrhelclirsgrp --name azrhelclivnet1 --subnet-name azrhelclisubnet1
    {
      "newVNet": {
        "addressSpace": {
          "addressPrefixes": [
          "10.0.0.0/16"
          ]
      },
      "dhcpOptions": {
        "dnsServers": []
      },
      "etag": "W/\"\"",
      "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Network/virtualNetworks/azrhelclivnet1",
      "location": "southcentralus",
      "name": "azrhelclivnet1",
      "provisioningState": "Succeeded",
      "resourceGroup": "azrhelclirsgrp",
      "resourceGuid": "0f25efee-e2a6-4abe-a4e9-817061ee1e79",
      "subnets": [
        {
          "addressPrefix": "10.0.0.0/24",
          "etag": "W/\"\"",
          "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Network/virtualNetworks/azrhelclivnet1/subnets/azrhelclisubnet1",
          "ipConfigurations": null,
          "name": "azrhelclisubnet1",
          "networkSecurityGroup": null,
          "provisioningState": "Succeeded",
          "resourceGroup": "azrhelclirsgrp",
          "resourceNavigationLinks": null,
          "routeTable": null
        }
      ],
      "tags": {},
      "type": "Microsoft.Network/virtualNetworks",
      "virtualNetworkPeerings": null
      }
    }

1.7. 上传并创建 Azure 镜像

完成以下步骤,将 VHD 文件上传到容器并创建 Azure 自定义镜像。

注意

系统重启后,导出的存储连接字符串不会保留。如果以下步骤中的任何命令失败,请再次导出连接字符串。

流程

  1. VHD 文件上传到存储容器中。它可能需要几分钟时间。要获取存储容器列表,请输入 az storage container list 命令。

    $ az storage blob upload --account-name <storage-account-name> --container-name <container-name> --type page --file <path-to-vhd> --name <image-name>.vhd

    例如:

    [clouduser@localhost]$ az storage blob upload --account-name azrhelclistact --container-name azrhelclistcont --type page --file rhel-image-8.vhd --name rhel-image-8.vhd
    Percent complete: %100.0
  2. 获取上传的 VHD 文件的 URL,以便在以下步骤中使用。

    $ az storage blob url -c <container-name> -n <image-name>.vhd

    例如:

    [clouduser@localhost]$ az storage blob url -c azrhelclistcont -n rhel-image-8.vhd
    "https://azrhelclistact.blob.core.windows.net/azrhelclistcont/rhel-image-8.vhd"
  3. 创建 Azure 自定义镜像。

    $ az image create -n <image-name> -g <resource-group> -l <azure-region> --source <URL> --os-type linux
    注意

    虚拟机的默认 hypervisor 系列为 V1。您可以通过包括选项 --hyper-v-generation V2 来将 hypervisor 系列指定为 V2。第二代虚拟机使用基于 UEFI 的引导架构。如需有关生成 2 代虚拟机的信息,请参阅 Azure 生成 2 个虚拟机的支持

    该命令可能会返回"仅可导入 VHD 格式的 Blob"错误。 这个错误可能意味着,在镜像转换为 VHD 前,镜像没有与最接近的 1 MB 边界一致。

    例如:

    [clouduser@localhost]$ az image create -n rhel8 -g azrhelclirsgrp2 -l southcentralus --source https://azrhelclistact.blob.core.windows.net/azrhelclistcont/rhel-image-8.vhd --os-type linux

1.8. 在 Azure 中创建并启动虚拟机

以下步骤提供从镜像创建 managed-disk Azure 虚拟机的最低命令选项。如需了解更多选项,请参阅 az vm create

流程

  1. 输入以下命令来创建虚拟机。

    注意

    选项 --generate-ssh-keys 会创建一个私有/公钥对。私钥和公钥文件会在您的系统 ~/.ssh 中创建。公钥添加到虚拟机上由 --admin-username 选项指定的用户的 authorized_keys 文件中。如需更多信息,请参阅其他验证方法

    $ az vm create -g <resource-group> -l <azure-region> -n <vm-name> --vnet-name <vnet-name> --subnet <subnet-name> --size Standard_A2 --os-disk-name <simple-name> --admin-username <administrator-name> --generate-ssh-keys --image <path-to-image>

    例如:

    [clouduser@localhost]$ az vm create -g azrhelclirsgrp2 -l southcentralus -n rhel-azure-vm-1 --vnet-name azrhelclivnet1 --subnet azrhelclisubnet1  --size Standard_A2 --os-disk-name vm-1-osdisk --admin-username clouduser --generate-ssh-keys --image rhel8
    
    {
      "fqdns": "",
      "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Compute/virtualMachines/rhel-azure-vm-1",
      "location": "southcentralus",
      "macAddress": "",
      "powerState": "VM running",
      "privateIpAddress": "10.0.0.4",
      "publicIpAddress": "<public-IP-address>",
      "resourceGroup": "azrhelclirsgrp2"

    注意 publicIpAddress。您需要这个地址在以下步骤中登录虚拟机。

  2. 启动 SSH 会话并登录到虚拟机。

    [clouduser@localhost]$ ssh  -i /home/clouduser/.ssh/id_rsa clouduser@<public-IP-address>.
    The authenticity of host ',<public-IP-address>' can't be established.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '<public-IP-address>' (ECDSA) to the list of known hosts.
    
    [clouduser@rhel-azure-vm-1 ~]$

如果您看到用户提示,则代表成功部署了 Azure 虚拟机。

现在,您可以进入 Microsoft Azure 门户,并检查资源的审计日志和属性。您可以在此门户中直接管理虚拟机。如果要管理多个虚拟机,您应该使用 Azure CLI。Azure CLI 为您在 Azure 中的资源提供了一个强大的接口。在 CLI 中输入 az --help,或者查看 Azure CLI 命令引用, 以了解有关您在 Microsoft Azure 中管理虚拟机的命令的更多信息。

1.9. 其他验证方法

虽然使用 Azure 生成的密钥对不是必须的,但为了提高安全性,推荐使用。以下示例演示了使用两个 SSH 验证方法。

示例 1: 这些命令选项在不生成公钥文件的情况下置备新虚拟机。它们允许使用密码进行 SSH 验证。

$ az vm create -g <resource-group> -l <azure-region> -n <vm-name> --vnet-name <vnet-name> --subnet <subnet-name> --size Standard_A2 --os-disk-name <simple-name> --authentication-type password --admin-username <administrator-name> --admin-password <ssh-password> --image <path-to-image>
$ ssh <admin-username>@<public-ip-address>

示例 2: 这些命令选项置备一个新的 Azure 虚拟机,并允许使用现有公钥文件进行 SSH 验证。

$ az vm create -g <resource-group> -l <azure-region> -n <vm-name> --vnet-name <vnet-name> --subnet <subnet-name> --size Standard_A2 --os-disk-name <simple-name> --admin-username <administrator-name> --ssh-key-value <path-to-existing-ssh-key> --image <path-to-image>
$ ssh -i <path-to-existing-ssh-key> <admin-username>@<public-ip-address>

1.10. 附加红帽订阅

完成以下步骤以附加您之前通过 Red Hat Cloud Access 程序启用的订阅。

先决条件

您必须已启用您的订阅。

流程

  1. 注册您的系统。

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

第 2 章 在 Microsoft Azure 上配置红帽高可用性集群

本章包含使用 Azure 虚拟机(VM)实例作为集群节点在 Azure 上配置红帽高可用性(HA)集群的信息和步骤。本章中的流程假设您要为 Azure 创建自定义镜像。您可以使用多个选项来获取您用于集群的 RHEL 8 镜像。如需 Azure 的镜像选项的信息,请参阅 Azure 上的 Red Hat Enterprise Linux Image Options

本章包含为 Azure 设置环境的先决条件。设置环境后,您可以创建并配置 Azure VM 实例。

本章还包含与创建 HA 集群相关的流程,该集群将单个节点转换为 Azure 上的 HA 节点集群。这包括在每个集群节点上安装高可用性软件包和代理、配置隔离和安装 Azure 网络资源代理的步骤。

本章在很多位置使用了 Azure 文档。如需了解更多信息,请参阅引用的 Azure 文档。

先决条件

2.1. 在 Azure 中创建资源

完成以下步骤以创建区域、资源组、存储帐户、虚拟网络和可用性设置。您需要这些资源才能完成本章中的后续任务。

流程

  1. 使用 Azure 验证您的系统并登录。

    $ az login
    注意

    如果在您的环境中有浏览器,则 CLI 会打开浏览器到 Azure 登录页面。

    例如:

    [clouduser@localhost]$ az login
    To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code FDMSCMETZ to authenticate.
      [
        {
          "cloudName": "AzureCloud",
          "id": "Subscription ID",
          "isDefault": true,
          "name": "MySubscriptionName",
          "state": "Enabled",
          "tenantId": "Tenant ID",
          "user": {
            "name": "clouduser@company.com",
            "type": "user"
          }
        }
      ]
  2. 在 Azure 区域中创建资源组。

    $ az group create --name resource-group --location azure-region

    例如:

    [clouduser@localhost]$ az group create --name azrhelclirsgrp --location southcentralus
    {
      "id": "/subscriptions//resourceGroups/azrhelclirsgrp",
      "location": "southcentralus",
      "managedBy": null,
      "name": "azrhelclirsgrp",
      "properties": {
        "provisioningState": "Succeeded"
      },
      "tags": null
    }
  3. 创建存储帐户。

    $ az storage account create -l azure-region -n storage-account-name -g resource-group --sku sku_type --kind StorageV2

    例如:

    [clouduser@localhost]$ az storage account create -l southcentralus -n azrhelclistact -g azrhelclirsgrp --sku Standard_LRS --kind StorageV2
    {
      "accessTier": null,
      "creationTime": "2017-04-05T19:10:29.855470+00:00",
      "customDomain": null,
      "encryption": null,
      "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Storage/storageAccounts/azrhelclistact",
      "kind": "StorageV2",
      "lastGeoFailoverTime": null,
      "location": "southcentralus",
      "name": "azrhelclistact",
      "primaryEndpoints": {
        "blob": "https://azrhelclistact.blob.core.windows.net/",
        "file": "https://azrhelclistact.file.core.windows.net/",
        "queue": "https://azrhelclistact.queue.core.windows.net/",
        "table": "https://azrhelclistact.table.core.windows.net/"
    },
    "primaryLocation": "southcentralus",
    "provisioningState": "Succeeded",
    "resourceGroup": "azrhelclirsgrp",
    "secondaryEndpoints": null,
    "secondaryLocation": null,
    "sku": {
      "name": "Standard_LRS",
      "tier": "Standard"
    },
    "statusOfPrimary": "available",
    "statusOfSecondary": null,
    "tags": {},
      "type": "Microsoft.Storage/storageAccounts"
    }
  4. 获取存储帐户连接字符串。

    $ az storage account show-connection-string -n storage-account-name -g resource-group

    例如:

    [clouduser@localhost]$ az storage account show-connection-string -n azrhelclistact -g azrhelclirsgrp
    {
      "connectionString": "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=azrhelclistact;AccountKey=NreGk...=="
    }
  5. 通过复制连接字符串并将其粘贴到以下命令来导出连接字符串。这个字符串将您的系统连接到存储帐户。

    $ export AZURE_STORAGE_CONNECTION_STRING="storage-connection-string"

    例如:

    [clouduser@localhost]$ export AZURE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=azrhelclistact;AccountKey=NreGk...=="
  6. 创建存储容器。

    $ az storage container create -n container-name

    例如:

    [clouduser@localhost]$ az storage container create -n azrhelclistcont
    {
      "created": true
    }
  7. 创建虚拟网络。所有集群节点都必须位于同一个虚拟网络中。

    $ az network vnet create -g resource group --name vnet-name --subnet-name subnet-name

    例如:

    [clouduser@localhost]$ az network vnet create --resource-group azrhelclirsgrp --name azrhelclivnet1 --subnet-name azrhelclisubnet1
    {
      "newVNet": {
        "addressSpace": {
          "addressPrefixes": [
          "10.0.0.0/16"
          ]
      },
      "dhcpOptions": {
        "dnsServers": []
      },
      "etag": "W/\"\"",
      "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Network/virtualNetworks/azrhelclivnet1",
      "location": "southcentralus",
      "name": "azrhelclivnet1",
      "provisioningState": "Succeeded",
      "resourceGroup": "azrhelclirsgrp",
      "resourceGuid": "0f25efee-e2a6-4abe-a4e9-817061ee1e79",
      "subnets": [
        {
          "addressPrefix": "10.0.0.0/24",
          "etag": "W/\"\"",
          "id": "/subscriptions//resourceGroups/azrhelclirsgrp/providers/Microsoft.Network/virtualNetworks/azrhelclivnet1/subnets/azrhelclisubnet1",
          "ipConfigurations": null,
          "name": "azrhelclisubnet1",
          "networkSecurityGroup": null,
          "provisioningState": "Succeeded",
          "resourceGroup": "azrhelclirsgrp",
          "resourceNavigationLinks": null,
          "routeTable": null
        }
      ],
      "tags": {},
      "type": "Microsoft.Network/virtualNetworks",
      "virtualNetworkPeerings": null
      }
    }
  8. 创建可用性集。所有集群节点都必须处于相同的可用性集。

    $ az vm availability-set create --name MyAvailabilitySet --resource-group MyResourceGroup

    例如:

    [clouduser@localhost]$ az vm availability-set create --name rhelha-avset1 --resource-group azrhelclirsgrp
    {
      "additionalProperties": {},
        "id": "/subscriptions/.../resourceGroups/azrhelclirsgrp/providers/Microsoft.Compute/availabilitySets/rhelha-avset1",
        "location": "southcentralus",
        "name": “rhelha-avset1",
        "platformFaultDomainCount": 2,
        "platformUpdateDomainCount": 5,
    
    ...omitted

2.2. 高可用性所需的系统软件包

这个步骤假设您要使用 Red Hat Enterprise Linux 为 Azure HA 创建虚拟机镜像。要成功完成这个过程,必须安装以下软件包。

表 2.1. 系统软件包

软件包软件仓库描述

libvirt

rhel-8-for-x86_64-appstream-rpms

用于管理平台虚拟化的开源 API、守护进程和管理工具

virt-install

rhel-8-for-x86_64-appstream-rpms

用于构建虚拟机的命令行工具

libguestfs

rhel-8-for-x86_64-appstream-rpms

用于访问和修改虚拟机文件系统的库

libguestfs-tools

rhel-8-for-x86_64-appstream-rpms

虚拟机的系统管理工具 ; 包括 guestfish 工具

2.3. Azure VM 配置设置

Azure 虚拟机必须具有以下配置设置。其中一些设置会在初始创建虚拟机期间启用。为 Azure 置备虚拟机镜像时会设置其他设置。在进行操作时请记住这些设置。如有必要,请参阅它们。

表 2.2. 虚拟机配置设置

设置建议

ssh

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

dhcp

应该为 dhcp 配置主虚拟适配器(仅限 IPv4)。

swap 空间

不要创建一个专用的交换文件或者交换分区。您可以使用 Windows Azure Linux Agent(WALinuxAgent)配置 swap 空间。

NIC

为主虚拟网络适配器选择 virtio

encryption

对于自定义镜像,请使用 Network Bound Disk Encryption(NBDE)在 Azure 上进行完整磁盘加密。

2.4. 安装 Hyper-V 设备驱动程序

Microsoft 为 Hyper-V 软件包提供网络和存储设备驱动程序作为其 Linux 集成服务(LIS)的一部分。在将 Hyper-V 设备驱动程序置备为 Azure 虚拟机之前,您可能需要在虚拟机镜像上安装 Hyper-V 设备驱动程序。使用 lsinitrd | grep hv 命令验证是否安装了驱动程序。

流程

  1. 输入以下 grep 命令来确定是否安装了所需的 Hyper-V 设备驱动程序。

    # lsinitrd | grep hv

    在以下示例中安装了所有必需的驱动程序。

    # lsinitrd | grep hv
    drwxr-xr-x   2 root     root            0 Aug 12 14:21 usr/lib/modules/3.10.0-932.el7.x86_64/kernel/drivers/hv
    -rw-r--r--   1 root     root        31272 Aug 11 08:45 usr/lib/modules/3.10.0-932.el7.x86_64/kernel/drivers/hv/hv_vmbus.ko.xz
    -rw-r--r--   1 root     root        25132 Aug 11 08:46 usr/lib/modules/3.10.0-932.el7.x86_64/kernel/drivers/net/hyperv/hv_netvsc.ko.xz
    -rw-r--r--   1 root     root         9796 Aug 11 08:45 usr/lib/modules/3.10.0-932.el7.x86_64/kernel/drivers/scsi/hv_storvsc.ko.xz

    如果没有安装所有驱动程序,请完成剩余的步骤。

    注意

    环境中可能会存在 hv_vmbus 驱动程序。即使存在这个驱动程序,请完成以下步骤。

  2. /etc/dracut.conf.d 中创建名为 hv.conf 的文件。
  3. hv.conf 文件中添加以下驱动程序参数。

    add_drivers+=" hv_vmbus "
    add_drivers+=" hv_netvsc "
    add_drivers+=" hv_storvsc "
    注意

    请注意引号之前和之后的空格,如 add_drivers+=" hv_vmbus "。这样可确保在环境中存在其他 Hyper-V 驱动程序时载入唯一驱动程序。

  4. 重新生成 initramfs 镜像。

    # dracut -f -v --regenerate-all

验证步骤

  1. 重启机器。
  2. 运行 lsinitrd | grep hv 命令验证是否安装了驱动程序。

2.5. 进行额外的配置更改

虚拟机需要进行进一步的配置更改才能在 Azure 中操作。执行以下步骤进行额外的更改。

流程

  1. 如有必要,启动虚拟机。
  2. 注册虚拟机并启用 Red Hat Enterprise Linux 8 软件仓库。

    # subscription-manager register --auto-attach

停止和删除 cloud-init

  1. 停止 cloud-init 服务(如果存在)。

    # systemctl stop cloud-init
  2. 删除 cloud-init 软件。

    # yum remove cloud-init

完成其他虚拟机更改

  1. 编辑 /etc/ssh/sshd_config 文件并启用密码验证。

    PasswordAuthentication yes
  2. 设置通用主机名。

    # hostnamectl set-hostname localhost.localdomain
  3. 编辑(或创建) /etc/sysconfig/network-scripts/ifcfg-eth0 文件。仅使用以下列出的参数。

    注意

    RHEL 8 DVD ISO 镜像中没有 ifcfg-eth0 文件,它必须被创建。

    DEVICE="eth0"
    ONBOOT="yes"
    BOOTPROTO="dhcp"
    TYPE="Ethernet"
    USERCTL="yes"
    PEERDNS="yes"
    IPV6INIT="no"
  4. 删除所有持久的网络设备规则(如果存在)。

    # rm -f /etc/udev/rules.d/70-persistent-net.rules
    # rm -f /etc/udev/rules.d/75-persistent-net-generator.rules
    # rm -f /etc/udev/rules.d/80-net-name-slot-rules
  5. ssh 设置为自动启动。

    # systemctl enable sshd
    # systemctl is-enabled sshd
  6. 修改内核引导参数。

    1. /etc/default/grub 文件中的 GRUB_CMDLINE_LINUX 行的开头添加 crashkernel=256M。如果 crashkernel=auto 存在,请将其改为 crashkernel=256M
    2. 如果不存在,在 GRUB_CMDLINE_LINUX 行的末尾添加以下行。

      earlyprintk=ttyS0
      console=ttyS0
      rootdelay=300
    3. 如果存在,请删除以下选项。

      rhgb
      quiet
  7. 重新生成 grub.cfg 文件。

    # grub2-mkconfig -o /boot/grub2/grub.cfg
  8. 安装并启用 Windows Azure Linux Agent(WALinuxAgent)。Red Hat Enterprise Linux 8 Application Stream(AppStream)包括 WALinuxAgent。如需更多信息,请参阅 使用 AppStream

    # yum install WALinuxAgent -y
    # systemctl enable waagent
  9. 编辑 /etc/waagent.conf 文件中的以下行,为置备的虚拟机配置 swap 空间。为您置备的虚拟机设置 swap 空间。

    Provisioning.DeleteRootPassword=n
    ResourceDisk.Filesystem=ext4
    ResourceDisk.EnableSwap=y
    ResourceDisk.SwapSizeMB=2048

准备置备

  1. 从 Red Hat Subscription Manager 取消注册虚拟机。

    # subscription-manager unregister
  2. 通过清理现有置备详情来准备 Azure 置备。Azure 在 Azure 中重新置备虚拟机。这个命令会生成警告,这是预期的。

    # waagent -force -deprovision
  3. 清理 shell 历史记录并关闭虚拟机。

    # export HISTSIZE=0
    # poweroff

2.6. 创建 Azure Active Directory 应用程序

完成以下步骤以创建 Azure AD 应用程序。Azure AD Application Views 和自动访问集群中所有节点的 HA 操作。

先决条件

安装 Azure 命令行界面(CLI)

流程

  1. 确保您是 Microsoft Azure 订阅的管理员或所有者。您需要此授权来创建 Azure AD 应用程序。
  2. 登录到您的 Azure 帐户。

    $ az login
  3. 输入以下命令来创建 Azure AD 应用程序。要使用您自己的密码,在该命令中添加 --password 选项。确保您创建一个强大密码。

    $ az ad sp create-for-rbac --name FencingApplicationName --role owner --scopes "/subscriptions/SubscriptionID/resourceGroups/MyResourseGroup"

    例如:

    [clouduser@localhost ~] $ az ad sp create-for-rbac --name FencingApp --role owner --scopes "/subscriptions/2586c64b-xxxxxx-xxxxxxx-xxxxxxx/resourceGroups/azrhelclirsgrp"
    Retrying role assignment creation: 1/36
    Retrying role assignment creation: 2/36
    Retrying role assignment creation: 3/36
    {
      "appId": "1a3dfe06-df55-42ad-937b-326d1c211739",
      "displayName": "FencingApp",
      "name": "http://FencingApp",
      "password": "43a603f0-64bb-482e-800d-402efe5f3d47",
      "tenant": "77ecefb6-xxxxxxxxxx-xxxxxxx-757a69cb9485"
    }
  4. 在继续操作前,保存以下信息。您需要这些信息来设置隔离代理。

    • Azure AD 应用 ID
    • Azure AD 应用程序密码
    • 租户 ID
    • Microsoft Azure Subscription ID

2.7. 将镜像转换为固定 VHD 格式

所有 Microsoft Azure VM 镜像都必须采用固定的 VHD 格式。镜像必须在将镜像转换为 VHD 之前被对齐到 1 MB 边界。本节论述了如何将镜像从 qcow2 转换为固定的 VHD 格式,并在需要时匹配镜像。转换镜像后,您可以将其上传到 Azure。

流程

  1. 将镜像从 qcow2 转换为 raw 格式。

    $ qemu-img convert -f qcow2 -O raw <image-name>.qcow2 <image-name>.raw
  2. 使用以下内容创建一个 shell 脚本。

    #!/bin/bash
    MB=$((1024 * 1024))
    size=$(qemu-img info -f raw --output json "$1" | gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    rounded_size=$((($size/$MB + 1) * $MB))
    if [ $(($size % $MB)) -eq  0 ]
    then
     echo "Your image is already aligned. You do not need to resize."
     exit 1
    fi
    echo "rounded size = $rounded_size"
    export rounded_size
  3. 运行脚本。这个示例使用名称 align.sh

    $ sh align.sh <image-xxx>.raw
    • 如需显示 "Your image is already aligned.You do not need to resize.",执行以下步骤。
    • 如果显示了一个值,代表您的镜像没有被对齐。
  4. 使用以下命令将文件转换为固定的 VHD 格式。

    示例使用 qemu-img 版本 2.12.0。

    $ qemu-img convert -f raw -o subformat=fixed,force_size -O vpc <image-xxx>.raw <image.xxx>.vhd

    转换后,VHD 文件就可以上传到 Azure。

对齐镜像

只有在 raw 文件没有被对齐时才执行以下步骤。

  1. 使用在运行验证脚本时显示的舍入值重新定义 raw 文件大小。

    $ qemu-img resize -f raw <image-xxx>.raw <rounded-value>
  2. raw 镜像文件转换为 VHD 格式。

    示例使用 qemu-img 版本 2.12.0。

    $ qemu-img convert -f raw -o subformat=fixed,force_size -O vpc <image-xxx>.raw <image.xxx>.vhd

    转换后,VHD 文件就可以上传到 Azure。

2.8. 上传并创建 Azure 镜像

完成以下步骤,将 VHD 文件上传到容器并创建 Azure 自定义镜像。

注意

系统重启后,导出的存储连接字符串不会保留。如果以下步骤中的任何命令失败,请再次导出连接字符串。

流程

  1. VHD 文件上传到存储容器中。它可能需要几分钟时间。要获取存储容器列表,请输入 az storage container list 命令。

    $ az storage blob upload --account-name <storage-account-name> --container-name <container-name> --type page --file <path-to-vhd> --name <image-name>.vhd

    例如:

    [clouduser@localhost]$ az storage blob upload --account-name azrhelclistact --container-name azrhelclistcont --type page --file rhel-image-8.vhd --name rhel-image-8.vhd
    Percent complete: %100.0
  2. 获取上传的 VHD 文件的 URL,以便在以下步骤中使用。

    $ az storage blob url -c <container-name> -n <image-name>.vhd

    例如:

    [clouduser@localhost]$ az storage blob url -c azrhelclistcont -n rhel-image-8.vhd
    "https://azrhelclistact.blob.core.windows.net/azrhelclistcont/rhel-image-8.vhd"
  3. 创建 Azure 自定义镜像。

    $ az image create -n <image-name> -g <resource-group> -l <azure-region> --source <URL> --os-type linux
    注意

    虚拟机的默认 hypervisor 系列为 V1。您可以通过包括选项 --hyper-v-generation V2 来将 hypervisor 系列指定为 V2。第二代虚拟机使用基于 UEFI 的引导架构。如需有关生成 2 代虚拟机的信息,请参阅 Azure 生成 2 个虚拟机的支持

    该命令可能会返回"仅可导入 VHD 格式的 Blob"错误。 这个错误可能意味着,在镜像转换为 VHD 前,镜像没有与最接近的 1 MB 边界一致。

    例如:

    [clouduser@localhost]$ az image create -n rhel8 -g azrhelclirsgrp2 -l southcentralus --source https://azrhelclistact.blob.core.windows.net/azrhelclistcont/rhel-image-8.vhd --os-type linux

2.9. 安装 Red Hat HA 软件包和代理

在所有节点上完成以下步骤。

流程

  1. 启动 SSH 终端会话,并使用管理员名称和公共 IP 地址连接到虚拟机。

    $ ssh administrator@PublicIP

    要获取 Azure 虚拟机的公共 IP 地址,在 Azure 门户中打开虚拟机属性,或者输入以下 Azure CLI 命令。

    $ az vm list -g <resource-group> -d --output table

    例如:

    [clouduser@localhost ~] $ az vm list -g azrhelclirsgrp -d --output table
    Name    ResourceGroup           PowerState      PublicIps        Location
    ------  ----------------------  --------------  -------------    --------------
    node01  azrhelclirsgrp          VM running      192.98.152.251    southcentralus
  2. 在红帽注册虚拟机。

    $ sudo -i
    # subscription-manager register --auto-attach
    注意

    如果 --auto-attach 命令失败,请手动在您的订阅中注册虚拟机。

  3. 禁用所有软件仓库。

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

    # subscription-manager repos --enable=rhel-8-server-rpms
    # subscription-manager repos --enable=rhel-8-for-x86_64-highavailability-rpms
  5. 更新所有软件包。

    # yum update -y
  6. 安装 Red Hat High Availability Add-On 软件包,以及 High Availability 频道中的所有可用的隔离代理。

    # yum install pcs pacemaker fence-agents-azure-arm
  7. 用户 hacluster 在上一步中的 pcs 和 pacemaker 安装过程中创建。在所有集群节点上为 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
    
    Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.

验证步骤

确定 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 Fri 2018-02-23 11:00:58 EST; 1min 23s ago
Docs: man:pcsd(8)
          man:pcs(8)
Main PID: 46235 (pcsd)
  CGroup: /system.slice/pcsd.service
          └─46235 /usr/bin/ruby /usr/lib/pcsd/pcsd > /dev/null &

2.10. 创建集群

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

流程

  1. 在其中一个节点上,输入以下命令验证 pcs 用户 hacluster。在该命令中,指定集群中的每个节点的名称。

    # pcs host auth  hostname1 hostname2 hostname3
    Username: hacluster
    Password:
    hostname1: Authorized
    hostname2: Authorized
    hostname3: Authorized

    例如:

    [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 --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

验证步骤

  1. 启用集群。

    [root@node01 clouduser]# pcs cluster enable --all
  2. 启动集群。

    [root@node01 clouduser]# 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...

2.11. 隔离(fencing)概述

如果与集群中某个节点通信失败,那么集群中的其他节点必须能够限制或释放对故障集群节点可访问的资源的访问。这无法通过通过联系集群节点本身来实现,因为集群节点可能没有响应。反之,必须提供一个外部的方法来实现。这个方法为称为隔离(fencing)。

不响应的节点可能仍然在访问数据。确定您的数据安全的唯一方法是使用 STONITH 保护节点。STONITH 是"Shoot The Other Node In The Head"的缩写,它保护您的数据不受有问题的节点或并发访问的影响。使用 STONITH 可以确保,在允许从另一个节点访问数据前确定节点真正离线。

2.12. 创建隔离设备

完成以下步骤来配置隔离。在集群中的任何节点中完成这些命令

先决条件

您需要将集群属性 stonith-enabled 设置为 true

流程

  1. 识别每个 RHEL 虚拟机的 Azure 节点名称。您可以使用 Azure 节点名称来配置隔离设备。

    # fence_azure_arm -l AD-Application-ID -p AD-Password --resourceGroup MyResourceGroup --tenantId Tenant-ID --subscriptionId Subscription-ID -o list

    例如:

    [root@node01 clouduser]# fence_azure_arm -l e04a6a49-9f00-xxxx-xxxx-a8bdda4af447 -p z/a05AwCN0IzAjVwXXXXXXXEWIoeVp0xg7QT//JE= --resourceGroup azrhelclirsgrp --tenantId 77ecefb6-cff0-XXXX-XXXX-757XXXX9485 --subscriptionId XXXXXXXX-38b4-4527-XXXX-012d49dfc02c -o list
    node01,
    node02,
    node03,
  2. 查看 Azure ARM STONITH 代理的选项。

    pcs stonith describe fence_azure_arm

    例如:

    # pass:quotes[pcs stonith describe fence_apc]
    Stonith options:
    password: Authentication key
    password_script: Script to run to retrieve password
    警告

    对于提供方法选项的隔离代理,不要指定循环值,因为它不被支持,并可能导致数据崩溃。

    有些隔离设备只能隔离一个节点,其他设备则可能隔离多个节点。您创建隔离设备时指定的参数取决于您的隔离设备的支持和要求。

    您可以在创建隔离设备时,使用 pcmk_host_list 参数指定由那个隔离设备控制的所有机器。

    您可以在创建隔离设备时使用 pcmk_host_map 参数将主机名映射到编译隔离设备的规格中。

  3. 创建隔离设备。

    # pcs stonith create clusterfence fence_azure_arm
  4. 测试其他其中一个节点的隔离代理。

    # pcs stonith fence azurenodename

    例如:

    [root@node01 clouduser]# pcs status
    Cluster name: newcluster
    Stack: corosync
    Current DC: node01 (version 1.1.18-11.el7-2b07d5c5a9) - partition with quorum
    Last updated: Fri Feb 23 11:44:35 2018
    Last change: Fri Feb 23 11:21:01 2018 by root via cibadmin on node01
    
    3 nodes configured
    1 resource configured
    
    Online: [ node01 node03 ]
    OFFLINE: [ node02 ]
    
    Full list of resources:
    
      clusterfence  (stonith:fence_azure_arm):  Started node01
    
    Daemon Status:
      corosync: active/disabled
      pacemaker: active/disabled
      pcsd: active/enabled
  5. 启动上一步中隔离的节点。

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

    # pcs status

    例如:

    [root@node01 clouduser]# pcs status
    Cluster name: newcluster
    Stack: corosync
    Current DC: node01 (version 1.1.18-11.el7-2b07d5c5a9) - partition with quorum
    Last updated: Fri Feb 23 11:34:59 2018
    Last change: Fri Feb 23 11:21:01 2018 by root via cibadmin on node01
    
    3 nodes configured
    1 resource configured
    
    Online: [ node01 node02 node03 ]
    
    Full list of resources:
    
    clusterfence    (stonith:fence_azure_arm):  Started node01
    
    Daemon Status:
      corosync: active/disabled
      pacemaker: active/disabled
      pcsd: active/enabled

2.13. 创建 Azure 内部负载均衡器

Azure 内部负载均衡器会删除对健康探测请求没有做出响应的集群节点。

执行以下步骤来创建 Azure 内部负载均衡器。每个步骤都引用特定的 Microsoft 流程,并包括为 HA 自定义负载均衡器的设置。

先决条件

Azure 控制面板

流程

  1. 创建基本负载均衡器。为 IP 地址分配类型选择 Internal load balancerBasic SKUDynamic
  2. 创建后端地址池。将后端池与在 HA 中创建 Azure 资源时创建的可用性集关联。不要设置任何目标网络 IP 配置。
  3. 创建健康探测。对于健康探测,选择 TCP 并输入端口 61000。您可以使用不会影响到另一个服务的 TCP 端口号。对于某些 HA 产品应用程序(如 SAP HANA 和 SQL Server),您可能需要与 Microsoft 合作来识别要使用的正确端口。
  4. 创建负载均衡器规则。要创建负载均衡规则,默认值会预先填充。确保将 Floating IP (direct server return) 设置为 Enabled

2.14. 配置负载均衡器资源代理

创建健康探测后,您必须配置 load balancer 资源代理。此资源代理运行一个服务,它回答来自 Azure 负载均衡器的健康探测请求,并删除不回答请求的集群节点。

流程

  1. 在所有节点上安装 nmap-ncat 资源代理。

    # yum install nmap-ncat resource-agents

    在单个节点上执行以下步骤。

  2. 创建 pcs 资源和组。将负载均衡器 FrontendIP 用于 IPaddr2 地址。

    # pcs resource create resource-name IPaddr2 ip="10.0.0.7" --group cluster-resources-group
  3. 配置 load balancer 资源代理。

    # pcs resource create resource-loadbalancer-name azure-lb port=port-number --group cluster-resources-group

验证步骤

运行 pcs status 查看结果。

[root@node01 clouduser]# pcs status

例如:

Cluster name: clusterfence01
Stack: corosync
Current DC: node02 (version 1.1.16-12.el7_4.7-94ff4df) - partition with quorum
Last updated: Tue Jan 30 12:42:35 2018
Last change: Tue Jan 30 12:26:42 2018 by root via cibadmin on node01

3 nodes configured
3 resources configured

Online: [ node01 node02 node03 ]

Full list of resources:

clusterfence (stonith:fence_azure_arm):      Started node01
Resource Group: g_azure
    vip_azure  (ocf::heartbeat:IPaddr2):       Started node02
    lb_azure   (ocf::heartbeat:azure-lb):      Started node02

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

2.15. 配置共享块存储

本节介绍了使用 Microsoft Azure Shared Disks 为 Red Hat High Availability 集群配置共享块存储的可选流程。该流程假设三个 Azure VM(一个三节点集群)带有 1TB 共享磁盘。

注意

这是配置块存储的独立示例步骤。该流程假设您还没有创建集群。

先决条件

流程

  1. 使用 Azure 命令 az disk create 创建共享块卷。

    $ az disk create -g <resource_group> -n <shared_block_volume_name> --size-gb <disk_size> --max-shares <number_vms> -l <location>

    例如,以下命令在 Azure Availability Zone westcentralus 的资源组 sharedblock 中创建了一个名为 shared-block-volume.vhd 的共享块卷。

    $ az disk create -g sharedblock-rg -n shared-block-volume.vhd --size-gb 1024 --max-shares 3 -l westcentralus
    
    {
      "creationData": {
        "createOption": "Empty",
        "galleryImageReference": null,
        "imageReference": null,
        "sourceResourceId": null,
        "sourceUniqueId": null,
        "sourceUri": null,
        "storageAccountId": null,
        "uploadSizeBytes": null
      },
      "diskAccessId": null,
      "diskIopsReadOnly": null,
      "diskIopsReadWrite": 5000,
      "diskMbpsReadOnly": null,
      "diskMbpsReadWrite": 200,
      "diskSizeBytes": 1099511627776,
      "diskSizeGb": 1024,
      "diskState": "Unattached",
      "encryption": {
        "diskEncryptionSetId": null,
        "type": "EncryptionAtRestWithPlatformKey"
      },
      "encryptionSettingsCollection": null,
      "hyperVgeneration": "V1",
      "id": "/subscriptions/12345678910-12345678910/resourceGroups/sharedblock-rg/providers/Microsoft.Compute/disks/shared-block-volume.vhd",
      "location": "westcentralus",
      "managedBy": null,
      "managedByExtended": null,
      "maxShares": 3,
      "name": "shared-block-volume.vhd",
      "networkAccessPolicy": "AllowAll",
      "osType": null,
      "provisioningState": "Succeeded",
      "resourceGroup": "sharedblock-rg",
      "shareInfo": null,
      "sku": {
        "name": "Premium_LRS",
        "tier": "Premium"
      },
      "tags": {},
      "timeCreated": "2020-08-27T15:36:56.263382+00:00",
      "type": "Microsoft.Compute/disks",
      "uniqueId": "cd8b0a25-6fbe-4779-9312-8d9cbb89b6f2",
      "zones": null
    }
  2. 使用 Azure 命令 az disk show 创建共享块卷。

    $ az disk show -g <resource_group> -n <shared_block_volume_name>

    例如,以下命令显示资源组 sharedblock-rg 中的共享块卷 shared-block-volume.vhd 的详情。

    $ az disk show -g sharedblock-rg -n shared-block-volume.vhd
    
    {
      "creationData": {
        "createOption": "Empty",
        "galleryImageReference": null,
        "imageReference": null,
        "sourceResourceId": null,
        "sourceUniqueId": null,
        "sourceUri": null,
        "storageAccountId": null,
        "uploadSizeBytes": null
      },
      "diskAccessId": null,
      "diskIopsReadOnly": null,
      "diskIopsReadWrite": 5000,
      "diskMbpsReadOnly": null,
      "diskMbpsReadWrite": 200,
      "diskSizeBytes": 1099511627776,
      "diskSizeGb": 1024,
      "diskState": "Unattached",
      "encryption": {
        "diskEncryptionSetId": null,
        "type": "EncryptionAtRestWithPlatformKey"
      },
      "encryptionSettingsCollection": null,
      "hyperVgeneration": "V1",
      "id": "/subscriptions/12345678910-12345678910/resourceGroups/sharedblock-rg/providers/Microsoft.Compute/disks/shared-block-volume.vhd",
      "location": "westcentralus",
      "managedBy": null,
      "managedByExtended": null,
      "maxShares": 3,
      "name": "shared-block-volume.vhd",
      "networkAccessPolicy": "AllowAll",
      "osType": null,
      "provisioningState": "Succeeded",
      "resourceGroup": "sharedblock-rg",
      "shareInfo": null,
      "sku": {
        "name": "Premium_LRS",
        "tier": "Premium"
      },
      "tags": {},
      "timeCreated": "2020-08-27T15:36:56.263382+00:00",
      "type": "Microsoft.Compute/disks",
      "uniqueId": "cd8b0a25-6fbe-4779-9312-8d9cbb89b6f2",
      "zones": null
    }
  3. 使用 Azure 命令 az network nic create 创建三个网络接口。运行以下命令三次,每次使用不同的 <nic_name>

    $ az network nic create -g <resource_group> -n <nic_name> --subnet <subnet_name> --vnet-name <virtual_network> --location <location> --network-security-group <network_security_group> --private-ip-address-version IPv4

    例如:以下命令创建一个名为 shareblock-nodea-vm-nic-protected 的网络接口。

    $ az network nic create -g sharedblock-rg -n sharedblock-nodea-vm-nic-protected --subnet sharedblock-subnet-protected --vnet-name sharedblock-vn --location westcentralus --network-security-group sharedblock-nsg --private-ip-address-version IPv4
  4. 使用 Azure 命令 az vm create 创建三个虚拟机并附加共享块卷。每个虚拟机的选项值都是一样的,但每个虚拟机都有自己的 <vm_name><new_vm_disk_name><nic_name>

    $ az vm create -n <vm_name> -g <resource_group> --attach-data-disks <shared_block_volume_name> --data-disk-caching None --os-disk-caching ReadWrite --os-disk-name <new-vm-disk-name> --os-disk-size-gb <disk_size> --location <location> --size <virtual_machine_size> --image <image_name> --admin-username <vm_username> --authentication-type ssh --ssh-key-values <ssh_key> --nics <nic_name> --availability-set <availability_set> --ppg <proximity_placement_group>

    例如,以下命令会创建一个名为 sharedblock-nodea-vm 的虚拟机。

    $ az vm create -n sharedblock-nodea-vm -g sharedblock-rg --attach-data-disks shared-block-volume.vhd --data-disk-caching None --os-disk-caching ReadWrite --os-disk-name sharedblock-nodea-vm.vhd --os-disk-size-gb 64 --location westcentralus --size Standard_D2s_v3 --image /subscriptions/12345678910-12345678910/resourceGroups/sample-azureimagesgroupwestcentralus/providers/Microsoft.Compute/images/sample-azure-rhel-8.3.0-20200713.n.0.x86_64 --admin-username sharedblock-user --authentication-type ssh --ssh-key-values @sharedblock-key.pub --nics sharedblock-nodea-vm-nic-protected --availability-set sharedblock-as --ppg sharedblock-ppg
    
    {
      "fqdns": "",
      "id": "/subscriptions/12345678910-12345678910/resourceGroups/sharedblock-rg/providers/Microsoft.Compute/virtualMachines/sharedblock-nodea-vm",
      "location": "westcentralus",
      "macAddress": "00-22-48-5D-EE-FB",
      "powerState": "VM running",
      "privateIpAddress": "198.51.100.3",
      "publicIpAddress": "",
      "resourceGroup": "sharedblock-rg",
      "zones": ""
    }

验证步骤

  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
    sdb    8:16   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=3600224808dd8eb102f6ffc5822c41d89

在确认将共享磁盘附加到每个虚拟机后,您可以为集群配置弹性存储。有关为红帽高可用性集群配置弹性存储的详情,请参考在集群中配置 GFS2 文件系统。有关 GFS2 文件系统的常规信息,请参考配置 GFS2 文件系统

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

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

重要

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

本章在很多位置使用了 Amazon 文档。如需很多流程,请参阅引用的 Amazon 文档了解更多详情。

注意

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

先决条件

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

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

表 3.1. 镜像选项

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

选择部署一个 Red Hat Gold Image。

利用您现有的红帽订阅。

通过 Red Hat Cloud Access 程序 启用订阅,然后在 AWS 上选择 Red Hat Gold Image。

订阅包括红帽产品成本 ; 您可以为 Amazon 提供所有其他实例成本。

Red Hat Gold Images 被称为 "Cloud Access" 镜像,因为您使用现有的红帽订阅。红帽直接为 Cloud Access 镜像提供支持。

选择部署移动到 AWS 的自定义镜像。

利用您现有的红帽订阅。

通过 Red Hat Cloud Access 程序启用订阅,上传您的自定义镜像并附加您的订阅。

订阅包括红帽产品成本 ; 您可以为 Amazon 提供所有其他实例成本。

移动到 AWS 的自定义镜像是 "Cloud Access" 镜像,因为您利用了您现有的红帽订阅。红帽直接为 Cloud Access 镜像提供支持。

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

AWS EC2 镜像包括红帽产品。

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

根据 pay-as-you-go 模式每小时向 Amazon 支付。这样的镜像称为 "on-demand" 镜像。Amazon 支持 on-demand 镜像。

红帽提供了镜像的更新。AWS 通过 Red Hat Update Infrastructure(RHUI)提供更新。

注意

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

重要

您无法将 on-demand 实例转换为 Red Hat Cloud Access 实例。要从 on-demand 镜像改为 Red Hat Cloud Access bring-your-own-subscription(BYOS)镜像,请创建新的 Red Hat Cloud Access 实例并从您的按需实例迁移数据。在迁移数据后取消您的 on-demand 实例以避免出现重复账单。

本章的剩余部分包含与自定义镜像相关的信息和流程。

3.2. 理解基础镜像

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

3.2.1. 使用自定义基础镜像

要手动配置虚拟机,请以基础(启动程序)虚拟机镜像开始。创建基本虚拟机镜像后,您可以修改配置设置并添加虚拟机在云中操作的软件包。您可在上传镜像后为特定应用程序进行额外的配置更改。

3.2.2. 虚拟机配置设置

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

表 3.2. 虚拟机配置设置

设置建议

ssh

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

dhcp

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

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

按照本节中的步骤从 ISO 镜像创建基础镜像。

先决条件

为 Red Hat Enterprise Linux 8 主机启用虚拟化

3.3.1. 下载 ISO 镜像

流程

  1. 从红帽 客户门户网站下载最新的 Red Hat Enterprise Linux ISO 镜像。
  2. 将镜像移动到 /var/lib/libvirt/images

3.3.2. 从 ISO 镜像创建虚拟机

流程

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

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

      下面是一个基本的命令行示例。

      virt-install --name isotest --memory 2048 --vcpus 2 --disk size=8,bus=virtio --location rhel-8.0-x86_64-dvd.iso --os-variant=rhel8.0
    2. 如果使用 web 控制台创建虚拟机,请按照 使用 web 控制台创建虚拟机中的 步骤进行操作:

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

3.3.3. 完成 RHEL 安装

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

流程

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

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

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

    注意

    确定安装并启用 cloud-init 软件包。

  7. 重要:此步骤只适用于您要上传到 AWS 的虚拟机。

    1. 对于 x86 虚拟机,请安装 nvmexen-netfrontxen-blkfront 驱动程序。

      # dracut -f --add-drivers "nvme xen-netfront xen-blkfront"
    2. 对于 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 CLI。完成以下步骤以安装 AWS CLI。

先决条件

您需要已创建并有权访问 AWS 访问密钥 ID 和 AWS Secret 访问密钥。有关信息和说明,请参阅快速配置 AWS CLI

流程

  1. 安装 Python 3 和 pip 工具。

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

    # pip3 install awscli
  3. 运行 aws --version 命令验证您是否安装了 AWS CLI。

    $ aws --version
    aws-cli/1.16.182 Python/2.7.5 Linux/3.10.0-957.21.3.el7.x86_64 botocore/1.12.172
  4. 根据 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. 输入一个 区域
    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 角色

执行以下步骤创建 VM 导入所需的 vmimport 角色。如需更多信息,请参阅 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 接受 OVAVHDVHDX VMDK、和 raw 格式的镜像。有关 Amazon 接受的镜像格式的更多信息,请参阅 VM Import/Export Works

流程

  1. 运行 qemu-img 命令转换您的镜像。下面是一个示例。

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

    aws s3 cp rhel-8.2-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.2-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.2-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 类型 下,选择 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" --block-device-mappings "{\"DeviceName\": \"/dev/sda1\",\"Ebs\": {\"SnapshotId\": \"snap-0ce7f009b69ab274d\"}}" --ena-support

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

3.4.7. 从 AMI 启动实例

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

流程

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

    如需有关实例类型的信息,请参阅 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: 配置安全组。选择设置 AWS 环境时创建的安全组。
  8. Review and Launch。验证您的选择。
  9. Launch。此时会提示您选择现有密钥对或创建新密钥对。选择设置 AWS 环境时创建的密钥对。

    注意

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

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

    现在,您可以通过选择实例并点击 连接 来启动 SSH 会话到实例。使用为 独立 SSH 客户端 提供的示例。

    注意

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

3.4.8. 附加红帽订阅

完成以下步骤以附加您之前通过 Red Hat Cloud Access 程序启用的订阅。

先决条件

您必须已启用您的订阅。

流程

  1. 注册您的系统。

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

第 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 文档来获得更多信息。

先决条件

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

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

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

先决条件

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

流程

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

4.2. 安装 AWS CLI

本章的许多流程包括使用 AWS CLI。完成以下步骤以安装 AWS CLI。

先决条件

您需要已创建并有权访问 AWS 访问密钥 ID 和 AWS Secret 访问密钥。有关信息和说明,请参阅快速配置 AWS CLI

流程

  1. 安装 Python 3 和 pip 工具。

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

    # pip3 install awscli
  3. 运行 aws --version 命令验证您是否安装了 AWS CLI。

    $ aws --version
    aws-cli/1.16.182 Python/2.7.5 Linux/3.10.0-957.21.3.el7.x86_64 botocore/1.12.172
  4. 根据 AWS 访问详情配置 AWS 命令行客户端。

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

4.3. 创建 HA EC2 实例

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

您可以创建并上传用于集群节点的自定义镜像,或者选择 Gold Image(Cloud Access image)或 on-demand 镜像。

先决条件

您需要已设置 AWS 环境。如需更多信息,请参阅使用 Amazon EC2 设置

流程

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

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

  1. Next: Configure Instance Details

    1. 输入您要 为集群创建的实例数。本章示例使用三个集群节点。

      注意

      不要启动自动缩放组。

    2. 对于 Network,选择您在 设置 AWS 环境中创建的 VPC。选择实例子网以创建新子网。
    3. 为 Auto-assign Public IP 选择 Enable。这些是 Configure Instance Details 所需的最小选择。根据您的特定的 HA 应用程序,您可能需要进行额外的选择。

      注意

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

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

    注意

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

  4. Next: 配置安全组。选择在 设置 AWS 环境 中创建的现有安全组。
  5. 点击 Review and Launch 并验证您的选择。
  6. Launch。此时会提示您选择现有密钥对或创建新密钥对。选择 设置 AWS 环境时创建的密钥对
  7. Launch Instances
  8. View Instances。您可以命名实例。

    注意

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

4.4. 配置私钥

完成以下配置任务,以使用私有 SSH 密钥文件(.pem),然后才能在 SSH 会话中使用该文件。

流程

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

    # chmod 400 KeyName.pem

4.5. 连接到实例

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

流程

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

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

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

流程

  1. 输入以下命令删除 AWS Red Hat Update Infrastructure(RHUI)客户端。由于您要使用 Red Hat Cloud Access 订阅,所以您不应该在订阅之外使用 AWS RHUI。

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

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

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

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

    # yum update -y
  6. 安装 Red Hat High Availability Add-On 软件包,以及 High Availability 频道中的所有可用的隔离代理。

    # yum install pcs pacemaker fence-agents-aws
  7. 用户 hacluster 在上一步中的 pcspacemaker 安装中创建。在所有集群节点上为 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.7. 创建集群

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

流程

  1. 在其中一个节点上,输入以下命令验证 pcs 用户 hacluster。在该命令中,指定集群中的每个节点的名称。

    # pcs host auth  hostname1 hostname2 hostname3
    Username: hacluster
    Password:
    hostname1: Authorized
    hostname2: Authorized
    hostname3: Authorized

    例如:

    [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 --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

验证步骤

  1. 启用集群。

    [root@node01 clouduser]# pcs cluster enable --all
  2. 启动集群。

    [root@node01 clouduser]# 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.8. 配置隔离

完成以下步骤来配置隔离。

流程

  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=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
  3. 测试其他其中一个节点的隔离代理。

    # 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

验证步骤

  1. 检查状态以验证该节点是否已隔离。

    # 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
  2. 启动上一步中隔离的节点。

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

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

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

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

先决条件

您必须已创建了 AWS Access Key 和 AWS Secret 访问密钥。如需更多信息,请参阅创建 AWS 访问密钥和 AWS Secret 访问密钥

流程

  1. 执行安装 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.10. 安装网络资源代理

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

将两个资源添加到 同一组 以强制 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 命令来验证资源是否正在运行。

# 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. 将两个资源添加到之前创建的用来强制 ordercolocation 约束的 同一组 中。
  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 二级 Elastic IP 地址资源代理(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.11. 配置共享块存储

本节提供了使用 Amazon EBS Multi-Attach 卷为红帽高可用性集群配置共享块存储的可选步骤。此流程假设三个带有 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 附加到 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"
    }

验证步骤

  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

在验证共享磁盘是否附加到每个实例后,您可以为集群配置弹性存储。有关为红帽高可用性集群配置弹性存储的详情,请参考在集群中配置 GFS2 文件系统。有关 GFS2 文件系统的常规信息,请参考配置 GFS2 文件系统

第 5 章 在 Google Cloud Platform 上将 Red Hat Enterprise Linux 镜像部署为 Google Compute Engine 实例

您有多个选项,可在 Google Cloud Platform(GCP)上将 Red Hat Enterprise Linux(RHEL)8 镜像部署为 Google Compute Engine(GCE)实例。本章讨论选择镜像的选项,以及列出或引用主机系统和虚拟机(VM)的系统要求。本章介绍了从 ISO 镜像创建自定义虚拟机、上传到 GCE 并启动实例的步骤。

本章在很多位置使用了 Google 文档。如需更多信息,请参阅引用的 Google 文档。

注意

有关 GCP 红帽产品认证列表,请参阅 Google Cloud Platform 上的红帽

先决条件

  • 您需要一个红帽客户门户网站帐户才能完成本章中的步骤。
  • 使用 GCP 创建帐户来访问 Google Cloud Platform 控制台。如需更多信息,请参阅 Google Cloud
  • 通过 Red Hat Cloud Access 程序启用您的红帽订阅。Red Hat Cloud Access 程序允许您在红帽的完全支持下将红帽订阅从物理或内部系统移到 GCP。

5.1. GCP 上的 Red Hat Enterprise Linux 镜像选项

下表列出了镜像选择和镜像选项的不同。

表 5.1. 镜像选项

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

选择部署移至 GCP 的自定义镜像。

利用您现有的红帽订阅。

通过 Red Hat Cloud Access 程序启用订阅,上传您的自定义镜像并附加您的订阅。

订阅只包括红帽产品的成本;您还需要支付其他成本。

移至 GCP 的自定义镜像名为 "Cloud Access" 镜像,因为您利用了您现有的红帽订阅。红帽直接为 Cloud Access 镜像提供支持。

选择部署包含 RHEL 的现有 GCP 镜像。

GCP 镜像包括一个红帽产品。

GCP Compute Engine 上启动实例时选择 RHEL 镜像,或者从 Google Cloud Platform Marketplace 中选择镜像。

根据 pay-as-you-go 模式每小时向 GCP 支付。这样的镜像称为 "on-demand" 镜像。GCP 通过支持协议支持 on-demand 镜像。

重要

您无法将 on-demand 实例转换为 Red Hat Cloud Access 实例。要从 on-demand 镜像改为 Red Hat Cloud Access bring-your-own-subscription(BYOS)镜像,请创建新的 Red Hat Cloud Access 实例并从您的按需实例迁移数据。在迁移数据后取消您的 on-demand 实例以避免出现重复账单。

本章的剩余部分包含与自定义镜像相关的信息和流程。

5.2. 理解基础镜像

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

5.2.1. 使用自定义基础镜像

要手动配置虚拟机,请以基础(启动程序)虚拟机镜像开始。创建基本虚拟机镜像后,您可以修改配置设置并添加虚拟机在云中操作的软件包。您可在上传镜像后为特定应用程序进行额外的配置更改。

5.2.2. 虚拟机配置设置

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

表 5.2. 虚拟机配置设置

设置建议

ssh

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

dhcp

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

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

按照本节中的步骤从 ISO 镜像创建基础镜像。

先决条件

为 Red Hat Enterprise Linux 8 主机启用虚拟化

5.3.1. 下载 ISO 镜像

流程

  1. 从红帽 客户门户网站下载最新的 Red Hat Enterprise Linux ISO 镜像。
  2. 将镜像移动到 /var/lib/libvirt/images

5.3.2. 从 ISO 镜像创建虚拟机

流程

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

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

      下面是一个基本的命令行示例。

      virt-install --name isotest --memory 2048 --vcpus 2 --disk size=8,bus=virtio --location rhel-8.0-x86_64-dvd.iso --os-variant=rhel8.0
    2. 如果使用 web 控制台创建虚拟机,请按照 使用 web 控制台创建虚拟机中的 步骤进行操作:

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

5.3.3. 完成 RHEL 安装

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

流程

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

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

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

    注意

    确定安装并启用 cloud-init 软件包。

  7. 关闭虚拟机。

5.4. 将 RHEL 镜像上传到 GCP

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

5.4.1. 在 GCP 上创建新项目

完成以下步骤,在 GCP 上创建新项目。

先决条件

您必须使用 GCP 创建了一个帐户。如果没有,请参阅 Google Cloud

流程

  1. 启动 GCP 控制台
  2. 点击 Google Cloud Platform 右侧的下拉菜单。
  3. 在弹出菜单中点击 NEW PROJECT
  4. New Project 窗口中输入新项目的名称。
  5. 选择 Organization。如果需要,点击下拉菜单更改机构。
  6. 确认您的父机构或文件夹的 位置。如果需要,点 Browse 搜索并更改这个值。
  7. 点击 CREATE 创建新 GCP 项目。

    注意

    安装 Google Cloud SDK 后,您可以使用 gcloud projects create CLI 命令创建项目。下面是一个简单的例子。

    gcloud projects create my-gcp-project3 --name project3

    这个示例创建项目 ID 为 my-gcp-project3,项目名称为 project3。如需更多信息,请参阅 gcloud 项目创建

其它资源

创建和管理资源

5.4.2. 安装 Google Cloud SDK

完成以下步骤以安装 Google Cloud SDK。

先决条件

  • 如果您还没有这样做,在 GCP 上创建一个项目。如需更多信息,请参阅在 Google Cloud Platform 上创建新项目
  • 确定您的主机系统包含 Python 2.7。如果没有安装,安装 Python 2.7。

流程

  1. 按照下载和提取 Google Cloud SDK 归档的 GCP 说明。详情请查看 GCP 文档中的 Linux Quickstart
  2. 按照初始化 Google Cloud SDK 的说明。

    注意

    初始化 Google Cloud SDK 后,您可以使用 gcloud CLI 命令执行任务并获取有关项目和实例的信息。例如,您可以使用 gcloud compute project-info describe --project <project-name> 命令显示项目信息。

5.4.3. 为 Google Compute Engine 创建 SSH 密钥

执行以下步骤使用 GCE 生成并注册 SSH 密钥,以便您可以使用它的公共 IP 地址直接将 SSH 连接到实例。

流程

  1. 使用 ssh-keygen 命令生成用于 GCE 的 SSH 密钥对。

    # ssh-keygen -t rsa -f ~/.ssh/google_compute_engine
  2. GCP Console Dashboard 页面 中,点击 Google Cloud Console 标题 左侧的 Navigation 菜单,然后选择 Compute Engine 并选择 Metadata
  3. SSH Keys,然后点 Edit
  4. 输入从 ~/.ssh/google_compute_engine.pub 文件生成的输出并点 Save

    现在,您可以使用标准 SSH 连接到实例。

    # ssh -i ~/.ssh/google_compute_engine <username>@<instance_external_ip>
注意

您可以运行 gcloud compute config-ssh 命令来使用实例的别名填充配置文件。别名允许按实例名称简单的 SSH 连接。有关 gcloud compute config-ssh 命令的详情,请参考 gcloud compute config-ssh

5.4.4. 在 GCP Storage 中创建存储桶

导入到 GCP 需要 GCP Storage Bucket。完成以下步骤以创建存储桶。

流程

  1. 如果您还没有登录到 GCP,请使用以下命令登录。

    # gcloud auth login
  2. 创建存储桶。

    # gsutil mb gs://bucket_name
    注意

    另外,您可以使用 Google Cloud Console 创建存储桶。如需更多信息,请参阅创建存储桶

其它资源

创建存储桶

5.4.5. 转换并上传您的镜像到您的 GCP 存储桶

完成以下步骤,将您的镜像转换并上传到您的 GCP 存储桶。示例是代表,它们将 qcow2 镜像转换为 raw 格式,然后将该镜像 tar 用于上传。

流程

  1. 运行 qemu-img 命令转换您的镜像。转换的镜像必须具有名称 disk.raw

    # qemu-img convert -f qcow2 -O raw rhel-8.2-sample.qcow2 disk.raw
  2. 打包镜像。

    # tar --format=oldgnu -Sczf disk.raw.tar.gz disk.raw
  3. 将镜像上传到之前创建的存储桶。上传可能需要几分钟时间。

    # gsutil cp disk.raw.tar.gz gs://bucket_name
  4. Google Cloud Platform 主屏幕中点击折叠菜单图标并选择 Storage,然后选择 Browser
  5. 点存储桶的名称。

    打包的镜像列在存储桶名称下。

    注意

    您还可以使用 GCP 控制台上传您的镜像。要做到这一点,请点击存储桶的名称,然后点击 Upload 文件

5.4.6. 从 GCP 存储桶中创建镜像

执行以下步骤从 GCP 存储桶中的对象创建镜像。

流程

  1. 运行以下命令来为 GCE 创建镜像。指定您要创建的镜像的名称、存储桶名称和打包的镜像的名称。

    # gcloud compute images create my-image-name --source-uri gs://my-bucket-name/disk.raw.tar.gz
    注意

    另外,您可以使用 Google Cloud Console 创建镜像。如需更多信息,请参阅创建、删除和弃用自定义镜像

  2. 另外,还可在 GCP Console 中找到该镜像。

    1. 点击 Google Cloud Console 标题左侧的 导航 菜单。
    2. 选择 Compute Engine ,然后选择 Images

5.4.7. 从镜像创建 Google Compute Engine 实例

完成以下步骤,使用 GCP 控制台配置 GCE 虚拟机实例。

注意

以下流程提供了使用 GCP 控制台创建基本虚拟机实例的说明。如需有关 GCE 虚拟机实例及其配置选项的更多信息,,参阅创建并启动虚拟机实例

流程

  1. GCP Console Dashboard 页面 中,点击 Google Cloud Console 标题 左侧的 Navigation 菜单,然后选择 Compute Engine 并选择 Images
  2. 选择您的镜像。
  3. Create Instance
  4. Create an instance 页面中,为您的实例输入一个 Name
  5. 选择一个 RegionZone
  6. 选择满足或超过工作负载要求的机器配置
  7. 确保引导磁盘指定了您的镜像名称。
  8. (可选)在 Firewall 下,选择 Allow HTTP 流量Allow HTTPS 流量
  9. Create

    注意

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

  10. 虚拟机实例中查找您的镜像。
  11. 在 GCP Console Dashboard 中点击 Google Cloud Console 标题 左侧的 Navigation 菜单,然后选择 Compute Engine 并选择 VM 实例

    注意

    另外,您可以使用 gcloud compute instances create CLI 命令从镜像创建 GCE 虚拟机实例。下面是一个简单的例子。

    gcloud compute instances create myinstance3 --zone=us-central1-a --image test-iso2-image

    这个示例基于现有镜像 test-iso2-image 在区 us-central1-a 中创建一个名为 myinstance3 的虚拟机实例。如需更多信息,请参阅 gcloud 计算实例创建

5.4.8. 连接到您的实例

执行以下步骤使用其公共 IP 地址连接到 GCE 实例。

流程

  1. 运行以下命令以确保您的实例正在运行。该命令列出 GCE 实例的信息,包括实例是否在运行,以及正在运行的实例的公共 IP 地址。

    # gcloud compute instances list
  2. 使用标准 SSH 连接到您的实例。这个示例使用之前创建的 google_compute_engine 密钥。

    # ssh -i ~/.ssh/google_compute_engine <user_name>@<instance_external_ip>
    注意

    GCP 提供了多种 SSH 到您的实例的方法。如需更多信息,请参阅连接到实例。您还可以使用之前设置的 root 帐户和密码连接到您的实例。

5.4.9. 附加红帽订阅

完成以下步骤以附加您之前通过 Red Hat Cloud Access 程序启用的订阅。

先决条件

您必须已启用您的订阅。

流程

  1. 注册您的系统。

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

第 6 章 在 Google Cloud Platform 上配置红帽高可用性集群

本章包含使用 Google Compute Engine(GCE)虚拟机(VM)实例在 Google Cloud Platform(GCP)上配置红帽高可用性(HA)集群的信息和步骤。

本章包含为 GCP 设置环境的先决条件。设置环境后,您可以创建并配置虚拟机实例。

本章还包含与创建 HA 集群相关的流程,该集群将单个节点转换为 GCP 上的 HA 节点集群。这包括在每个集群节点上安装高可用性软件包和代理、配置隔离以及安装网络资源代理的步骤。

先决条件

  • 您必须在 Red Hat Cloud Access 程序中注册,且没有使用的 RHEL 订阅。附加的订阅必须包括为每个 GCP 实例访问以下软件仓库。

    • Red Hat Enterprise Linux 8 Server: rhel-8-server-rpms/8Server/x86_64
    • Red Hat Enterprise Linux 8 Server (High Availability): rhel-8-server-ha-rpms/8Server/x86_64
  • 您必须属于活跃的 GCP 项目,并有足够的权限在项目中创建资源。
  • 您的项目应具有属于虚拟机实例而非单独的用户的服务帐户。有关使用默认服务帐户而不是创建单独服务帐户的信息,请参阅使用 Compute Engine 默认服务帐户

如果您或项目管理员创建自定义服务帐户,则应该为以下角色配置服务帐户。

  • Cloud Trace Agent
  • Compute Admin
  • Compute Network Admin
  • Cloud Datastore User
  • Logging Admin
  • Monitoring Editor
  • Monitoring Metric Writer
  • Service Account Administrator
  • Storage Admin

6.1. 所需的系统软件包

本章的步骤假设您使用运行 Red Hat Enterprise Linux 的主机系统。要成功完成这些操作,主机系统必须安装以下软件包。

表 6.1. 系统软件包

软件包软件仓库描述

libvirt

rhel-8-for-x86_64-appstream-rpms

用于管理平台虚拟化的开源 API、守护进程和管理工具

virt-install

rhel-8-for-x86_64-appstream-rpms

用于构建虚拟机的命令行工具

libguestfs

rhel-8-for-x86_64-appstream-rpms

用于访问和修改虚拟机文件系统的库

libguestfs-tools

rhel-8-for-x86_64-appstream-rpms

虚拟机的系统管理工具 ; 包括 guestfish 工具

6.2. GCP 上的 Red Hat Enterprise Linux 镜像选项

下表列出了镜像选择和镜像选项的不同。

表 6.2. 镜像选项

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

选择部署移至 GCP 的自定义镜像。

利用您现有的红帽订阅。

通过 Red Hat Cloud Access 程序启用订阅,上传您的自定义镜像并附加您的订阅。

订阅只包括红帽产品的成本;您还需要支付其他成本。

移至 GCP 的自定义镜像名为 "Cloud Access" 镜像,因为您利用了您现有的红帽订阅。红帽直接为 Cloud Access 镜像提供支持。

选择部署包含 RHEL 的现有 GCP 镜像。

GCP 镜像包括一个红帽产品。

GCP Compute Engine 上启动实例时选择 RHEL 镜像,或者从 Google Cloud Platform Marketplace 中选择镜像。

根据 pay-as-you-go 模式每小时向 GCP 支付。这样的镜像称为 "on-demand" 镜像。GCP 通过支持协议支持 on-demand 镜像。

重要

您无法将 on-demand 实例转换为 Red Hat Cloud Access 实例。要从 on-demand 镜像改为 Red Hat Cloud Access bring-your-own-subscription(BYOS)镜像,请创建新的 Red Hat Cloud Access 实例并从您的按需实例迁移数据。在迁移数据后取消您的 on-demand 实例以避免出现重复账单。

本章的剩余部分包含与自定义镜像相关的信息和流程。

6.3. 安装 Google Cloud SDK

完成以下步骤以安装 Google Cloud SDK。

先决条件

  • 如果您还没有这样做,在 GCP 上创建一个项目。如需更多信息,请参阅在 Google Cloud Platform 上创建新项目
  • 确定您的主机系统包含 Python 2.7。如果没有安装,安装 Python 2.7。

流程

  1. 按照下载和提取 Google Cloud SDK 归档的 GCP 说明。详情请查看 GCP 文档中的 Linux Quickstart
  2. 按照初始化 Google Cloud SDK 的说明。

    注意

    初始化 Google Cloud SDK 后,您可以使用 gcloud CLI 命令执行任务并获取有关项目和实例的信息。例如,您可以使用 gcloud compute project-info describe --project <project-name> 命令显示项目信息。

6.4. 创建 GCP 镜像存储桶

以下文档包含在默认位置创建 多存储桶的 最低要求。

先决条件

GCP storage utility(gsutil)

流程

  1. 如果您还没有登录到 Google Cloud Platform,请使用以下命令登录。

    # gcloud auth login
  2. 创建存储桶。

    $ gsutil mb gs://BucketName

    例如:

    $ gsutil mb gs://rhel-ha-bucket

其它资源

生成存储桶

6.5. 创建自定义虚拟私有云网络和子网

完成以下步骤以创建自定义虚拟私有云(VPC)网络和子网。

流程

  1. 启动 GCP 控制台。
  2. 在左侧导航窗格中选择 Networking 中的 VPC 网络
  3. Create VPC Network
  4. 输入 VPC 网络的名称。
  5. 新子网 下,在您要创建集群的区域创建一个 自定义子网
  6. Create

6.6. 准备并导入基本 GCP 镜像

完成以下步骤,为 GCP 准备镜像。

流程

  1. 输入以下命令来转换该文件。上传到 GCP 的镜像必须采用 raw 格式,并命名为 disk.raw

    $ qemu-img convert -f qcow2 ImageName.qcow2 -O raw disk.raw
  2. 输入以下命令来压缩 raw 文件。上传到 GCP 的镜像必须被压缩。

    $ tar -Sczf ImageName.tar.gz disk.raw
  3. 将压缩镜像导入到之前创建的存储桶。

    $ gsutil cp ImageName.tar.gz gs://BucketName

6.7. 创建并配置基本 GCP 实例

完成以下步骤,创建并配置符合 GCP 操作和安全要求的 GCP 实例。

流程

  1. 输入以下命令从存储桶中压缩文件创建镜像。

    $ gcloud compute images create BaseImageName --source-uri gs://BucketName/BaseImageName.tar.gz

    例如:

    [admin@localhost ~] $ gcloud compute images create rhel-76-server --source-uri gs://user-rhelha/rhel-server-76.tar.gz
    Created [https://www.googleapis.com/compute/v1/projects/MyProject/global/images/rhel-server-76].
    NAME            PROJECT                 FAMILY  DEPRECATED  STATUS
    rhel-76-server  rhel-ha-testing-on-gcp                      READY
  2. 输入以下命令从镜像创建模板实例。基本 RHEL 实例所需的最小值为 n1-standard-2。如需了解更多配置选项,请参阅 gcloud 计算实例创建

    $ gcloud compute instances create BaseInstanceName --can-ip-forward --machine-type n1-standard-2 --image BaseImageName --service-account ServiceAccountEmail

    例如:

    [admin@localhost ~] $ gcloud compute instances create rhel-76-server-base-instance --can-ip-forward --machine-type n1-standard-2 --image rhel-76-server --service-account account@project-name-on-gcp.iam.gserviceaccount.com
    Created [https://www.googleapis.com/compute/v1/projects/rhel-ha-testing-on-gcp/zones/us-east1-b/instances/rhel-76-server-base-instance].
    NAME   ZONE   MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
    rhel-76-server-base-instance  us-east1-bn1-standard-2          10.10.10.3   192.227.54.211  RUNNING
  3. 通过 SSH 终端会话连接到实例。

    $ ssh root@PublicIPaddress
  4. 更新 RHEL 软件。

    1. 使用 Red Hat Subscription Manager(RHSM)注册。
    2. 启用订阅池 ID(或使用 --auto-attach 命令)。
    3. 禁用所有软件仓库。

      # subscription-manager repos --disable=*
    4. 启用以下软件仓库。

      # subscription-manager repos --enable=rhel-8-server-rpms
    5. 运行 yum update 命令。

      # yum update -y
  5. 在运行的实例(原位安装)中安装 GCP Linux 客户机环境。

    具体步骤请参阅原位安装客户机环境

  6. 选择 CentOS/RHEL 选项。
  7. 复制命令脚本,并将其粘贴到命令提示符以立即运行脚本。
  8. 对实例进行以下配置更改。这些更改基于自定义镜像的 GCP 建议。如需更多信息,请参阅 gcloudcompute 镜像列表

    1. 编辑 /etc/chrony.conf 文件并删除所有 NTP 服务器。
    2. 添加以下 NTP 服务器。

      metadata.google.internal iburst Google NTP server
    3. 删除任何持久的网络设备规则。

      # rm -f /etc/udev/rules.d/70-persistent-net.rules
      
      # rm -f /etc/udev/rules.d/75-persistent-net-generator.rules
    4. 将网络服务设置为自动启动。

      # chkconfig network on
    5. sshd service 设置为自动启动。

      # systemctl enable sshd
      # systemctl is-enabled sshd
    6. 输入以下命令将时区设置为 UTC。

      # ln -sf /usr/share/zoneinfo/UTC /etc/localtime
    7. (可选)编辑 /etc/ssh/ssh_config 文件并在文件的末尾添加以下行。这将在较长的不活跃时间段内使您的 SSH 会话保持活跃。

      # Server times out connections after several minutes of inactivity.
      # Keep alive ssh connections by sending a packet every 7 minutes.
      ServerAliveInterval 420
    8. 编辑 /etc/ssh/sshd_config 文件并在需要时进行以下更改。ClientAliveInterval 420 设置是可选的,这会在不活跃时间较长期间保持 SSH 会话活跃。

      PermitRootLogin no
      PasswordAuthentication no
      AllowTcpForwarding yes
      X11Forwarding no
      PermitTunnel no
      # Compute times out connections after 10 minutes of inactivity.
      # Keep ssh connections alive by sending a packet every 7 minutes.
      ClientAliveInterval 420
  9. 输入以下命令禁用密码访问。编辑 /etc/cloud/cloud.cfg 文件。

    ssh_pwauth from 1 to 0.
    ssh_pwauth: 0
    重要

    在以前的版本中,您可以启用密码访问来允许 SSH 会话访问来配置实例。您必须禁用密码访问。所有 SSH 会话访问都必须是无密码的。

  10. 输入以下命令从订阅管理器取消注册实例。

    # subscription-manager unregister
  11. 输入以下命令清理 shell 历史记录。为下一个流程保留实例运行。

    # export HISTSIZE=0

6.8. 创建快照镜像

完成以下步骤以保留实例配置设置并创建快照。

流程

  1. 在正在运行的实例中,输入以下命令将数据同步到磁盘。

    # sync
  2. 在您的主机系统中输入以下命令来创建快照。

    $ gcloud compute disks snapshot InstanceName --snapshot-names SnapshotName
  3. 在主机系统中,输入以下命令从快照创建配置的镜像。

    $ gcloud compute images create ConfiguredImageFromSnapshot --source-snapshot SnapshotName

6.9. 创建 HA 节点模板实例和 HA 节点

从快照配置了镜像后,您可以创建节点模板。使用此模板来创建所有 HA 节点。完成以下步骤以创建模板和 HA 节点。

流程

  1. 运行以下命令来创建实例模板。

    $ gcloud compute instance-templates create InstanceTemplateName --can-ip-forward --machine-type n1-standard-2  --image ConfiguredImageFromSnapshot --service-account ServiceAccountEmailAddress

    例如:

    [admin@localhost ~] $ gcloud compute instance-templates create rhel-81-instance-template --can-ip-forward --machine-type n1-standard-2 --image rhel-81-gcp-image --service-account account@project-name-on-gcp.iam.gserviceaccount.com
    Created [https://www.googleapis.com/compute/v1/projects/project-name-on-gcp/global/instanceTemplates/rhel-81-instance-template].
    NAME  MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
    rhel-81-instance-template   n1-standard-2          2018-07-25T11:09:30.506-07:00
  2. 输入以下命令在一个区中创建多个节点。

    # gcloud compute instances create NodeName01 NodeName02 --source-instance-template InstanceTemplateName --zone RegionZone --network=NetworkName --subnet=SubnetName

    例如:

    [admin@localhost ~] $ gcloud compute instances create rhel81-node-01 rhel81-node-02 rhel81-node-03 --source-instance-template rhel-81-instance-template --zone us-west1-b --network=projectVPC --subnet=range0
    Created [https://www.googleapis.com/compute/v1/projects/project-name-on-gcp/zones/us-west1-b/instances/rhel81-node-01].
    Created [https://www.googleapis.com/compute/v1/projects/project-name-on-gcp/zones/us-west1-b/instances/rhel81-node-02].
    Created [https://www.googleapis.com/compute/v1/projects/project-name-on-gcp/zones/us-west1-b/instances/rhel81-node-03].
    NAME            ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
    rhel81-node-01  us-west1-b  n1-standard-2               10.10.10.4   192.230.25.81   RUNNING
    rhel81-node-02  us-west1-b  n1-standard-2               10.10.10.5   192.230.81.253  RUNNING
    rhel81-node-03  us-east1-b  n1-standard-2               10.10.10.6   192.230.102.15  RUNNING

6.10. 安装 HA 软件包和代理

在所有节点上完成以下步骤。

流程

  1. 在 Google Cloud Console 中,选择 Compute Engine 并选择 VM 实例
  2. 选择实例,点击 SSH 旁边的箭头,然后选择 View gcloud 命令选项。
  3. 在命令提示下粘贴这个命令,以免密码访问实例。
  4. 启用 sudo 帐户访问并使用 Red Hat Subscription Manager 注册。
  5. 启用订阅池 ID(或使用 --auto-attach 命令)。
  6. 禁用所有软件仓库。

    # subscription-manager repos --disable=*
  7. 启用以下软件仓库。

    # subscription-manager repos --enable=rhel-8-server-rpms
    # subscription-manager repos --enable=rhel-8-for-x86_64-highavailability-rpms
  8. 安装 pcs pacemaker、隔离代理和资源代理。

    # yum install -y pcs pacemaker fence-agents-gce resource-agents-gcp
  9. 更新所有软件包。

    # yum update -y

6.11. 配置 HA 服务

在所有节点上完成以下步骤以配置 HA 服务。

流程

  1. 用户 hacluster 在上一步中的 pcspacemaker 安装中创建。在所有集群节点上为用户 hacluster 创建密码。所有节点都使用相同的密码。

    # passwd hacluster
  2. 如果安装了 firewalld 服务,输入以下命令来添加 HA 服务。

    # firewall-cmd --permanent --add-service=high-availability
    
    # firewall-cmd --reload
  3. 输入以下命令启动 pcs 服务并启用它在引导时启动。

    # systemctl start pcsd.service
    
    # systemctl enable pcsd.service
    
    Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.

验证步骤

  1. 确定 pcsd 服务正在运行。

    # 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 Mon 2018-06-25 19:21:42 UTC; 15s ago
    Docs: man:pcsd(8)
    man:pcs(8)
    Main PID: 5901 (pcsd)
    CGroup: /system.slice/pcsd.service
    └─5901 /usr/bin/ruby /usr/lib/pcsd/pcsd > /dev/null &
  2. 编辑 /etc/hosts 文件。为所有节点添加 RHEL 主机名和内部 IP 地址。

6.12. 创建集群

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

流程

  1. 在其中一个节点上,输入以下命令验证 pcs 用户。在该命令中指定集群中每个节点的名称。

    # pcs host auth  hostname1 hostname2 hostname3
    Username: hacluster
    Password:
    hostname1: Authorized
    hostname2: Authorized
    hostname3: Authorized
  2. 运行以下命令来创建集群。

    # pcs cluster setup cluster-name hostname1 hostname2 _hostname3-

验证步骤

  1. 运行以下命令,以便在启动时自动加入集群。

    # pcs cluster enable --all
  2. 输入以下命令启动集群。

    # pcs cluster start --all

6.13. 创建隔离设备

对于大多数默认配置,GCP 实例名称和 RHEL 主机名是相同的。

完成以下步骤以创建隔离设备。

流程

  1. 输入以下命令获取 GCP 实例名称。请注意,输出还显示实例的内部 ID。

    # fence_gce --zone us-west1-b --project=rhel-ha-on-gcp -o list

    例如:

    Example:
    [root@rhel81-node-01 ~]# fence_gce --zone us-west1-b --project=rhel-ha-testing-on-gcp -o list
    44358**********3181,InstanceName-3
    40819**********6811,InstanceName-1
    71736**********3341,InstanceName-2
  2. 输入以下命令来创建隔离设备。

    # pcs stonith create _FenceDeviceName_ fence_gce zone=_Region-Zone_ project=_MyProject_

验证步骤

验证隔离设备是否已启动。

# pcs status

例如:

[root@rhel81-node-01 ~]# pcs status
Cluster name: gcp-cluster
Stack: corosync
Current DC: rhel81-node-02 (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum
Last updated: Fri Jul 27 12:53:25 2018
Last change: Fri Jul 27 12:51:43 2018 by root via cibadmin on rhel81-node-01

3 nodes configured
3 resources configured

Online: [ rhel81-node-01 rhel81-node-02 rhel81-node-03 ]

Full list of resources:

us-west1-b-fence    (stonith:fence_gce):    Started rhel81-node-01

Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled

6.14. 配置 GCP 节点授权

配置 cloud SDK 工具,使用您的帐户凭证访问 GCP。

流程

在每个节点上输入以下命令,使用项目 ID 和帐户凭证初始化每个节点。

# gcloud-ra init

6.15. 配置 gcp-vcp-move-vip 资源代理

gcp-vpc-move-vip 资源代理会将二级 IP 地址(作为 IP)附加到运行的实例。这是一个浮动 IP 地址,可在集群中的不同节点间传递。

输入以下命令来显示有关此资源的更多信息。

# pcs resource describe gcp-vpc-move-vip

您可以将资源代理配置为使用主子网地址范围或二级子网地址范围。本节包含这两个范围的步骤。

主子网地址范围

完成以下步骤,为主 VPC 子网配置资源。

流程

  1. 输入以下命令来创建 aliasip 资源。包括一个未使用的内部 IP 地址。在命令中包含 CIDR 块。

    # pcs resource create aliasip gcp-vpc-move-vip  alias_ip=UnusedIPaddress/CIDRblock

    例如:

    [root@rhel81-node-01 ~]# pcs resource create aliasip gcp-vpc-move-vip alias_ip=10.10.10.200/32
  2. 输入以下命令创建用于管理节点上的 IP 的 IPaddr2 资源。

    # pcs resource create vip IPaddr2 nic=interface ip=AliasIPaddress cidr_netmask=32

    例如:

    [root@rhel81-node-01 ~]# pcs resource create vip IPaddr2 nic=eth0 ip=10.10.10.200 cidr_netmask=32
  3. 输入以下命令对 vipgrp 下的网络资源进行分组。

    # pcs resource group add vipgrp aliasip vip

验证步骤

  1. 输入以下命令验证资源是否已启动,并在 vipgrp 下分组。

    [root@rhel81-node-01 ~]# pcs status
  2. 输入以下命令验证资源是否可移至其他节点。

    # pcs resource move vip _Node_

    例如:

    [root@rhel81-node-01 ~]# pcs resource move vip rhel81-node-03
  3. 输入以下命令验证 vip 是否在不同节点上成功启动。

    [root@rhel81-node-01 ~]# pcs status

二级子网地址范围

完成以下步骤,为二级子网地址范围配置资源。

流程

  1. 输入以下命令来创建二级子网地址范围。

    # gcloud-ra compute networks subnets update SubnetName --region RegionName --add-secondary-ranges SecondarySubnetName=SecondarySubnetRange

    例如:

    # gcloud-ra compute networks subnets update range0 --region us-west1 --add-secondary-ranges range1=10.10.20.0/24
  2. 输入以下命令来创建 aliasip 资源。在二级子网地址范围内创建一个未使用的内部 IP 地址。在命令中包含 CIDR 块。

    # pcs resource create aliasip gcp-vpc-move-vip alias_ip=UnusedIPaddress/CIDRblock

    例如:

    [root@rhel81-node-01 ~]# pcs resource create aliasip gcp-vpc-move-vip alias_ip=10.10.20.200/32
  3. 输入以下命令创建用于管理节点上的 IP 的 IPaddr2 资源。

    # pcs resource create vip IPaddr2 nic=interface ip=AliasIPaddress cidr_netmask=32

    例如:

    [root@rhel81-node-01 ~]# pcs resource create vip IPaddr2 nic=eth0 ip=10.10.20.200 cidr_netmask=32
  4. vipgrp 下的网络资源进行分组。

    # pcs resource group add vipgrp aliasip vip

验证步骤

  1. 输入以下命令验证资源是否已启动,并在 vipgrp 下分组。

    [root@rhel81-node-01 ~]# pcs status
  2. 输入以下命令验证资源是否可移至其他节点。

    # pcs resource move vip _Node_

    例如:

    [root@rhel81-node-01 ~]# pcs resource move vip rhel81-node-03
  3. 输入以下命令验证 vip 是否在不同节点上成功启动。

    [root@rhel81-node-01 ~]# pcs status

法律通告

Copyright © 2021 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.