7.3. 为 Red Hat OpenShift Service on AWS 集群创建虚拟私有云
您必须具有 Virtual Private Cloud (VPC)才能在 AWS 集群上创建 Red Hat OpenShift Service。要通过 VPC 端点从本地 ECR 镜像拉取镜像,您必须配置 privatelink 服务连接,并使用特定标签修改默认安全组。使用以下方法之一创建 VPC:
- 使用 ROSA 命令行界面(CLI)创建 VPC
- 使用 Terraform 模板创建 VPC
- 使用 AWS CLI 创建 VPC
- 在 AWS 控制台中手动创建 VPC 资源
7.3.1. 使用 ROSA CLI 创建 AWS VPC 复制链接链接已复制到粘贴板!
rosa create network 命令在 ROSA CLI 的 v.1.2.48 或更高版本中提供。命令使用 AWS CloudFormation 创建 VPC 以及在 AWS 集群上安装 Red Hat OpenShift Service 所需的相关网络组件。CloudFormation 是一个原生 AWS 基础架构即代码工具,与 AWS CLI 兼容。
如果没有指定模板,CloudFormation 将使用以下参数来创建资源的默认模板:
| VPC 参数 | value |
|---|---|
| 可用区 | 1 |
| 区域 |
|
| VPC CIDR |
|
您可以创建和自定义 CloudFormation 模板,以用于 rosa create network 命令。如需有关默认 VPC 模板的信息,请参阅本节的其他资源。
先决条件
- 您已配置了 AWS 帐户
- 您已配置了您的红帽帐户
- 已安装 ROSA CLI 并将其配置为最新版本
验证
完成后,您会收到创建的资源概述:
INFO[0140] Resources created in stack: INFO[0140] Resource: AttachGateway, Type: AWS::EC2::VPCGatewayAttachment, ID: <gateway_id> INFO[0140] Resource: EC2VPCEndpoint, Type: AWS::EC2::VPCEndpoint, ID: <vpce_id> INFO[0140] Resource: EcrApiVPCEndpoint, Type: AWS::EC2::VPCEndpoint, ID: <vpce_id> INFO[0140] Resource: EcrDkrVPCEndpoint, Type: AWS::EC2::VPCEndpoint, ID: <vpce_id> INFO[0140] Resource: ElasticIP1, Type: AWS::EC2::EIP, ID: <IP> INFO[0140] Resource: ElasticIP2, Type: AWS::EC2::EIP, ID: <IP> INFO[0140] Resource: InternetGateway, Type: AWS::EC2::InternetGateway, ID: igw-016e1a71b9812464e INFO[0140] Resource: KMSVPCEndpoint, Type: AWS::EC2::VPCEndpoint, ID: <vpce_id> INFO[0140] Resource: NATGateway1, Type: AWS::EC2::NatGateway, ID: <nat-gateway_id> INFO[0140] Resource: PrivateRoute, Type: AWS::EC2::Route, ID: <route_id> INFO[0140] Resource: PrivateRouteTable, Type: AWS::EC2::RouteTable, ID: <route_id> INFO[0140] Resource: PrivateSubnetRouteTableAssociation1, Type: AWS::EC2::SubnetRouteTableAssociation, ID: <route_id> INFO[0140] Resource: PublicRoute, Type: AWS::EC2::Route, ID: <route_id> INFO[0140] Resource: PublicRouteTable, Type: AWS::EC2::RouteTable, ID: <route_id> INFO[0140] Resource: PublicSubnetRouteTableAssociation1, Type: AWS::EC2::SubnetRouteTableAssociation, ID: <route_id> INFO[0140] Resource: S3VPCEndpoint, Type: AWS::EC2::VPCEndpoint, ID: <vpce_id> INFO[0140] Resource: STSVPCEndpoint, Type: AWS::EC2::VPCEndpoint, ID: <vpce_id> INFO[0140] Resource: SecurityGroup, Type: AWS::EC2::SecurityGroup, ID: <security-group_id> INFO[0140] Resource: SubnetPrivate1, Type: AWS::EC2::Subnet, ID: <private_subnet_id-1> \1 INFO[0140] Resource: SubnetPublic1, Type: AWS::EC2::Subnet, ID: <public_subnet_id-1> \2 INFO[0140] Resource: VPC, Type: AWS::EC2::VPC, ID: <vpc_id> INFO[0140] Stack rosa-network-stack-5555 created \3
7.3.1.1. 标记子网 复制链接链接已复制到粘贴板!
在使用 VPC 创建 Red Hat OpenShift Service on AWS 集群前,您必须标记 VPC 子网。自动服务 preflight 检查验证这些资源是否已正确标记。下表显示了如何标记您的资源:
| 资源 | 键 | value |
|---|---|---|
| 公共子网 |
|
|
| 专用子网 |
|
|
如果需要,您必须至少标记一个专用子网和一个公共子网。
在终端中标记您的资源:
对于公共子网,运行以下命令:
$ aws ec2 create-tags --resources <public_subnet_id> --region <aws_region> --tags Key=kubernetes.io/role/elb,Value=1对于专用子网,运行以下命令:
$ aws ec2 create-tags --resources <private_subnet_id> --region <aws_region> --tags Key=kubernetes.io/role/internal-elb,Value=1
验证
运行以下命令验证标签是否正确:
$ aws ec2 describe-tags --filters "Name=resource-id,Values=<subnet_id>"输出示例
TAGS Name <subnet_id> subnet <prefix>-subnet-public1-us-east-1a TAGS kubernetes.io/role/elb <subnet_id> subnet 1
7.3.2. 使用 Terraform 创建虚拟私有云 复制链接链接已复制到粘贴板!
Terraform 是一个工具,可让您使用已建立的模板创建各种资源。以下流程根据需要使用默认选项在 AWS 集群上创建 Red Hat OpenShift Service。有关使用 Terraform 的更多信息,请参阅其他资源。
Terraform 指令用于测试和演示目的。您自己的安装需要对 VPC 的一些修改才能自行使用。您还应确保使用此 Terraform 脚本时,它位于您要安装集群的同一区域。这些示例使用 us-east-2。
先决条件
- 您已在机器上安装 Terraform 版本 1.4.0 或更新版本。
- 您已在机器上安装了 Git。
流程
运行以下命令,打开 shell 提示符并克隆 Terraform VPC 存储库:
$ git clone https://github.com/openshift-cs/terraform-vpc-example运行以下命令来进入创建的目录:
$ cd terraform-vpc-example/zero-egress运行以下命令来启动 Terraform 文件:
$ terraform init在此过程完成后会显示确认初始化的消息。
要根据现有的 Terraform 模板构建 VPC Terraform 计划,请运行
plan命令。您必须包含 AWS 区域、可用区、CIDR 块和专用子网。您可以选择指定集群名称。terraform计划完成后,rosa-zero-egress.tfplan文件被添加到hypershift-tf目录中。有关更详细的选项,请参阅 Terraform VPC 存储库的 README 文件。$ terraform plan -out rosa-zero-egress.tfplan -var region=<aws_region> \1 -var 'availability_zones=["aws_region_1a","aws_region_1b","aws_region_1c"]'\2 -var vpc_cidr_block=10.0.0.0/16 \3 -var 'private_subnets=["10.0.0.0/24", "10.0.1.0/24", "10.0.2.0/24"]'4 运行以下命令应用此计划文件来构建 VPC:
$ terraform apply rosa-zero-egress.tfplan
7.3.2.1. 标记子网 复制链接链接已复制到粘贴板!
在使用 VPC 创建 Red Hat OpenShift Service on AWS 集群前,您必须标记 VPC 子网。自动服务 preflight 检查验证这些资源是否已正确标记。下表显示了如何标记您的资源:
| 资源 | 键 | value |
|---|---|---|
| 公共子网 |
|
|
| 专用子网 |
|
|
如果需要,您必须至少标记一个专用子网和一个公共子网。
在终端中标记您的资源:
对于公共子网,运行以下命令:
$ aws ec2 create-tags --resources <public_subnet_id> --region <aws_region> --tags Key=kubernetes.io/role/elb,Value=1对于专用子网,运行以下命令:
$ aws ec2 create-tags --resources <private_subnet_id> --region <aws_region> --tags Key=kubernetes.io/role/internal-elb,Value=1
验证
运行以下命令验证标签是否正确:
$ aws ec2 describe-tags --filters "Name=resource-id,Values=<subnet_id>"输出示例
TAGS Name <subnet_id> subnet <prefix>-subnet-public1-us-east-1a TAGS kubernetes.io/role/elb <subnet_id> subnet 1
7.3.3. 使用 AWS CLI 创建 VPC 复制链接链接已复制到粘贴板!
您可以使用 AWS CLI 创建 VPC。有关使用此 CLI 的详情,请查看 AWS create-vpc 文档。
7.3.4. 手动创建 AWS Virtual Private Cloud 复制链接链接已复制到粘贴板!
如果您选择手动创建 AWS Virtual Private Cloud (VPC)而不是使用 Terraform,请访问 AWS 控制台中的 VPC 页面。
您的 VPC 必须满足下表中显示的要求。
| 要求 | 详情 |
|---|---|
| VPC 名称 | 创建集群时,您需要具有特定的 VPC 名称和 ID。 |
| CIDR 范围 | 您的 VPC CIDR 范围应该与您的机器 CIDR 匹配。 |
| 可用区 | 您需要一个区域的可用区,并且需要三个用于多区的可用区。 |
| 公共子网 | 您必须有一个公共子网,其中包含公共集群的 NAT 网关。私有集群不需要公共子网。 |
| DNS 主机名和解析 | 您必须确保启用 DNS 主机名和解析。 |
7.3.4.1. 标记子网 复制链接链接已复制到粘贴板!
在使用 VPC 创建 Red Hat OpenShift Service on AWS 集群前,您必须标记 VPC 子网。自动服务 preflight 检查验证这些资源是否已正确标记。下表显示了如何标记您的资源:
| 资源 | 键 | value |
|---|---|---|
| 公共子网 |
|
|
| 专用子网 |
|
|
如果需要,您必须至少标记一个专用子网和一个公共子网。
在终端中标记您的资源:
对于公共子网,运行以下命令:
$ aws ec2 create-tags --resources <public_subnet_id> --region <aws_region> --tags Key=kubernetes.io/role/elb,Value=1对于专用子网,运行以下命令:
$ aws ec2 create-tags --resources <private_subnet_id> --region <aws_region> --tags Key=kubernetes.io/role/internal-elb,Value=1
验证
运行以下命令验证标签是否正确:
$ aws ec2 describe-tags --filters "Name=resource-id,Values=<subnet_id>"输出示例
TAGS Name <subnet_id> subnet <prefix>-subnet-public1-us-east-1a TAGS kubernetes.io/role/elb <subnet_id> subnet 1