×

托管集群 是一个 OpenShift Container Platform 集群,其 API 端点和控制平面托管在管理集群上。托管集群包括控制平面及其相应的数据平面。要在本地配置托管控制平面,必须在管理集群中安装 Kubernetes 运算符的多集群引擎。通过使用hypershift-addon托管集群附加组件在现有托管集群上部署 HyperShift 运算符,您可以将该集群启用为管理集群并开始创建托管集群。hypershift-addon托管集群附加组件默认情况下为local-cluster托管集群启用。

您可以使用多集群引擎运算符控制台或托管控制平面命令行界面 (CLI)hcp创建托管集群。托管集群会自动作为托管集群导入。但是,您可以禁用此自动导入功能到多集群引擎运算符

准备在 AWS 上部署托管控制平面

在准备在 Amazon Web Services (AWS) 上部署托管控制平面时,请考虑以下信息

  • 每个托管集群必须具有集群范围内的唯一名称。为了让多集群引擎 Operator 能够管理托管集群,其名称不能与任何现有的托管集群名称相同。

  • 请勿使用 clusters 作为托管集群名称。

  • 对于托管控制平面,请在同一平台上运行管理集群和工作节点。

  • 无法在多集群引擎 Operator 管理的集群的命名空间中创建托管集群。

配置管理集群的先决条件

配置管理集群需要满足以下先决条件:

  • 您已在 OpenShift Container Platform 集群上安装了 Kubernetes Operator 2.5 或更高版本的 Multicluster Engine。安装 Red Hat Advanced Cluster Management (RHACM) 时会自动安装 Multicluster Engine Operator。Multicluster Engine Operator 也可以作为 OpenShift Container Platform OperatorHub 中的 Operator 在没有 RHACM 的情况下安装。

  • 您至少拥有一个供 Multicluster Engine Operator 使用的托管 OpenShift Container Platform 集群。在 Multicluster Engine Operator 2.5 及更高版本中,local-cluster 会自动导入。您可以运行以下命令来检查您的中心集群的状态:

    $ oc get managedclusters local-cluster
  • 您已安装 aws 命令行界面 (CLI)

  • 您已安装托管控制平面 CLI,hcp

创建 Amazon Web Services S3 存储桶和 S3 OIDC 密钥

在 Amazon Web Services (AWS) 上创建和管理托管集群之前,必须创建 S3 存储桶和 S3 OIDC 密钥。

步骤
  1. 创建一个 S3 存储桶,该存储桶允许公开访问您的集群的 OIDC 发现文档,方法是运行以下命令:

    $ aws s3api create-bucket --bucket <bucket_name> \(1)
      --create-bucket-configuration LocationConstraint=<region> \(2)
      --region <region> (2)
    1 <bucket_name> 替换为您要创建的 S3 存储桶的名称。
    2 要在 us-east-1 区域之外的区域创建存储桶,请包含此行并将 <region> 替换为您要使用的区域。要在 us-east-1 区域创建存储桶,请省略此行。
    $ aws s3api delete-public-access-block --bucket <bucket_name> (1)
    1 <bucket_name> 替换为您要创建的 S3 存储桶的名称。
    $ echo '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::<bucket_name>/*" (1)
            }
        ]
    }' | envsubst > policy.json
    1 <bucket_name> 替换为您要创建的 S3 存储桶的名称。
    $ aws s3api put-bucket-policy --bucket <bucket_name> --policy file://policy.json (1)
    1 <bucket_name> 替换为您要创建的 S3 存储桶的名称。

    如果您使用的是 Mac 计算机,则必须导出存储桶名称才能使策略正常工作。

  2. 为 HyperShift Operator 创建一个名为 hypershift-operator-oidc-provider-s3-credentials 的 OIDC S3 密钥。

  3. 将密钥保存到 local-cluster 命名空间。

  4. 请参阅下表,以验证密钥是否包含以下字段:

    表 1. AWS 密钥的必需字段
    字段名称 描述

    bucket

    包含一个 S3 存储桶,允许公开访问托管集群的 OIDC 发现文档。

    credentials

    对包含可以访问存储桶的 default 配置文件的凭据的文件的引用。默认情况下,HyperShift 只使用 default 配置文件来操作 bucket

    region

    指定 S3 存储桶的区域。

  5. 要创建 AWS 密钥,请运行以下命令:

    $ oc create secret generic <secret_name> --from-file=credentials=<path>/.aws/credentials --from-literal=bucket=<s3_bucket> --from-literal=region=<region> -n local-cluster

    不会自动启用密钥的灾难恢复备份。要添加启用 hypershift-operator-oidc-provider-s3-credentials 密钥进行灾难恢复备份的标签,请运行以下命令:

    $ oc label secret hypershift-operator-oidc-provider-s3-credentials -n local-cluster cluster.open-cluster-management.io/backup=true

