3.13. 将 AWS VPC 集群扩展到 AWS Outpost


在 OpenShift Container Platform 版本 4.14 中,您可以使用 AWS Outposts 中运行的计算节点在 Amazon Web Services (AWS)上安装集群。自 OpenShift Container Platform 版本 4.15 起,不再支持这个安装方法。相反,您可以在 AWS 上将集群安装到现有的 VPC 中,并在 AWS Outposts 上置备计算节点作为安装后配置任务。

在 Amazon Web Services (AWS)上安装集群到现有的 Amazon Virtual Private Cloud (VPC) 后,您可以创建一个在 AWS Outposts 中部署计算机器的计算机器集。AWS Outposts 是一个 AWS 边缘计算服务,允许使用基于云的 AWS 部署的许多功能,并减少内部环境的延迟。如需更多信息,请参阅 AWS Outposts 文档

3.13.1. OpenShift Container Platform 要求和限制的 AWS Outposts

如果配置 OpenShift Container Platform 集群以适应以下要求和限制,您可以管理 AWS Outpost 上的资源,与基于云的 AWS 集群上的资源类似:

  • 要将 AWS 上的 OpenShift Container Platform 集群扩展到 Outpost 中,您必须将集群安装到现有的 Amazon Virtual Private Cloud (VPC) 中。
  • Outpost 的基础架构与 AWS 区域中的可用区关联,并使用专用子网。部署到 Outpost 中的边缘计算机器必须使用 Outpost 子网以及 Outpost 与之关联的可用区。
  • 当 AWS Kubernetes 云控制器管理器发现 Outpost 子网时,它会尝试在 Outpost 子网中创建服务负载均衡器。AWS Outposts 不支持运行服务负载均衡器。要防止云控制器管理器在 Outpost 子网中创建不支持的服务,您必须在 Outpost 子网配置中包含 kubernetes.io/cluster/unmanaged 标签。这个要求是 OpenShift Container Platform 版本 4.16 的一个临时解决方案。如需更多信息,请参阅 OCPBUGS-30041
  • AWS 上的 OpenShift Container Platform 集群包括 gp3-csigp2-csi 存储类。这些类与 Amazon Elastic Block Store (EBS) gp3 和 gp2 卷对应。OpenShift Container Platform 集群默认使用 gp3-csi 存储类,但 AWS Outposts 不支持 EBS gp3 卷。
  • 此实现使用 node-role.kubernetes.io/outposts 污点,以防止将常规集群工作负载分散到 Outpost 节点。要在 Outpost 中调度用户工作负载,您必须在应用程序的 Deployment 资源中指定对应的容限。为用户工作负载保留 AWS Outpost 基础架构可以避免额外的配置要求,如将默认 CSI 更新至 gp2-csi,使其兼容。
  • 要在 Outpost 中创建卷,CSI 驱动程序需要 Outpost Amazon Resource Name (ARN)。驱动程序使用 CSINode 对象中存储的拓扑密钥来确定 Outpost ARN。为确保驱动程序使用正确的拓扑值,您必须将卷绑定模式设置为 WaitForConsumer,并避免在您创建的任何新存储类上设置允许的拓扑。
  • 当您将 AWS VPC 集群扩展到 Outpost 时,您有两个计算资源。Outpost 具有边缘计算节点,而 VPC 具有基于云的计算节点。基于云的 AWS Elastic Block 卷无法附加到 Outpost 边缘计算节点,而 Outpost 卷无法附加到基于云的计算节点。

    因此,您无法使用 CSI 快照将使用持久性存储的应用程序从基于云的计算节点迁移到边缘计算节点,或直接使用原始持久性卷。要为应用程序迁移持久性存储数据,您必须执行手动备份和恢复操作。

  • AWS Outposts 不支持 AWS Network Load Balancers 或 AWS Classic Load Balancers。您必须使用 AWS Application Load Balancers 在 AWS Outposts 环境中为边缘计算资源启用负载均衡。

    要置备 Application Load Balancer,您必须使用 Ingress 资源并安装 AWS Load Balancer Operator。如果您的集群包含共享工作负载的边缘和基于云的计算实例,则需要额外的配置。

    如需更多信息,请参阅"在 AWS VPC 集群中使用 AWS Load Balancer Operator 进入 Outpost"。

3.13.2. 获取有关您的环境的信息

