16.3. 为您的 Outpost 配置网络
要将 VPC 集群扩展到 Outpost 中,您必须完成以下网络配置任务:
- 更改集群网络 MTU。
- 在 Outpost 中创建子网。
16.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
其他资源
16.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 模板。
16.3.3. VPC 子网的 CloudFormation 模板
您可以使用以下 CloudFormation 模板来部署 Outpost 子网。
例 16.1. 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]]