为托管集群创建可路由公共区域

要访问托管集群中的应用程序,必须配置可路由公共区域。如果公共区域已存在,请跳过此步骤。否则,公共区域会影响现有功能。

步骤
  • 要为 DNS 记录创建可路由公共区域,请输入以下命令:

    $ aws route53 create-hosted-zone --name <basedomain> --caller-reference $(whoami)-$(date --rfc-3339=date) (1)
    1 <basedomain> 替换为您的基础域,例如 www.example.com

创建 AWS IAM 角色和 STS 凭据

在 Amazon Web Services (AWS) 上创建托管集群之前,必须创建 AWS IAM 角色和 STS 凭据。

步骤
  1. 通过运行以下命令获取您的用户的 Amazon 资源名称 (ARN):

    $ aws sts get-caller-identity --query "Arn" --output text
    示例输出
    arn:aws:iam::1234567890:user/<aws_username>

    将此输出用作下一步中 <arn> 的值。

  2. 创建一个包含角色信任关系配置的 JSON 文件。请参见以下示例:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "<arn>" (1)
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    1 <arn> 替换为您在上一步中记下的用户的 ARN。
  3. 通过运行以下命令创建 Identity and Access Management (IAM) 角色:

    $ aws iam create-role \
    --role-name <name> \(1)
    --assume-role-policy-document file://<file_name>.json \(2)
    --query "Role.Arn"
    1 <name> 替换为角色名称,例如 hcp-cli-role
    2 <file_name> 替换为您在上一步中创建的 JSON 文件的名称。
    示例输出
    arn:aws:iam::820196288204:role/myrole
  4. 创建一个名为 policy.json 的 JSON 文件,其中包含角色的以下权限策略:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "EC2",
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateDhcpOptions",
                    "ec2:DeleteSubnet",
                    "ec2:ReplaceRouteTableAssociation",
                    "ec2:DescribeAddresses",
                    "ec2:DescribeInstances",
                    "ec2:DeleteVpcEndpoints",
                    "ec2:CreateNatGateway",
                    "ec2:CreateVpc",
                    "ec2:DescribeDhcpOptions",
                    "ec2:AttachInternetGateway",
                    "ec2:DeleteVpcEndpointServiceConfigurations",
                    "ec2:DeleteRouteTable",
                    "ec2:AssociateRouteTable",
                    "ec2:DescribeInternetGateways",
                    "ec2:DescribeAvailabilityZones",
                    "ec2:CreateRoute",
                    "ec2:CreateInternetGateway",
                    "ec2:RevokeSecurityGroupEgress",
                    "ec2:ModifyVpcAttribute",
                    "ec2:DeleteInternetGateway",
                    "ec2:DescribeVpcEndpointConnections",
                    "ec2:RejectVpcEndpointConnections",
                    "ec2:DescribeRouteTables",
                    "ec2:ReleaseAddress",
                    "ec2:AssociateDhcpOptions",
                    "ec2:TerminateInstances",
                    "ec2:CreateTags",
                    "ec2:DeleteRoute",
                    "ec2:CreateRouteTable",
                    "ec2:DetachInternetGateway",
                    "ec2:DescribeVpcEndpointServiceConfigurations",
                    "ec2:DescribeNatGateways",
                    "ec2:DisassociateRouteTable",
                    "ec2:AllocateAddress",
                    "ec2:DescribeSecurityGroups",
                    "ec2:RevokeSecurityGroupIngress",
                    "ec2:CreateVpcEndpoint",
                    "ec2:DescribeVpcs",
                    "ec2:DeleteSecurityGroup",
                    "ec2:DeleteDhcpOptions",
                    "ec2:DeleteNatGateway",
                    "ec2:DescribeVpcEndpoints",
                    "ec2:DeleteVpc",
                    "ec2:CreateSubnet",
                    "ec2:DescribeSubnets"
                ],
                "Resource": "*"
            },
            {
                "Sid": "ELB",
                "Effect": "Allow",
                "Action": [
                    "elasticloadbalancing:DeleteLoadBalancer",
                    "elasticloadbalancing:DescribeLoadBalancers",
                    "elasticloadbalancing:DescribeTargetGroups",
                    "elasticloadbalancing:DeleteTargetGroup"
                ],
                "Resource": "*"
            },
            {
                "Sid": "IAMPassRole",
                "Effect": "Allow",
                "Action": "iam:PassRole",
                "Resource": "arn:*:iam::*:role/*-worker-role",
                "Condition": {
                    "ForAnyValue:StringEqualsIfExists": {
                        "iam:PassedToService": "ec2.amazonaws.com"
                    }
                }
            },
            {
                "Sid": "IAM",
                "Effect": "Allow",
                "Action": [
                    "iam:CreateInstanceProfile",
                    "iam:DeleteInstanceProfile",
                    "iam:GetRole",
                    "iam:UpdateAssumeRolePolicy",
                    "iam:GetInstanceProfile",
                    "iam:TagRole",
                    "iam:RemoveRoleFromInstanceProfile",
                    "iam:CreateRole",
                    "iam:DeleteRole",
                    "iam:PutRolePolicy",
                    "iam:AddRoleToInstanceProfile",
                    "iam:CreateOpenIDConnectProvider",
                    "iam:ListOpenIDConnectProviders",
                    "iam:DeleteRolePolicy",
                    "iam:UpdateRole",
                    "iam:DeleteOpenIDConnectProvider",
                    "iam:GetRolePolicy"
                ],
                "Resource": "*"
            },
            {
                "Sid": "Route53",
                "Effect": "Allow",
                "Action": [
                    "route53:ListHostedZonesByVPC",
                    "route53:CreateHostedZone",
                    "route53:ListHostedZones",
                    "route53:ChangeResourceRecordSets",
                    "route53:ListResourceRecordSets",
                    "route53:DeleteHostedZone",
                    "route53:AssociateVPCWithHostedZone",
                    "route53:ListHostedZonesByName"
                ],
                "Resource": "*"
            },
            {
                "Sid": "S3",
                "Effect": "Allow",
                "Action": [
                    "s3:ListAllMyBuckets",
                    "s3:ListBucket",
                    "s3:DeleteObject",
                    "s3:DeleteBucket"
                ],
                "Resource": "*"
            }
        ]
    }
  5. 通过运行以下命令将 policy.json 文件附加到您的角色:

    $ aws iam put-role-policy \
      --role-name <role_name> \(1)
      --policy-name <policy_name> \(2)
      --policy-document file://policy.json (3)
    1 <role_name> 替换为您的角色名称。
    2 <policy_name> 替换为您的策略名称。
    3 policy.json 文件包含您的角色的权限策略。
  6. 通过运行以下命令在名为 sts-creds.json 的 JSON 文件中检索 STS 凭据:

    $ aws sts get-session-token --output json > sts-creds.json
    示例 sts-creds.json 文件
    {
                  "Credentials": {
                      "AccessKeyId": "ASIA1443CE0GN2ATHWJU",
                      "SecretAccessKey": "XFLN7cZ5AP0d66KhyI4gd8Mu0UCQEDN9cfelW1”,
                      "SessionToken": "IQoJb3JpZ2luX2VjEEAaCXVzLWVhc3QtMiJHMEUCIDyipkM7oPKBHiGeI0pMnXst1gDLfs/TvfskXseKCbshAiEAnl1l/Html7Iq9AEIqf////KQburfkq4A3TuppHMr/9j1TgCj1z83SO261bHqlJUazKoy7vBFR/a6LHt55iMBqtKPEsIWjBgj/jSdRJI3j4Gyk1//luKDytcfF/tb9YrxDTPLrACS1lqAxSIFZ82I/jDhbDs=",
                      "Expiration": "2025-05-16T04:19:32+00:00"
                  }
              }