要将 AWS VPC 集群扩展到 Outpost,您必须提供有关 OpenShift Container Platform 集群和 Outpost 环境的信息。您可以使用此信息完成网络配置任务,并配置在 Outpost 中创建计算机器的计算机器集。您可以使用命令行工具收集所需的详情。

3.13.2.1. 从 OpenShift Container Platform 集群获取信息

您可以使用 OpenShift CLI (oc)从 OpenShift Container Platform 集群获取信息。

提示

您可以使用 export 命令,将部分或所有值存储为环境变量。

先决条件

  • 您已将 OpenShift Container Platform 集群安装到 AWS 上的自定义 VPC 中。
  • 您可以使用具有 cluster-admin 权限的账户访问集群。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令,列出集群的基础架构 ID。保留这个值。

    $ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructures.config.openshift.io cluster
  2. 运行以下命令,获取安装程序创建的计算机器集的详情:

    1. 列出集群中的计算机器集:

      $ oc get machinesets.machine.openshift.io -n openshift-machine-api

      输出示例

      NAME                           DESIRED   CURRENT   READY   AVAILABLE   AGE
      <compute_machine_set_name_1>   1         1         1       1           55m
      <compute_machine_set_name_2>   1         1         1       1           55m

    2. 显示列出的计算机器集的 Amazon Machine Image (AMI) ID。保留这个值。

      $ oc get machinesets.machine.openshift.io <compute_machine_set_name_1> \
        -n openshift-machine-api \
        -o jsonpath='{.spec.template.spec.providerSpec.value.ami.id}'
    3. 显示 AWS VPC 集群的子网 ID。保留这个值。

      $ oc get machinesets.machine.openshift.io <compute_machine_set_name_1> \
        -n openshift-machine-api \
        -o jsonpath='{.spec.template.spec.providerSpec.value.subnet.id}'

3.13.2.2. 从 AWS 帐户获取信息

您可以使用 AWS CLI (aws) 从 AWS 帐户获取信息。

提示

您可以使用 export 命令,将部分或所有值存储为环境变量。

先决条件

  • 您有一个带有所需硬件设置的 AWS Outposts 站点。
  • 您的 Outpost 连接到您的 AWS 帐户。
  • 您可以使用 AWS CLI (aws) 作为具有执行所需任务权限的用户访问 AWS 帐户。

流程

  1. 运行以下命令,列出连接到 AWS 帐户的 Outposts:

    $ aws outposts list-outposts
  2. 保留 aws outposts list-outposts 命令的输出中的以下值:

    • Outpost ID。
    • Outpost 的 Amazon 资源名称 (ARN)。
    • Outpost 可用区。

      注意

      aws outposts list-outposts 命令的输出包括两个与可用区相关的值: AvailabilityZoneAvailabilityZoneId。您可以使用 AvailablilityZone 值配置在 Outpost 中创建计算机器的计算机器集。

  3. 使用 Outpost ID 的值,运行以下命令来显示 Outpost 中可用的实例类型。保留可用实例类型的值。

    $ aws outposts get-outpost-instance-types \
      --outpost-id <outpost_id_value>
  4. 使用 Outpost ARN 的值,运行以下命令来显示 Outpost 的子网 ID。保留这个值。

    $ aws ec2 describe-subnets \
      --filters Name=outpost-arn,Values=<outpost_arn_value>

3.13.3. 为您的 Outpost 配置网络

要将 VPC 集群扩展到 Outpost 中,您必须完成以下网络配置任务:

  • 更改集群网络 MTU。
  • 在 Outpost 中创建子网。

3.13.3.1. 更改集群网络 MTU 以支持 AWS Outposts

在安装过程中,集群网络的最大传输单元 (MTU) 会根据集群中节点的主网络接口的 MTU 自动检测到。您可能需要减少集群网络的 MTU 值来支持 AWS Outposts 子网。

重要

当 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": 1000 } , "machine": { "to" : 1100} } } } }'

  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

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

在 OpenShift Container Platform 集群中为边缘计算节点配置机器集前,您必须在 AWS Outposts 中创建子网。

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

注意

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

先决条件

  • 已配置了一个 AWS 帐户。
  • 您可以通过运行 aws configure,将 AWS 密钥和区域添加到本地 AWS 配置集中。
  • 您已从 OpenShift Container Platform 集群、Outpost 和 AWS 帐户获取环境所需的信息。

