2.3. 在 GCP 上创建机器集
您可以在 Google Cloud Platform (GCP) 上的 OpenShift Container Platform 集群中创建不同的机器集来满足特定目的。例如,您可以创建基础架构机器集和相关的机器,以便将支持型工作负载转移到新机器上。
此过程不适用于使用手动置备的机器的集群。您只能在 Machine API 操作的集群中使用高级机器管理和扩展功能。
2.3.1. Machine API 概述
Machine API 将基于上游 Cluster API 项目的主要资源与自定义 OpenShift Container Platform 资源相结合。
对于 OpenShift Container Platform 4.8 集群,Machine API 在集群安装完成后执行所有节点主机置备管理操作。由于此系统的缘故,OpenShift Container Platform 4.8 在公有或私有云基础架构之上提供了一种弹性动态置备方法。
两种主要资源分别是:
- Machines
-
描述节点主机的基本单元。机器具有
providerSpec
规格,用于描述为不同云平台提供的计算节点的类型。例如,Amazon Web Services (AWS) 上的 worker 节点的机器类型可能会定义特定的机器类型和所需的元数据。 - 机器集
MachineSet
资源是机器组。机器集适用于机器,复制集则适用于 pod。如果需要更多机器或必须缩减规模,则可以更改机器集的 replicas 字段来满足您的计算需求。警告control plane 机器不能由机器集管理。
以下自定义资源可为集群添加更多功能:
- 机器自动扩展
-
MachineAutoscaler
资源自动扩展云中的机器。您可以为指定机器集中的节点设置最小和最大扩展界限,机器自动扩展就会维护此范围内的节点。ClusterAutoscaler
对象存在后,MachineAutoscaler
对象生效。ClusterAutoscaler
和MachineAutoscaler
资源都由ClusterAutoscalerOperator
对象提供。 - 集群自动扩展
- 此资源基于上游集群自动扩展项目。在 OpenShift Container Platform 实现中,它通过扩展机器集 API 来与 Machine API 集成。您可以为核心、节点、内存和 GPU 等资源设置集群范围的扩展限制。您可以设置优先级,使集群对 Pod 进行优先级排序,以便不针对不太重要的 Pod 使新节点上线。您还可以设置扩展策略,以便可以扩展节点,但不会缩减节点。
- 机器健康检查
-
MachineHealthCheck
资源可检测机器何时处于不健康状态并将其删除,然后在支持的平台上生成新的机器。
在 OpenShift Container Platform 版本 3.11 中,您无法轻松地推出多区架构,因为集群不负责管理机器置备。自 OpenShift Container Platform 版本 4.1 起,此过程变得更加容易。每个机器集限定在一个区域,因此安装程序可以代表您将机器集分发到多个可用区。然后,由于您的计算是动态的,因此在面对区域故障时,您始终都有一个区域来应对必须重新平衡机器的情况。自动扩展器在集群生命周期内尽可能提供平衡。
2.3.2. GCP 上机器设置自定义资源的 YAML 示例
此 YAML 示例定义了一个在 Google Cloud Platform (GCP) 中运行的机器集,并创建通过 node-role.kubernetes.io/<role>: ""
标记的节点。
在本例中,<infrastructure_id>
是基础架构 ID 标签,该标签基于您在置备集群时设定的集群 ID,而 <role>
则是要添加的节点标签。
apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1 name: <infrastructure_id>-w-a namespace: openshift-machine-api spec: replicas: 1 selector: matchLabels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> machine.openshift.io/cluster-api-machineset: <infrastructure_id>-w-a template: metadata: creationTimestamp: null labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> machine.openshift.io/cluster-api-machine-role: <role> 2 machine.openshift.io/cluster-api-machine-type: <role> machine.openshift.io/cluster-api-machineset: <infrastructure_id>-w-a spec: metadata: labels: node-role.kubernetes.io/<role>: "" providerSpec: value: apiVersion: gcpprovider.openshift.io/v1beta1 canIPForward: false credentialsSecret: name: gcp-cloud-credentials deletionProtection: false disks: - autoDelete: true boot: true image: <path_to_image> 3 labels: null sizeGb: 128 type: pd-ssd gcpMetadata: 4 - key: <custom_metadata_key> value: <custom_metadata_value> kind: GCPMachineProviderSpec machineType: n1-standard-4 metadata: creationTimestamp: null networkInterfaces: - network: <infrastructure_id>-network subnetwork: <infrastructure_id>-worker-subnet projectID: <project_name> 5 region: us-central1 serviceAccounts: - email: <infrastructure_id>-w@<project_name>.iam.gserviceaccount.com scopes: - https://www.googleapis.com/auth/cloud-platform tags: - <infrastructure_id>-worker userDataSecret: name: worker-user-data zone: us-central1-a
- 1
- 其中
<infrastructure_id>
是基础架构 ID,它基于您在置备集群时设定的集群 ID。如果已安装 OpenShift CLI,您可以通过运行以下命令来获取基础架构 ID:$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructure cluster
- 2
- 对于
<node>
,指定要添加的节点标签。 - 3
- 指定当前计算机器集中使用的镜像的路径。如果已安装 OpenShift CLI,您可以通过运行以下命令来获取镜像的路径:
$ oc -n openshift-machine-api \ -o jsonpath='{.spec.template.spec.providerSpec.value.disks[0].image}{"\n"}' \ get machineset/<infrastructure_id>-worker-a
要使用 GCP Marketplace 镜像,请指定要使用的功能:
-
OpenShift Container Platform:
https://www.googleapis.com/compute/v1/projects/redhat-marketplace-public/global/images/redhat-coreos-ocp-48-x86-64-202210040145
-
OpenShift Platform Plus:
https://www.googleapis.com/compute/v1/projects/redhat-marketplace-public/global/images/redhat-coreos-opp-48-x86-64-202206140145
-
OpenShift Kubernetes Engine:
https://www.googleapis.com/compute/v1/projects/redhat-marketplace-public/global/images/redhat-coreos-oke-48-x86-64-202206140145
-
OpenShift Container Platform:
- 4
- 可选:以
key:value
对的形式指定自定义元数据。有关用例,请参阅 GCP 文档,以查看设置自定义元数据。 - 5
- 对于
<project_name>
,请指定用于集群的 GCP 项目的名称。
2.3.3. 创建机器集
除了安装程序创建的机器集之外,还可创建自己的机器集来动态管理您选择的特定工作负载的机器计算资源。
先决条件
- 部署一个 OpenShift Container Platform 集群。
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
权限的用户身份登录oc
。
流程
创建一个包含机器集自定义资源(CR)示例的新 YAML 文件,并将其命名为
<file_name>.yaml
。确保设置
<clusterID>
和<role>
参数值。如果您不确定要为特定字段设置哪个值,您可以从集群中检查现有机器集:
$ oc get machinesets -n openshift-machine-api
输出示例
NAME DESIRED CURRENT READY AVAILABLE AGE agl030519-vplxk-worker-us-east-1a 1 1 1 1 55m agl030519-vplxk-worker-us-east-1b 1 1 1 1 55m agl030519-vplxk-worker-us-east-1c 1 1 1 1 55m agl030519-vplxk-worker-us-east-1d 0 0 55m agl030519-vplxk-worker-us-east-1e 0 0 55m agl030519-vplxk-worker-us-east-1f 0 0 55m
检查特定机器集的值:
$ oc get machineset <machineset_name> -n \ openshift-machine-api -o yaml
输出示例
... template: metadata: labels: machine.openshift.io/cluster-api-cluster: agl030519-vplxk 1 machine.openshift.io/cluster-api-machine-role: worker 2 machine.openshift.io/cluster-api-machine-type: worker machine.openshift.io/cluster-api-machineset: agl030519-vplxk-worker-us-east-1a
创建新的
MachineSet
CR:$ oc create -f <file_name>.yaml
查看机器集列表:
$ oc get machineset -n openshift-machine-api
输出示例
NAME DESIRED CURRENT READY AVAILABLE AGE agl030519-vplxk-infra-us-east-1a 1 1 1 1 11m agl030519-vplxk-worker-us-east-1a 1 1 1 1 55m agl030519-vplxk-worker-us-east-1b 1 1 1 1 55m agl030519-vplxk-worker-us-east-1c 1 1 1 1 55m agl030519-vplxk-worker-us-east-1d 0 0 55m agl030519-vplxk-worker-us-east-1e 0 0 55m agl030519-vplxk-worker-us-east-1f 0 0 55m
当新机器集可用时,
DESIRED
和CURRENT
的值会匹配。如果机器集不可用,请等待几分钟,然后再次运行命令。
2.3.4. 将机器部署为可抢占虚拟机实例的机器集
您可以通过创建一个在 GCP 上运行的机器集来节约成本,该 MachineSet 将机器部署为非保障的虚拟机实例。抢占虚拟机实例使用了超额的 Compute Engine 容量,且比一般实例的成本要低。您可以将抢占虚拟机实例用于可容许中断的工作负载,如批处理或无状态工作负载、横向可扩展工作负载。
GCP Compute Engine 可随时终止可抢占的虚拟机实例。Compute Engine 向用户发送抢占通知,表示会在 30 秒内发生中断。当 Compute Engine 发出抢占通知时,OpenShift Container Platform 开始从受影响的实例中删除工作负载。如果实例没有停止,则 ACPI G3 Mechanical Off 信号会在 30 秒后发送到操作系统。然后,抢占虚拟机实例由 Compute Engine 转换为 TERMINATED
状态。
使用抢占虚拟机实例时可能会出现中断,理由如下:
- 有系统或维护事件
- 提供的抢占虚拟机实例减少
- 该实例为抢占虚拟机实例到达分配的 24 小时期限的结束
当 GCP 终止一个实例时,在可抢占虚拟机实例节点上运行的终止处理器会删除机器资源。为了满足机器集副本
数量,机器集会创建一个请求抢占虚拟机实例的机器。
2.3.5. 使用机器集创建抢占虚拟机实例
您可以通过在机器设置 YAML 文件中添加 preemptible
,在 GCP 上启动抢占虚拟机实例。
流程
在
providerSpec
字段中添加以下行:providerSpec: value: preemptible: true
如果
preemptible
被设置为true
,则在实例启动后,机器将被标记为interruptable-instance
。
2.3.6. 为机器集启用客户管理的加密密钥
Google Cloud Platform(GCP)Compute Engine 允许用户提供加密密钥来加密磁盘上的数据。密钥用于对数据加密密钥进行加密,而不是加密客户的数据。默认情况下,Compute Engine 使用 Compute Engine 密钥加密这些数据。
您可以使用 Machine API 使用客户管理的密钥启用加密。您必须首先创建 KMS 密钥并为服务帐户分配正确的权限。需要 KMS 密钥名称、密钥环名称和位置来允许服务帐户使用您的密钥。
如果您不想将专用服务帐户用于 KMS 加密,则使用 Compute Engine 默认服务帐户。如果没有使用专用服务帐户,则必须授予默认服务帐户权限来访问密钥。Compute Engine 默认服务帐户名称遵循 service-<project_number>@compute-system.iam.gserviceaccount.com
模式。
流程
使用您的 KMS 密钥名称、密钥环名称和位置运行以下命令,允许特定服务帐户使用您的 KMS 密钥,并为服务帐户授予正确的 IAM 角色:
gcloud kms keys add-iam-policy-binding <key_name> \ --keyring <key_ring_name> \ --location <key_ring_location> \ --member "serviceAccount:service-<project_number>@compute-system.iam.gserviceaccount.com” \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
在机器集 YAML 文件中的
providerSpec
字段中配置加密密钥。例如:providerSpec: value: # ... disks: - type: # ... encryptionKey: kmsKey: name: machine-encryption-key 1 keyRing: openshift-encrpytion-ring 2 location: global 3 projectID: openshift-gcp-project 4 kmsKeyServiceAccount: openshift-service-account@openshift-gcp-project.iam.gserviceaccount.com 5
当使用更新的
providerSpec
对象配置创建新机器后,磁盘加密密钥就会使用 KMS 密钥加密。