要在 Amazon Web Services (AWS) 上使用 PrivateLink 预配托管控制平面,请为托管控制平面启用 AWS PrivateLink。

步骤
  1. 为 HyperShift Operator 创建一个 AWS 凭据密钥,并将其命名为 hypershift-operator-private-link-credentials。密钥必须位于用作管理集群的托管集群的命名空间中。如果您使用的是 local-cluster,请在 local-cluster 命名空间中创建密钥。

  2. 请参阅下表,以确认密钥是否包含必需的字段:

表 2. AWS 密钥的必需字段
字段名称 描述 可选或必需

region

与 Private Link 一起使用的区域

必需

aws-access-key-id

凭据访问密钥 ID。

必需

aws-secret-access-key

凭据访问密钥。

必需

要创建 AWS 密钥,请运行以下命令:

$ oc create secret generic <secret_name> --from-literal=aws-access-key-id=<aws_access_key_id> --from-literal=aws-secret-access-key=<aws_secret_access_key> --from-literal=region=<region> -n local-cluster

不会自动启用密钥的灾难恢复备份。运行以下命令添加启用 hypershift-operator-private-link-credentials 密钥进行灾难恢复备份的标签:

$ oc label secret hypershift-operator-private-link-credentials -n local-cluster cluster.open-cluster-management.io/backup=""

在 AWS 上为托管控制平面启用外部 DNS

在托管控制平面中,控制平面和数据平面是分开的。您可以在两个独立的区域配置 DNS:

  • 托管集群内工作负载的入口,例如以下域:*.apps.service-consumer-domain.com

  • 管理集群内服务端点的入口,例如通过服务提供商域的 API 或 OAuth 端点:*.service-provider-domain.com

hostedCluster.spec.dns 的输入管理托管集群内工作负载的入口。hostedCluster.spec.services.servicePublishingStrategy.route.hostname 的输入管理管理集群内服务端点的入口。

