第 4 章 部署托管的 control plane


4.1. 在 AWS 上部署托管的 control plane

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

您可以使用 multicluster engine Operator 控制台或托管的 control plane 命令行界面 (CLI) hcp 创建托管集群。托管的集群自动导入为受管集群。但是,您可以将此自动导入功能禁用到多集群引擎 Operator 中

4.1.1. 准备在 AWS 上部署托管的 control plane

当您准备在 Amazon Web Services (AWS) 上部署托管 control plane 时,请考虑以下信息:

  • 每个托管集群都必须具有集群范围的唯一名称。托管的集群名称不能与任何现有的受管集群相同,以便多集群引擎 Operator 可以管理它。
  • 不要使用 clusters 作为托管的集群名称。
  • 在托管 control plane 的同一平台上运行 hub 集群和 worker。
  • 无法在多集群引擎 Operator 受管集群的命名空间中创建托管集群。

4.1.1.1. 配置管理集群的先决条件

您必须满足以下先决条件才能配置管理集群:

  • 您已在 OpenShift Container Platform 集群中安装了 Kubernetes Operator 2.5 及之后的版本的多集群引擎。安装 Red Hat Advanced Cluster Management (RHACM) 时会自动安装 multicluster engine Operator。multicluster engine Operator 也可以在没有 RHACM 作为 OpenShift Container Platform OperatorHub 中的 Operator 的情况下安装。
  • 至少有一个受管 OpenShift Container Platform 集群用于多集群引擎 Operator。local-cluster 在 multicluster engine Operator 版本 2.5 及更新的版本中自动导入。您可以运行以下命令来检查 hub 集群的状态:

    $ oc get managedclusters local-cluster
  • 已安装 aws 命令行界面(CLI)
  • 已安装托管的 control plane CLI hcp

4.1.2. 创建 Amazon Web Services S3 存储桶和 S3 OIDC secret

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

流程

  1. 运行以下命令,创建一个可对集群托管 OIDC 发现文档的公共访问权限的 S3 存储桶:

    $ aws s3api create-bucket --bucket <bucket_name> \1
      --create-bucket-configuration LocationConstraint=<region> \2
      --region <region> 3
    1
    <bucket_name > 替换为您要创建的 S3 存储桶的名称。
    2 3
    要在 us-east-1 区域以外的区域中创建存储桶,请包含这一行,并将 &lt ;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 secret。
  3. 将 secret 保存到 local-cluster 命名空间中。
  4. 请查看下表以验证 secret 是否包含以下字段:

    表 4.1. AWS secret 的必填字段
    字段名称描述

    bucket

    包含具有公共访问权限的 S3 存储桶,用于保存托管集群的 OIDC 发现文档。

    credentials

    对包含可以访问存储桶的 default 配置集凭证的文件的引用。默认情况下,HyperShift 仅使用 default 配置集来运行 bucket

    region

    指定 S3 存储桶的区域。

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

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

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

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

4.1.3. 为托管集群创建可路由的公共区

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

流程

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

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

4.1.4. 创建 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"
                  }
              }

4.1.6. 为 AWS 上托管的 control plane 启用外部 DNS

control plane 和数据平面在托管的 control plane 中是相互独立的。您可以在两个独立区域中配置 DNS:

  • 托管集群中的工作负载的 Ingress,如以下域:*.apps.service-consumer-domain.com
  • 管理集群中的服务端点的 Ingress,如通过服务提供商域提供 API 或 OAuth 端点:service-provider-domain.com

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

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

托管 control plane 会公开以下服务:

  • APIServer
  • OIDC

您可以使用 HostedCluster 规格中的 servicePublishingStrategy 字段来公开这些服务。默认情况下,对于 LoadBalancerRoute 类型的 servicePublishingStrategy,您可以通过以下方法之一发布该服务:

  • 通过使用处于 LoadBalancer 类型的 Service 状态的负载均衡器的主机名。
  • 通过使用 Route 资源的 status.host 字段。

但是,当您在受管服务上下文中部署托管 control plane 时,这些方法可以公开底层管理集群的 ingress 子域,并限制管理集群生命周期和灾难恢复的选项。

当 DNS 间接在 LoadBalancerRoute 发布类型上分层时,受管服务操作员可以使用服务级别域发布所有公共托管集群服务。这个架构允许将 DNS 名称重新映射到新的 LoadBalancerRoute,且不会公开管理集群的 ingress 域。托管 control plane 使用外部 DNS 来实现间接层。