流程

  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
        ParameterKey=PrivateSubnetLabel,ParameterValue="private-outpost" \
        ParameterKey=PublicSubnetLabel,ParameterValue="public-outpost" \
        ParameterKey=OutpostArn,ParameterValue="${OUTPOST_ARN}" 10
    1
    <stack_name> 是 CloudFormation 堆栈的名称,如 cluster-<outpost_name>
    2
    <template> 是相对路径,以及保存的 CloudFormation 模板 YAML 文件的名称。
    3
    ${VPC_ID} 是 VPC ID,它是 VPC 模板输出中的 VpcID 值。
    4
    ${CLUSTER_NAME}ClusterName 的值,用作新 AWS 资源名称的前缀。
    5
    ${ZONE_NAME} 是创建子网的 AWS Outposts 名称的值。
    6
    ${ROUTE_TABLE_PUB}${VPC_ID} 中创建的公共路由表 ID,用于关联 Outposts 上的公共子网。指定用于关联此堆栈创建的 Outpost 子网的公共路由表。
    7
    ${SUBNET_CIDR_PUB} 是一个有效的 CIDR 块,用于创建公共子网。这个块必须是 VPC CIDR 块 VpcCidr 的一部分。
    8
    ${ROUTE_TABLE_PVT}${VPC_ID} 中创建的私有路由表 ID,用于关联 Outposts 上的专用子网。指定用于关联此堆栈创建的 Outpost 子网的专用路由表。
    9
    ${SUBNET_CIDR_PVT} 是一个有效的 CIDR 块,用于创建专用子网。这个块必须是 VPC CIDR 块 VpcCidr 的一部分。
    10
    ${OUTPOST_ARN} 是 Outpost 的 Amazon 资源名称 (ARN)。

    输出示例

    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 模板。

3.13.3.3. VPC 子网的 CloudFormation 模板

您可以使用以下 CloudFormation 模板来部署 Outpost 子网。

例 3.38. 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
  PrivateSubnetLabel:
    Default: "private"
    Description: Subnet label to be added when building the subnet name.
    Type: String
  PublicSubnetLabel:
    Default: "public"
    Description: Subnet label to be added when building the subnet name.
    Type: String
  OutpostArn:
    Default: ""
    Description: OutpostArn when creating subnets on AWS Outpost.
    Type: String

Conditions:
  OutpostEnabled: !Not [!Equals [!Ref "OutpostArn", ""]]

Resources:
  PublicSubnet:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref VpcId
      CidrBlock: !Ref PublicSubnetCidr
      AvailabilityZone: !Ref ZoneName
      OutpostArn: !If [ OutpostEnabled, !Ref OutpostArn, !Ref "AWS::NoValue"]
      Tags:
      - Key: Name
        Value: !Join ['-', [ !Ref ClusterName, !Ref PublicSubnetLabel, !Ref ZoneName]]
      - Key: kubernetes.io/cluster/unmanaged 1
        Value: true

  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
      OutpostArn: !If [ OutpostEnabled, !Ref OutpostArn, !Ref "AWS::NoValue"]
      Tags:
      - Key: Name
        Value: !Join ['-', [!Ref ClusterName, !Ref PrivateSubnetLabel, !Ref ZoneName]]
      - Key: kubernetes.io/cluster/unmanaged 2
        Value: true

  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]]
1
您必须在 AWS Outposts 的公共子网配置中包含 kubernetes.io/cluster/unmanaged 标签。
2
您必须在 AWS Outposts 的专用子网配置中包含 kubernetes.io/cluster/unmanaged 标签。

3.13.4. 创建在 Outpost 上部署边缘计算机器的计算机器集

要在 AWS Outposts 上创建边缘计算机器,您必须使用兼容配置创建新的计算机器集。

先决条件

  • 您有一个 AWS Outposts 站点。
  • 您已将 OpenShift Container Platform 集群安装到 AWS 上的自定义 VPC 中。
  • 您可以使用具有 cluster-admin 权限的账户访问集群。
  • 已安装 OpenShift CLI(oc)。