外部DNS为托管集群的Services创建名称记录,这些记录指定发布类型为LoadBalancerRoute,并为该发布类型提供主机名。对于具有PrivatePublicAndPrivate端点访问类型的托管集群,只有APIServerOAuth服务支持主机名。对于Private托管集群,DNS记录解析为虚拟私有云 (VPC) 中VPC端点的私有IP地址。

托管控制平面公开以下服务:

  • APIServer

  • OIDC

您可以使用HostedCluster规范中的servicePublishingStrategy字段公开这些服务。默认情况下,对于servicePublishingStrategyLoadBalancerRoute类型,您可以通过以下方式发布服务:

  • 使用状态为LoadBalancer类型的Service的负载均衡器的主机名。

  • 使用Route资源的status.host字段。

但是,当您在托管服务环境中部署托管控制平面时,这些方法可能会公开底层管理集群的入口子域名,并限制管理集群生命周期和灾难恢复的选项。

当在LoadBalancerRoute发布类型上叠加DNS间接寻址层时,托管服务运营商可以使用服务级域名发布所有公共托管集群服务。此架构允许将DNS名称重新映射到新的LoadBalancerRoute,并且不会公开管理集群的入口域名。托管控制平面使用外部DNS来实现该间接寻址层。

您可以在管理集群的hypershift命名空间中与HyperShift Operator一起部署external-dns。外部DNS会监视具有external-dns.alpha.kubernetes.io/hostname注释的ServicesRoutes。该注释用于创建指向Service(例如,A记录)或Route(例如,CNAME记录)的DNS记录。

您只能在云环境中使用外部DNS。对于其他环境,您需要手动配置DNS和服务。

有关外部DNS的更多信息,请参阅external DNS

先决条件

在为Amazon Web Services (AWS)上的托管控制平面设置外部DNS之前,您必须满足以下先决条件:

  • 您已创建外部公共域名。

  • 您可以访问AWS Route53管理控制台。

  • 您已为托管控制平面启用AWS PrivateLink。

为托管控制平面设置外部DNS

您可以使用外部DNS或服务级DNS配置托管控制平面。

  1. 为HyperShift Operator创建一个Amazon Web Services (AWS)凭据密钥,并将其命名为hypershift-operator-external-dns-credentials,位于local-cluster命名空间中。

  2. 请参阅下表以验证密钥是否具有必需的字段:

    表3. AWS密钥的必需字段
    字段名称 描述 可选或必需

    provider

    管理服务级DNS区域的DNS提供商。

    必需

    domain-filter

    服务级域名。

    必需

    credentials

    支持所有外部DNS类型的凭据文件。

    使用AWS密钥时可选

    aws-access-key-id

    凭据访问密钥 ID。

    使用AWS DNS服务时可选

    aws-secret-access-key

    凭据访问密钥。

    使用AWS DNS服务时可选

  3. 要创建 AWS 密钥,请运行以下命令:

    $ oc create secret generic <secret_name> --from-literal=provider=aws --from-literal=domain-filter=<domain_name> --from-file=credentials=<path_to_aws_credentials_file> -n local-cluster

    不会自动启用密钥的灾难恢复备份。要备份用于灾难恢复的密钥,请通过输入以下命令添加hypershift-operator-external-dns-credentials

    $ oc label secret hypershift-operator-external-dns-credentials -n local-cluster cluster.open-cluster-management.io/backup=""

创建公共DNS托管区域

外部DNS Operator使用公共DNS托管区域来创建您的公共托管集群。

您可以创建公共DNS托管区域用作外部DNS domain-filter。请在AWS Route 53管理控制台中完成以下步骤:

步骤
  1. 在Route 53管理控制台中,单击**创建托管区域**。

  2. 在**托管区域配置**页面上,键入域名,验证是否已选择**发布托管区域**作为类型,然后单击**创建托管区域**。

  3. 区域创建后,在**记录**选项卡上,记下**值/将流量路由到**列中的值。

  4. 在主域名中,创建NS记录以将DNS请求重定向到委派区域。在**值**字段中,输入您在上一步中记下的值。

  5. 单击**创建记录**。

  6. 通过在新子区域中创建一个测试条目并使用dig命令(例如以下示例)对其进行测试,来验证DNS托管区域是否正常工作:

    $ dig +short test.user-dest-public.aws.kerberos.com
    示例输出
    192.168.1.1
  7. 要创建设置LoadBalancerRoute服务的 hostname 的托管集群,请输入以下命令:

    $ hcp create cluster aws --name=<hosted_cluster_name> --endpoint-access=PublicAndPrivate --external-dns-domain=<public_hosted_zone> ... (1)
    1 <public_hosted_zone>替换为您创建的公共托管区域。
    托管集群的示例services块:
      platform:
        aws:
          endpointAccess: PublicAndPrivate
    ...
      services:
      - service: APIServer
        servicePublishingStrategy:
          route:
            hostname: api-example.service-provider-domain.com
          type: Route
      - service: OAuthServer
        servicePublishingStrategy:
          route:
            hostname: oauth-example.service-provider-domain.com
          type: Route
      - service: Konnectivity
        servicePublishingStrategy:
          type: Route
      - service: Ignition
        servicePublishingStrategy:
          type: Route

