第 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 作为 Operator 的情况下从 OpenShift Container Platform 软件目录安装。
至少有一个受管 OpenShift Container Platform 集群用于多集群引擎 Operator。
local-cluster在 multicluster engine Operator 版本 2.5 及更新的版本中自动导入。您可以运行以下命令来检查 hub 集群的状态:oc get managedclusters local-cluster
$ oc get managedclusters local-clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
已安装
aws命令行界面(CLI)。 -
已安装托管的 control plane CLI
hcp。
4.1.2. 使用 hcp CLI 访问 AWS 上的托管集群 复制链接链接已复制到粘贴板!
您可以使用 hcp 命令行界面(CLI)访问托管集群来生成 kubeconfig 文件。
流程
输入以下命令生成
kubeconfig文件:hcp create kubeconfig --namespace <hosted_cluster_namespace> \ --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfig
$ hcp create kubeconfig --namespace <hosted_cluster_namespace> \ --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfigCopy to Clipboard Copied! Toggle word wrap Toggle overflow 保存
kubeconfig文件后,您可以输入以下命令访问托管集群:oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes
$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.3. 创建 Amazon Web Services S3 存储桶和 S3 OIDC secret 复制链接链接已复制到粘贴板!
在 Amazon Web Services (AWS) 上创建和管理托管集群之前,您必须创建 S3 存储桶和 S3 OIDC secret。
流程
运行以下命令,创建一个可对集群托管 OIDC 发现文档的公共访问权限的 S3 存储桶:
aws s3api create-bucket --bucket <bucket_name> \ --create-bucket-configuration LocationConstraint=<region> \ --region <region>
$ aws s3api create-bucket --bucket <bucket_name> \1 --create-bucket-configuration LocationConstraint=<region> \2 --region <region>3 Copy to Clipboard Copied! Toggle word wrap Toggle overflow aws s3api delete-public-access-block --bucket <bucket_name>
$ aws s3api delete-public-access-block --bucket <bucket_name>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<bucket_name>替换为您要创建的 S3 存储桶的名称。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<bucket_name>替换为您要创建的 S3 存储桶的名称。
aws s3api put-bucket-policy --bucket <bucket_name> \ --policy file://policy.json
$ aws s3api put-bucket-policy --bucket <bucket_name> \1 --policy file://policy.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<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
$ oc create secret generic <secret_name> \ --from-file=credentials=<path>/.aws/credentials \ --from-literal=bucket=<s3_bucket> \ --from-literal=region=<region> \ -n local-clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意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
$ oc label secret hypershift-operator-oidc-provider-s3-credentials \ -n local-cluster cluster.open-cluster-management.io/backup=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.4. 为托管集群创建可路由的公共区 复制链接链接已复制到粘贴板!
要访问托管的集群中的应用程序,您必须配置可路由的公共区。如果 public 区域存在,请跳过这一步。否则,public 区域会影响现有功能。
流程
要为 DNS 记录创建可路由的公共区,请输入以下命令:
aws route53 create-hosted-zone \ --name <basedomain> \ --caller-reference $(whoami)-$(date --rfc-3339=date)
$ aws route53 create-hosted-zone \ --name <basedomain> \1 --caller-reference $(whoami)-$(date --rfc-3339=date)Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<basedomain>替换为您的基域,例如www.example.com。
4.1.5. 创建 AWS IAM 角色和 STS 凭证 复制链接链接已复制到粘贴板!
在 Amazon Web Services (AWS) 上创建托管集群前,您必须创建一个 AWS IAM 角色和 STS 凭证。
流程
运行以下命令,获取用户的 Amazon 资源名称(ARN):
aws sts get-caller-identity --query "Arn" --output text
$ aws sts get-caller-identity --query "Arn" --output textCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
arn:aws:iam::1234567890:user/<aws_username>
arn:aws:iam::1234567890:user/<aws_username>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用此输出作为下一步中
<arn>的值。创建一个包含角色信任关系配置的 JSON 文件。请参见以下示例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<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"
$ aws iam create-role \ --role-name <name> \1 --assume-role-policy-document file://<file_name>.json \2 --query "Role.Arn"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
arn:aws:iam::820196288204:role/myrole
arn:aws:iam::820196288204:role/myroleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
policy.json的 JSON 文件,其中包含您的角色的以下权限策略:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将
policy.json文件附加到角色中:aws iam put-role-policy \ --role-name <role_name> \ --policy-name <policy_name> \ --policy-document file://policy.json
$ aws iam put-role-policy \ --role-name <role_name> \1 --policy-name <policy_name> \2 --policy-document file://policy.json3 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在名为
sts-creds.json的 JSON 文件中检索 STS 凭证:aws sts get-session-token --output json > sts-creds.json
$ aws sts get-session-token --output json > sts-creds.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow sts-creds.json文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.6. 为托管 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
$ 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=""
$ oc label secret hypershift-operator-private-link-credentials \
-n local-cluster \
cluster.open-cluster-management.io/backup=""
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 为托管的集群服务创建名称记录,用于指定 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.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。
-
为 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
$ 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-clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意secret 的灾难恢复备份不会被自动启用。要为灾难恢复备份 secret,请输入以下命令添加
hypershift-operator-external-dns-credentials:oc label secret hypershift-operator-external-dns-credentials \ -n local-cluster \ cluster.open-cluster-management.io/backup=""
$ oc label secret hypershift-operator-external-dns-credentials \ -n local-cluster \ cluster.open-cluster-management.io/backup=""Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.7.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
$ dig +short test.user-dest-public.aws.kerberos.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
192.168.1.1
192.168.1.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要创建为
LoadBalancer和Route服务设置主机名的托管集群,请输入以下命令:hcp create cluster aws --name=<hosted_cluster_name> \ --endpoint-access=PublicAndPrivate \ --external-dns-domain=<public_hosted_zone> ...
$ hcp create cluster aws --name=<hosted_cluster_name> \ --endpoint-access=PublicAndPrivate \ --external-dns-domain=<public_hosted_zone> ...1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<public_hosted_zone>替换为您创建的公共托管区。
托管集群的
services块示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Control Plane Operator 创建 Services 和 Routes 资源,并使用 external-dns.alpha.kubernetes.io/hostname 注解为它们添加注解。对于 Services 和 Routes,Control Plane Operator 将 servicePublishingStrategy 字段中的 hostname 参数的值用于服务端点。要创建 DNS 记录,您可以使用某种机制,如 external-dns 部署。
您只能为公共服务配置服务级别 DNS 间接。您不能为私有服务设置主机名,因为它们使用 hypershift.local 私有区。
下表显示了何时能够为服务和端点组合设置主机名:
| 服务 | 公开 | PublicAndPrivate | 私有 |
|---|---|---|---|
|
| Y | Y | N |
|
| Y | Y | N |
|
| Y | N | N |
|
| Y | N | N |
4.1.7.4. 使用 AWS 上的外部 DNS 创建托管集群 复制链接链接已复制到粘贴板!
要使用 Amazon Web Services (AWS) 上的 PublicAndPrivate 或 Public 策略来创建托管集群,您必须在管理集群中配置以下工件:
- 公共 DNS 托管区
- External DNS Operator
- HyperShift Operator
您可以使用 hcp 命令行界面 (CLI)部署托管集群。
流程
要访问您的管理集群,请输入以下命令:
export KUBECONFIG=<path_to_management_cluster_kubeconfig>
$ export KUBECONFIG=<path_to_management_cluster_kubeconfig>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令验证 External DNS Operator 是否正在运行:
oc get pod -n hypershift -lapp=external-dns
$ oc get pod -n hypershift -lapp=external-dnsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE external-dns-7c89788c69-rn8gp 1/1 Running 0 40s
NAME READY STATUS RESTARTS AGE external-dns-7c89788c69-rn8gp 1/1 Running 0 40sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要使用外部 DNS 创建托管集群,请输入以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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.19.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.5. 定义自定义 DNS 名称 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用外部 API DNS 名称创建托管集群,它与用于节点 bootstrap 和 control plane 通信的内部端点不同。您可能需要定义不同的 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参数和域的地址,并指定要使用的证书,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
kubeAPIServerDNSName参数的值必须是有效且可寻址的域。
在定义了 kubeAPIServerDNSName 参数并指定证书后,Control Plane Operator 控制器会创建一个名为 custom-admin- 文件,其中的文件存储在 kubeconfig 的 kubeconfigHostedControlPlane 命名空间中。证书生成发生自 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 访问 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 架构上运行托管集群"。
有关节点池和托管集群兼容组合,请参阅下表:
| 托管的集群 | 节点池 |
|---|---|
| AMD64 | AMD64 或 ARM64 |
| ARM64 | ARM64 或 AMD64 |
先决条件
-
您已设置了托管的 control plane CLI
hcp。 -
您已启用了
local-cluster受管集群作为管理集群。 - 您创建了 AWS Identity and Access Management (IAM) 角色和 AWS 安全令牌服务(STS) 凭证。
流程
要在 AWS 上创建托管集群,请运行以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 文件示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证托管集群的状态,以检查
AVAILABLE的值是否为True。运行以下命令:oc get hostedclusters -n <hosted_cluster_namespace>
$ oc get hostedclusters -n <hosted_cluster_namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,获取节点池列表:
oc get nodepools --namespace <hosted_cluster_namespace>
$ oc get nodepools --namespace <hosted_cluster_namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.8.1. 访问 AWS 上的托管集群 复制链接链接已复制到粘贴板!
您可以通过直接从资源获取 kubeconfig 文件和 kubeadmin 凭证来访问托管集群。
您必须熟悉托管集群的访问 secret。托管的集群命名空间包含托管的集群资源,托管的 control plane 命名空间是托管的 control plane 运行的位置。secret 名称格式如下:
-
kubeconfigsecret:<hosted-cluster-namespace>-<name>-admin-kubeconfig。例如clusters-hypershift-demo-admin-kubeconfig。 -
kubeadminpassword secret:<hosted-cluster-namespace>-<name>-kubeadmin-password。例如,clusters-hypershift-demo-kubeadmin-password。
流程
kubeconfigsecret 包含一个 Base64 编码的kubeconfig字段,您可以解码并保存到要使用以下命令使用的文件中:oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes
$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow kubeadmin密码 secret 也为 Base64 编码的。您可以对它进行解码,并使用密码登录到托管集群的 API 服务器或控制台。
4.1.8.2. 使用 kubeadmin 凭证在 AWS 上访问托管集群 复制链接链接已复制到粘贴板!
在 Amazon Web Services (AWS) 上创建托管集群后,您可以通过获取 kubeconfig 文件、访问 secret 和 kubeadmin 凭证来访问托管集群。
托管的集群命名空间包含托管的集群资源和访问 secret。托管 control plane 在托管的 control plane 命名空间中运行。
secret 名称格式如下:
-
kubeconfigsecret:<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
$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您必须对
kubeadmin密码 secret 进行解码,才能登录到 API 服务器或托管集群的控制台。
4.1.8.3. 使用 hcp CLI 访问 AWS 上的托管集群 复制链接链接已复制到粘贴板!
您可以使用 hcp 命令行界面 (CLI)访问托管集群。
流程
输入以下命令生成
kubeconfig文件:hcp create kubeconfig --namespace <hosted_cluster_namespace> \ --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfig
$ hcp create kubeconfig --namespace <hosted_cluster_namespace> \ --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfigCopy to Clipboard Copied! Toggle word wrap Toggle overflow 保存
kubeconfig文件后,输入以下命令访问托管集群:oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes
$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.9. 在托管集群中配置自定义 API 服务器证书 复制链接链接已复制到粘贴板!
要为 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 用作供应商时,使用Private或PublicAndPrivate配置。在这些情况下,SAN 冲突由平台管理。 - 证书必须对外部 API 端点有效。
- 证书的有效性周期与集群的预期生命周期一致。
流程
输入以下命令使用自定义证书创建 secret:
oc create secret tls sample-hosted-kas-custom-cert \ --cert=path/to/cert.crt \ --key=path/to/key.key \ -n <hosted_cluster_namespace>
$ oc create secret tls sample-hosted-kas-custom-cert \ --cert=path/to/cert.crt \ --key=path/to/key.key \ -n <hosted_cluster_namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用自定义证书详情更新
HostedCluster配置,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令将更改应用到
HostedCluster配置:oc apply -f <hosted_cluster_config>.yaml
$ oc apply -f <hosted_cluster_config>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
- 检查 API 服务器 pod,以确保挂载了新证书。
- 使用自定义域名测试与 API 服务器的连接。
-
在浏览器中或使用
openssl等工具验证证书详情。
4.1.10. 在 AWS 上的多个区中创建托管集群 复制链接链接已复制到粘贴板!
您可以使用 hcp 命令行界面 (CLI)在 Amazon Web Services (AWS) 上的多个区域中创建托管集群。
先决条件
- 您创建了 AWS Identity and Access Management (IAM) 角色和 AWS 安全令牌服务(STS) 凭证。
流程
运行以下命令,在 AWS 上的多个区中创建托管集群:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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.10.1. 通过提供 AWS STS 凭证来创建托管集群 复制链接链接已复制到粘贴板!
当使用 hcp create cluster aws 命令创建托管集群时,您必须提供 Amazon Web Services (AWS) 帐户凭证来为托管集群创建基础架构资源。
基础架构资源包括以下示例:
- 虚拟私有云(VPC)
- 子网
- 网络地址转换 (NAT) 网关
您可以使用以下任一方法提供 AWS 凭证:
- AWS 安全令牌服务 (STS) 凭证
- 来自多集群引擎 Operator 的 AWS 云供应商 secret
流程
要通过提供 AWS STS 凭证在 AWS 上创建托管集群,请输入以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.11. 在 ARM64 架构上运行托管集群 复制链接链接已复制到粘贴板!
默认情况下,对于 Amazon Web Services (AWS)上的托管 control plane,您可以使用 AMD64 托管的集群。但是,您可以启用托管的 control plane 在 ARM64 托管的集群中运行。
有关节点池和托管集群兼容组合,请参阅下表:
| 托管的集群 | 节点池 |
|---|---|
| AMD64 | AMD64 或 ARM64 |
| ARM64 | ARM64 或 AMD64 |
4.1.11.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 集群上创建托管集群:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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.19.0-multi。如果您使用断开连接的环境,将<ocp_release_image>替换为摘要镜像。要提取 OpenShift Container Platform 发行镜像摘要,请参阅"提取 OpenShift Container Platform 发行镜像摘要"。 - 8
- 指定 Amazon Resource Name (ARN),例如
arn:aws:iam::820196288204:role/myrole。
4.1.11.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> \ --name <node_pool_name> \ --node-count <node_pool_replica_count> \ --arch <architecture>
$ 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 Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 上创建私有托管集群:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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)访问私有管理集群。
流程
输入以下命令查找节点的专用 IP:
aws ec2 describe-instances \ --filter="Name=tag:kubernetes.io/cluster/<infra_id>,Values=owned" \ | jq '.Reservations[] | .Instances[] | select(.PublicDnsName=="") \ | .PrivateIpAddress'
$ aws ec2 describe-instances \ --filter="Name=tag:kubernetes.io/cluster/<infra_id>,Values=owned" \ | jq '.Reservations[] | .Instances[] | select(.PublicDnsName=="") \ | .PrivateIpAddress'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令为可复制到节点的托管集群创建
kubeconfig文件:hcp create kubeconfig > <hosted_cluster_kubeconfig>
$ hcp create kubeconfig > <hosted_cluster_kubeconfig>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要通过 bastion 连接到其中一个节点,请输入以下命令:
ssh -o ProxyCommand="ssh ec2-user@<bastion_ip> \ -W %h:%p" core@<node_ip>
$ ssh -o ProxyCommand="ssh ec2-user@<bastion_ip> \ -W %h:%p" core@<node_ip>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 SSH shell 中,输入以下命令将
kubeconfig文件内容复制到节点上的文件中:mv <path_to_kubeconfig_file> <new_file_name>
$ mv <path_to_kubeconfig_file> <new_file_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令导出
kubeconfig文件:export KUBECONFIG=<path_to_kubeconfig_file>
$ export KUBECONFIG=<path_to_kubeconfig_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令观察托管的集群状态:
oc get clusteroperators clusterversion
$ oc get clusteroperators clusterversionCopy to Clipboard Copied! Toggle word wrap Toggle overflow