×

扩展现有集群以使用 AWS 本地区域或 Wavelength 区域

作为安装后任务,您可以将 Amazon Web Services (AWS) 上的现有 OpenShift Container Platform 集群扩展到 AWS 本地区域或 Wavelength 区域。

将节点扩展到本地区域或 Wavelength 区域位置包括以下步骤

  • 调整集群网络最大传输单元 (MTU)。

  • 选择加入 AWS 本地区域或 Wavelength 区域的本地区域或 Wavelength 区域组。

  • 在现有 VPC 中为本地区域或 Wavelength 区域位置创建子网。

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

  • 创建机器集清单,然后在每个本地区域或 Wavelength 区域位置创建节点。

  • 仅限本地区域:将权限ec2:ModifyAvailabilityZoneGroup添加到身份和访问管理 (IAM) 用户或角色,以便可以创建所需的网络资源。例如

    AWS 本地区域部署的其他 IAM 策略示例
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Action": [
            "ec2:ModifyAvailabilityZoneGroup"
          ],
          "Effect": "Allow",
          "Resource": "*"
        }
      ]
    }
  • 仅限 Wavelength 区域:将权限ec2:ModifyAvailabilityZoneGroupec2:CreateCarrierGatewayec2:DeleteCarrierGateway添加到身份和访问管理 (IAM) 用户或角色,以便可以创建所需的网络资源。例如

    AWS Wavelength 区域部署的其他 IAM 策略示例
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ec2:DeleteCarrierGateway",
            "ec2:CreateCarrierGateway"
          ],
          "Resource": "*"
        },
        {
          "Action": [
            "ec2:ModifyAvailabilityZoneGroup"
          ],
          "Effect": "Allow",
          "Resource": "*"
        }
      ]
    }
其他资源
  • 有关 AWS 本地区域、支持的实例类型和服务的更多信息,请参阅 AWS 文档中的AWS 本地区域功能

  • 有关 AWS 本地区域、支持的实例类型和服务的更多信息,请参阅 AWS 文档中的AWS Wavelength 功能

关于边缘计算池

边缘计算节点是在 AWS 本地区域或 Wavelength 区域位置运行的受污染的计算节点。

在部署使用本地区域或 Wavelength 区域的集群时,请考虑以下几点

  • 本地区域或 Wavelength 区域中的 Amazon EC2 实例比可用区中的 Amazon EC2 实例更昂贵。

  • 在 AWS 本地区域或 Wavelength 区域中运行的应用程序与最终用户之间的延迟更低。如果例如入口流量在本地区域或 Wavelength 区域和可用区之间混合,则某些工作负载会存在延迟影响。

通常,本地区域或 Wavelength 区域中的 Amazon EC2 实例与区域中的 Amazon EC2 实例之间的最大传输单元 (MTU) 为 1300。集群网络 MTU 必须始终小于 EC2 MTU,以考虑开销。具体的开销由网络插件决定。例如:OVN-Kubernetes 的开销为100 字节

网络插件可以提供其他功能,例如 IPsec,这些功能也会影响 MTU 大小。

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

OpenShift Container Platform 4.12 引入了一个新的计算池edge,该池设计用于远程区域。AWS 本地区域或 Wavelength 区域位置的边缘计算池配置是通用的。由于本地区域或 Wavelength 区域资源上的 EC2 和 EBS 等资源的类型和大小限制,默认实例类型可能与传统计算池不同。

本地区域或 Wavelength 区域位置的默认弹性块存储 (EBS) 为gp2,这与非边缘计算池不同。边缘计算池上每个本地区域或 Wavelength 区域使用的实例类型也可能不同于其他计算池,具体取决于区域上的实例产品。

边缘计算池创建开发人员可以使用的新标签,以将应用程序部署到 AWS 本地区域或 Wavelength 区域节点。新标签为

  • node-role.kubernetes.io/edge=''

  • 仅限本地区域:machine.openshift.io/zone-type=local-zone

  • 仅限波长区域:machine.openshift.io/zone-type=wavelength-zone

  • machine.openshift.io/zone-group=$ZONE_GROUP_NAME

默认情况下,边缘计算池的机器设置定义了NoSchedule污点,以防止其他工作负载在本地区域或波长区域实例上扩散。用户只有在 Pod 规范中定义容忍度时才能运行用户工作负载。

更改集群网络 MTU 以支持本地区域或波长区域