控制平面操作员创建ServicesRoutes资源,并使用external-dns.alpha.kubernetes.io/hostname注释对其进行注释。对于ServicesRoutes,控制平面操作员使用服务端点的servicePublishingStrategy字段中hostname参数的值。要创建DNS记录,您可以使用某种机制,例如external-dns部署。

您只能为公共服务配置服务级DNS间接寻址。您无法为私有服务设置hostname,因为它们使用hypershift.local私有区域。

下表显示了何时可以为服务和端点组合设置hostname

表4. 设置hostname的服务和端点组合
服务 公共

公共和私有

私有

APIServer

Y

Y

N

OAuthServer

Y

Y

N

Konnectivity

Y

N

N

Ignition

Y

N

N

使用AWS上的外部DNS创建托管集群

要在Amazon Web Services (AWS)上使用PublicAndPrivatePublic发布策略创建托管集群,您必须在管理集群中配置以下工件:

  • 公共DNS托管区域

  • 外部DNS Operator

  • HyperShift Operator

您可以使用hcp命令行界面 (CLI) 部署托管集群。

步骤
  1. 要访问您的管理集群,请输入以下命令:

    $ export KUBECONFIG=<path_to_management_cluster_kubeconfig>
  2. 通过输入以下命令来验证外部DNS Operator是否正在运行:

    $ oc get pod -n hypershift -lapp=external-dns
    示例输出
    NAME                            READY   STATUS    RESTARTS   AGE
    external-dns-7c89788c69-rn8gp   1/1     Running   0          40s
  3. 要使用外部DNS创建托管集群,请输入以下命令:

    $ hcp create cluster aws \
        --role-arn <arn_role> \ (1)
        --instance-type <instance_type> \ (2)
        --region <region> \ (3)
        --auto-repair \
        --generate-ssh \
        --name <hosted_cluster_name> \ (4)
        --namespace clusters \
        --base-domain <service_consumer_domain> \ (5)
        --node-pool-replicas <node_replica_count> \ (6)
        --pull-secret <path_to_your_pull_secret> \ (7)
        --release-image quay.io/openshift-release-dev/ocp-release:<ocp_release_image> \ (8)
        --external-dns-domain=<service_provider_domain> \ (9)
        --endpoint-access=PublicAndPrivate (10)
        --sts-creds <path_to_sts_credential_file> (11)
    
    1 指定Amazon资源名称 (ARN),例如arn:aws:iam::820196288204:role/myrole
    2 指定实例类型,例如m6i.xlarge
    3 指定AWS区域,例如us-east-1
    4 指定您的托管集群名称,例如my-external-aws
    5 指定服务使用者拥有的公共托管区域,例如service-consumer-domain.com
    6 指定节点副本数量,例如2
    7 指定拉取密钥文件的路径。
    8 指定您要使用的受支持的OpenShift Container Platform版本,例如4.17.0-multi
    9 指定服务提供商拥有的公共托管区域,例如service-provider-domain.com
    10 设置为PublicAndPrivate。只有PublicPublicAndPrivate配置才能使用外部DNS。
    11 指定AWS STS凭证文件的路径,例如,/home/user/sts-creds/sts-creds.json

在AWS上创建托管集群

您可以使用hcp命令行界面(CLI)在Amazon Web Services (AWS)上创建托管集群。

在Amazon Web Services (AWS)上托管控制平面默认使用AMD64托管集群。但是,您可以启用托管控制平面在ARM64托管集群上运行。更多信息,请参见“在ARM64架构上运行托管集群”。

有关节点池和托管集群的兼容组合,请参见下表

表5. 节点池和托管集群的兼容架构
托管集群 节点池

AMD64

AMD64或ARM64

ARM64

ARM64或AMD64

先决条件
  • 您已设置托管控制平面CLI,hcp

  • 您已启用local-cluster托管集群作为管理集群。

  • 您已创建AWS身份和访问管理(IAM)角色和AWS安全令牌服务(STS)凭证。

