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": "*" } ] }
其他资源
- 如需有关 AWS Local Zones、支持的实例类型和服务的更多信息,请参阅 AWS 文档中的 AWS Local Zones 功能。
- 有关 AWS 本地区域、支持的实例类型和服务的更多信息,请参阅 AWS 文档中的 AWS Wavelength 功能。
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 大小。
您可以访问以下资源以了解更多有关相应区类型的信息:
- 请参阅 AWS 文档中的 Local Zones 的工作原理。
- 请参阅 AWS 文档中的 AWS Wavelength 的工作原理。
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. 迁移过程如何工作
下表对迁移过程进行了概述,它分为操作中的用户发起的步骤,以及在响应过程中迁移过程要执行的操作。
用户发起的步骤 | OpenShift Container Platform 活动 |
---|---|
在 Cluster Network Operator 配置中设置以下值:
| Cluster Network Operator(CNO) :确认每个字段都设置为有效的值。
如果提供的值有效,CNO 会生成一个新的临时配置,它将集群网络集的 MTU 设置为 Machine Config Operator(MCO) :执行集群中每个节点的滚动重启。 |
重新配置集群中节点的主网络接口 MTU。您可以使用各种方法完成此操作,包括:
| N/A |
在网络插件的 CNO 配置中设置 | Machine Config Operator(MCO) :使用新的 MTU 配置执行集群中每个节点的滚动重启。 |
4.8.2.1.4. 更改集群网络 MTU
作为集群管理员,您可以增加或减少集群的最大传输单元 (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": 9000 } , "machine": { "to" : 9100} } } } }'
当 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
4.8.2.2. 选择 AWS 本地区域或 Wavelength 区域
如果您计划在 AWS Local Zones 或 Wavelength 区域中创建子网,则必须单独选择每个 zone group。
先决条件
- 已安装 AWS CLI。
- 您已决定要部署 OpenShift Container Platform 集群的 AWS 区域。
- 您已将 permissive IAM 策略附加到选择 zone 组的用户或组帐户。
流程
运行以下命令,列出 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
,如下一步所述。
运行以下命令,选择 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 配置集中。
流程
- 进入名为"CloudFormation template for the VPC Carrier Gateway"的文档的下一部分,然后复制 VPC Carrier Gateway 模板的 CloudFormation 模板的语法。将复制的模板语法保存为本地系统中的 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="${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 组。
流程
- 进入名为"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
- 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
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.com
的name: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
。
流程
创建一个包含计算机器集自定义资源(CR)示例的新 YAML 文件,并将其命名为
<file_name>.yaml
。确保设置
<clusterID>
和<role>
参数值。可选:如果您不确定要为特定字段设置哪个值,您可以从集群中检查现有计算机器集:
要列出集群中的计算机器集,请运行以下命令:
$ 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
要查看特定计算机器集自定义资源 (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 ...
运行以下命令来创建
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
当新的计算机器集可用时,
DESIRED
和CURRENT
的值会匹配。如果 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/edge
和 node-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
的污点。
流程
为要在 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
清单上定义的污点
匹配的值。
为节点创建
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>
4.8.4. 后续步骤
- 可选: 使用 AWS Load Balancer (ALB) Operator 将目标边缘计算节点中的 pod 公开给在本地区域或公共网络中运行的服务。请参阅安装 AWS Load Balancer Operator。