您可能需要更改集群网络的最大传输单元 (MTU) 值,以便您的集群基础设施能够支持本地区域或波长区域子网。

关于集群 MTU

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

您可能需要更改集群网络的 MTU,原因如下:

  • 在集群安装过程中检测到的 MTU 对于您的基础设施不正确。

  • 您的集群基础设施现在需要不同的 MTU,例如添加需要不同 MTU 以获得最佳性能的节点。

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

服务中断注意事项

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

  • 完成迁移到新的 MTU 需要至少两次滚动重启。在此期间,某些节点在重启时不可用。

  • 部署到集群的特定应用程序,其超时时间间隔短于绝对 TCP 超时时间间隔,在 MTU 更改期间可能会出现中断。

MTU 值选择

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

  • 硬件 MTU:此 MTU 值根据您的网络基础设施的具体情况设置。

  • 集群网络 MTU:此 MTU 值始终小于您的硬件 MTU,以考虑集群网络覆盖的开销。具体的开销由您的网络插件确定。对于 OVN-Kubernetes,开销为100字节。

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

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

迁移过程的工作方式

下表总结了迁移过程,通过将流程中用户启动的步骤与迁移响应中执行的操作区分开来。

表 1. 集群 MTU 的实时迁移
用户启动的步骤 OpenShift Container Platform 活动

在集群网络操作员配置中设置以下值:

  • spec.migration.mtu.machine.to

  • spec.migration.mtu.network.from

  • spec.migration.mtu.network.to

集群网络操作员 (CNO):确认每个字段都设置为有效值。

  • mtu.machine.to必须设置为新的硬件 MTU 或当前硬件 MTU(如果硬件的 MTU 没有更改)。此值是临时的,用作迁移过程的一部分。另外,如果您指定与现有硬件 MTU 值不同的硬件 MTU,则必须通过其他方式手动配置 MTU 以使其持久化,例如使用机器配置、DHCP 设置或 Linux 内核命令行。

  • mtu.network.from字段必须等于network.status.clusterNetworkMTU字段,即集群网络的当前 MTU。

  • mtu.network.to字段必须设置为目标集群网络 MTU,并且必须小于硬件 MTU,以便允许网络插件的覆盖开销。对于 OVN-Kubernetes,开销为100字节。

如果提供的值有效,则 CNO 会使用设置为mtu.network.to字段值的集群网络 MTU 写入新的临时配置。

机器配置操作员 (MCO):对集群中的每个节点执行滚动重启。

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

  • 部署具有 MTU 更改的新 NetworkManager 连接配置文件

  • 通过 DHCP 服务器设置更改 MTU

  • 通过引导参数更改 MTU

N/A

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

机器配置操作员 (MCO):使用新的 MTU 配置对集群中的每个节点执行滚动重启。

更改集群网络 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 迁移,请通过输入以下命令指定迁移配置。机器配置操作员将对集群中的节点执行滚动重启,以准备进行 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. 当机器配置操作员更新每个机器配置池中的机器时,它将逐个重启每个节点。您必须等到所有节点都更新完毕。通过输入以下命令检查机器配置池状态:

    $ oc get machineconfigpools

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

    默认情况下,机器配置操作员一次更新每个池中的一台机器,导致迁移所需的时间随着集群大小的增加而增加。

  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

选择加入 AWS 本地区域或 Wavelength 区域

如果您计划在 AWS 本地区域或 Wavelength 区域创建子网,则必须分别选择加入每个区域组。

先决条件
  • 您已安装 AWS CLI。

  • 您已确定要部署 OpenShift Container Platform 集群的 AWS 区域。

  • 您已将允许的 IAM 策略附加到选择加入区域组的用户或角色帐户。

步骤
  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

    包含该区域的组。要选择加入该区域,请保存名称。

    Status

    本地区域或 Wavelength 区域组的状态。如果状态为not-opted-in,则必须按照下一步说明选择加入GroupName

  2. 通过运行以下命令选择加入 AWS 帐户中的区域组

    $ aws ec2 modify-availability-zone-group \
        --group-name "<value_of_GroupName>" \(1)
        --opt-in-status opted-in
    1 <value_of_GroupName>替换为您要在其中创建子网的本地区域或 Wavelength 区域组的名称。

在使用 AWS 本地区域或 Wavelength 区域的现有 VPC 中创建网络需求