步骤
  1. 要在AWS上创建托管集群,请运行以下命令

    $ hcp create cluster aws \
        --name <hosted_cluster_name> \(1)
        --infra-id <infra_id> \(2)
        --base-domain <basedomain> \(3)
        --sts-creds <path_to_sts_credential_file> \(4)
        --pull-secret <path_to_pull_secret> \(5)
        --region <region> \(6)
        --generate-ssh \
        --node-pool-replicas <node_pool_replica_count> \(7)
        --namespace <hosted_cluster_namespace> \(8)
        --role-arn <role_name> \(9)
        --render-into <file_name>.yaml (10)
    1 指定托管集群的名称,例如,example
    2 指定您的基础设施名称。您必须为<hosted_cluster_name><infra_id>提供相同的值。否则,集群可能无法在Kubernetes Operator控制台的多集群引擎中正确显示。
    3 指定您的基础域名,例如,example.com
    4 指定AWS STS凭证文件的路径,例如,/home/user/sts-creds/sts-creds.json
    5 指定您的拉取密钥的路径,例如,/user/name/pullsecret
    6 指定AWS区域名称,例如,us-east-1
    7 指定节点池副本数量,例如,3
    8 默认情况下,所有HostedClusterNodePool自定义资源都在clusters命名空间中创建。您可以使用--namespace <namespace>参数,在特定命名空间中创建HostedClusterNodePool自定义资源。
    9 指定Amazon资源名称 (ARN),例如arn:aws:iam::820196288204:role/myrole
    10 如果要指示EC2实例是在共享硬件还是单租户硬件上运行,请包含此字段。--render-into标志将Kubernetes资源渲染到您在此字段中指定的YAML文件中。然后,继续下一步编辑YAML文件。
  2. 如果您在上一个命令中包含了--render-into标志,请编辑指定的YAML文件。编辑YAML文件中的NodePool规范以指示EC2实例是否应在共享硬件或单租户硬件上运行,类似于以下示例

    YAML文件示例
    apiVersion: hypershift.openshift.io/v1beta1
    kind: NodePool
    metadata:
      name: <nodepool_name> (1)
    spec:
      platform:
        aws:
          placement:
            tenancy: "default" (2)
    1 指定NodePool资源的名称。
    2 指定租户的有效值:"default""dedicated""host"。当节点池实例在共享硬件上运行时,使用"default"。当每个节点池实例在单租户硬件上运行时,使用"dedicated"。当节点池实例在您预分配的专用主机上运行时,使用"host"
验证
  1. 验证托管集群的状态,检查AVAILABLE的值是否为True。运行以下命令

    $ oc get hostedclusters -n <hosted_cluster_namespace>
  2. 通过运行以下命令获取节点池列表

    $ oc get nodepools --namespace <hosted_cluster_namespace>

使用kubeadmin凭证访问AWS上的托管集群

在Amazon Web Services (AWS)上创建托管集群后,您可以通过获取kubeconfig文件、访问密钥和kubeadmin凭证来访问托管集群。

托管集群命名空间包含托管集群资源和访问密钥。托管控制平面在托管控制平面命名空间中运行。

密钥名称格式如下

  • kubeconfig密钥:<hosted_cluster_namespace>-<name>-admin-kubeconfig。例如,clusters-hypershift-demo-admin-kubeconfig

  • kubeadmin密码密钥:<hosted_cluster_namespace>-<name>-kubeadmin-password。例如,clusters-hypershift-demo-kubeadmin-password

kubeadmin密码密钥是Base64编码的,kubeconfig密钥包含Base64编码的kubeconfig配置。您必须解码Base64编码的kubeconfig配置并将其保存到<hosted_cluster_name>.kubeconfig文件中。

步骤
  • 使用包含已解码kubeconfig配置的<hosted_cluster_name>.kubeconfig文件来访问托管集群。输入以下命令

    $ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes

    您必须解码kubeadmin密码密钥才能登录到托管集群的API服务器或控制台。

使用hcp CLI访问AWS上的托管集群

您可以使用hcp命令行界面(CLI)访问托管集群。

步骤
  1. 通过输入以下命令生成kubeconfig文件

    $ hcp create kubeconfig --namespace <hosted_cluster_namespace> --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfig
  2. 保存kubeconfig文件后,通过输入以下命令访问托管集群

    $ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes

在AWS上的多个区域创建托管集群

您可以使用hcp命令行界面(CLI)在Amazon Web Services (AWS)上的多个区域创建托管集群。

先决条件
  • 您已创建AWS身份和访问管理(IAM)角色和AWS安全令牌服务(STS)凭证。

步骤
  • 通过运行以下命令在AWS上的多个区域创建托管集群

    $ hcp create cluster aws \
      --name <hosted_cluster_name> \(1)
      --node-pool-replicas=<node_pool_replica_count> \(2)
      --base-domain <basedomain> \(3)
      --pull-secret <path_to_pull_secret> \(4)
      --role-arn <arn_role> \(5)
      --region <region> \(6)
      --zones <zones> \(7)
      --sts-creds <path_to_sts_credential_file> (8)
    1 指定托管集群的名称,例如,example
    2 指定节点池副本数量,例如,2
    3 指定您的基础域名,例如,example.com
    4 指定您的拉取密钥的路径,例如,/user/name/pullsecret
    5 指定Amazon资源名称 (ARN),例如arn:aws:iam::820196288204:role/myrole
    6 指定AWS区域名称,例如,us-east-1
    7 指定AWS区域内的可用区,例如,us-east-1aus-east-1b
    8 指定AWS STS凭证文件的路径,例如,/home/user/sts-creds/sts-creds.json

