第 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 的同一平台上运行管理集群和 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 软件目录中的 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. 使用 hcp CLI 访问 AWS 上的托管集群

您可以使用 hcp 命令行界面(CLI)访问托管集群来生成 kubeconfig 文件。

流程

  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

在 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 区域以外的区域中创建存储桶,请包含这一行,并将 <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> \
    1
    
      --policy file://policy.json
    1
    <bucket_name> 替换为您要创建的 S3 存储桶的名称。
    注意

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

  2. 为 HyperShift Operator 创建一个名为 hypershift-operator-oidc-provider-s3-credentials 的 OIDC S3 secret。
  3. 将 secret 保存到 local-cluster 命名空间中。
  4. 请查看下表以验证 secret 是否包含以下字段:

    Expand
    表 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.4. 为托管集群创建可路由的公共区

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

流程

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

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

4.1.5. 创建 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": "<access_key_id",
            "SecretAccessKey": "<secret_access_key>”,
            "SessionToken": "<session_token>",
            "Expiration": "<time_stamp>"
        }
    }

4.1.7. 为 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该注解用于创建指向 Service 的 DNS 记录,如 A 记录或 Route,如 CNAME 记录。

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

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

4.1.7.1. 先决条件

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

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

4.1.7.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 是否具有必填字段:

    Expand
    表 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.7.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 私有区。

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

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

APIServer

Y

Y

N

OAuthServer

Y

Y

N

Konnectivity

Y

N

N

Ignition

Y

N

N

4.1.7.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.20.0-multi
    9
    指定服务提供商拥有的公共托管区,如 service-provider-domain.com
    10
    设置为 PublicAndPrivate。您只能使用 PublicPublicAndPrivate 配置来使用外部 DNS。
    11
    指定 AWS STS 凭证文件的路径,例如 /home/user/sts-creds/sts-creds.json

4.1.7.5. 定义自定义 DNS 名称

作为集群管理员,您可以使用与用于节点 bootstrap 和 control plane 通信的内部端点不同的外部 API DNS 名称创建托管集群。您可能需要定义不同的 DNS 名称,理由如下:

  • 将面向用户的 TLS 证书替换为公共 CA 中的一个,而不破坏绑定到内部 root CA 的 control plane 功能
  • 支持 split-horizon DNS 和 NAT 场景
  • 为确保与独立 control plane 类似的体验,您可以使用带有正确的 kubeconfig 和 DNS 配置等功能,如 Show Login Command 功能。

您可以通过在 HostedCluster 对象的 kubeAPIServerDNSName 字段中输入域名来定义 DNS 名,这可以在初始设置时进行,或作为安装后的操作进行。

先决条件

  • 您有一个有效的 TLS 证书,其中包含您将在 kubeAPIServerDNSName 参数中设置的 DNS 名称。
  • 您有一个可解析的 DNS 名称 URI,可以访问并指向正确的地址。

流程

  • HostedCluster 对象的规格中,添加 kubeAPIServerDNSName 参数和域的地址,并指定要使用的证书,如下例所示:

    #...
    spec:
      configuration:
        apiServer:
          servingCerts:
            namedCertificates:
            - names:
              - xxx.example.com
              - yyy.example.com
              servingCertificate:
                name: <my_serving_certificate>
      kubeAPIServerDNSName: <custom_address> 
    1
    1
    kubeAPIServerDNSName 参数的值必须是有效且可寻址的域。

在定义了 kubeAPIServerDNSName 参数并指定证书后,Control Plane Operator 控制器会创建一个名为 custom-admin-kubeconfigkubeconfig 文件,其中的文件存储在 HostedControlPlane 命名空间中。证书的生成来自 root CA,而 HostedControlPlane 命名空间则管理证书的过期和续订。

Control Plane Operator 在 HostedControlPlane 命名空间中报告一个名为 CustomKubeconfig 的新 kubeconfig 文件。该文件使用在 kubeAPIServerDNSName 参数中定义的新服务器。

自定义 kubeconfig 文件的引用存在于 status 参数中,作为 HostedCluster 对象的 CustomKubeconfigCustomKubeConfig 参数是可选的,只有在 kubeAPIServerDNSName 参数不为空时才添加该参数。在设置了 CustomKubeConfig 参数后,参数会在 HostedCluster 命名空间中触发生成名为 <hosted_cluster_name>-custom-admin-kubeconfig 的 secret。您可以使用 secret 访问 HostedCluster API 服务器。如果在安装后操作过程中删除 CustomKubeConfig 参数,请删除所有相关 secret 和状态引用。

