借助 Cloud Workstations,您可以在工作站容器启动之前,在工作站宿主虚拟机上运行自定义启动脚本。这对于执行虚拟机级配置或安装需要在工作站容器外部运行的其他软件非常有用。
在主机虚拟机上运行自定义启动脚本是一项高级功能。 我们建议您自定义容器映像,而不是使用启动脚本。
如果您选择使用启动脚本,请确保您的脚本与 Container-Optimized OS (COS) 映像更改保持兼容,因为主机虚拟机会根据 COS 定期接收操作系统更新。
准备工作
安装 Google Cloud CLI,然后
使用联合身份登录 gcloud CLI。
登录后,运行以下命令来初始化 Google Cloud CLI:
gcloud init准备启动脚本
创建要在工作站宿主虚拟机上运行的启动脚本。编写脚本时,请遵循以下准则:
- Cloud Workstations 会在主机工作站虚拟机上运行您指定的工作站容器以及多个系统容器,以确保工作站正常运行。所有容器都使用
containerd运行时和crictl客户端运行。 - 使用
containerd运行启动脚本启动的所有其他容器。主机虚拟机上已停用 Docker,以防止干扰在工作站容器内运行的 Docker 守护程序。 - 由启动脚本启动的主机级容器无法与主工作站容器交互。这些直接交互不受支持,因为它们会绕过 Identity and Access Management (IAM) 检查。
将启动脚本存储在 Cloud Storage 中
将脚本上传到 Cloud Storage 存储桶,并确保与工作站关联的服务账号可以访问该脚本。
将脚本上传到存储桶:
gcloud storage cp LOCAL_SCRIPT_PATH gs://BUCKET_NAME/SCRIPT_NAME替换以下内容:
LOCAL_SCRIPT_PATH:启动脚本文件的本地路径。BUCKET_NAME:Cloud Storage 存储桶的名称。SCRIPT_NAME:您要为存储桶中的脚本文件指定的名称。
确保工作站配置使用的服务账号具有访问存储桶和脚本文件的权限。或者,脚本也可以公开访问。
创建工作站配置
如需使用自定义启动脚本,请创建工作站配置并指定脚本的 Cloud Storage URI。
控制台
如需在创建工作站配置时配置自定义启动脚本,请执行以下操作:
在 Google Cloud 控制台中,前往工作站配置页面。
点击 add 创建。
在基本信息页面上,输入配置名称,选择工作站集群,然后点击继续。
在机器设置页面上,配置机器设置,然后点击继续。
在环境设置页面上,展开高级容器选项部分。
在自定义启动脚本字段中,输入启动脚本的 Cloud Storage 路径(例如
gs://BUCKET_NAME/SCRIPT_NAME)。完成其余步骤,然后点击创建。
REST
如需使用 REST API 配置自定义启动脚本,请创建工作站配置,并将 host.gceInstance 消息中的 startupScriptUri 字段设置为脚本的 Cloud Storage URI:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"host": {
"gceInstance": {
"poolSize": 1,
"startupScriptUri": "gs://BUCKET_NAME/SCRIPT_NAME",
"serviceAccount": "SERVICE_ACCOUNT"
}
}
}' \
https://workstations.googleapis.com/v1alpha/projects/PROJECT_ID/locations/LOCATION/workstationClusters/CLUSTER_ID/workstationConfigs?workstation_config_id=CONFIG_ID
替换以下内容:
SERVICE_ACCOUNT:与工作站配置关联的服务账号的电子邮件地址。PROJECT_ID:您的 Google Cloud 项目 ID。LOCATION:工作站集群所在的区域。CLUSTER_ID:工作站集群的 ID。CONFIG_ID:您要分配给新工作站配置的 ID。
验证脚本执行
如需验证脚本是否正确运行,请使用以下方法之一:
- 串行端口 3 输出日志:脚本生成的输出日志会自动发送到串行端口 3 输出。如需查找分配给工作站的虚拟机的名称,请参阅平台日志。
- 通过 SSH 连接到虚拟机:您可以通过 SSH 连接到工作站虚拟机,以便根据需要进一步调试脚本。
- 就绪情况检查:启动脚本会尽力而为,不会阻止工作站启动。如果脚本运行时间较长或失败,工作站可能仍会被标记为就绪。为确保在脚本完成之前工作站不会被标记为就绪,请考虑实施就绪性检查。