4.8. AWS Local Zone 或 Wavelength Zone 任务


在 Amazon Web Services (AWS) 上安装 OpenShift Container Platform 后,您可以进一步配置 AWS Local Zones 或 Wavelength Zones 和边缘计算池。

4.8.1. 将现有集群扩展为使用 AWS Local Zones 或 Wavelength 区域

作为安装后任务,您可以在 Amazon Web Services (AWS) 上扩展现有 OpenShift Container Platform 集群,以使用 AWS Local Zones 或 Wavelength 区域。

将节点扩展到 Local Zones 或 Wavelength 区域位置包括以下步骤:

  • 调整 cluster-network 最大传输单元 (MTU)。
  • 在 Local Zones 或 Wavelength Zones 组中选择 AWS Local Zones 或 Wavelength 区域。
  • 在现有 VPC 中为本地区域或 Wavelength 区域位置创建一个子网。

    重要

    在将 AWS 上的现有 OpenShift Container Platform 集群扩展为使用 Local Zones 或 Wavelength 区域前,请检查现有的 VPC 是否包含可用的无类别域间路由 (CIDR) 块。创建子网需要这些块。

  • 创建机器集清单,然后在每个 Local Zone 或 Wavelength Zone 位置创建一个节点。
  • 仅限本地区域:将权限 ec2:ModifyAvailabilityZoneGroup 添加到 Identity and Access Management (IAM) 用户或组,以便可以创建所需的网络资源。例如:

    AWS Local Zones 部署的额外 IAM 策略示例

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Action": [
            "ec2:ModifyAvailabilityZoneGroup"
          ],
          "Effect": "Allow",
          "Resource": "*"
        }
      ]
    }

  • 仅限 Wavelength 区域:将权限 ec2:ModifyAvailabilityZoneGroup,ec2:CreateCarrierGateway, 和 ec2:DeleteCarrierGateway 添加到 Identity and Access Management (IAM) 用户或角色,以便可以创建所需的网络资源。例如:

    AWS Wavelength Zones 部署的额外 IAM 策略示例

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ec2:DeleteCarrierGateway",
            "ec2:CreateCarrierGateway"
          ],
          "Resource": "*"
        },
        {
          "Action": [
            "ec2:ModifyAvailabilityZoneGroup"
          ],
          "Effect": "Allow",
          "Resource": "*"
        }
      ]
    }

其他资源

4.8.1.1. 关于边缘计算池

边缘计算节点是在 AWS Local Zones 或 Wavelength 区域位置中运行的污点计算节点。

在部署使用 Local Zones 或 Wavelength 区域的集群时,请考虑以下点:

  • 本地区域或 Wavelength 区域中的 Amazon EC2 实例比可用区中的 Amazon EC2 实例的成本更高。
  • 在 AWS Local Zones 或 Wavelength 区域和最终用户中运行的应用程序间延迟较低。例如,在 Local Zones 或 Wavelength 区域和可用区之间混合了入口流量,则对一些工作负载存在延迟影响。
重要

通常,Local Zones 或 Wavelength Zones 中的 Amazon EC2 实例和 Region 中的 Amazon EC2 实例之间的最大传输单元 (MTU) 为 1300。对于开销,集群网络 MTU 必须总是小于 EC2 MTU。具体开销由网络插件决定。例如: OVN-Kubernetes 的开销为 100 字节

网络插件可以提供额外的功能,如 IPsec,它们也会影响 MTU 大小。

您可以访问以下资源以了解更多有关相应区类型的信息:

OpenShift Container Platform 4.12 引入了一个新的计算池 edge,用于在远程区中使用。边缘计算池配置在 AWS Local Zones 或 Wavelength 区域位置之间很常见。由于 Local Zones 或 Wavelength Zones 资源的 EC2 和 EBS 等资源的类型和大小限制,默认的实例类型可能与传统的计算池不同。

Local Zones 或 Wavelength 区域位置的默认 Elastic Block Store (EBS) 是 gp2,它与非边缘计算池不同。根据区域上的实例产品,边缘计算池中每个本地区域或 Wavelength 区域使用的实例类型可能与其他计算池不同。

边缘计算池创建新的标签,供开发人员用来将应用程序部署到 AWS Local Zones 或 Wavelength 区域节点上。新标签包括:

  • node-role.kubernetes.io/edge=''
  • 仅限 Local Zones:machine.openshift.io/zone-type=local-zone
  • 仅限 Wavelength Zones: machine.openshift.io/zone-type=wavelength-zone
  • machine.openshift.io/zone-group=$ZONE_GROUP_NAME

默认情况下,边缘计算池的机器集定义 NoSchedule 污点,以防止其他工作负载分散到 Local Zones 或 Wavelength Zones 实例。只有用户在 pod 规格中定义容限时,用户才能运行用户工作负载。

4.8.2. 更改集群网络 MTU 以支持本地区域或 Wavelength 区域

您可能需要更改集群网络的最大传输单元 (MTU)值,以便集群基础架构可以支持 Local Zones 或 Wavelength 区域子网。

4.8.2.1. 关于集群 MTU

在安装集群网络的最大传输单元(MTU)期间,会根据集群中节点的主网络接口的 MTU 自动检测到。您通常不需要覆盖检测到的 MTU。

您可能希望因为以下原因更改集群网络的 MTU:

  • 集群安装过程中检测到的 MTU 不正确。
  • 集群基础架构现在需要不同的 MTU,如添加需要不同 MTU 的节点来获得最佳性能

只有 OVN-Kubernetes 集群网络插件支持更改 MTU 值。