您可以在管理集群的 hypershift 命名空间中部署 external-dns 和 HyperShift Operator。用于监视具有 external-dns.alpha.kubernetes.io/hostname 注解的 ServicesRoutes 的外部 DNS该注解用于创建指向服务的 DNS 记录,如一个记录,或路由,如一个 CNAME 记录。

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

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

4.1.6.1. 先决条件

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

  • 您创建了外部公共域。
  • 您可以访问 AWS Route53 管理控制台。
  • 为托管 control plane 启用了 AWS PrivateLink。

4.1.6.2. 为托管的 control plane 设置外部 DNS

您可以使用外部 DNS 或服务级别 DNS 置备托管的 control plane。

  1. 为 HyperShift Operator 创建 Amazon Web Services (AWS) 凭证 secret,并将其命名为 local-cluster 命名空间中的 hypershift-operator-external-dns-credentials
  2. 查看下表以验证 secret 是否具有必填字段:

    表 4.3. AWS secret 的必填字段
    字段名称描述

    可选或必需的

    provider

    管理服务级别 DNS 区的 DNS 供应商。

    必需

    domain-filter

    服务级别域。

    必需

    credentials

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

    在使用 AWS 密钥时是可选的

    aws-access-key-id

    凭证访问密钥 ID。

    在使用 AWS DNS 服务时是可选的

    aws-secret-access-key

    凭证访问密钥 secret。

    在使用 AWS DNS 服务时是可选的

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

    $ 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
    注意

    secret 的灾难恢复备份不会被自动启用。要为灾难恢复备份 secret,请输入以下命令添加 hypershift-operator-external-dns-credentials

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

4.1.6.3. 创建公共 DNS 托管区

External DNS Operator 使用公共 DNS 托管区来创建公共托管集群。

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

流程

  1. 在 Route 53 管理控制台中,点 Create hosted zone
  2. Hosted zone configuration 页面中,键入域名,验证已选择 Publish hosted zone 作为类型,然后点 Create hosted zone
  3. 创建区域后,在 Records 选项卡中,请注意 Value/Route traffic to 栏中的值。
  4. 在主域中,创建一个 NS 记录,将 DNS 请求重定向到委派的区域。在 Value 字段中,输入您在上一步中记录的值。
  5. Create records
  6. 通过在新子区中创建测试条目并使用 dig 命令进行测试,以验证 DNS 托管区是否正常工作,如下例所示:

    $ dig +short test.user-dest-public.aws.kerberos.com

    输出示例

    192.168.1.1

  7. 要创建为 LoadBalancerRoute 服务设置主机名的托管集群,请输入以下命令:

    $ 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

Control Plane Operator 创建 ServicesRoutes 资源,并使用 external-dns.alpha.kubernetes.io/hostname 注解为它们添加注解。对于 ServicesRoutes,Control Plane Operator 将 servicePublishingStrategy 字段中的 hostname 参数的值用于服务端点。要创建 DNS 记录,您可以使用某种机制,如 external-dns 部署。

您只能为公共服务配置服务级别 DNS 间接。您不能为私有服务设置主机名,因为它们使用 hypershift.local 私有区。

下表显示了何时能够为服务和端点组合设置主机名

表 4.4. 用于设置主机名的服务和端点组合
service公开

PublicAndPrivate

私有

APIServer

Y

Y

N

OAuthServer

Y

Y

N

Konnectivity

Y

N

N

Ignition

Y

N

N

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

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

  • 公共 DNS 托管区
  • External DNS Operator
  • HyperShift Operator

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