注意

定义自定义 DNS 名称并不会直接影响数据平面,因此不会预期发生推出部署行为。HostedControlPlane 命名空间接收来自 HyperShift Operator 的更改,并删除对应的参数。

如果您从 HostedCluster 对象的规格中删除 kubeAPIServerDNSName 字段,则所有新生成的 secret 和 CustomKubeconfig 引用都会从集群和 status 字段中删除。

4.1.8. 在 AWS 上创建托管集群

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

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

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

Expand
表 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.8.1. 访问 AWS 上的托管集群

您可以通过直接从资源获取 kubeconfig 文件和 kubeadmin 凭证来访问托管集群。

您必须熟悉托管集群的访问 secret。托管的集群命名空间包含托管的集群资源,托管的 control plane 命名空间是托管的 control plane 运行的位置。secret 名称格式如下:

  • kubeconfig secret: <hosted-cluster-namespace>-<name>-admin-kubeconfig.例如 clusters-hypershift-demo-admin-kubeconfig
  • kubeadmin password secret: <hosted-cluster-namespace>-<name>-kubeadmin-password.例如,clusters-hypershift-demo-kubeadmin-password

流程

  • kubeconfig secret 包含一个 Base64 编码的 kubeconfig 字段,您可以解码并保存到要使用以下命令使用的文件中:

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

    kubeadmin 密码 secret 也为 Base64 编码的。您可以对它进行解码,并使用密码登录到托管集群的 API 服务器或控制台。

在 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.8.3. 使用 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

要为 API 服务器配置自定义证书,请在 HostedCluster 配置的 spec.configuration.apiServer 部分中指定证书详情。

您可以在第 1 天或第 2 天操作期间配置自定义证书。但是,由于在托管集群创建过程中设置服务发布策略后,服务发布策略不可变,所以您必须知道您要配置的 Kubernetes API 服务器的主机名。

先决条件

  • 您创建了包含管理集群中的自定义证书的 Kubernetes secret。secret 包含以下键:

    • tls.crt: 证书
    • tls.key:私钥
  • 如果您的 HostedCluster 配置包含使用负载均衡器的服务发布策略,请确保证书的 Subject Alternative Names (SAN) 与内部 API 端点 (api-int) 没有冲突。内部 API 端点由您的平台自动创建和管理。如果您在自定义证书和内部 API 端点中使用相同的主机名,则可能会出现路由冲突。此规则的唯一例外是,当您将 AWS 用作供应商时,使用 PrivatePublicAndPrivate 配置。在这些情况下,SAN 冲突由平台管理。
  • 证书必须对外部 API 端点有效。
  • 证书的有效性周期与集群的预期生命周期一致。

流程

  1. 输入以下命令使用自定义证书创建 secret:

    $ oc create secret tls sample-hosted-kas-custom-cert \
      --cert=path/to/cert.crt \
      --key=path/to/key.key \
      -n <hosted_cluster_namespace>
  2. 使用自定义证书详情更新 HostedCluster 配置,如下例所示:

    spec:
      configuration:
        apiServer:
          servingCerts:
            namedCertificates:
            - names: 
    1
    
              - api-custom-cert-sample-hosted.sample-hosted.example.com
              servingCertificate: 
    2
    
                name: sample-hosted-kas-custom-cert
    1
    证书对其是有效的 DNS 名称列表。
    2
    包含自定义证书的 secret 的名称。
  3. 输入以下命令将更改应用到 HostedCluster 配置:

    $ oc apply -f <hosted_cluster_config>.yaml

验证

  • 检查 API 服务器 pod,以确保挂载了新证书。
  • 使用自定义域名测试与 API 服务器的连接。
  • 在浏览器中或使用 openssl 等工具验证证书详情。

4.1.10. 在 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.10.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.11. 在 ARM64 架构上运行托管集群

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

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

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

AMD64

AMD64 或 ARM64

ARM64

ARM64 或 AMD64

您可以使用多架构发行镜像覆盖默认的发行镜像,在 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 凭证"。

流程

  • 输入以下命令在 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.20.0-multi。如果您使用断开连接的环境,将 <ocp_release_image> 替换为摘要镜像。要提取 OpenShift Container Platform 发行镜像摘要,请参阅"提取 OpenShift Container Platform 发行镜像摘要"。
    8
    指定 Amazon Resource Name (ARN),例如 arn:aws:iam::820196288204:role/myrole

您可以调度应用程序负载,它是来自同一托管的 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.12. 在 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.12.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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部