第 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。
流程
运行以下命令,创建一个可对集群托管 OIDC 发现文档的公共访问权限的 S3 存储桶:
$ aws s3api create-bucket --bucket <bucket_name> \1 --create-bucket-configuration LocationConstraint=<region> \2 --region <region> 3
$ 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 计算机,则必须导出存储桶名称才能使策略正常工作。
-
为 HyperShift Operator 创建一个名为
hypershift-operator-oidc-provider-s3-credentials
的 OIDC S3 secret。 -
将 secret 保存到
local-cluster
命名空间中。 请查看下表以验证 secret 是否包含以下字段:
表 4.1. AWS secret 的必填字段 字段名称 描述 bucket
包含具有公共访问权限的 S3 存储桶,用于保存托管集群的 OIDC 发现文档。
credentials
对包含可以访问存储桶的
default
配置集凭证的文件的引用。默认情况下,HyperShift 仅使用default
配置集来运行bucket
。region
指定 S3 存储桶的区域。
要创建 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 凭证。
流程
运行以下命令,获取用户的 Amazon 资源名称(ARN):
$ aws sts get-caller-identity --query "Arn" --output text
输出示例
arn:aws:iam::1234567890:user/<aws_username>
使用此输出作为下一步中
<arn>
的值。创建一个包含角色信任关系配置的 JSON 文件。请参见以下示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "<arn>" 1 }, "Action": "sts:AssumeRole" } ] }
- 1
- 将
<arn>
替换为您在上一步中记下的用户的 ARN。
运行以下命令来创建 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"
输出示例
arn:aws:iam::820196288204:role/myrole
创建名为
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": "*" } ] }
运行以下命令,将
policy.json
文件附加到角色中:$ aws iam put-role-policy \ --role-name <role_name> \1 --policy-name <policy_name> \2 --policy-document file://policy.json 3
运行以下命令,在名为
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.5. 为托管 control plane 启用 AWS PrivateLink
要使用 PrivateLink 在 Amazon Web Services (AWS) 上置备托管的 control plane,请为托管 control plane 启用 AWS PrivateLink。
流程
-
为 HyperShift Operator 创建 AWS 凭证 secret,并将其命名为
hypershift-operator-private-link-credentials
。secret 必须位于用作管理集群的受管集群的命名空间中。如果使用local-cluster
,请在local-cluster
命名空间中创建 secret。 - 下表确认 secret 包含必填字段:
字段名称 | 描述 |
---|---|
可选或必需的 |
|
与私有链接一起使用的区域 | 必填 |
| 凭证访问密钥 ID。 |
必填 |
|
凭证访问密钥 secret。 | 必填 |
要创建 AWS secret,请运行以下命令:
$ 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
secret 的灾难恢复备份不会被自动启用。运行以下命令添加可备份 hypershift-operator-private-link-credentials
secret 的标签:
$ oc label secret hypershift-operator-private-link-credentials -n local-cluster cluster.open-cluster-management.io/backup=""
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 为托管的集群服务
创建名称记录,用于指定 LoadBalancer
或 Route
的发布类型,并为该发布类型提供主机名。对于带有 Private
或 PublicAndPrivate
端点访问类型的托管集群,只有 APIServer
和 OAuth
服务支持主机名。对于 私有
托管集群,DNS 记录解析为 VPC 中 Virtual Private Cloud (VPC) 端点的专用 IP 地址。
托管 control plane 会公开以下服务:
-
APIServer
-
OIDC
您可以使用 HostedCluster
规格中的 servicePublishingStrategy
字段来公开这些服务。默认情况下,对于 LoadBalancer
和 Route
类型的 servicePublishingStrategy
,您可以通过以下方法之一发布该服务:
-
通过使用处于
LoadBalancer
类型的Service
状态的负载均衡器的主机名。 -
通过使用
Route
资源的status.host
字段。
但是,当您在受管服务上下文中部署托管 control plane 时,这些方法可以公开底层管理集群的 ingress 子域,并限制管理集群生命周期和灾难恢复的选项。
当 DNS 间接在 LoadBalancer
和 Route
发布类型上分层时,受管服务操作员可以使用服务级别域发布所有公共托管集群服务。这个架构允许将 DNS 名称重新映射到新的 LoadBalancer
或 Route
,且不会公开管理集群的 ingress 域。托管 control plane 使用外部 DNS 来实现间接层。
您可以在管理集群的 hypershift
命名空间中部署 external-dns
和 HyperShift Operator。用于监视具有 external-dns.alpha.kubernetes.io/hostname
注解的 Services
或 Routes
的外部 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。
-
为 HyperShift Operator 创建 Amazon Web Services (AWS) 凭证 secret,并将其命名为
local-cluster
命名空间中的hypershift-operator-external-dns-credentials
。 查看下表以验证 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 服务时是可选的
要创建 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 管理控制台中完成以下步骤。
流程
- 在 Route 53 管理控制台中,点 Create hosted zone。
- 在 Hosted zone configuration 页面中,键入域名,验证已选择 Publish hosted zone 作为类型,然后点 Create hosted zone。
- 创建区域后,在 Records 选项卡中,请注意 Value/Route traffic to 栏中的值。
- 在主域中,创建一个 NS 记录,将 DNS 请求重定向到委派的区域。在 Value 字段中,输入您在上一步中记录的值。
- 点 Create records。
通过在新子区中创建测试条目并使用
dig
命令进行测试,以验证 DNS 托管区是否正常工作,如下例所示:$ dig +short test.user-dest-public.aws.kerberos.com
输出示例
192.168.1.1
要创建为
LoadBalancer
和Route
服务设置主机名的托管集群,请输入以下命令:$ 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 创建 Services
和 Routes
资源,并使用 external-dns.alpha.kubernetes.io/hostname
注解为它们添加注解。对于 Services
和 Routes
,Control Plane Operator 将 servicePublishingStrategy
字段中的 hostname
参数的值用于服务端点。要创建 DNS 记录,您可以使用某种机制,如 external-dns
部署。
您只能为公共服务配置服务级别 DNS 间接。您不能为私有服务设置主机名
,因为它们使用 hypershift.local
私有区。
下表显示了何时能够为服务和端点组合设置主机名
:
service | 公开 |
---|---|
PublicAndPrivate | 私有 |
| Y |
Y | N |
| Y |
Y | N |
| Y |
N | N |
| Y |
N | N |
4.1.6.4. 使用 AWS 上的外部 DNS 创建托管集群
要使用 Amazon Web Services (AWS) 上的 PublicAndPrivate
或 Public
策略来创建托管集群,您必须在管理集群中配置以下工件:
- 公共 DNS 托管区
- External DNS Operator
- HyperShift Operator
您可以使用 hcp
命令行界面 (CLI)部署托管集群。
流程
要访问您的管理集群,请输入以下命令:
$ export KUBECONFIG=<path_to_management_cluster_kubeconfig>
输入以下命令验证 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
要使用外部 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
。您只能使用Public
或PublicAndPrivate
配置来使用外部 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 架构上运行托管集群"。
有关节点池和托管集群兼容组合,请参阅下表:
托管的集群 | 节点池 |
---|---|
AMD64 | AMD64 或 ARM64 |
ARM64 | ARM64 或 AMD64 |
先决条件
-
您已设置了托管的 control plane CLI
hcp
。 -
您已启用了
local-cluster
受管集群作为管理集群。 - 您创建了 AWS Identity and Access Management (IAM) 角色和 AWS 安全令牌服务(STS) 凭证。
流程
要在 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
- 默认情况下,所有
HostedCluster
和NodePool
自定义资源都会在clusters
命名空间中创建。您可以使用--namespace <namespace>
参数,在特定命名空间中创建HostedCluster
和NodePool
自定义资源。 - 9
- 指定 Amazon Resource Name (ARN),例如
arn:aws:iam::820196288204:role/myrole
。 - 10
- 如果要指明 EC2 实例是否在共享或单个租户硬件上运行,请包含此字段。
--render-into
标志会将 Kubernetes 资源呈现到您在此字段中指定的 YAML 文件中。然后,继续执行下一步来编辑 YAML 文件。
如果在上一命令中包含了
--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
验证
验证托管集群的状态,以检查
AVAILABLE
的值是否为True
。运行以下命令:$ oc get hostedclusters -n <hosted_cluster_namespace>
运行以下命令,获取节点池列表:
$ 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)访问托管集群。
流程
输入以下命令生成
kubeconfig
文件:$ hcp create kubeconfig --namespace <hosted_cluster_namespace> --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfig
保存
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-1a
和us-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
4.1.9. 在 ARM64 架构上运行托管集群
默认情况下,对于 Amazon Web Services (AWS)上的托管 control plane,您可以使用 AMD64 托管的集群。但是,您可以启用托管的 control plane 在 ARM64 托管的集群中运行。
有关节点池和托管集群兼容组合,请参阅下表:
托管的集群 | 节点池 |
---|---|
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 凭证"。
流程
输入以下命令在 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
。
运行以下命令,将
NodePool
对象添加到托管集群:$ hcp create nodepool aws \ --cluster-name <hosted_cluster_name> \1 --name <nodepool_name> \2 --node-count <node_pool_replica_count> 3
4.1.9.2. 在 AWS 托管集群中创建 ARM 或 AMD NodePool 对象
您可以调度应用程序负载,它是来自同一托管的 control plane 的 64 位 ARM 和 AMD 上的 NodePool
对象。您可以在 NodePool
规格中定义 arch
字段,为 NodePool
对象设置所需的处理器架构。arch
字段的有效值如下:
-
arm64
-
amd64
先决条件
-
您必须具有多架构镜像才能使用
HostedCluster
自定义资源。您可以访问 multi-architecture nightly 镜像。
流程
运行以下命令,将 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
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)访问私有管理集群。
流程
输入以下命令查找节点的专用 IP:
$ aws ec2 describe-instances --filter="Name=tag:kubernetes.io/cluster/<infra_id>,Values=owned" | jq '.Reservations[] | .Instances[] | select(.PublicDnsName=="") | .PrivateIpAddress'
输入以下命令为可复制到节点的托管集群创建
kubeconfig
文件:$ hcp create kubeconfig > <hosted_cluster_kubeconfig>
要通过 bastion 连接到其中一个节点,请输入以下命令:
$ ssh -o ProxyCommand="ssh ec2-user@<bastion_ip> -W %h:%p" core@<node_ip>
在 SSH shell 中,输入以下命令将
kubeconfig
文件内容复制到节点上的文件中:$ mv <path_to_kubeconfig_file> <new_file_name>
输入以下命令导出
kubeconfig
文件:$ export KUBECONFIG=<path_to_kubeconfig_file>
输入以下命令观察托管的集群状态:
$ oc get clusteroperators clusterversion