第 4 章 部署托管的 control plane
4.1. 在 AWS 上部署托管的 control plane 复制链接链接已复制到粘贴板!
要降低基础架构成本并提高集群管理效率,您可以在 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 需要满足几个先决条件并创建资源,包括 S3 存储桶、OIDC secret、可路由的公共区、IAM 角色和 STS 凭证。
4.1.1.1. 在 AWS 上部署托管控制平面(control plane)的先决条件 复制链接链接已复制到粘贴板!
为确保在 Amazon Web Services (AWS) 上成功部署托管的控制平面,您的环境必须满足以下要求。
- 在 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。
- 在同一平台上运行管理集群和计算节点。
- 对于每个托管集群,提供一个集群范围的唯一名称。托管的集群名称不能与任何现有的受管集群相同,以便多集群引擎 Operator 可以管理它。
-
不要使用
clusters作为托管的集群名称。 - 不要在多集群引擎 Operator 受管集群的命名空间中创建托管集群。
4.1.1.2. 创建 Amazon Web Services S3 存储桶和 S3 OIDC secret 复制链接链接已复制到粘贴板!
在 Amazon Web Services (AWS) 上创建和管理托管集群之前,您必须创建 S3 存储桶和 S3 OIDC secret。这些资源为集群提供了一个位置,用于存储有关自身的信息以及集群向 AWS 证明其身份的方法。
流程
创建一个 S3 存储桶,它对集群的主机 OIDC 发现文档有公共访问权限。
输入以下命令:
$ aws s3api create-bucket --bucket <bucket_name> \ --create-bucket-configuration LocationConstraint=<region> \ --region <region>1 其中:
<bucket_name>- 指定您要创建的 S3 存储桶的名称。
<region>-
指定在其中创建存储桶的、
us-east-1区域以外的区域。包含这一行,将<region>替换为您要使用的区域。要在us-east-1区域中创建存储桶,请省略这一行。
输入以下命令:
$ aws s3api delete-public-access-block --bucket <bucket_name>将
<bucket_name>替换为您要创建的 S3 存储桶的名称。输入以下命令:
$ echo '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<bucket_name>/*" } ] }' | envsubst > policy.json将
<bucket_name>替换为您要创建的 S3 存储桶的名称。输入以下命令:
$ aws s3api put-bucket-policy --bucket <bucket_name> \ --policy file://policy.json将
<bucket_name>替换为您要创建的 S3 存储桶的名称。注意如果使用 Mac 计算机,则必须导出存储桶名称才能使策略正常工作。
-
为 HyperShift Operator 创建一个名为
hypershift-operator-oidc-provider-s3-credentials的 OIDC S3 secret。 -
将 secret 保存到
local-cluster命名空间中。 请查看下表以验证 secret 是否包含以下字段:
Expand 表 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-credentialssecret 的标签来备份灾难恢复,请运行以下命令:$ oc label secret hypershift-operator-oidc-provider-s3-credentials \ -n local-cluster cluster.open-cluster-management.io/backup=true
4.1.1.3. 为托管集群创建可路由的公共区 复制链接链接已复制到粘贴板!
要访问托管集群中的应用程序,您必须配置可路由的公共区。
如果 public 区域存在,请跳过这一步。否则,public 区域会影响现有功能。
流程
要为 DNS 记录创建可路由的公共区,请输入以下命令:
$ aws route53 create-hosted-zone \ --name <basedomain> \ --caller-reference $(whoami)-$(date --rfc-3339=date)将
<basedomain>替换为您的基域,例如www.example.com。
4.1.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>" }, "Action": "sts:AssumeRole" } ] }将
<arn>替换为您在上一步中记下的用户的 ARN。运行以下命令来创建 Identity and Access Management (IAM) 角色:
$ aws iam create-role \ --role-name <name> \ --assume-role-policy-document file://<file_name>.json \ --query "Role.Arn"其中:
<name>-
指定角色名称,如
hcp-cli-role。 <file_name>- 指定您在上一步中创建的 JSON 文件的名称。
输出示例
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> \ --policy-name <policy_name> \ --policy-document file://policy.json其中:
<role_name>- 指定角色的名称。
<policy_name>- 指定您的策略名称。
运行以下命令,在名为
sts-creds.json的 JSON 文件中检索 STS 凭证:$ aws sts get-session-token --output json > sts-creds.jsonsts-creds.json文件示例{ "Credentials": { "AccessKeyId": "<access_key_id", "SecretAccessKey": "<secret_access_key>”, "SessionToken": "<session_token>", "Expiration": "<time_stamp>" } }
4.1.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 包含必填字段:
Expand 表 4.2. AWS secret 的必填字段 字段名称 描述 可选或必需的 region与私有链接一起使用的区域
必需
aws-access-key-id凭证访问密钥 ID。
必需
aws-secret-access-key凭证访问密钥 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-clustersecret 的灾难恢复备份不会被自动启用。运行以下命令添加可备份
hypershift-operator-private-link-credentialssecret 的标签:$ oc label secret hypershift-operator-private-link-credentials \ -n local-cluster \ cluster.open-cluster-management.io/backup=""
4.1.2. 为 AWS 上托管的 control plane 启用外部 DNS 复制链接链接已复制到粘贴板!
要自动管理 DNS 记录,您可以启用外部 DNS。通过配置此功能,您可以为集群提供在创建和删除服务和入口时自动更新 AWS Route 53 公共托管区的方法。
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该注解用于创建指向 Service 的 DNS 记录,如 A 记录或 Route,如 CNAME 记录。
您只能在云环境中使用外部 DNS。对于其他环境,您需要手动配置 DNS 和服务。
有关外部 DNS 的更多信息,请参阅外部 DNS。
4.1.2.1. 为托管的 control plane 设置外部 DNS 复制链接链接已复制到粘贴板!
要自动管理 DNS 记录,您可以为 AWS 上的托管 control plane 设置外部 DNS。您需要此配置以确保当您创建或修改服务时,AWS Route 53 公共托管区中的对应 DNS 记录会自动更新。
您可以使用外部 DNS 或服务级别 DNS 置备托管的 control plane。
先决条件
- 您创建了外部公共域。
- 您可以访问 AWS Route53 管理控制台。
- 为托管 control plane 启用了 AWS PrivateLink。
流程
-
为 HyperShift Operator 创建 Amazon Web Services (AWS) 凭证 secret,并将其命名为
local-cluster命名空间中的hypershift-operator-external-dns-credentials。 验证 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 服务时是可选的
运行以下命令来创建 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.2.2. 创建公共 DNS 托管区 复制链接链接已复制到粘贴板!
您可以创建公共 DNS 托管区来用作外部 DNS 域过滤。External DNS Operator 使用公共 DNS 托管区来创建公共托管集群。
流程
- 在 AWS 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> ...将
<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: RouteControl Plane Operator 创建
Services和Routes资源,并使用external-dns.alpha.kubernetes.io/hostname注解为它们添加注解。对于Services和Routes,Control Plane Operator 将servicePublishingStrategy字段中的hostname参数的值用于服务端点。要创建 DNS 记录,您可以使用某种机制,如external-dns部署。您只能为公共服务配置服务级别 DNS 间接。您不能为私有服务设置
主机名,因为它们使用hypershift.local私有区。下表显示了何时能够为服务和端点组合设置
主机名:Expand 表 4.4. 用于设置主机名的服务和端点组合 服务 公开 PublicAndPrivate 私有 APIServerY
Y
N
OAuthServerY
Y
N
KonnectivityY
N
N
IgnitionY
N
N
4.1.2.3. 使用 AWS 上的外部 DNS 创建托管集群 复制链接链接已复制到粘贴板!
当您在 AWS 上创建托管集群时,使用外部 DNS 与标准安装方法相比具有优势。使用外部 DNS,您可以自动将集群的服务端点与 AWS Route 53 同步。
如果没有外部 DNS,您必须手动管理每个新服务或入口的 DNS 记录,这会增加配置错误和停机时间的风险。
先决条件
您在管理集群中配置了以下工件:
- 公共 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> \ --instance-type <instance_type> \ --region <region> \ --auto-repair \ --generate-ssh \ --name <hosted_cluster_name> \ --namespace clusters \ --base-domain <service_consumer_domain> \ --node-pool-replicas <node_replica_count> \ --pull-secret <path_to_your_pull_secret> \ --release-image quay.io/openshift-release-dev/ocp-release:<ocp_release_image> \ --external-dns-domain=<service_provider_domain> \ --endpoint-access=<endpoint_access_configuration> \ --sts-creds <path_to_sts_credential_file>其中:
<arn_role>-
指定 Amazon Resource Name (ARN),例如
arn:aws:iam::820196288204:role/myrole。 <instance_types>-
指定实例类型,如
m6i.xlarge。 <region>-
指定 AWS 区域,如
us-east-1。 <hosted_cluster_name>-
指定托管集群名称,如
my-external-aws。 <service_consumer_domain>-
指定服务消费者拥有的公共托管区,如
service-consumer-domain.com。 <node_replica_count>-
指定节点副本数,例如
2。 <path_to_your_pull_secret>- 指定 pull secret 文件的路径。
<ocp_release_image>-
指定您要使用的受支持 OpenShift Container Platform 版本,如
4.21.0-multi。 <service_provider_domain>-
指定服务提供商拥有的公共托管区,如
service-provider-domain.com。 <endpoint_access_configuraton>-
指定外部 DNS 的端点访问配置。设置为
PublicAndPrivate。您只能使用Public或PublicAndPrivate配置来使用外部 DNS。 <path_to_sts_credential_file>-
指定 AWS STS 凭证文件的路径,例如
/home/user/sts-creds/sts-creds.json。
4.1.2.4. 定义自定义 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>kubeAPIServerDNSName参数的值必须是有效且可寻址的域。在定义了
kubeAPIServerDNSName参数并指定证书后,Control Plane Operator 控制器会创建一个名为custom-admin-kubeconfig的kubeconfig文件,其中的文件存储在HostedControlPlane命名空间中。证书的生成来自 root CA,而HostedControlPlane命名空间则管理证书的过期和续订。Control Plane Operator 在
HostedControlPlane命名空间中报告一个名为CustomKubeconfig的新kubeconfig文件。该文件使用在kubeAPIServerDNSName参数中定义的新服务器。自定义
kubeconfig文件的引用存在于status参数中,作为HostedCluster对象的CustomKubeconfig。CustomKubeConfig参数是可选的,只有在kubeAPIServerDNSName参数不为空时才添加该参数。在设置了CustomKubeConfig参数后,参数会在HostedCluster命名空间中触发生成名为<hosted_cluster_name>-custom-admin-kubeconfig的 secret。您可以使用 secret 访问HostedClusterAPI 服务器。如果在安装后操作过程中删除CustomKubeConfig参数,请删除所有相关 secret 和状态引用。注意定义自定义 DNS 名称并不会直接影响数据平面,因此不会预期发生推出部署行为。
HostedControlPlane命名空间接收来自 HyperShift Operator 的更改,并删除对应的参数。如果您从
HostedCluster对象的规格中删除kubeAPIServerDNSName字段,则所有新生成的 secret 和CustomKubeconfig引用都会从集群和status字段中删除。
4.1.3. 在 AWS 上创建托管集群 复制链接链接已复制到粘贴板!
在 AWS 中,您可以使用命令行界面、hcp 或提供 AWS STS 凭证来创建托管集群。您还可以在 AWS 上的多个区中创建托管集群。
托管的集群 是一个 OpenShift Container Platform 集群,其 API 端点和 control plane 托管在管理集群中。托管的集群包括控制平面和它的对应的数据平面。
托管的集群自动导入为受管集群。如果要禁用此自动导入功能,请参阅"禁用托管集群自动导入到多集群引擎 Operator"。
默认情况下,对于 AWS 上的托管 control plane,您可以使用 AMD64 托管的集群。但是,您可以启用托管的 control plane 在 ARM64 托管的集群中运行。如需更多信息,请参阅"在 ARM64 架构上运行托管集群"。
有关节点池和托管集群兼容组合,请参阅下表:
| 托管的集群 | 节点池 |
|---|---|
| AMD64 | AMD64 或 ARM64 |
| ARM64 | ARM64 或 AMD64 |
4.1.3.1. 使用 CLI 在 AWS 上创建托管集群 复制链接链接已复制到粘贴板!
要在 Amazon Web Services (AWS)上创建托管集群,您可以使用托管的 control plane 命令行界面(hcp)。
先决条件
-
您已设置了托管的 control plane CLI
hcp。 -
您已启用了
local-cluster受管集群作为管理集群。 - 您创建了 AWS Identity and Access Management (IAM) 角色和 AWS 安全令牌服务(STS) 凭证。
流程
要在 AWS 上创建托管集群,请运行以下命令:
$ hcp create cluster aws \ --name <hosted_cluster_name> \ --infra-id <infra_id> \ --base-domain <basedomain> \ --sts-creds <path_to_sts_credential_file> \ --pull-secret <path_to_pull_secret> \ --region <region> \ --generate-ssh \ --node-pool-replicas <node_pool_replica_count> \ --namespace <hosted_cluster_namespace> \ --role-arn <role_name> \ --render-into <file_name>.yaml其中:
<hosted_cluster_name>- 指定托管集群的名称。
<infra_id>-
指定您的基础架构名称。您必须为
<hosted_cluster_name>和<infra_id>提供相同的值。否则,集群可能无法在 Kubernetes Operator 控制台的多集群引擎中正确显示。 <basedomain>-
指定您的基域,例如
example.com。 <path_to_sts_credential_file>-
指定 AWS STS 凭证文件的路径,例如
/home/user/sts-creds/sts-creds.json。 <path_to_pull_secret>-
指定 pull secret 的路径,例如
/user/name/pullsecret。 <region>-
指定 AWS 区域名称,如
us-east-1。 <node_pool_replica_count>-
指定节点池副本数,例
3。 <hosted_cluster_namespace>-
指定您要在特定命名空间中创建
HostedCluster和NodePool自定义资源。否则,默认情况下,所有HostedCluster和NodePool自定义资源都会在集群命名空间中创建。 <role_name>-
指定 Amazon Resource Name (ARN),例如
arn:aws:iam::820196288204:role/myrole。 <file_name>-
指定 EC2 实例是否在共享还是单一租户硬件上运行。
--render-into标志会将 Kubernetes 资源呈现到您在此字段中指定的 YAML 文件中。继续下一步来编辑 YAML 文件。
如果在上一命令中包含了
--render-into标志,请编辑指定的 YAML 文件。编辑 YAML 文件中的NodePool规格,以指示 EC2 实例是否应该在共享或单租户硬件上运行,如下例所示:YAML 文件示例
apiVersion: hypershift.openshift.io/v1beta1 kind: NodePool metadata: name: <nodepool_name> spec: platform: aws: placement: tenancy: "default"其中:
<nodepool_name>-
指定
NodePool资源的名称。 spec.platform.aws.placement.tenancy-
为租户指定有效的值:"
default"、或"dedicated""host"。当节点池实例在共享硬件上运行时,请使用"default"。当每个节点池实例在单租户硬件上运行时,请使用"dedicated"。当节点池实例在预分配的专用主机上运行时,请使用"host"。
如果使用外部负载均衡器,通过编辑
HostedCluster资源来配置入口端点,如下例所示。如果没有配置端点,则默认行为是随机化服务在其上公开入口的节点端口。要配置入口控制器如何发布默认 ingress 路由,请设置endpointPublishingStrategy参数及其底层功能:#... spec: operatorConfiguration: ingressOperator: endpointPublishingStrategy: type: LoadBalancerService loadBalancer: scope: Internal #...spec.operatorConfiguration.ingressOperator.endPointPublishingStrategy.type参数指定负载均衡器的端点。对于 AWS,请使用LoadBalancerService类型。
验证
验证托管集群的状态,以检查
AVAILABLE的值是否为True。运行以下命令:$ oc get hostedclusters -n <hosted_cluster_namespace>运行以下命令,获取节点池列表:
$ oc get nodepools --namespace <hosted_cluster_namespace>
4.1.3.2. 通过提供 AWS STS 凭证来创建托管集群 复制链接链接已复制到粘贴板!
要增强托管 control plane 部署的安全性,您可以使用 AWS 安全令牌服务(STS)在 AWS 上创建托管集群。
当使用 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> \ --node-pool-replicas <node_pool_replica_count> \ --base-domain <base_domain> \ --pull-secret <path_to_pull_secret> \ --sts-creds <path_to_sts_credential_file> \ --region <region> \ --role-arn <arn_role>其中:
<hosted_cluster_name>-
指定托管集群的名称,如
my-hosted-cluster-01。 <node_pool_replica_count>-
指定节点池副本数,如
2。 <base_domain>-
指定您的基域,例如
example.com。 <path_to_pull_secret>-
指定 pull secret 的路径,例如
/user/name/pullsecret。 <path_to_sts_credentials>-
指定 AWS STS 凭证文件的路径,例如
/home/user/sts-creds/sts-creds.json。 <region>-
指定 AWS 区域名称,如
us-east-1。 <arn_role>-
指定 Amazon Resource Name (ARN),例如
arn:aws:iam::820196288204:role/myrole。
4.1.3.3. 在 AWS 上的多个区中创建托管集群 复制链接链接已复制到粘贴板!
要提高可用性和容错功能,您可以在多个 AWS 可用区中创建托管集群。在多个区域间分布节点池和计算节点,可保护您的工作负载不受因为单个地理位置造成的潜在中断。
您可以使用 hcp 命令行界面 (CLI)在 Amazon Web Services (AWS) 上的多个区域中创建托管集群。
先决条件
- 您创建了 AWS Identity and Access Management (IAM) 角色和 AWS 安全令牌服务(STS) 凭证。
流程
运行以下命令,在 AWS 上的多个区中创建托管集群:
$ hcp create cluster aws \ --name <hosted_cluster_name> \ --node-pool-replicas=<node_pool_replica_count> \ --base-domain <base_domain> \ --pull-secret <path_to_pull_secret> \ --role-arn <arn_role> \ --region <region> \ --zones <zones> \ --sts-creds <path_to_sts_credential_file>其中:
<hosted_cluster_name>-
指定托管集群的名称,如
my-hosted-cluster-01。 <node_pool_replica_count>-
指定节点池副本数,如
2。 <base_domain>-
指定您的基域,例如
example.com。 <path_to_pull_secret>-
指定 pull secret 的路径,例如
/user/name/pullsecret。 <arn_role>-
指定 Amazon Resource Name (ARN),例如
arn:aws:iam::820196288204:role/myrole。 <region>-
指定 AWS 区域名称,如
us-east-1。 <zones>-
指定 AWS 区域中的可用区,如
us-east-1a和us-east-1b。对于每个指定区域,会创建以下基础架构:公共子网、专用子网、NAT 网关和私有路由表。公共路由表在公共子网之间共享。为每个区创建一个NodePool资源。节点池名称带有区名称后缀。区的专用子网在spec.platform.aws.subnet.id参数中设置。 <path_to_sts_credential_file>-
指定 AWS STS 凭证文件的路径,例如
/home/user/sts-creds/sts-creds.json。
4.1.4. 访问 AWS 上的托管集群 复制链接链接已复制到粘贴板!
在 AWS 上创建托管集群后,您可以使用 kubeconfig 文件访问它,访问 secret 和 kubeadmin 凭证。
托管的集群命名空间包含托管的集群资源和访问 secret。托管 control plane 在托管的 control plane 命名空间中运行。
secret 名称格式在下表中显示:
| Secret | 格式 | 示例 |
|---|---|---|
|
|
|
|
|
|
|
|
kubeadmin 密码 secret 是 Base64 编码的,kubeconfig secret 包含以 Base64 编码的 kubeconfig 配置。您必须对 Base64 编码的 kubeconfig 配置进行解码,并将其保存到 <hosted_cluster_name>.kubeconfig 文件中。
流程
输入以下命令生成
kubeconfig文件:$ hcp create kubeconfig --namespace <hosted_cluster_namespace> \ --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfig使用包含解码的
kubeconfig配置的<hosted_cluster_name>.kubeconfig文件来访问托管集群。输入以下命令:$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes您必须对
kubeadmin密码 secret 进行解码,才能登录到 API 服务器或托管集群的控制台。
4.1.5. 在 ARM64 架构上运行托管集群 复制链接链接已复制到粘贴板!
默认情况下,对于 Amazon Web Services (AWS)上的托管 control plane,您可以使用 AMD64 托管的集群。但是,您可以启用托管的 control plane 在 ARM64 托管的集群中运行。
有关节点池和托管集群兼容组合,请参阅下表:
| 托管的集群 | 节点池 |
|---|---|
| AMD64 | AMD64 或 ARM64 |
| ARM64 | ARM64 或 AMD64 |
4.1.5.1. 在 ARM64 OpenShift Container Platform 集群中创建托管集群 复制链接链接已复制到粘贴板!
您可以使用多架构发行镜像覆盖默认的发行镜像,在 ARM64 OpenShift Container Platform 集群中为 Amazon Web Services (AWS) 运行托管集群。
如果没有使用多架构发行镜像,则节点池中的计算节点不会被创建,协调过程会停止,直到您在托管集群中使用了一个多架构发行镜像,或根据发行镜像更新了 NodePool 自定义资源。
先决条件
- 您必须有一个在 AWS 上安装 64 位 ARM 基础架构的 OpenShift Container Platform 集群。如需更多信息,请参阅 "Create an 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> \ --node-pool-replicas <node_pool_replica_count> \ --base-domain <base_domain> \ --pull-secret <path_to_pull_secret> \ --sts-creds <path_to_sts_credential_file> \ --region <region> \ --release-image quay.io/openshift-release-dev/ocp-release:<ocp_release_image> \ --role-arn <role_name>其中:
<hosted_cluster_name>-
指定托管集群的名称,如
my-hosted-cluster-01。 <node_pool_replica_count>-
指定节点池副本数,例
3。 <base_domain>-
指定您的基域,例如
example.com。 <path_to_pull_secret>-
指定 pull secret 的路径,例如
/user/name/pullsecret。 <path_to_sts_credential_file>-
指定 AWS STS 凭证文件的路径,例如
/home/user/sts-creds/sts-creds.json。 <region>-
指定 AWS 区域名称,如
us-east-1。 <ocp_release_image>-
指定您要使用的受支持 OpenShift Container Platform 版本,如
4.21.0-multi。如果您使用断开连接的环境,将<ocp_release_image>替换为摘要镜像。要提取 OpenShift Container Platform 发行镜像摘要,请参阅"提取 OpenShift Container Platform 发行镜像摘要"。 <role_name>-
指定 Amazon Resource Name (ARN),例如
arn:aws:iam::820196288204:role/myrole。
4.1.5.2. 在 AWS 托管集群中创建 ARM 或 AMD NodePool 对象 复制链接链接已复制到粘贴板!
您可以从同一托管的 control plane 将应用程序工作负载调度到 64 位 ARM 和 AMD 上。要为 NodePool 对象设置所需的处理器架构,您可以在 NodePool 规格中定义 arch 字段。
arch 字段的有效值如下:
-
arm64 -
amd64
先决条件
-
您必须具有多架构镜像才能使用
HostedCluster自定义资源。您可以在夜间访问多架构镜像。如需更多信息,请参阅"在每晚间多架构镜像"。
流程
运行以下命令,将 ARM 或 AMD
NodePool对象添加到 AWS 上的托管集群:$ hcp create nodepool aws \ --cluster-name <hosted_cluster_name> \ --name <node_pool_name> \ --node-count <node_pool_replica_count> \ --arch <architecture>其中:
<hosted_cluster_name>-
指定托管集群的名称,如
my-hosted-cluster-01。 <node_pool_name>- 指定节点池名称。
<node_pool_replica_count>-
指定节点池副本数,例
3。 <architecture>-
指定构架类型,如
arm64或amd64。如果没有为--arch标志指定值,则默认使用amd64。
4.1.6. 在 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 上配置了堡垒实例。如需更多信息,请参阅"使用 Linux Bastion 主机配置私有网络访问"。
流程
输入以下命令在 AWS 上创建私有托管集群:
$ hcp create cluster aws \ --name <hosted_cluster_name> \ --node-pool-replicas=<node_pool_replica_count> \ --base-domain <basedomain> \ --pull-secret <path_to_pull_secret> \ --sts-creds <path_to_sts_credential_file> \ --region <region> \ --endpoint-access Private \ --role-arn <role_name>其中:
<hosted_cluster_name>-
指定托管集群的名称,如
example。 <node_pool_replica_count>-
指定节点池副本数,例
3。 <basedomain>-
指定您的基域,例如
example.com。 <path_to_pull_secret>-
指定 pull secret 的路径,例如
/user/name/pullsecret。 <path_to_sts_credential_file>-
指定 AWS STS 凭证文件的路径,例如
/home/user/sts-creds/sts-creds.json。 <region>-
指定 AWS 区域名称,如
us-east-1。 私有- 指定集群是私有的。
<role_name>-
指定 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.6.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