4.8.2.1.1. 服务中断注意事项

当您为集群启动 MTU 更改时,以下效果可能会影响服务可用性:

  • 至少需要两个滚动重启才能完成迁移到新的 MTU。在此过程中,一些节点在重启时不可用。
  • 部署到集群的特定应用程序带有较短的超时间隔,超过绝对 TCP 超时间隔可能会在 MTU 更改过程中造成中断。
4.8.2.1.2. MTU 值选择

在规划 MTU 迁移时,需要考虑两个相关但不同的 MTU 值。

  • Hardware MTU :此 MTU 值根据您的网络基础架构的具体设置。
  • Cluster network MTU :此 MTU 值始终小于您的硬件 MTU,以考虑集群网络覆盖开销。具体开销由您的网络插件决定。对于 OVN-Kubernetes,开销为 100 字节。

如果您的集群为不同的节点需要不同的 MTU 值,则必须从集群中任何节点使用的最低 MTU 值中减去网络插件的开销值。例如,如果集群中的某些节点的 MTU 为 9001,而某些节点的 MTU 为 1500,则必须将此值设置为 1400

重要

为了避免选择节点无法接受的 MTU 值,请使用 ip -d link 命令验证网络接口接受的最大 MTU 值 (maxmtu)。

4.8.2.1.3. 迁移过程如何工作

下表对迁移过程进行了概述,它分为操作中的用户发起的步骤,以及在响应过程中迁移过程要执行的操作。

表 4.31. 集群 MTU 的实时迁移
用户发起的步骤OpenShift Container Platform 活动

在 Cluster Network Operator 配置中设置以下值:

  • spec.migration.mtu.machine.to
  • spec.migration.mtu.network.from
  • spec.migration.mtu.network.to

Cluster Network Operator(CNO) :确认每个字段都设置为有效的值。

  • 如果硬件的 MTU 没有改变,则 mtu.machine.to 必须设置为新硬件 MTU 或当前的硬件 MTU。这个值是临时的,被用作迁移过程的一部分。如果您指定了与现有硬件 MTU 值不同的硬件 MTU,您必须手动将 MTU 配置为持久,如机器配置、DHCP 设置或 Linux 内核命令行。
  • mtu.network.from 字段必须等于 network.status.clusterNetworkMTU 字段,这是集群网络的当前 MTU。
  • mtu.network.to 字段必须设置为目标集群网络 MTU,且必须小于硬件 MTU,以允许网络插件的覆盖开销。对于 OVN-Kubernetes,开销为 100 字节。

如果提供的值有效,CNO 会生成一个新的临时配置,它将集群网络集的 MTU 设置为 mtu.network.to 字段的值。

Machine Config Operator(MCO) :执行集群中每个节点的滚动重启。

重新配置集群中节点的主网络接口 MTU。您可以使用各种方法完成此操作,包括:

  • 使用 MTU 更改部署新的 NetworkManager 连接配置集
  • 通过 DHCP 服务器设置更改 MTU
  • 通过引导参数更改 MTU

N/A

在网络插件的 CNO 配置中设置 mtu 值,并将 spec.migration 设置为 null

Machine Config Operator(MCO) :使用新的 MTU 配置执行集群中每个节点的滚动重启。

4.8.2.1.4. 更改集群网络 MTU

作为集群管理员,您可以增加或减少集群的最大传输单元 (MTU)。

重要

当 MTU 更新推出时,集群中的迁移具有破坏性且节点可能会临时不可用。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您可以使用具有 cluster-admin 权限的账户访问集群。
  • 已为集群识别目标 MTU。OVN-Kubernetes 网络插件的 MTU 必须设置为比集群中的最低硬件 MTU 值小 100

流程

  1. 要获得集群网络的当前 MTU,请输入以下命令:

    $ oc describe network.config cluster

    输出示例

    ...
    Status:
      Cluster Network:
        Cidr:               10.217.0.0/22
        Host Prefix:        23
      Cluster Network MTU:  1400
      Network Type:         OVNKubernetes
      Service Network:
        10.217.4.0/23
    ...

  2. 要开始 MTU 迁移,请输入以下命令指定迁移配置。Machine Config Operator 在集群中执行节点的滚动重启,以准备 MTU 更改。

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": { "mtu": { "network": { "from": <overlay_from>, "to": <overlay_to> } , "machine": { "to" : <machine_to> } } } } }'

    其中:

    <overlay_from>
    指定当前的集群网络 MTU 值。
    <overlay_to>
    指定集群网络的目标 MTU。这个值相对于 <machine_to> 的值设置。对于 OVN-Kubernetes,这个值必须比 <machine_to> 的值小 100
    <machine_to>
    指定底层主机网络上的主网络接口的 MTU。

    增加集群 MTU 的示例

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": { "mtu": { "network": { "from": 1400, "to": 9000 } , "machine": { "to" : 9100} } } } }'

  3. 当 Machine Config Operator 更新每个机器配置池中的机器时,它会逐一重启每个节点。您必须等到所有节点都已更新。输入以下命令检查机器配置池状态:

    $ oc get machineconfigpools

    成功更新的节点具有以下状态: UPDATED=trueUPDATING=falseDEGRADED=false

    注意

    默认情况下,Machine Config Operator 一次更新每个池中的一个机器,从而导致迁移总时间随着集群大小而增加。

  4. 确认主机上新机器配置的状态:

    1. 要列出机器配置状态和应用的机器配置名称,请输入以下命令:

      $ oc describe node | egrep "hostname|machineconfig"

      输出示例

      kubernetes.io/hostname=master-0
      machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/reason:
      machineconfiguration.openshift.io/state: Done

    2. 验证以下语句是否正确:

      • machineconfiguration.openshift.io/state 字段的值为 Done
      • machineconfiguration.openshift.io/currentConfig 字段的值等于 machineconfiguration.openshift.io/desiredConfig 字段的值。
    3. 要确认机器配置正确,请输入以下命令:

      $ oc get machineconfig <config_name> -o yaml | grep ExecStart

      这里的 <config_name>machineconfiguration.openshift.io/currentConfig 字段中机器配置的名称。

      机器配置必须包括以下对 systemd 配置的更新:

      ExecStart=/usr/local/bin/mtu-migration.sh
  5. 要完成 MTU 迁移,请为 OVN-Kubernetes 网络插件输入以下命令:

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": null, "defaultNetwork":{ "ovnKubernetesConfig": { "mtu": <mtu> }}}}'

    其中:

    <mtu>
    指定您使用 <overlay_to> 指定的新集群网络 MTU。
  6. 最终调整 MTU 迁移后,每个机器配置池节点都会逐个重启一个。您必须等到所有节点都已更新。输入以下命令检查机器配置池状态:

    $ oc get machineconfigpools

    成功更新的节点具有以下状态: UPDATED=trueUPDATING=falseDEGRADED=false

