在 Linux 虚拟机上使用启动脚本

启动脚本用于在虚拟机 (VM) 的启动过程中执行任务。本页介绍了在虚拟机实例上使用启动脚本的步骤。

准备工作

如需使用 gdcloud 命令行界面 (CLI) 命令,请确保您已下载、安装并配置 gdcloud CLI。Distributed Cloud 的所有命令都使用 gdcloudkubectl CLI,并且需要操作系统 (OS) 环境。

获取 kubeconfig 文件路径

如需针对管理 API 服务器运行命令,请确保您拥有以下资源:

  1. 登录并生成管理 API 服务器的 kubeconfig 文件(如果您还没有)。

  2. 使用管理 API 服务器的 kubeconfig 文件路径替换这些说明中的 MANAGEMENT_API_SERVER

请求权限和访问权限

如需执行本页面中列出的任务,您必须具有 Project VirtualMachine Admin 角色。按照相应步骤验证您的访问权限,或者让项目 IAM 管理员在虚拟机所在项目的命名空间中为您分配项目虚拟机管理员 (project-vm-admin) 角色。

传递启动脚本

您可以使用 bash 脚本或非 bash 脚本作为启动脚本。为此,请在脚本开头添加 #!/bin/…,以指示脚本解释器。例如,如需使用 Python 3 启动脚本,请将 #! /usr/bin/python3 添加到脚本的开头。

Google Distributed Cloud (GDC) air-gapped 会根据每个启动脚本的名称按字母顺序运行启动脚本。

下表显示了根据脚本大小应使用的脚本格式:

脚本大小 脚本格式
脚本大小上限:2048 字节 清除文字
大于 2048 字节的脚本 Kubernetes Secret

定义启动脚本

如需使用启动脚本,您必须将 startupScripts 字段添加到虚拟机 spec 字段。在此字段中,您可以将多个启动脚本指定为纯文本或 Kubernetes Secret。

以下示例将启动脚本指定为明文和 Kubernetes Secret:

apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  
  startupScripts:
  - name: hello-world
    script: |
      #!/bin/bash
      echo hello
  - name: add-user
    scriptSecretRef:
      name: add-user
---

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: add-user
data: 
  script:
    IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==

请查看以下注意事项:

  • 启动脚本会在每次启动时运行。
  • 启动脚本具有默认的 root 权限。
  • 在 Kubernetes Secret 中,虚拟机 specscriptSecretRef 的名称必须与 metadata.name 字段一致。
  • 在 Kubernetes Secret 中,通过向 data 字段添加键 script 来指定启动脚本内容。

创建具有启动脚本的新虚拟机

无论您使用什么作为映像来创建虚拟机,这些说明都适用。请完成以下操作:

  1. 如需创建作为 Kubernetes Secret 的启动脚本,请运行以下命令:

    cat <<EOF >>FILE_NAME
    STARTUP_SCRIPT_CONTENT
    EOF
    
    kubectl --kubeconfig MANAGEMENT_API_SERVER create secret -n PROJECT generic SECRET_NAME --from-file=script=FILE_NAME
    
    rm FILE_NAME
    
  2. 请参考创建虚拟机页面上介绍的创建虚拟机的步骤。 在第 1 步中,在运行命令以创建虚拟机之前,将启动脚本添加到 spec 字段。

    此示例定义了一个同时包含明文和 Kubernetes Secret 的启动脚本:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
    name: VM_NAME
    namespace: PROJECT
    spec:
    
    startupScripts:
    - name: CLEAR_TEXT_SCRIPT_NAME
      script: |
        #!/bin/bash
        CLEAR_TEXT_SCRIPT
    - name: SECRET_SCRIPT_NAME
      scriptSecretRef:
        name: SECRET_NAME
    

    这些变量的定义如下:

    变量定义
    MANAGEMENT_API_SERVER 管理 API 服务器 kubeconfig 文件。
    PROJECT 您要在其中创建虚拟机的 Distributed Cloud 项目。
    VM_NAME 虚拟机的名称。
    FILE_NAME 用于存储启动脚本的文件的名称。
    STARTUP_SCRIPT_CONTENT 作为启动脚本的一部分运行的命令
    CLEAR_TEXT_SCRIPT_NAME 明文启动脚本的名称。
    CLEAR_TEXT_SCRIPT 您定义的明文脚本。
    SECRET_NAME Kubernetes Secret 的名称。
    SECRET_SCRIPT_NAME 启动脚本的名称(以 Kubernetes Secret 的形式)。
  3. 继续执行以下步骤以创建虚拟机。

    以下示例展示了如何创建包含启动脚本的虚拟机,该脚本使用 Kubernetes Secret 和明文添加新用户。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
        apply -n PROJECT -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_BOOT_DISK_NAME
    spec:
      source:
        image:
          name: BOOT_DISK_IMAGE_NAME
          namespace: vm-system
      size: BOOT_DISK_SIZE
    ---
    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: add-user
    data: 
      script:
        IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==
    ---
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      compute:
        virtualMachineType: MACHINE_TYPE
      disks:
      - virtualMachineDiskRef:
          name: VM_BOOT_DISK_NAME
        boot: true
        autoDelete: BOOT_DISK_AUTO_DELETE
      startupScripts:
      - name: add-user
        scriptSecretRef:
          name: add-user
      - name: add-to-sudoers
        script: |
          #!/bin/bash
          usermod -aG sudo user
    EOF
    

    在此示例中,变量定义如下。

    变量定义
    MANAGEMENT_API_SERVER 管理 API 服务器 kubeconfig 文件。
    PROJECT 您要在其中创建虚拟机的 Distributed Cloud 项目。
    VM_NAME 新虚拟机的名称。
    VM_BOOT_DISK_NAME 新虚拟机启动磁盘的名称。
    BOOT_DISK_IMAGE_NAME 要用于新虚拟机启动磁盘的映像的名称。
    BOOT_DISK_SIZE 启动磁盘的大小,例如 20G
    此值必须始终大于或等于启动磁盘映像的 minimumDiskSize
    BOOT_DISK_AUTO_DELETE truefalse,用于指明在删除虚拟机实例时是否自动删除启动磁盘。
    MACHINE_TYPE 新虚拟机的预定义机器类型。如需选择可用的机器类型,请运行以下命令:
    kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system

使用启动脚本更新现有虚拟机

您还可以使用启动脚本更新现有虚拟机。您必须先关闭虚拟机,然后才能执行更新。

按照更新虚拟机属性中的步骤操作,并使用您要运行的启动脚本更新 spec 字段。

查看启动脚本的输出

  1. 按照相关步骤连接到虚拟机
  2. 在 guest 虚拟机中运行以下命令,以获取您运行的启动脚本的日志:

    sudo journalctl -u cloud-final
    

    启动脚本日志以以下内容开头:

    Started to run the command: /var/lib/google/startup-scripts/<script-name> ...