6.10.17. 在 GCP 中创建额外的 worker 机器

您可以通过分散启动各个实例或利用集群外自动化流程(如自动缩放组),在 Google Cloud Platform (GCP) 中为您的集群创建 worker 机器。您还可以利用 OpenShift Container Platform 中的内置集群扩展机制和机器 API。

在本例中,您要使用 Deployment Manager 模板来手动启动一个实例。通过在文件中添加类型为 06_worker.py 的其他资源,即可启动其他实例。

注意

如果不使用提供的 Deployment Manager 模板来创建 worker 机器,您必须检查提供的信息并手动创建基础架构。如果集群没有正确初始化,您可能需要联系红帽支持并提供您的安装日志。

先决条件

  • 配置 GCP 帐户。
  • 为集群生成 Ignition 配置文件。
  • 在 GCP 中创建和配置 VPC 及相关子网。
  • 在 GCP 中创建和配置联网及负载均衡器。
  • 创建 control plane 和计算角色。
  • 创建 bootstrap 机器。
  • 创建 control plane 机器。

流程

  1. 复制本主题的 worker 机器的 Deployment Manager 模板部分中的模板,并将它以 06_worker.py 形式保存到计算机中。此模板描述了集群所需的 worker 机器。
  2. 导出资源定义使用的变量。

    1. 导出托管计算机器的子网:

      $ export COMPUTE_SUBNET=(`gcloud compute networks subnets describe ${HOST_PROJECT_COMPUTE_SUBNET} --region=${REGION} --project ${HOST_PROJECT} --account ${HOST_PROJECT_ACCOUNT} --format json | jq -r .selfLink`)
    2. 为您的服务帐户导出电子邮件地址:

      $ export WORKER_SERVICE_ACCOUNT=(`gcloud iam service-accounts list --filter "email~^${INFRA_ID}-w@${PROJECT_NAME}." --format json | jq -r '.[0].email'`)
    3. 导出计算机器 Ignition 配置文件的位置:

      $ export WORKER_IGNITION=`cat <installation_directory>/worker.ign`
  3. 创建 06_worker.yaml 资源定义文件:

    $ cat <<EOF >06_worker.yaml
    imports:
    - path: 06_worker.py
    
    resources:
    - name: 'worker-0' 1
      type: 06_worker.py
      properties:
        infra_id: '${INFRA_ID}' 2
        zone: '${ZONE_0}' 3
        compute_subnet: '${COMPUTE_SUBNET}' 4
        image: '${CLUSTER_IMAGE}' 5
        machine_type: 'n1-standard-4' 6
        root_volume_size: '128'
        service_account_email: '${WORKER_SERVICE_ACCOUNT}' 7
        ignition: '${WORKER_IGNITION}' 8
    - name: 'worker-1'
      type: 06_worker.py
      properties:
        infra_id: '${INFRA_ID}' 9
        zone: '${ZONE_1}' 10
        compute_subnet: '${COMPUTE_SUBNET}' 11
        image: '${CLUSTER_IMAGE}' 12
        machine_type: 'n1-standard-4' 13
        root_volume_size: '128'
        service_account_email: '${WORKER_SERVICE_ACCOUNT}' 14
        ignition: '${WORKER_IGNITION}' 15
    EOF
    1
    name 是 worker 机器的名称,如 worker-0
    2 9
    infra_id 是来自于提取步骤的 INFRA_ID 基础架构名称。
    3 10
    zone 是 worker 机器要部署到的区域,如 us-central1-a
    4 11
    compute_subnet 是计算子网的 selfLink
    5 12
    image 是 RHCOS 镜像的 selfLink URL。
    6 13
    machine_type 是实例的机器类型,如 n1-standard-4
    7 14
    service_account_email 是创建的 worker 服务帐户的电子邮件地址。
    8 15
    ignitionworker.ign 文件的内容。
  4. 可选:如果要启动更多实例,请在 06_worker.yaml 资源定义文件中包含类型为 06_worker.py 的其他资源。
  5. 使用 gcloud CLI 创建部署:

    $ gcloud deployment-manager deployments create ${INFRA_ID}-worker --config 06_worker.yaml

6.10.17.1. worker 机器的 Deloyment Manager 模板

您可以使用以下 Deployment Manager 模板来部署 OpenShift Container Platform 集群所需的 worker 机器:

例 6.18. 06_worker.py Deployment Manager 模板

def GenerateConfig(context):

    resources = [{
        'name': context.properties['infra_id'] + '-' + context.env['name'],
        'type': 'compute.v1.instance',
        'properties': {
            'disks': [{
                'autoDelete': True,
                'boot': True,
                'initializeParams': {
                    'diskSizeGb': context.properties['root_volume_size'],
                    'sourceImage': context.properties['image']
                }
            }],
            'machineType': 'zones/' + context.properties['zone'] + '/machineTypes/' + context.properties['machine_type'],
            'metadata': {
                'items': [{
                    'key': 'user-data',
                    'value': context.properties['ignition']
                }]
            },
            'networkInterfaces': [{
                'subnetwork': context.properties['compute_subnet']
            }],
            'serviceAccounts': [{
                'email': context.properties['service_account_email'],
                'scopes': ['https://www.googleapis.com/auth/cloud-platform']
            }],
            'tags': {
                'items': [
                    context.properties['infra_id'] + '-worker',
                ]
            },
            'zone': context.properties['zone']
        }
    }]

    return {'resources': resources}