验证

  • 输入以下命令验证集群中的节点是否使用您指定的 MTU:

    $ oc describe network.config cluster

4.8.2.2. 选择 AWS 本地区域或 Wavelength 区域

如果您计划在 AWS Local Zones 或 Wavelength 区域中创建子网,则必须单独选择每个 zone group。

先决条件

  • 已安装 AWS CLI。
  • 您已决定要部署 OpenShift Container Platform 集群的 AWS 区域。
  • 您已将 permissive IAM 策略附加到选择 zone 组的用户或组帐户。

流程

  1. 运行以下命令,列出 AWS 区域中可用的区域:

    在 AWS 区域中列出可用 AWS 区域的命令示例

    $ aws --region "<value_of_AWS_Region>" ec2 describe-availability-zones \
        --query 'AvailabilityZones[].[{ZoneName: ZoneName, GroupName: GroupName, Status: OptInStatus}]' \
        --filters Name=zone-type,Values=local-zone \
        --all-availability-zones

    在 AWS 区域中列出可用 AWS Wavelength 区域的命令示例

    $ aws --region "<value_of_AWS_Region>" ec2 describe-availability-zones \
        --query 'AvailabilityZones[].[{ZoneName: ZoneName, GroupName: GroupName, Status: OptInStatus}]' \
        --filters Name=zone-type,Values=wavelength-zone \
        --all-availability-zones

    根据 AWS 区域,可用区列表可能比较长。该命令返回以下字段:

    ZoneName
    本地区域或 Wavelength 区域的名称。
    GroupName
    组成区域的组。要选择 Region,保存名称。
    Status
    Local Zones 或 Wavelength Zones 组的状态。如果状态是 not-opted-in,则需要选择 GroupName,如下一步所述。
  2. 运行以下命令,选择 AWS 帐户上的 zone 组:

    $ aws ec2 modify-availability-zone-group \
        --group-name "<value_of_GroupName>" \1
        --opt-in-status opted-in
    1
    <value_of_GroupName> 替换为您要创建子网的 Local Zones 或 Wavelength 区域的名称。

4.8.2.3. 在使用 AWS Local Zones 或 Wavelength 区域的现有 VPC 中创建网络要求

如果您希望 Machine API 在远程区位置创建 Amazon EC2 实例,您必须在 Local Zones 或 Wavelength Zones 位置创建一个子网。您可以使用任何置备工具(如 Ansible 或 Terraform)在现有的 Virtual Private Cloud (VPC) 中创建子网。

您可以配置 CloudFormation 模板以满足您的要求。以下小节包括使用 CloudFormation 模板创建网络要求的步骤,将现有的 VPC 扩展为使用 AWS Local Zones 或 Wavelength 区域。

将节点扩展到 Local Zones 要求您创建以下资源:

  • 2 个 VPC 子网:公共和私有。共子网与 Region 中的普通可用域的公共路由表关联。专用子网与提供的路由表 ID 关联。

将节点扩展到 Wavelength 区域需要您创建以下资源:

  • 1 个与提供的 VPC ID 关联的 VPC Carrier Gateway。
  • 1 个 VPC 路由表用于 Wavelength 区域,带有到 VPC Carrier Gateway 的默认路由条目。
  • 2 个 VPC 子网:公共和私有。公共子网与 AWS Wavelength Zone 的公共路由表关联。专用子网与提供的路由表 ID 关联。
重要

考虑 Wavelength 区域中的 NAT 网关限制,提供的 CloudFormation 模板支持仅将专用子网与提供的路由表 ID 关联。路由表 ID 附加到 AWS 区域中的有效 NAT 网关。

4.8.2.4. 仅限 Wavelength 区域:创建 VPC 载体网关

要在 Wavelength 区域上运行的 OpenShift Container Platform 集群中使用公共子网,您必须创建载体网关,并将载体网关关联到 VPC。子网可用于部署负载均衡器或边缘计算节点。

要在 OpenShift Container Platform 集群的 Wavelength 区域位置创建边缘节点或面向互联网的负载均衡器,您必须创建以下所需的网络组件:

  • 与现有 VPC 关联的载体网关。
  • 列出路由条目的载波路由表。
  • 与载体路由表关联的子网。

对于仅包含 Wavelength 区中的子网的 VPC 存在载体网关。