对于每个指定的区域,将创建以下基础设施

  • 公共子网

  • 私有子网

  • NAT网关

  • 私有路由表

公共路由表在公共子网之间共享。

每个区域将创建一个NodePool资源。节点池名称以区域名称作为后缀。区域的私有子网设置在spec.platform.aws.subnet.id中。

通过提供AWS STS凭证创建托管集群

当您使用hcp create cluster aws命令创建托管集群时,您必须提供具有创建托管集群基础设施资源权限的Amazon Web Services (AWS)帐户凭证。

基础设施资源包括以下示例

  • 虚拟私有云 (VPC)

  • 子网

  • 网络地址转换 (NAT) 网关

您可以通过以下两种方式之一提供AWS凭证

  • AWS安全令牌服务 (STS) 凭证

  • 来自多集群引擎 Operator 的AWS云提供商密钥

步骤
  • 要通过提供AWS STS凭证在AWS上创建托管集群,请输入以下命令

    $ hcp create cluster aws \
      --name <hosted_cluster_name> \(1)
      --node-pool-replicas <node_pool_replica_count> \(2)
      --base-domain <basedomain> \(3)
      --pull-secret <path_to_pull_secret> \(4)
      --sts-creds <path_to_sts_credential_file> \(5)
      --region <region> \(6)
      --role-arn <arn_role>  (7)
    1 指定托管集群的名称,例如,example
    2 指定节点池副本数量,例如,2
    3 指定您的基础域名,例如,example.com
    4 指定您的拉取密钥的路径,例如,/user/name/pullsecret
    5 指定AWS STS凭证文件的路径,例如,/home/user/sts-creds/sts-creds.json
    6 指定AWS区域名称,例如,us-east-1
    7 指定Amazon资源名称 (ARN),例如arn:aws:iam::820196288204:role/myrole

在 ARM64 架构上运行托管集群

在 Amazon Web Services (AWS) 上默认情况下,托管控制平面使用 AMD64 托管集群。但是,您可以启用托管控制平面在 ARM64 托管集群上运行。

有关节点池和托管集群的兼容组合,请参见下表

表 6. 节点池和托管集群的兼容架构
托管集群 节点池

AMD64

AMD64或ARM64

ARM64

ARM64或AMD64

在 ARM64 OpenShift Container Platform 集群上创建托管集群

您可以通过使用多架构发行版镜像覆盖默认发行版镜像,在 Amazon Web Services (AWS) 的 ARM64 OpenShift Container Platform 集群上运行托管集群。

如果您不使用多架构发行版镜像,则节点池中的计算节点将不会创建,并且节点池的协调将停止,直到您在托管集群中使用多架构发行版镜像或根据发行版镜像更新NodePool自定义资源。

先决条件
  • 您必须拥有一个安装在 AWS 上的,具有 64 位 ARM 基础设施的 OpenShift Container Platform 集群。更多信息,请参见 创建 OpenShift Container Platform 集群:AWS (ARM)

  • 您必须创建一个 AWS Identity and Access Management (IAM) 角色和 AWS 安全令牌服务 (STS) 凭据。更多信息,请参见“创建 AWS IAM 角色和 STS 凭据”。

步骤
  1. 通过输入以下命令在 ARM64 OpenShift Container Platform 集群上创建一个托管集群

    $ hcp create cluster aws \
      --name <hosted_cluster_name> \(1)
      --node-pool-replicas <node_pool_replica_count> \(2)
      --base-domain <basedomain> \(3)
      --pull-secret <path_to_pull_secret> \(4)
      --sts-creds <path_to_sts_credential_file> \(5)
      --region <region> \(6)
      --release-image quay.io/openshift-release-dev/ocp-release:<ocp_release_image> \(7)
      --role-arn <role_name> (8)
    1 指定托管集群的名称,例如,example
    2 指定节点池副本数量,例如,3
    3 指定您的基础域名,例如,example.com
    4 指定您的拉取密钥的路径,例如,/user/name/pullsecret
    5 指定AWS STS凭证文件的路径,例如,/home/user/sts-creds/sts-creds.json
    6 指定AWS区域名称,例如,us-east-1
    7 指定您想要使用的受支持的 OpenShift Container Platform 版本,例如,4.17.0-multi。如果您使用的是脱机环境,请将<ocp_release_image>替换为摘要镜像。要提取 OpenShift Container Platform 发行版镜像摘要,请参见“提取 OpenShift Container Platform 发行版镜像摘要”。
    8 指定Amazon资源名称 (ARN),例如arn:aws:iam::820196288204:role/myrole
  2. 通过运行以下命令向托管集群添加NodePool对象

    $ hcp create nodepool aws \
      --cluster-name <hosted_cluster_name> \(1)
      --name <nodepool_name> \(2)
      --node-count <node_pool_replica_count> (3)
    1 指定托管集群的名称,例如,example
    2 指定节点池名称。
    3 指定节点池副本数量,例如,3