流程

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

    $ oc get machinesets.machine.openshift.io -n openshift-machine-api

    输出示例

    NAME                            DESIRED   CURRENT   READY   AVAILABLE   AGE
    <original_machine_set_name_1>   1         1         1       1           55m
    <original_machine_set_name_2>   1         1         1       1           55m

  2. 记录现有计算机器集的名称。
  3. 使用以下方法之一创建一个包含新计算机器设置自定义资源 (CR) 的 YAML 文件:

    • 运行以下命令,将现有计算机器集配置复制到新文件中:

      $ oc get machinesets.machine.openshift.io <original_machine_set_name_1> \
        -n openshift-machine-api -o yaml > <new_machine_set_name_1>.yaml

      您可以使用首选文本编辑器编辑此 YAML 文件。

    • 使用您的首选文本编辑器创建名为 <new_machine_set_name_1>.yaml 的空白 YAML 文件,并包含新计算机器集所需的值。

      如果您不确定为特定字段设置哪个值,您可以通过运行以下命令来查看现有计算机器集 CR 的值:

      $ oc get machinesets.machine.openshift.io <original_machine_set_name_1> \
        -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>-<availability_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>-<role>-<availability_zone>
        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>-<availability_zone>
          spec:
            providerSpec: 3
      # ...

      1
      集群基础架构 ID。
      2
      默认节点标签。对于 AWS Outposts,您可以使用 outposts 角色。
      3
      省略的 providerSpec 部分包括必须为 Outpost 配置的值。
  4. 通过编辑 <new_machine_set_name_1>.yaml 文件,将新计算机器集配置为在 Outpost 中创建边缘计算机器:

    AWS Outposts 的计算机器集示例

    apiVersion: machine.openshift.io/v1beta1
    kind: MachineSet
    metadata:
      labels:
        machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1
      name: <infrastructure_id>-outposts-<availability_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>-outposts-<availability_zone>
      template:
        metadata:
          labels:
            machine.openshift.io/cluster-api-cluster: <infrastructure_id>
            machine.openshift.io/cluster-api-machine-role: outposts
            machine.openshift.io/cluster-api-machine-type: outposts
            machine.openshift.io/cluster-api-machineset: <infrastructure_id>-outposts-<availability_zone>
        spec:
          metadata:
            labels:
              node-role.kubernetes.io/outposts: ""
              location: outposts
          providerSpec:
            value:
              ami:
                id: <ami_id> 3
              apiVersion: machine.openshift.io/v1beta1
              blockDevices:
                - ebs:
                    volumeSize: 120
                    volumeType: gp2 4
              credentialsSecret:
                name: aws-cloud-credentials
              deviceIndex: 0
              iamInstanceProfile:
                id: <infrastructure_id>-worker-profile
              instanceType: m5.xlarge 5
              kind: AWSMachineProviderConfig
              placement:
                availabilityZone: <availability_zone>
                region: <region> 6
              securityGroups:
                - filters:
                  - name: tag:Name
                    values:
                      - <infrastructure_id>-worker-sg
              subnet:
                id: <subnet_id> 7
              tags:
                - name: kubernetes.io/cluster/<infrastructure_id>
                  value: owned
              userDataSecret:
                name: worker-user-data
          taints: 8
            - key: node-role.kubernetes.io/outposts
              effect: NoSchedule

    1
    指定集群基础架构 ID。
    2
    指定计算机器设置的名称。名称由集群基础架构 ID、outposts 角色名称和 Outpost 可用区组成。
    3
    指定 Amazon Machine Image (AMI) ID。
    4
    指定 EBS 卷类型。AWS Outposts 需要 gp2 卷。
    5
    指定 AWS 实例类型。您必须使用 Outpost 中配置的实例类型。
    6
    指定 Outpost 可用区存在的 AWS 区域。
    7
    指定 Outpost 的专用子网。
    8
    指定污点,以防止将工作负载调度到具有 node-role.kubernetes.io/outposts 标签的节点上。要在 Outpost 中调度用户工作负载,您必须在应用程序的 Deployment 资源中指定对应的容限。
  5. 保存您的更改。
  6. 运行以下命令来创建计算机器设置 CR:

    $ oc create -f <new_machine_set_name_1>.yaml

