第 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 OperatorHub 中的 Operator 的情况下安装。
至少有一个受管 OpenShift Container Platform 集群用于多集群引擎 Operator。
local-cluster
在 multicluster engine Operator 版本 2.5 及更新的版本中自动导入。您可以运行以下命令来检查 hub 集群的状态:oc get managedclusters local-cluster
$ oc get managedclusters local-cluster
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
已安装
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> \ --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.json
Copy 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-cluster
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意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
$ oc label secret hypershift-operator-oidc-provider-s3-credentials \ -n local-cluster cluster.open-cluster-management.io/backup=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.3. 为托管集群创建可路由的公共区 复制链接链接已复制到粘贴板!
要访问托管的集群中的应用程序,您必须配置可路由的公共区。如果 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.4. 创建 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 text
Copy 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/myrole
Copy 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.json
3 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.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow sts-creds.json
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
$ 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.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该注解用于创建指向 Service
的 DNS 记录,如 A 记录或 Route
,如 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 是否具有必填字段:
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-cluster
Copy 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.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
$ dig +short test.user-dest-public.aws.kerberos.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
192.168.1.1
192.168.1.1
Copy 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.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>
$ 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-dns
Copy 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 40s
Copy 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.6.5. 定义自定义 DNS 名称 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用与用于节点 bootstrap 和 control plane 通信的内部端点不同的外部 API DNS 名称创建托管集群。您可能想要定义不同的 DNS 名称,理由如下:
- 将面向用户的 TLS 证书替换为公共 CA 中的一个,而不破坏绑定到内部 root CA 的 control plane 功能
- 支持 split-horizon DNS 和 NAT 场景
-
为确保与独立 control plane 类似的体验,您可以使用的功能,如 "Show Login Command" 功能,以及正确的
kubeconfig
和 DNS 配置
您可以通过在 HostedCluster
对象的 kubeAPIServerDNSName
字段中输入域名,在初始设置或第 2 天操作期间定义 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
字段中被引用为 CustomKubeconfig
。CustomKubeConfig
字段是可选的,只有在 kubeAPIServerDNSName
字段不为空时才可以添加。当设置 CustomKubeConfig
字段时,它会在 HostedCluster
命名空间中触发名为 < hosted_cluster_name>-custom-admin-kubeconfig
的 secret 生成。您可以使用 secret 访问 HostedCluster
API 服务器。如果您在第 2 天操作过程中删除 CustomKubeConfig
字段,则会删除所有相关 secret 和状态引用。
此过程不会影响数据平面,因此不会发生任何推出部署。HostedControlPlane
命名空间从 HyperShift Operator 接收更改并删除对应的字段。
如果您从 HostedCluster
对象的规格中删除 kubeAPIServerDNSName
字段,则所有新生成的 secret 和 CustomKubeconfig
引用都会从集群中和 status
字段中删除。
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 上创建托管集群,请运行以下命令:
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.7.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
$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kubeadmin
密码 secret 也为 Base64 编码的。您可以对它进行解码,并使用密码登录到托管集群的 API 服务器或控制台。
4.1.7.2. 使用 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
$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您必须对
kubeadmin
密码 secret 进行解码,才能登录到 API 服务器或托管集群的控制台。
4.1.7.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>.kubeconfig
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 保存
kubeconfig
文件后,输入以下命令访问托管集群:oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes
$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.8. 在托管集群中配置自定义 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>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
- 检查 API 服务器 pod,以确保挂载了新证书。
- 使用自定义域名测试与 API 服务器的连接。
-
在浏览器中或使用
openssl
等工具验证证书详情。
4.1.9. 在 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.9.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.10. 在 ARM64 架构上运行托管集群 复制链接链接已复制到粘贴板!
默认情况下,对于 Amazon Web Services (AWS)上的托管 control plane,您可以使用 AMD64 托管的集群。但是,您可以启用托管的 control plane 在 ARM64 托管的集群中运行。
有关节点池和托管集群兼容组合,请参阅下表:
托管的集群 | 节点池 |
---|---|
AMD64 | AMD64 或 ARM64 |
ARM64 | ARM64 或 AMD64 |
4.1.10.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.10.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.11. 在 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.11.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 clusterversion
Copy to Clipboard Copied! Toggle word wrap Toggle overflow