以下列表解释了 AWS Wavelength 区域位置上下文中的载体网关的功能:

  • 提供 Wavelength Zone 和 carrier 网络之间的连接,其中包括来自载体网络的任何可用设备。
  • 执行网络地址转换(NAT)功能,如将作为网络边框组的公共 IP 地址(从 Wavelength 区域转换为载体 IP 地址)的 IP 地址转换。这些转换功能适用于入站和出站流量。
  • 授权来自位于特定位置的载体网络的入站流量。
  • 授权到载波网络和互联网的出站流量。
注意

互联网没有入站连接配置,通过载体网关到 Wavelength 区域。

您可以使用提供的 CloudFormation 模板来创建以下 AWS 资源堆栈:

  • 一个载体网关,与模板中的 VPC ID 关联。
  • 一个用于 Wavelength Zone 的公共路由表,名为 <ClusterName>-public-carrier
  • 以载体网关为目标的新路由表中的默认 IPv4 路由条目。
  • AWS Simple Storage Service (S3) 的 VPC 网关端点。
注意

如果不使用提供的 CloudFormation 模板来创建 AWS 基础架构,您必须检查提供的信息并手动创建基础架构。如果集群没有正确初始化,您可能需要联系红帽支持并提供您的安装日志。

先决条件

  • 已配置了一个 AWS 帐户。
  • 您可以通过运行 aws configure,将 AWS 密钥和区域添加到本地 AWS 配置集中。

流程

  1. 进入名为"CloudFormation template for the VPC Carrier Gateway"的文档的下一部分,然后复制 VPC Carrier Gateway 模板的 CloudFormation 模板的语法。将复制的模板语法保存为本地系统中的 YAML 文件。此模板描述了集群所需的 VPC。
  2. 运行以下命令来部署 CloudFormation 模板,它会创建一个代表 VPC 的 AWS 资源堆栈:

    $ aws cloudformation create-stack --stack-name <stack_name> \1
      --region ${CLUSTER_REGION} \
      --template-body file://<template>.yaml \2
      --parameters \//
        ParameterKey=VpcId,ParameterValue="${VpcId}" \3
        ParameterKey=ClusterName,ParameterValue="${ClusterName}" 4
    1
    <stack_name> 是 CloudFormation 堆栈的名称,如 clusterName-vpc-carrier-gw。如果您删除集群,则需要此堆栈的名称。
    2
    <template> 是相对路径,以及保存的 CloudFormation 模板 YAML 文件的名称。
    3
    <VpcId> 是从名为"Creating a VPC in AWS"部分创建的 CloudFormation 堆栈输出中提取的 VPC ID。
    4
    <clusterName> 是一个自定义值,前缀为 CloudFormation 堆栈创建的资源的前缀。您可以使用 install-config.yaml 配置文件的 metadata.name 部分中定义的相同名称。

    输出示例

    arn:aws:cloudformation:us-east-1:123456789012:stack/<stack_name>/dbedae40-2fd3-11eb-820e-12a48460849f

验证

  • 运行以下命令确认 CloudFormation 模板组件已存在:

    $ aws cloudformation describe-stacks --stack-name <stack_name>

    StackStatus 显示 CREATE_COMPLETE 后,输出显示以下参数的值:确保为集群运行的其他 CloudFormation 模板提供参数值。

    PublicRouteTableId

    Carrier 基础架构中路由表 ID。

4.8.2.5. 仅限 Wavelength 区域:VPC Carrier Gateway 的 CloudFormation 模板

您可以使用以下 CloudFormation 模板,在 AWS Wavelength 基础架构上部署 Carrier Gateway。

例 4.85. VPC Carrier Gateway 的 CloudFormation 模板

AWSTemplateFormatVersion: 2010-09-09
Description: Template for Creating Wavelength Zone Gateway (Carrier Gateway).

Parameters:
  VpcId:
    Description: VPC ID to associate the Carrier Gateway.
    Type: String
    AllowedPattern: ^(?:(?:vpc)(?:-[a-zA-Z0-9]+)?\b|(?:[0-9]{1,3}\.){3}[0-9]{1,3})$
    ConstraintDescription: VPC ID must be with valid name, starting with vpc-.*.
  ClusterName:
    Description: Cluster Name or Prefix name to prepend the tag Name for each subnet.
    Type: String
    AllowedPattern: ".+"
    ConstraintDescription: ClusterName parameter must be specified.

Resources:
  CarrierGateway:
    Type: "AWS::EC2::CarrierGateway"
    Properties:
      VpcId: !Ref VpcId
      Tags:
      - Key: Name
        Value: !Join ['-', [!Ref ClusterName, "cagw"]]

  PublicRouteTable:
    Type: "AWS::EC2::RouteTable"
    Properties:
      VpcId: !Ref VpcId
      Tags:
      - Key: Name
        Value: !Join ['-', [!Ref ClusterName, "public-carrier"]]

  PublicRoute:
    Type: "AWS::EC2::Route"
    DependsOn: CarrierGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      CarrierGatewayId: !Ref CarrierGateway

  S3Endpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
        - Effect: Allow
          Principal: '*'
          Action:
          - '*'
          Resource:
          - '*'
      RouteTableIds:
      - !Ref PublicRouteTable
      ServiceName: !Join
      - ''
      - - com.amazonaws.
        - !Ref 'AWS::Region'
        - .s3
      VpcId: !Ref VpcId

Outputs:
  PublicRouteTableId:
    Description: Public Route table ID
    Value: !Ref PublicRouteTable

