{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:ModifyAvailabilityZoneGroup"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
在 Amazon Web Services (AWS) 上安装 OpenShift Container Platform 后,您可以进一步配置 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) 用户或角色,以便可以创建所需的网络资源。例如
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:ModifyAvailabilityZoneGroup"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
仅限 Wavelength 区域:将权限ec2:ModifyAvailabilityZoneGroup
、ec2:CreateCarrierGateway
和ec2:DeleteCarrierGateway
添加到身份和访问管理 (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 的开销为 网络插件可以提供其他功能,例如 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 以获得最佳性能的节点。
只有 OVN-Kubernetes 集群网络插件支持更改 MTU 值。
当您在集群上启动 MTU 更改时,以下影响可能会影响服务可用性:
完成迁移到新的 MTU 需要至少两次滚动重启。在此期间,某些节点在重启时不可用。
部署到集群的特定应用程序,其超时时间间隔短于绝对 TCP 超时时间间隔,在 MTU 更改期间可能会出现中断。
在规划 MTU 迁移时,需要考虑两个相关但不同的 MTU 值。
硬件 MTU:此 MTU 值根据您的网络基础设施的具体情况设置。
集群网络 MTU:此 MTU 值始终小于您的硬件 MTU,以考虑集群网络覆盖的开销。具体的开销由您的网络插件确定。对于 OVN-Kubernetes,开销为100
字节。
如果您的集群需要为不同的节点使用不同的 MTU 值,则必须从集群中任何节点使用的最低 MTU 值中减去网络插件的开销值。例如,如果集群中某些节点的 MTU 为9001
,而某些节点的 MTU 为1500
,则必须将此值设置为1400
。
为避免选择节点无法接受的 MTU 值,请使用 |
下表总结了迁移过程,通过将流程中用户启动的步骤与迁移响应中执行的操作区分开来。
用户启动的步骤 | OpenShift Container Platform 活动 |
---|---|
在集群网络操作员配置中设置以下值:
|
集群网络操作员 (CNO):确认每个字段都设置为有效值。
如果提供的值有效,则 CNO 会使用设置为 机器配置操作员 (MCO):对集群中的每个节点执行滚动重启。 |
重新配置集群上节点主网络接口的 MTU。您可以使用多种方法来完成此操作,包括:
|
N/A |
在 CNO 配置中为网络插件设置 |
机器配置操作员 (MCO):使用新的 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 迁移,请通过输入以下命令指定迁移配置。机器配置操作员将对集群中的节点执行滚动重启,以准备进行 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。
$ oc patch Network.operator.openshift.io cluster --type=merge --patch \
'{"spec": { "migration": { "mtu": { "network": { "from": 1400, "to": 9000 } , "machine": { "to" : 9100} } } } }'
当机器配置操作员更新每个机器配置池中的机器时,它将逐个重启每个节点。您必须等到所有节点都更新完毕。通过输入以下命令检查机器配置池状态:
$ oc get machineconfigpools
成功更新的节点具有以下状态:UPDATED=true
、UPDATING=false
、DEGRADED=false
。
默认情况下,机器配置操作员一次更新每个池中的一台机器,导致迁移所需的时间随着集群大小的增加而增加。 |
确认主机上新机器配置的状态
要列出机器配置状态和应用的机器配置的名称,请输入以下命令:
$ 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
如果您计划在 AWS 本地区域或 Wavelength 区域创建子网,则必须分别选择加入每个区域组。
您已安装 AWS CLI。
您已确定要部署 OpenShift Container Platform 集群的 AWS 区域。
您已将允许的 IAM 策略附加到选择加入区域组的用户或角色帐户。
通过运行以下命令列出 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 --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
。
通过运行以下命令选择加入 AWS 帐户中的区域组
$ aws ec2 modify-availability-zone-group \
--group-name "<value_of_GroupName>" \(1)
--opt-in-status opted-in
1 | 将<value_of_GroupName> 替换为您要在其中创建子网的本地区域或 Wavelength 区域组的名称。 |
如果您希望 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 区域的 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 配置文件中。
转到名为“VPC 运营商网关的 CloudFormation 模板”的文档的下一部分,然后从**VPC 运营商网关的 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> 是从名为“在 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。 |
您可以使用以下CloudFormation模板在AWS Wavelength基础设施上部署Carrier Gateway。
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
在为OpenShift Container Platform集群中的边缘计算节点配置机器集之前,必须在本地区域或Wavelength区域中创建一个子网。对于要向其部署计算节点的每个Wavelength区域,请完成以下步骤。
您可以使用提供的CloudFormation模板并创建一个CloudFormation堆栈。然后,您可以使用此堆栈自定义配置子网。
如果您不使用提供的 CloudFormation 模板来创建您的 AWS 基础设施,则必须查看提供的信息并手动创建基础设施。如果您的集群未正确初始化,您可能需要联系 Red Hat 支持并提供您的安装日志。 |
您已配置 AWS 帐户。
您已通过运行aws configure
将您的 AWS 密钥和区域添加到本地 AWS 配置文件中。
您已加入本地区域或Wavelength区域组。
转到名为“VPC子网的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="${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模板。
您可以使用以下CloudFormation模板在本地区域或Wavelength区域基础设施上的区域中部署私有和公共子网。
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区域中创建子网后,您可以创建机器集清单。
安装程序在集群安装时为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"
}
]
us-east-1-wl1
的示例输出[
{
"ZoneName": "us-east-1-wl1-bos-wlz-1",
"ParentZoneName": "us-east-1a",
"GroupName": "us-east-1-wl1",
"ZoneType": "wavelength-zone"
}
]
此示例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
|
||
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。
|
||
5 | 可选:为您的集群指定自定义标签数据。例如,您可以通过指定Email:[email protected] 的name:value 对来添加管理员联系电子邮件地址。
|
||
6 | 指定区域名称,例如us-east-1-nyc-1a 。 |
||
7 | 指定区域,例如us-east-1 。 |
||
8 | 您在AWS本地区域或Wavelength区域中创建的公共子网的ID。完成“在AWS区域中创建子网”的步骤后,您创建了此公共子网ID。 | ||
9 | 指定污点以防止用户工作负载安排在edge 节点上。
|
除了安装程序创建的计算机器集之外,您还可以创建自己的计算机器集,以动态管理您选择的特定工作负载的机器计算资源。
部署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)
...
1 | 集群基础设施 ID。 | ||
2 | 默认节点标签。
|
||
3 | 计算机器集 CR 的<providerSpec> 部分中的值是特定于平台的。有关 CR 中<providerSpec> 参数的更多信息,请参阅您提供程序的示例计算机器集 CR 配置。 |
通过运行以下命令创建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
值将匹配。如果计算机器集不可用,请等待几分钟,然后再次运行该命令。
可选:要检查由边缘机器创建的节点,请运行以下命令
$ 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
创建 Amazon Web Service (AWS) 本地区域或 Wavelength 区域基础设施并部署集群后,您可以使用边缘计算节点在本地区域或 Wavelength 区域子网中创建用户工作负载。
当您使用安装程序创建集群时,安装程序会自动为每个边缘计算节点指定NoSchedule
的污点效应。这意味着如果 pod 不匹配污点的指定容忍度,调度程序不会将新的 pod 或部署添加到节点。您可以修改污点以更好地控制节点如何在每个本地区域或 Wavelength 区域子网中创建工作负载。
安装程序创建计算机器集清单文件,其中应用了node-role.kubernetes.io/edge
和node-role.kubernetes.io/worker
标签到位于本地区域或 Wavelength 区域子网中的每个边缘计算节点。
此过程中的示例适用于本地区域基础设施。如果您使用的是 Wavelength 区域基础设施,请确保将示例调整为该基础设施支持的内容。 |
您可以访问 OpenShift CLI (oc
)。
您已在具有已定义本地区域或 Wavelength 区域子网的虚拟私有云 (VPC) 中部署了集群。
您已确保本地区域或 Wavelength 区域子网上的边缘计算节点的计算机器集指定了node-role.kubernetes.io/edge
的污点。
为要在本地区域子网中运行的示例应用程序创建一个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 匹配的值。 |
为节点创建一个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 负载均衡器运算符。