启动脚本用于在虚拟机 (VM) 的启动过程中执行任务。本页介绍了在虚拟机实例上使用启动脚本的步骤。
准备工作
如需使用 gdcloud
命令行界面 (CLI) 命令,请确保您已下载、安装并配置 gdcloud
CLI。Distributed Cloud 的所有命令都使用 gdcloud
或 kubectl
CLI,并且需要操作系统 (OS) 环境。
获取 kubeconfig 文件路径
如需针对管理 API 服务器运行命令,请确保您拥有以下资源:
登录并生成管理 API 服务器的 kubeconfig 文件(如果您还没有)。
使用管理 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 中,虚拟机
spec
中scriptSecretRef
的名称必须与metadata.name
字段一致。 - 在 Kubernetes Secret 中,通过向
data
字段添加键script
来指定启动脚本内容。
创建具有启动脚本的新虚拟机
无论您使用什么作为映像来创建虚拟机,这些说明都适用。请完成以下操作:
如需创建作为 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
请参考创建虚拟机页面上介绍的创建虚拟机的步骤。 在第 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 的形式)。 继续执行以下步骤以创建虚拟机。
以下示例展示了如何创建包含启动脚本的虚拟机,该脚本使用 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
true
或false
,用于指明在删除虚拟机实例时是否自动删除启动磁盘。MACHINE_TYPE
新虚拟机的预定义机器类型。如需选择可用的机器类型,请运行以下命令:
kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system
使用启动脚本更新现有虚拟机
您还可以使用启动脚本更新现有虚拟机。您必须先关闭虚拟机,然后才能执行更新。
按照更新虚拟机属性中的步骤操作,并使用您要运行的启动脚本更新 spec
字段。
查看启动脚本的输出
- 按照相关步骤连接到虚拟机。
在 guest 虚拟机中运行以下命令,以获取您运行的启动脚本的日志:
sudo journalctl -u cloud-final
启动脚本日志以以下内容开头:
Started to run the command: /var/lib/google/startup-scripts/<script-name> ...