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-csi
和gp2-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
)。
流程
运行以下命令,列出集群的基础架构 ID。保留这个值。
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructures.config.openshift.io cluster
运行以下命令,获取安装程序创建的计算机器集的详情:
列出集群中的计算机器集:
$ 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
显示列出的计算机器集的 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}'
显示 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 帐户。
流程
运行以下命令,列出连接到 AWS 帐户的 Outposts:
$ aws outposts list-outposts
保留
aws outposts list-outposts
命令的输出中的以下值:- Outpost ID。
- Outpost 的 Amazon 资源名称 (ARN)。
Outpost 可用区。
注意aws outposts list-outposts
命令的输出包括两个与可用区相关的值:AvailabilityZone
和AvailabilityZoneId
。您可以使用AvailablilityZone
值配置在 Outpost 中创建计算机器的计算机器集。
使用 Outpost ID 的值,运行以下命令来显示 Outpost 中可用的实例类型。保留可用实例类型的值。
$ aws outposts get-outpost-instance-types \ --outpost-id <outpost_id_value>
使用 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
。
流程
要获得集群网络的当前 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 ...
要开始 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} } } } }'
当 Machine Config Operator 更新每个机器配置池中的机器时,它会逐一重启每个节点。您必须等到所有节点都已更新。输入以下命令检查机器配置池状态:
$ oc get machineconfigpools
成功更新的节点具有以下状态:
UPDATED=true
、UPDATING=false
、DEGRADED=false
。注意默认情况下,Machine Config Operator 一次更新每个池中的一个机器,从而导致迁移总时间随着集群大小而增加。
确认主机上新机器配置的状态:
要列出机器配置状态和应用的机器配置名称,请输入以下命令:
$ 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
验证以下语句是否正确:
-
machineconfiguration.openshift.io/state
字段的值为Done
。 -
machineconfiguration.openshift.io/currentConfig
字段的值等于machineconfiguration.openshift.io/desiredConfig
字段的值。
-
要确认机器配置正确,请输入以下命令:
$ oc get machineconfig <config_name> -o yaml | grep ExecStart
这里的
<config_name>
是machineconfiguration.openshift.io/currentConfig
字段中机器配置的名称。机器配置必须包括以下对 systemd 配置的更新:
ExecStart=/usr/local/bin/mtu-migration.sh
要完成 MTU 迁移,请为 OVN-Kubernetes 网络插件输入以下命令:
$ oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": null, "defaultNetwork":{ "ovnKubernetesConfig": { "mtu": <mtu> }}}}'
其中:
<mtu>
-
指定您使用
<overlay_to>
指定的新集群网络 MTU。
最终调整 MTU 迁移后,每个机器配置池节点都会逐个重启一个。您必须等到所有节点都已更新。输入以下命令检查机器配置池状态:
$ oc get machineconfigpools
成功更新的节点具有以下状态:
UPDATED=true
、UPDATING=false
、DEGRADED=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 帐户获取环境所需的信息。
流程
- 进入名为"CloudFormation template for the VPC 子网"的文档部分,并从模板中复制语法。将复制的模板语法保存为本地系统中的 YAML 文件。此模板描述了集群所需的 VPC。
运行以下命令来部署 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]]
3.13.4. 创建在 Outpost 上部署边缘计算机器的计算机器集
要在 AWS Outposts 上创建边缘计算机器,您必须使用兼容配置创建新的计算机器集。
先决条件
- 您有一个 AWS Outposts 站点。
- 您已将 OpenShift Container Platform 集群安装到 AWS 上的自定义 VPC 中。
-
您可以使用具有
cluster-admin
权限的账户访问集群。 -
已安装 OpenShift CLI(
oc
)。
流程
运行以下命令列出集群中的计算机器集:
$ 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
- 记录现有计算机器集的名称。
使用以下方法之一创建一个包含新计算机器设置自定义资源 (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 # ...
通过编辑
<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
资源中指定对应的容限。
- 保存您的更改。
运行以下命令来创建计算机器设置 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 环境兼容的边缘计算机器的计算机器集。
流程
为您要部署到边缘子网中边缘计算节点的应用程序配置
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>
运行以下命令来创建
Deployment
资源:$ oc create -f <application_deployment>.yaml
配置
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>
运行以下命令来创建
Service
CR:$ oc create -f <application_service>.yaml
3.13.6. 在边缘和基于云的 AWS 计算资源上调度工作负载
当您将 AWS VPC 集群扩展到 Outpost 时,Outpost 使用边缘计算节点,并且 VPC 使用基于云的计算节点。以下负载均衡器注意事项适用于扩展到 Outpost 中的 AWS VPC 集群:
- Outposts 无法运行 AWS Network Load Balancers 或 AWS Classic Load Balancers,但扩展到 Outpost 的 VPC 集群的 Classic Load Balancer 可以附加到 Outpost 边缘计算节点。如需更多信息,请参阅在 AWS VPC 集群中使用 AWS Classic Load Balancers 扩展到 Outpost。
- 要在 Outpost 实例上运行负载均衡器,您必须使用 AWS Application Load Balancer。您可以使用 AWS Load Balancer Operator 部署 AWS Load Balancer Controller 的实例。控制器为 Kubernetes Ingress 资源置备 AWS Application Load Balancers。如需更多信息,请参阅在 AWS VPC 集群中使用 AWS Load Balancer Operator 扩展到 Outpost。
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 中创建用户工作负载,其容限与边缘计算机器的污点匹配。
流程
可选:运行以下命令来验证边缘计算节点是否具有
location=outposts
标签,并验证输出是否只包含 Outpost 中的边缘计算节点:$ oc get nodes -l location=outposts
运行以下命令,使用键值对标记 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
可选:运行以下命令来验证基于云的计算节点是否具有指定的标签,并确认输出是否包含 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
通过在
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
运行以下命令来创建
Service
CR:$ oc create -f <file_name>.yaml
验证
运行以下命令,验证
service
资源的状态,以显示置备的 AWS Load Balancer(ALB)的主机:$ HOST=$(oc get service <application_name> -n <application_namespace> --template='{{(index .status.loadBalancer.ingress 0).hostname}}')
运行以下命令,验证置备的 Classic Load Balancer 主机的状态:
$ curl $HOST
- 在 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,您必须在不同的可用区中指定至少两个子网。