4.8.2.6. 为 AWS 边缘计算服务创建子网

在 OpenShift Container Platform 集群中为边缘计算节点配置机器集前,您必须在 Local Zones 或 Wavelength Zones 中创建子网。对您要将计算节点部署到的每个 Wavelength 区完成以下步骤。

您可以使用提供的 CloudFormation 模板并创建 CloudFormation 堆栈。然后,您可以使用此堆栈自定义置备子网。

注意

如果不使用提供的 CloudFormation 模板来创建 AWS 基础架构,您必须检查提供的信息并手动创建基础架构。如果集群没有正确初始化,您可能需要联系红帽支持并提供您的安装日志。

先决条件

  • 已配置了一个 AWS 帐户。
  • 您可以通过运行 aws configure,将 AWS 密钥和区域添加到本地 AWS 配置集中。
  • 您可以选择 Local Zones 或 Wavelength Zones 组。

流程

  1. 进入名为"CloudFormation template for the VPC 子网"的文档部分,并从模板中复制语法。将复制的模板语法保存为本地系统中的 YAML 文件。此模板描述了集群所需的 VPC。
  2. 运行以下命令来部署 CloudFormation 模板,它会创建一个代表 VPC 的 AWS 资源堆栈:

    $ aws cloudformation create-stack --stack-name <stack_name> \1
      --region ${CLUSTER_REGION} \
      --template-body file://<template>.yaml \2
      --parameters \
        ParameterKey=VpcId,ParameterValue="${VPC_ID}" \3
        ParameterKey=ClusterName,ParameterValue="${CLUSTER_NAME}" \4
        ParameterKey=ZoneName,ParameterValue="${ZONE_NAME}" \5
        ParameterKey=PublicRouteTableId,ParameterValue="${ROUTE_TABLE_PUB}" \6
        ParameterKey=PublicSubnetCidr,ParameterValue="${SUBNET_CIDR_PUB}" \7
        ParameterKey=PrivateRouteTableId,ParameterValue="${ROUTE_TABLE_PVT}" \8
        ParameterKey=PrivateSubnetCidr,ParameterValue="${SUBNET_CIDR_PVT}" 9
    1
    <stack_name> 是 CloudFormation 堆栈的名称,如用于 Local Zones 的 cluster-wl-<local_zone_shortname>,用于 Wavelength Zones 的 cluster-wl-<wavelength_zone_shortname>。如果您删除集群,则需要此堆栈的名称。
    2
    <template> 是相对路径,以及保存的 CloudFormation 模板 YAML 文件的名称。
    3
    ${VPC_ID} 是 VPC ID,它是 VPC 模板输出中的 VpcID 值。
    4
    ${CLUSTER_NAME}ClusterName 的值,用作新 AWS 资源名称的前缀。
    5
    ${ZONE_NAME} 是创建子网的 Local Zones 或 Wavelength 区域名称的值。
    6
    ${ROUTE_TABLE_PUB} 是从 CloudFormation 模板中提取的公共路由表 Id。对于 Local Zones,从 VPC CloudFormation 堆栈中提取公共路由表。对于 Wavelength Zones,值必须从 VPC 的载体网关 CloudFormation 堆栈的输出中提取。
    7
    ${SUBNET_CIDR_PUB} 是一个有效的 CIDR 块,用于创建公共子网。这个块必须是 VPC CIDR 块 VpcCidr 的一部分。
    8
    ${ROUTE_TABLE_PVT} 是从 VPC 的 CloudFormation 堆栈的输出中提取的 PrivateRouteTableId
    9
    ${SUBNET_CIDR_PVT} 是一个有效的 CIDR 块,用于创建专用子网。这个块必须是 VPC CIDR 块 VpcCidr 的一部分。

    输出示例

    arn:aws:cloudformation:us-east-1:123456789012:stack/<stack_name>/dbedae40-820e-11eb-2fd3-12a48460849f

验证

  • 运行以下命令确认模板组件已存在:

    $ aws cloudformation describe-stacks --stack-name <stack_name>

    StackStatus 显示 CREATE_COMPLETE 后,输出会显示以下参数的值:

    PublicSubnetId

    由 CloudFormation 堆栈创建的公共子网的 ID。

    PrivateSubnetId

    由 CloudFormation 堆栈创建的专用子网的 ID。

    确保将这些参数值提供给您为集群创建的其他 CloudFormation 模板。

4.8.2.7. VPC 子网的 CloudFormation 模板

您可以使用以下 CloudFormation 模板,在 Local Zones 或 Wavelength 区域基础架构上部署私有和公共子网。

例 4.86. VPC 子网的 CloudFormation 模板

AWSTemplateFormatVersion: 2010-09-09
Description: Template for Best Practice Subnets (Public and Private)

