16.3. 为您的 Outpost 配置网络
要将 VPC 集群扩展到 Outpost 中,您必须完成以下网络配置任务:
- 更改集群网络 MTU。
- 在 Outpost 中创建子网。
16.3.1. 更改集群网络 MTU 以支持 AWS Outposts 复制链接链接已复制到粘贴板!
在安装过程中,集群网络的最大传输单元 (MTU) 会根据集群中节点的主网络接口的 MTU 自动检测到。您可能需要减少集群网络的 MTU 值来支持 AWS Outposts 子网。
您无法在 MTU 迁移过程中回滚节点的 MTU 值,但您可以在 MTU 迁移过程完成后回滚。
当 MTU 更新推出时,集群中的迁移具有破坏性且节点可能会临时不可用。
有关迁移过程的详情,包括重要的服务中断注意事项,请参阅此流程的其他资源中的"为集群网络分配 MTU"。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
cluster-admin权限的账户访问集群。 已为集群识别目标 MTU。
-
OVN-Kubernetes 网络插件的 MTU 必须设置为比集群中的最低硬件 MTU 值小
100。 -
OpenShift SDN 网络插件的 MTU 必须设置为比集群中的最低硬件 MTU 值小
50。
-
OVN-Kubernetes 网络插件的 MTU 必须设置为比集群中的最低硬件 MTU 值小
- 如果您的节点是物理计算机,请确保集群网络和连接的网络交换机支持巨型帧。
- 如果您的节点是虚拟机 (VM),请确保虚拟机监控程序和连接的网络交换机支持巨型帧。
流程
要获得集群网络的当前 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。对于 OpenShift SDN,这个值必须比<machine_to>的值小50。 <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 迁移。在这两个示例命令中,
<mtu>指定了您使用<overlay_to>指定的新集群网络 MTU。要完成 MTU 迁移,请为 OVN-Kubernetes 网络插件输入以下命令:
$ oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": null, "defaultNetwork":{ "ovnKubernetesConfig": { "mtu": <mtu> }}}}'要完成 MTU 迁移,请为 OpenShift SDN 网络插件输入以下命令:
$ oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": null, "defaultNetwork":{ "openshiftSDNConfig": { "mtu": <mtu> }}}}'
最终调整 MTU 迁移后,每个机器配置池节点都会逐个重启一个。您必须等到所有节点都已更新。输入以下命令检查机器配置池状态:
$ oc get machineconfigpools成功更新的节点具有以下状态:
UPDATED=true、UPDATING=false、DEGRADED=false。
验证
输入以下命令验证集群中的节点是否使用您指定的 MTU:
$ oc describe network.config cluster
16.3.1.1. 检查当前集群 MTU 值 复制链接链接已复制到粘贴板!
使用以下步骤获取集群网络的当前最大传输单元(MTU)。
流程
要获得集群网络的当前 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 ...
16.3.1.2. 开始 MTU 迁移 复制链接链接已复制到粘贴板!
使用以下步骤启动 MTU 迁移。
流程
要开始 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。
$ oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": { "mtu": { "network": { "from": 1400, "to": 1000 } , "machine": { "to" : 1100} } } } }'当 Machine Config Operator 更新每个机器配置池中的机器时,Operator 会逐一重启每个节点。您必须等到所有节点都已更新。输入以下命令检查机器配置池状态:
$ oc get machineconfigpools成功更新的节点具有以下状态:
UPDATED=true、UPDATING=false、DEGRADED=false。注意默认情况下,Machine Config Operator 一次更新每个池中的一个机器,从而导致迁移总时间随着集群大小而增加。
16.3.1.3. 验证机器配置 复制链接链接已复制到粘贴板!
使用以下步骤验证机器配置。
流程
确认主机上新机器配置的状态:
要列出机器配置状态和应用的机器配置名称,请输入以下命令:
$ 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
16.3.1.4. 最终调整 MTU 迁移 复制链接链接已复制到粘贴板!
使用以下步骤完成 MTU 迁移。
流程
要完成 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
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
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]]