在 AWS 托管集群上创建 ARM 或 AMD NodePool 对象

您可以从同一个托管控制平面调度NodePool对象上的应用程序工作负载,这些对象在 64 位 ARM 和 AMD 上运行。您可以在NodePool规范中定义arch字段来设置NodePool对象所需的处理器架构。arch字段的有效值如下:

  • arm64

  • amd64

先决条件
步骤
  • 通过运行以下命令向 AWS 上的托管集群添加 ARM 或 AMD NodePool 对象

    $ hcp create nodepool aws \
      --cluster-name <hosted_cluster_name> \(1)
      --name <node_pool_name> \(2)
      --node-count <node_pool_replica_count> \(3)
      --arch <architecture> (4)
    1 指定托管集群的名称,例如,example
    2 指定节点池名称。
    3 指定节点池副本数量,例如,3
    4 指定架构类型,例如arm64amd64。如果您没有为--arch标志指定值,则默认使用amd64值。

在 AWS 上创建一个私有托管集群

启用local-cluster作为托管集群后,您可以在 Amazon Web Services (AWS) 上部署托管集群或私有托管集群。

默认情况下,托管集群可以通过公共 DNS 和管理集群的默认路由器公开访问。

对于 AWS 上的私有集群,与托管集群的所有通信都通过 AWS PrivateLink 进行。

先决条件
  • 您已启用 AWS PrivateLink。更多信息,请参见“启用 AWS PrivateLink”。

  • 您已创建 AWS Identity and Access Management (IAM) 角色和 AWS 安全令牌服务 (STS) 凭据。更多信息,请参见“创建 AWS IAM 角色和 STS 凭据”和“身份和访问管理 (IAM) 权限”。

  • 您已配置了 AWS 上的堡垒机实例

步骤
  • 通过输入以下命令在 AWS 上创建一个私有托管集群

    $ hcp create cluster aws \
      --name <hosted_cluster_name> \(1)
      --node-pool-replicas=<node_pool_replica_count> \(2)
      --base-domain <basedomain> \(3)
      --pull-secret <path_to_pull_secret> \(4)
      --sts-creds <path_to_sts_credential_file> \(5)
      --region <region> \(6)
      --endpoint-access Private \(7)
      --role-arn <role_name> (8)
    1 指定托管集群的名称,例如,example
    2 指定节点池副本数量,例如,3
    3 指定您的基础域名,例如,example.com
    4 指定您的拉取密钥的路径,例如,/user/name/pullsecret
    5 指定AWS STS凭证文件的路径,例如,/home/user/sts-creds/sts-creds.json
    6 指定AWS区域名称,例如,us-east-1
    7 定义集群是公共的还是私有的。
    8 指定 Amazon 资源名称 (ARN),例如,arn:aws:iam::820196288204:role/myrole。有关 ARN 角色的更多信息,请参见“身份和访问管理 (IAM) 权限”。

    托管集群的以下 API 端点可以通过私有 DNS 区域访问

  • api.<hosted_cluster_name>.hypershift.local

  • *.apps.<hosted_cluster_name>.hypershift.local

访问 AWS 上的私有管理集群

其他资源

您可以使用命令行界面 (CLI) 访问您的私有管理集群。

步骤
  1. 通过输入以下命令查找节点的私有 IP

    $ aws ec2 describe-instances --filter="Name=tag:kubernetes.io/cluster/<infra_id>,Values=owned" | jq '.Reservations[] | .Instances[] | select(.PublicDnsName=="") | .PrivateIpAddress'
  2. 通过输入以下命令为托管集群创建一个kubeconfig文件,您可以将其复制到节点

    $ hcp create kubeconfig > <hosted_cluster_kubeconfig>
  3. 要通过堡垒机 SSH 到其中一个节点,请输入以下命令

    $ ssh -o ProxyCommand="ssh ec2-user@<bastion_ip> -W %h:%p" core@<node_ip>
  4. 在 SSH shell 中,通过输入以下命令将kubeconfig文件内容复制到节点上的文件

    $ mv <path_to_kubeconfig_file> <new_file_name>
  5. 通过输入以下命令导出kubeconfig文件

    $ export KUBECONFIG=<path_to_kubeconfig_file>
  6. 通过输入以下命令观察托管集群状态

    $ oc get clusteroperators clusterversion