如果您希望 Machine API 在远程区域位置创建 Amazon EC2 实例,则必须在本地区域或 Wavelength 区域位置创建子网。您可以使用任何配置工具(例如 Ansible 或 Terraform)在现有的虚拟私有云 (VPC) 中创建子网。

您可以配置 CloudFormation 模板以满足您的需求。以下小节包含使用 CloudFormation 模板创建将现有 VPC 扩展到使用 AWS 本地区域或 Wavelength 区域的网络需求的步骤。

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

  • 2 个 VPC 子网:公共和私有。公共子网与该区域中常规可用区的公共路由表关联。私有子网与提供的路由表 ID 关联。

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

  • 1 个与提供的 VPC ID 关联的 VPC 运营商网关。

  • 1 个用于 Wavelength 区域的 VPC 路由表,其中包含指向 VPC 运营商网关的默认路由条目。

  • 2 个 VPC 子网:公共和私有。公共子网与 AWS Wavelength 区域的公共路由表关联。私有子网与提供的路由表 ID 关联。

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

仅限 Wavelength 区域:创建 VPC 运营商网关

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

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

  • 与现有 VPC 关联的运营商网关。

  • 列出路由条目的运营商路由表。

  • 与运营商路由表关联的子网。

运营商网关存在于仅包含 Wavelength 区域中子网的 VPC 中。

以下列表解释了在 AWS Wavelength 区域上下文中运营商网关的功能

  • 提供 Wavelength 区域与运营商网络之间的连接,包括运营商网络中任何可用的设备。

  • 执行网络地址转换 (NAT) 功能,例如将存储在网络边界组中的公共 IP 地址从 Wavelength 区域转换为运营商 IP 地址。这些转换功能适用于入站和出站流量。

  • 授权来自特定位置的运营商网络的入站流量。

  • 授权出站流量到运营商网络和互联网。

通过运营商网关,从互联网到 Wavelength 区域不存在入站连接配置。

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

  • 一个与模板中的 VPC ID 关联的运营商网关。

  • Wavelength 区域的公共路由表,命名为<ClusterName>-public-carrier

  • 新路由表中指向运营商网关的默认 IPv4 路由条目。

  • AWS 简单存储服务 (S3) 的 VPC 网关端点。

如果您不使用提供的 CloudFormation 模板来创建您的 AWS 基础设施,则必须查看提供的信息并手动创建基础设施。如果您的集群未正确初始化,您可能需要联系 Red Hat 支持并提供您的安装日志。

先决条件
  • 您已配置 AWS 帐户。

  • 您已通过运行aws configure将您的 AWS 密钥和区域添加到本地 AWS 配置文件中。

步骤
  1. 转到名为“VPC 运营商网关的 CloudFormation 模板”的文档的下一部分,然后从**VPC 运营商网关的 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>是从名为“在 AWS 中创建 VPC”的部分中创建的 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

    运营商基础设施中路由表的ID。

仅限Wavelength Zones:VPC Carrier Gateway 的 CloudFormation 模板

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

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

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

在为OpenShift Container Platform集群中的边缘计算节点配置机器集之前,必须在本地区域或Wavelength区域中创建一个子网。对于要向其部署计算节点的每个Wavelength区域,请完成以下步骤。

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

如果您不使用提供的 CloudFormation 模板来创建您的 AWS 基础设施,则必须查看提供的信息并手动创建基础设施。如果您的集群未正确初始化,您可能需要联系 Red Hat 支持并提供您的安装日志。

先决条件
  • 您已配置 AWS 帐户。

  • 您已通过运行aws configure将您的 AWS 密钥和区域添加到本地 AWS 配置文件中。

  • 您已加入本地区域或Wavelength区域组。

步骤
  1. 转到名为“VPC子网的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="${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堆栈的名称,例如本地区域的cluster-wl-<local_zone_shortname>和Wavelength区域的cluster-wl-<wavelength_zone_shortname>。如果删除集群,则需要此堆栈的名称。
    2 <template>是您保存的 CloudFormation 模板 YAML 文件的相对路径和名称。
    3 ${VPC_ID}是VPC ID,它是VPC的CloudFormation模板输出中的VpcID值。
    4 ${CLUSTER_NAME}是要用作新AWS资源名称前缀的**ClusterName**的值。
    5 ${ZONE_NAME}是用于创建子网的本地区域或Wavelength区域名称的值。
    6 ${ROUTE_TABLE_PUB}是从CloudFormation模板中提取的公共路由表ID。对于本地区域,公共路由表是从VPC CloudFormation堆栈中提取的。对于Wavelength区域,必须从VPC的Carrier Gateway 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模板。