验证

  • 要验证是否已创建计算机器设置,请运行以下命令列出集群中的计算机器集:

    $ oc get machinesets.machine.openshift.io -n openshift-machine-api

    输出示例

    NAME                            DESIRED   CURRENT   READY   AVAILABLE   AGE
    <new_machine_set_name_1>        1         1         1       1           4m12s
    <original_machine_set_name_1>   1         1         1       1           55m
    <original_machine_set_name_2>   1         1         1       1           55m

  • 要列出由新计算机器集管理的机器,请运行以下命令:

    $ oc get -n openshift-machine-api machines.machine.openshift.io \
      -l machine.openshift.io/cluster-api-machineset=<new_machine_set_name_1>

    输出示例

    NAME                             PHASE          TYPE        REGION      ZONE         AGE
    <machine_from_new_1>             Provisioned    m5.xlarge   us-east-1   us-east-1a   25s
    <machine_from_new_2>             Provisioning   m5.xlarge   us-east-1   us-east-1a   25s

  • 要验证由新计算机器集创建的机器是否具有正确的配置,请运行以下命令检查 CR 中的相关字段是否有新机器:

    $ oc describe machine <machine_from_new_1> -n openshift-machine-api

3.13.5. 在 Outpost 中创建用户工作负载

将 AWS VPC 集群中的 OpenShift Container Platform 扩展为 Outpost 后,您可以使用带有标签 node-role.kubernetes.io/outposts 的边缘计算节点在 Outpost 中创建用户工作负载。

先决条件

  • 您已将 AWS VPC 集群扩展到 Outpost。
  • 您可以使用具有 cluster-admin 权限的账户访问集群。
  • 已安装 OpenShift CLI(oc)。
  • 您已创建了部署与 Outpost 环境兼容的边缘计算机器的计算机器集。

流程

  1. 为您要部署到边缘子网中边缘计算节点的应用程序配置 Deployment 资源文件。

    Deployment 清单示例

    kind: Namespace
    apiVersion: v1
    metadata:
      name: <application_name> 1
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: <application_name>
      namespace: <application_namespace> 2
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: gp2-csi 3
      volumeMode: Filesystem
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: <application_name>
      namespace: <application_namespace>
    spec:
      selector:
        matchLabels:
          app: <application_name>
      replicas: 1
      template:
        metadata:
          labels:
            app: <application_name>
            location: outposts 4
        spec:
          securityContext:
            seccompProfile:
              type: RuntimeDefault
          nodeSelector: 5
            node-role.kubernetes.io/outpost: ''
          tolerations: 6
          - key: "node-role.kubernetes.io/outposts"
            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: <application_name>
              ports:
                - containerPort: 8080
              volumeMounts:
                - mountPath: "/mnt/storage"
                  name: data
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: <application_name>

    1
    为应用程序指定一个名称。
    2
    为应用程序指定一个命名空间。应用程序命名空间可以与应用程序名称相同。
    3
    指定存储类名称。对于边缘计算配置,必须使用 gp2-csi 存储类。
    4
    指定标签来标识 Outpost 中部署的工作负载。
    5
    指定以边缘计算节点为目标的节点选择器标签。
    6
    指定与边缘计算机器计算机器集中的 keyeffects 污点匹配的容限。设置 valueoperator,如下所示。
  2. 运行以下命令来创建 Deployment 资源:

    $ oc create -f <application_deployment>.yaml
  3. 配置 Service 对象,将 pod 从目标边缘计算节点公开到在边缘网络中运行的服务。

    Service 清单示例

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

    1
    定义 service 资源。
    2
    指定要应用到受管 pod 的标签类型。
  4. 运行以下命令来创建 Service CR:

    $ oc create -f <application_service>.yaml

3.13.6. 在边缘和基于云的 AWS 计算资源上调度工作负载

当您将 AWS VPC 集群扩展到 Outpost 时,Outpost 使用边缘计算节点,并且 VPC 使用基于云的计算节点。以下负载均衡器注意事项适用于扩展到 Outpost 中的 AWS VPC 集群:

3.13.6.1. 在 AWS VPC 集群中使用 AWS Classic Load Balancers 扩展至 Outpost

AWS Outposts 基础架构无法运行 AWS Classic Load Balancers,但 AWS VPC 集群中的 Classic Load Balancers 可以在 Outpost 中目标边缘计算节点(如果边缘和基于云的子网位于同一可用区中)。因此,VPC 集群上的 Classic Load Balancers 可能会在其中一个节点类型上调度 pod。

在边缘计算节点和基于云的计算节点上调度工作负载可能会带来延迟。如果要防止 VPC 集群中的 Classic Load Balancer 针对 Outpost 边缘计算节点,您可以将标签应用到基于云的计算节点,并将 Classic Load Balancer 配置为仅在带有应用的标签的节点上调度。