Parameters:
  VpcId:
    Description: VPC ID that comprises all the target subnets.
    Type: String
    AllowedPattern: ^(?:(?:vpc)(?:-[a-zA-Z0-9]+)?\b|(?:[0-9]{1,3}\.){3}[0-9]{1,3})$
    ConstraintDescription: VPC ID must be with valid name, starting with vpc-.*.
  ClusterName:
    Description: Cluster name or prefix name to prepend the Name tag for each subnet.
    Type: String
    AllowedPattern: ".+"
    ConstraintDescription: ClusterName parameter must be specified.
  ZoneName:
    Description: Zone Name to create the subnets, such as us-west-2-lax-1a.
    Type: String
    AllowedPattern: ".+"
    ConstraintDescription: ZoneName parameter must be specified.
  PublicRouteTableId:
    Description: Public Route Table ID to associate the public subnet.
    Type: String
    AllowedPattern: ".+"
    ConstraintDescription: PublicRouteTableId parameter must be specified.
  PublicSubnetCidr:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(1[6-9]|2[0-4]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/16-24.
    Default: 10.0.128.0/20
    Description: CIDR block for public subnet.
    Type: String
  PrivateRouteTableId:
    Description: Private Route Table ID to associate the private subnet.
    Type: String
    AllowedPattern: ".+"
    ConstraintDescription: PrivateRouteTableId parameter must be specified.
  PrivateSubnetCidr:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(1[6-9]|2[0-4]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/16-24.
    Default: 10.0.128.0/20
    Description: CIDR block for private subnet.
    Type: String


Resources:
  PublicSubnet:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref VpcId
      CidrBlock: !Ref PublicSubnetCidr
      AvailabilityZone: !Ref ZoneName
      Tags:
      - Key: Name
        Value: !Join ['-', [!Ref ClusterName, "public", !Ref ZoneName]]

  PublicSubnetRouteTableAssociation:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTableId

  PrivateSubnet:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref VpcId
      CidrBlock: !Ref PrivateSubnetCidr
      AvailabilityZone: !Ref ZoneName
      Tags:
      - Key: Name
        Value: !Join ['-', [!Ref ClusterName, "private", !Ref ZoneName]]

  PrivateSubnetRouteTableAssociation:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      SubnetId: !Ref PrivateSubnet
      RouteTableId: !Ref PrivateRouteTableId

Outputs:
  PublicSubnetId:
    Description: Subnet ID of the public subnets.
    Value:
      !Join ["", [!Ref PublicSubnet]]

  PrivateSubnetId:
    Description: Subnet ID of the private subnets.
    Value:
      !Join ["", [!Ref PrivateSubnet]]

4.8.2.8. 为 AWS Local Zones 或 Wavelength 区域节点创建机器集清单

在 AWS Local Zones 或 Wavelength 区域中创建子网后,您可以创建机器集清单。

安装程序在集群安装过程中为 edge 机器池设置以下标签:

  • machine.openshift.io/parent-zone-name: <value_of_ParentZoneName>
  • machine.openshift.io/zone-group: <value_of_ZoneGroup>
  • machine.openshift.io/zone-type: <value_of_ZoneType>

以下过程详细介绍了如何创建与 edge 计算池 配置匹配的机器集 configuraton。

先决条件

  • 您已在 AWS Local Zones 或 Wavelength 区域中创建子网。

流程

  • 通过收集 AWS API 创建机器集清单时,手动保留 edge 机器池标签。要完成此操作,请在命令行界面(CLI)中输入以下命令:

    $ aws ec2 describe-availability-zones --region <value_of_Region> \1
        --query 'AvailabilityZones[].{
    	ZoneName: ZoneName,
    	ParentZoneName: ParentZoneName,
    	GroupName: GroupName,
    	ZoneType: ZoneType}' \
        --filters Name=zone-name,Values=<value_of_ZoneName> \2
        --all-availability-zones
    1
    对于 <value_of_Region>,请指定区的区域名称。
    2
    对于 <value_of_ZoneName>,请指定 Local Zones 或 Wavelength Zones 的名称。

    Local Zone us-east-1-nyc-1a 的输出示例

    [
        {
            "ZoneName": "us-east-1-nyc-1a",
            "ParentZoneName": "us-east-1f",
            "GroupName": "us-east-1-nyc-1",
            "ZoneType": "local-zone"
        }
    ]

    Wavelength Zone us-east-1-wl1 的输出示例

    [
        {
            "ZoneName": "us-east-1-wl1-bos-wlz-1",
            "ParentZoneName": "us-east-1a",
            "GroupName": "us-east-1-wl1",
            "ZoneType": "wavelength-zone"
        }
    ]

4.8.2.8.1. AWS 上计算机器设置自定义资源的 YAML 示例

此 YAML 示例定义了一个在 us-east-1-nyc-1a Amazon Web Services (AWS)区域中运行的计算机器集,并创建带有 node-role.kubernetes.io/edge: "" 标记的节点。

注意

如果要在 Wavelength 区域上下文中引用示例 YAML 文件,请确保将 AWS Region 和 zone 信息替换为支持的 Wavelength Zone 值。

在本例中,<infrastructure_id> 是基础架构 ID 标签,该标签基于您在置备集群时设定的集群 ID,而 <edge> 则是要添加的节点标签。

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  labels:
    machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1
  name: <infrastructure_id>-edge-<zone> 2
  namespace: openshift-machine-api
spec:
  replicas: 1
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: <infrastructure_id> 3
      machine.openshift.io/cluster-api-machineset: <infrastructure_id>-edge-<zone>
  template:
    metadata:
      labels:
        machine.openshift.io/cluster-api-cluster: <infrastructure_id> 4
        machine.openshift.io/cluster-api-machine-role: edge 5
        machine.openshift.io/cluster-api-machine-type: edge 6
        machine.openshift.io/cluster-api-machineset: <infrastructure_id>-edge-<zone> 7
    spec:
      metadata:
        labels:
          machine.openshift.io/parent-zone-name: <value_of_ParentZoneName>
          machine.openshift.io/zone-group: <value_of_GroupName>
          machine.openshift.io/zone-type: <value_of_ZoneType>
          node-role.kubernetes.io/edge: "" 8
      providerSpec:
        value:
          ami:
            id: ami-046fe691f52a953f9 9
          apiVersion: machine.openshift.io/v1beta1
          blockDevices:
            - ebs:
                iops: 0
                volumeSize: 120
                volumeType: gp2
          credentialsSecret:
            name: aws-cloud-credentials
          deviceIndex: 0
          iamInstanceProfile:
            id: <infrastructure_id>-worker-profile 10
          instanceType: m6i.large
          kind: AWSMachineProviderConfig
          placement:
            availabilityZone: <zone> 11
            region: <region> 12
          securityGroups:
            - filters:
                - name: tag:Name
                  values:
                    - <infrastructure_id>-worker-sg 13
          subnet:
              id: <value_of_PublicSubnetIds> 14
          publicIp: true
          tags:
            - name: kubernetes.io/cluster/<infrastructure_id> 15
              value: owned
            - name: <custom_tag_name> 16
              value: <custom_tag_value> 17
          userDataSecret:
            name: worker-user-data
      taints: 18
        - key: node-role.kubernetes.io/edge
          effect: NoSchedule
1 3 4 10 13 15
指定基于置备集群时所设置的集群 ID 的基础架构 ID。如果已安装 OpenShift CLI,您可以通过运行以下命令来获取基础架构 ID:
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructure cluster
2 7
指定基础架构 ID、edge 角色节点标签和区域名称。
5 6 8
指定 edge 角色节点标签。
9
为 OpenShift Container Platform 节点的 AWS 区域指定有效的 Red Hat Enterprise Linux CoreOS (RHCOS) Amazon Machine Image (AMI)。如果要使用 AWS Marketplace 镜像,则必须从 AWS Marketplace 完成 OpenShift Container Platform 订阅来获取您所在地区的 AMI ID。
$ oc -n openshift-machine-api \
    -o jsonpath='{.spec.template.spec.providerSpec.value.ami.id}{"\n"}' \
    get machineset/<infrastructure_id>-<role>-<zone>
16 17
可选:为集群指定自定义标签数据。例如,您可以通过指定 Email:admin-email@example.comname:value 对来添加管理员的电子邮件地址。
注意

也可以在 install-config.yml 文件中在安装过程中指定自定义标签。如果 install-config.yml 文件和机器集包含具有相同 name 数据的标签,则机器集的标签值优先于 install-config.yml 文件中的标签值。

11
指定区域名称,如 us-east-1-nyc-1a
12
指定区域,如 us-east-1
14
您在 AWS Local Zones 或 Wavelength 区域中创建的公共子网的 ID。完成"在 AWS 区域中创建子网"的步骤后,创建了此公共子网 ID。
18
指定污点,以防止将用户工作负载调度到 edge 节点上。
注意

在基础架构节点上添加 NoSchedule 污点后,在该节点上运行的现有 DNS pod 被标记为 misscheduled。您必须删除或misscheduled DNS pod 中添加容限

4.8.2.8.2. 创建计算机器集

除了安装程序创建的计算机器集外,您还可以创建自己的来动态管理您选择的特定工作负载的机器计算资源。

先决条件

  • 部署一个 OpenShift Container Platform 集群。
  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 权限的用户身份登录 oc

流程

  1. 创建一个包含计算机器集自定义资源(CR)示例的新 YAML 文件,并将其命名为 <file_name>.yaml

    确保设置 <clusterID><role> 参数值。

  2. 可选:如果您不确定要为特定字段设置哪个值,您可以从集群中检查现有计算机器集:

    1. 要列出集群中的计算机器集,请运行以下命令:

      $ oc get machinesets -n openshift-machine-api

      输出示例

      NAME                                DESIRED   CURRENT   READY   AVAILABLE   AGE
      agl030519-vplxk-worker-us-east-1a   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1b   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1c   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1d   0         0                             55m
      agl030519-vplxk-worker-us-east-1e   0         0                             55m
      agl030519-vplxk-worker-us-east-1f   0         0                             55m

    2. 要查看特定计算机器集自定义资源 (CR) 的值,请运行以下命令:

      $ oc get machineset <machineset_name> \
        -n openshift-machine-api -o yaml

      输出示例

      apiVersion: machine.openshift.io/v1beta1
      kind: MachineSet
      metadata:
        labels:
          machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1
        name: <infrastructure_id>-<role> 2
        namespace: openshift-machine-api
      spec:
        replicas: 1
        selector:
          matchLabels:
            machine.openshift.io/cluster-api-cluster: <infrastructure_id>
            machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>
        template:
          metadata:
            labels:
              machine.openshift.io/cluster-api-cluster: <infrastructure_id>
              machine.openshift.io/cluster-api-machine-role: <role>
              machine.openshift.io/cluster-api-machine-type: <role>
              machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>
          spec:
            providerSpec: 3
              ...

      1
      集群基础架构 ID。
      2
      默认节点标签。
      注意

      对于具有用户置备的基础架构的集群,计算机器集只能创建 workerinfra 类型机器。

      3
      计算机器设置 CR 的 <providerSpec> 部分中的值是特定于平台的。有关 CR 中的 <providerSpec> 参数的更多信息,请参阅您的供应商计算机器设置 CR 配置示例。
  3. 运行以下命令来创建 MachineSet CR:

    $ oc create -f <file_name>.yaml

验证

  • 运行以下命令,查看计算机器集列表:

    $ oc get machineset -n openshift-machine-api

    输出示例

    NAME                                       DESIRED   CURRENT   READY   AVAILABLE   AGE
    agl030519-vplxk-edge-us-east-1-nyc-1a      1         1         1       1           11m
    agl030519-vplxk-worker-us-east-1a          1         1         1       1           55m
    agl030519-vplxk-worker-us-east-1b          1         1         1       1           55m
    agl030519-vplxk-worker-us-east-1c          1         1         1       1           55m
    agl030519-vplxk-worker-us-east-1d          0         0                             55m
    agl030519-vplxk-worker-us-east-1e          0         0                             55m
    agl030519-vplxk-worker-us-east-1f          0         0                             55m

    当新的计算机器集可用时,DESIREDCURRENT 的值会匹配。如果 compute 机器集不可用,请等待几分钟,然后再次运行命令。

  • 可选: 要检查边缘机器创建的节点,请运行以下命令:

    $ oc get nodes -l node-role.kubernetes.io/edge

    输出示例

    NAME                           STATUS   ROLES         AGE    VERSION
    ip-10-0-207-188.ec2.internal   Ready    edge,worker   172m   v1.25.2+d2e245f

4.8.3. 在 AWS 本地区中或 Wavelength 区域创建用户工作负载

创建 Amazon Web Service (AWS) Local Zones 或 Wavelength 区域基础架构并部署集群后,您可以使用边缘计算节点在 Local Zones 或 Wavelength 区域子网中创建用户工作负载。

当使用安装程序创建集群时,安装程序会自动为每个边缘计算节点指定 NoSchedule 的污点效果。这意味着,如果 pod 与污点的指定容限不匹配,调度程序不会向节点添加新 pod 或部署。您可以修改污点,以更好地控制节点如何在每个本地区域或 Wavelength 区域子网中创建工作负载。

安装程序创建计算机器集清单文件,该文件带有 node-role.kubernetes.io/edgenode-role.kubernetes.io/worker 标签,应用到位于 Local Zones 或 Wavelength Zones 子网中的每个边缘计算节点。

注意

该流程中的示例用于本地区域基础架构。如果您使用 Wavelength 区域基础架构,请确保将示例适应此基础架构支持的内容。

先决条件

  • 您可以访问 OpenShift CLI(oc)。
  • 您在带有定义的 Local Zones 或 Wavelength 区域子网中的虚拟私有云 (VPC) 中部署了集群。
  • 确保 Local Zones 或 Wavelength Zones 子网上边缘计算节点的计算机器集指定了 node-role.kubernetes.io/edge 的污点。

流程

  1. 为要在 Local Zones 子网中运行的边缘计算节点中部署的示例应用程序创建一个 deployment 资源 YAML 文件。确保指定与边缘计算节点污点匹配的正确容限。

    在 Local Zone 子网中运行的边缘计算节点配置的 deployment 资源示例

    kind: Namespace
    apiVersion: v1
    metadata:
      name: <local_zone_application_namespace>
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: <pvc_name>
      namespace: <local_zone_application_namespace>
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: gp2-csi 1
      volumeMode: Filesystem
    ---
    apiVersion: apps/v1
    kind: Deployment 2
    metadata:
      name: <local_zone_application> 3
      namespace: <local_zone_application_namespace> 4
    spec:
      selector:
        matchLabels:
          app: <local_zone_application>
      replicas: 1
      template:
        metadata:
          labels:
            app: <local_zone_application>
            zone-group: ${ZONE_GROUP_NAME} 5
        spec:
          securityContext:
            seccompProfile:
              type: RuntimeDefault
          nodeSelector: 6
            machine.openshift.io/zone-group: ${ZONE_GROUP_NAME}
          tolerations: 7
          - key: "node-role.kubernetes.io/edge"
            operator: "Equal"
            value: ""
            effect: "NoSchedule"
          containers:
            - image: openshift/origin-node
              command:
               - "/bin/socat"
              args:
                - TCP4-LISTEN:8080,reuseaddr,fork
                - EXEC:'/bin/bash -c \"printf \\\"HTTP/1.0 200 OK\r\n\r\n\\\"; sed -e \\\"/^\r/q\\\"\"'
              imagePullPolicy: Always
              name: echoserver
              ports:
                - containerPort: 8080
              volumeMounts:
                - mountPath: "/mnt/storage"
                  name: data
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: <pvc_name>

    1
    storageClassName :对于 Local Zone 配置,您必须指定 gp2-csi
    2
    kind :定义 deployment 资源。
    3
    name :指定 Local Zone 应用程序的名称。例如,local-zone-demo-app-nyc-1
    4
    namespace :定义您要运行用户工作负载的 AWS Local Zone 的命名空间。例如:local-zone-app-nyc-1a
    5
    zone-group :定义区域所属的组。例如,us-east-1-iah-1
    6
    nodeSelector :目标与指定标签匹配的边缘计算节点。
    7
    tolerations :设置与 Local Zone 节点的 MachineSet 清单上定义的污点匹配的值。
  2. 为节点创建 service 资源 YAML 文件。此资源将来自目标边缘计算节点的 pod 公开给在 Local Zone 网络中运行的服务。

    在 Local Zone 子网中运行的边缘计算节点配置的 service 资源示例

    apiVersion: v1
    kind: Service 1
    metadata:
      name:  <local_zone_application>
      namespace: <local_zone_application_namespace>
    spec:
      ports:
        - port: 80
          targetPort: 8080
          protocol: TCP
      type: NodePort
      selector: 2
        app: <local_zone_application>

    1
    kind :定义 service 资源。
    2
    selector: 指定应用到受管 pod 的标签类型。

4.8.4. 后续步骤

  • 可选: 使用 AWS Load Balancer (ALB) Operator 将目标边缘计算节点中的 pod 公开给在本地区域或公共网络中运行的服务。请参阅安装 AWS Load Balancer Operator
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.