VPC子网的CloudFormation模板

您可以使用以下CloudFormation模板在本地区域或Wavelength区域基础设施上的区域中部署私有和公共子网。

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

为AWS本地区域或Wavelength区域节点创建机器集清单

在AWS本地区域或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计算池配置匹配的机器集配置。

先决条件
  • 您已在AWS本地区域或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>,请指定本地区域或Wavelength区域的名称。
    本地区域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区域us-east-1-wl1的示例输出
    [
        {
            "ZoneName": "us-east-1-wl1-bos-wlz-1",
            "ParentZoneName": "us-east-1a",
            "GroupName": "us-east-1-wl1",
            "ZoneType": "wavelength-zone"
        }
    ]

AWS上计算机器集自定义资源的示例YAML

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

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

在此示例中,<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>
      machine.openshift.io/cluster-api-machineset: <infrastructure_id>-edge-<zone>
  template:
    metadata:
      labels:
        machine.openshift.io/cluster-api-cluster: <infrastructure_id>
        machine.openshift.io/cluster-api-machine-role: edge (3)
        machine.openshift.io/cluster-api-machine-type: edge
        machine.openshift.io/cluster-api-machineset: <infrastructure_id>-edge-<zone>
    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: ""
      providerSpec:
        value:
          ami:
            id: ami-046fe691f52a953f9 (4)
          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
          instanceType: m6i.large
          kind: AWSMachineProviderConfig
          placement:
            availabilityZone: <zone> (6)
            region: <region> (7)
          securityGroups:
            - filters:
                - name: tag:Name
                  values:
                    - <infrastructure_id>-node
            - filters:
                - name: tag:Name
                  values:
                    - <infrastructure_id>-lb
          subnet:
              id: <value_of_PublicSubnetIds> (8)
          publicIp: true
          tags:
            - name: kubernetes.io/cluster/<infrastructure_id>
              value: owned
            - name: <custom_tag_name> (5)
              value: <custom_tag_value>
          userDataSecret:
            name: worker-user-data
      taints: (9)
        - key: node-role.kubernetes.io/edge
          effect: NoSchedule
1 指定基于您在预配集群时设置的集群ID的基础架构ID。如果您已安装OpenShift CLI,则可以通过运行以下命令获取基础架构ID
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructure cluster
2 指定基于您在预配集群时设置的集群ID的基础架构ID、edge角色节点标签和区域名称。
3 指定edge角色节点标签。
4 为您的AWS区域中的OpenShift Container Platform节点指定有效的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>
5 可选:为您的集群指定自定义标签数据。例如,您可以通过指定Email:[email protected]name:value对来添加管理员联系电子邮件地址。

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

6 指定区域名称,例如us-east-1-nyc-1a
7 指定区域,例如us-east-1
8 您在AWS本地区域或Wavelength区域中创建的公共子网的ID。完成“在AWS区域中创建子网”的步骤后,您创建了此公共子网ID。
9 指定污点以防止用户工作负载安排在edge节点上。

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

创建计算机器集

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

先决条件
  • 部署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值将匹配。如果计算机器集不可用,请等待几分钟,然后再次运行该命令。

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

    $ 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

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

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

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

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

此过程中的示例适用于本地区域基础设施。如果您使用的是 Wavelength 区域基础设施,请确保将示例调整为该基础设施支持的内容。

先决条件
  • 您可以访问 OpenShift CLI (oc)。

  • 您已在具有已定义本地区域或 Wavelength 区域子网的虚拟私有云 (VPC) 中部署了集群。

  • 您已确保本地区域或 Wavelength 区域子网上的边缘计算节点的计算机器集指定了node-role.kubernetes.io/edge的污点。

步骤
  1. 为要在本地区域子网中运行的示例应用程序创建一个deployment资源 YAML 文件。确保您指定与边缘计算节点的污点匹配的正确容忍度。

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

    在本地区域子网中运行的边缘计算节点的已配置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 的标签类型。

后续步骤

  • 可选:使用 AWS 负载均衡器 (ALB) 运算符将 pod 从目标边缘计算节点公开到从公共网络在本地区域或 Wavelength 区域子网中运行的服务。请参阅 安装 AWS 负载均衡器运算符