注意

如果您不需要防止 VPC 集群中的 Classic Load Balancer 以 Outpost 边缘计算节点为目标,则不需要完成这些步骤。

先决条件

  • 您已将 AWS VPC 集群扩展到 Outpost。
  • 您可以使用具有 cluster-admin 权限的账户访问集群。
  • 已安装 OpenShift CLI(oc)。
  • 您已在 Outpost 中创建用户工作负载,其容限与边缘计算机器的污点匹配。

流程

  1. 可选:运行以下命令来验证边缘计算节点是否具有 location=outposts 标签,并验证输出是否只包含 Outpost 中的边缘计算节点:

    $ oc get nodes -l location=outposts
  2. 运行以下命令,使用键值对标记 VPC 集群中的基于云的计算节点:

    $ for NODE in $(oc get node -l node-role.kubernetes.io/worker --no-headers | grep -v outposts | awk '{print$1}'); do oc label node $NODE <key_name>=<value>; done

    其中 <key_name>=<value> 是您要用来区分基于云的计算节点的标签。

    输出示例

    node1.example.com labeled
    node2.example.com labeled
    node3.example.com labeled

  3. 可选:运行以下命令来验证基于云的计算节点是否具有指定的标签,并确认输出是否包含 VPC 集群中的所有基于云的计算节点:

    $ oc get nodes -l <key_name>=<value>

    输出示例

    NAME                   STATUS    ROLES     AGE       VERSION
    node1.example.com      Ready     worker    7h        v1.29.4
    node2.example.com      Ready     worker    7h        v1.29.4
    node3.example.com      Ready     worker    7h        v1.29.4

  4. 通过在 Service 清单的 annotations 字段中添加基于云的子网信息来配置 Classic Load Balancer 服务:

    服务配置示例

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: <application_name>
      name: <application_name>
      namespace: <application_namespace>
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-subnets: <aws_subnet> 1
        service.beta.kubernetes.io/aws-load-balancer-target-node-labels: <key_name>=<value> 2
    spec:
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: <application_name>
      type: LoadBalancer

    1
    指定 AWS VPC 集群的子网 ID。
    2
    在节点标签中指定与密钥对匹配的键值对。
  5. 运行以下命令来创建 Service CR:

    $ oc create -f <file_name>.yaml

验证

  1. 运行以下命令,验证 service 资源的状态,以显示置备的 AWS Load Balancer(ALB)的主机:

    $ HOST=$(oc get service <application_name> -n <application_namespace> --template='{{(index .status.loadBalancer.ingress 0).hostname}}')
  2. 运行以下命令,验证置备的 Classic Load Balancer 主机的状态:

    $ curl $HOST
  3. 在 AWS 控制台中,验证是否只有标记的实例显示为负载均衡器的目标实例。

3.13.6.2. 在 AWS VPC 集群中使用 AWS Load Balancer Operator 扩展至 Outpost

您可以配置 AWS Load Balancer Operator,以便在 AWS VPC 集群中置备 AWS Application Load Balancer。AWS Outposts 不支持 AWS Network Load Balancers。因此,AWS Load Balancer Operator 无法在 Outpost 中置备 Network Load Balancers。

您可以在云子网或 Outpost 子网中创建 AWS Application Load Balancer。云中的 Application Load Balancer 可以附加到基于云的计算节点,而 Outpost 中的 Application Load Balancer 可以附加到边缘计算节点。您必须使用 Outpost 子网或 VPC 子网来注解 Ingress 资源,但不能同时注解两者。

先决条件

  • 您已将 AWS VPC 集群扩展到 Outpost。
  • 已安装 OpenShift CLI(oc)。
  • 已安装 AWS Load Balancer Operator 并创建了 AWS Load Balancer Controller。

流程

  • Ingress 资源配置为使用指定的子网:

    Ingress 资源配置示例

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: <application_name>
      annotations:
        alb.ingress.kubernetes.io/subnets: <subnet_id> 1
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /
                pathType: Exact
                backend:
                  service:
                    name: <application_name>
                    port:
                      number: 80

    1
    指定要使用的子网。
    • 要在 Outpost 中使用 Application Load Balancer,请指定 Outpost 子网 ID。
    • 要在云中使用 Application Load Balancer,您必须在不同的可用区中指定至少两个子网。

3.13.7. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.