流程

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

    $ export KUBECONFIG=<path_to_management_cluster_kubeconfig>
  2. 输入以下命令验证 External 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 Resource Name (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
    指定 pull secret 文件的路径。
    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

4.1.7. 在 AWS 上创建托管集群

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

默认情况下,对于 Amazon Web Services (AWS)上的托管 control plane,您可以使用 AMD64 托管的集群。但是,您可以启用托管的 control plane 在 ARM64 托管的集群中运行。如需更多信息,请参阅"在 ARM64 架构上运行托管集群"。

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

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

AMD64

AMD64 或 ARM64

ARM64

ARM64 或 AMD64

先决条件

  • 您已设置了托管的 control plane CLI hcp
  • 您已启用了 local-cluster 受管集群作为管理集群。
  • 您创建了 AWS Identity and Access Management (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
    指定 pull secret 的路径,例如 /user/name/pullsecret
    6
    指定 AWS 区域名称,如 us-east-1
    7
    指定节点池副本数,例如 3
    8
    默认情况下,所有 HostedClusterNodePool 自定义资源都会在 clusters 命名空间中创建。您可以使用-- namespace <namespace> 参数,在特定命名空间中创建 HostedClusterNodePool 自定义资源。
    9
    指定 Amazon Resource Name (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
    为 tenancy 指定有效的值:" default""dedicated""host "。当节点池实例在共享硬件上运行时,请使用 "default "。当每个节点池实例在单租户硬件上运行时,请使用 "dedicated "。当节点池实例在预分配的专用主机上运行时,请使用 "host "。

验证

  1. 验证托管集群的状态,以检查 AVAILABLE 的值是否为 True。运行以下命令:

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

    $ oc get nodepools --namespace <hosted_cluster_namespace>

4.1.7.1. 使用 kubeadmin 凭证在 AWS 上访问托管集群

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

托管的集群命名空间包含托管的集群资源和访问 secret。托管 control plane 在托管的 control plane 命名空间中运行。

secret 名称格式如下:

  • kubeconfig secret: <hosted_cluster_namespace>-<name>-admin-kubeconfig.例如 clusters-hypershift-demo-admin-kubeconfig
  • kubeadmin 密码 secret: <hosted_cluster_namespace>-<name>-kubeadmin-password。例如,clusters-hypershift-demo-kubeadmin-password
注意

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

流程

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

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

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

4.1.7.2. 使用 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

4.1.8. 在 AWS 上的多个区中创建托管集群

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

先决条件

  • 您创建了 AWS Identity and Access Management (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
    指定 pull secret 的路径,例如 /user/name/pullsecret
    5
    指定 Amazon Resource Name (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 中设置。

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

当使用 hcp create cluster aws 命令创建托管集群时,您必须提供 Amazon Web Services (AWS) 帐户凭证来为托管集群创建基础架构资源。

基础架构资源包括以下示例:

  • 虚拟私有云(VPC)
  • 子网
  • 网络地址转换 (NAT) 网关

您可以使用以下任一方法提供 AWS 凭证:

  • AWS 安全令牌服务 (STS) 凭证
  • 来自多集群引擎 Operator 的 AWS 云供应商 secret

流程

  • 要通过提供 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
    指定 pull secret 的路径,例如 /user/name/pullsecret
    5
    指定 AWS STS 凭证文件的路径,例如 /home/user/sts-creds/sts-creds.json
    6
    指定 AWS 区域名称,如 us-east-1
    7
    指定 Amazon Resource Name (ARN),例如 arn:aws:iam::820196288204:role/myrole

4.1.9. 在 ARM64 架构上运行托管集群

默认情况下,对于 Amazon Web Services (AWS)上的托管 control plane,您可以使用 AMD64 托管的集群。但是,您可以启用托管的 control plane 在 ARM64 托管的集群中运行。

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

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

AMD64

AMD64 或 ARM64

ARM64

ARM64 或 AMD64

4.1.9.1. 在 ARM64 OpenShift Container Platform 集群中创建托管集群

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

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

先决条件

  • 您必须有一个在 AWS 上安装 64 位 ARM 基础架构的 OpenShift Container Platform 集群。如需更多信息,请参阅创建 OpenShift Container Platform Cluster: 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
    指定 pull secret 的路径,例如 /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 Resource Name (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

4.1.9.2. 在 AWS 托管集群中创建 ARM 或 AMD NodePool 对象

您可以调度应用程序负载,它是来自同一托管的 control plane 的 64 位 ARM 和 AMD 上的 NodePool 对象。您可以在 NodePool 规格中定义 arch 字段,为 NodePool 对象设置所需的处理器架构。arch 字段的有效值如下:

  • arm64
  • amd64

先决条件

流程

  • 运行以下命令,将 ARM 或 AMD NodePool 对象添加到 AWS 上的托管集群:

    $ 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

4.1.10. 在 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 凭证"和"Identity and Access Management (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
    指定 pull secret 的路径,例如 /user/name/pullsecret
    5
    指定 AWS STS 凭证文件的路径,例如 /home/user/sts-creds/sts-creds.json
    6
    指定 AWS 区域名称,如 us-east-1
    7
    定义集群是公共还是私有。
    8
    指定 Amazon Resource Name (ARN),例如 arn:aws:iam::820196288204:role/myrole。有关 ARN 角色的更多信息,请参阅"Identity and Access Management (IAM) 权限"。

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

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

4.1.10.1. 访问 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. 要通过 bastion 连接到其中一个节点,请输入以下命令:

    $ 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
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.