【问题标题】:Google Cloud Compute Instance doesn't work as expected with startup script谷歌云计算实例无法按预期使用启动脚本
【发布时间】:2020-10-11 18:08:44
【问题描述】:

我创建了一个 Google Cloud Compute Engine 实例模板,我在其中指定了要使用的 docker 容器映像(私有托管在 Google Container Registry 上)。 对于我的应用,我需要运行 Google Cloud Sql Proxyso I followed these steps 并在我的 Compute Engine 实例模板上添加了一个启动脚本,如下所示:

#! /bin/bash
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O /var/lib/google/cloud_sql_proxy
chmod 777 /var/lib/google/cloud_sql_proxy
sudo /var/lib/google/cloud_sql_proxy -instances={instance name} &

我遇到的问题是,当我基于此模板创建 Compute Engine 虚拟机实例时

gcloud compute instances create {instance name} --source-instance-template {template name}

实例已创建并启动,我可以看到 cloud_sql_proxy 脚本正在运行,但 docker 映像未拉取,容器也未启动...

我尝试在不指定启动脚本的情况下创建一个 Compute Engine VM 实例,它可以正常工作,拉取 docker 映像并且容器开始运行。 随着计算实例的运行,我通过 ssh 连接并手动启动 cloud_sql_proxy 脚本,一切正常(应用程序成功连接到 Google Cloud SQL 上的 SQL 实例)。 但我想让这个自动化......

我错过了什么?有人遇到过这个问题吗?

【问题讨论】:

  • 你最终解决了这个问题吗?
  • 几个问题: 1. 如果您要创建实例模板,为什么每次都使用wget? 2. 为什么不为您的应用程序创建一个状态脚本,运行云 sql 代理,然后启动您的应用程序。单一应用程序回购和隔离配置 ==> 易于调试。 3. 缺少chmod +x 4. 如果。你这样做,sudo 执行然后为什么chmod 777

标签: docker google-cloud-platform google-compute-engine


【解决方案1】:

可能是启动脚本以某种方式阻塞了容器启动器。后者是konlet-startup.service,尤其依赖于systemd配置中的云注册服务和启动脚本服务:

[Unit]
Description=Containers on GCE Setup
Wants=network-online.target google-startup-scripts.service gcr-online.target docker.socket
After=network-online.target google-startup-scripts.service gcr-online.target docker.socket

要调试问题,您可以通过在开头插入 systemctl start gcr-online.target 来在启动脚本的开头强制使用 gcr-online.target

此外,您应该确保启动脚本退出并且不会继续运行,因为konlet-startup.service 正在等待google-startup-scripts.service 报告成功退出代码:exit 0

【讨论】:

    【解决方案2】:

    对于 devops 地狱中的任何人(在您调试问题时运行无尽的 terraform),这是我的容器优化操作系统实例的启动脚本,它以 cloud_sql_proxy 作为其启动脚本的一部分:

    sudo wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O /var/lib/docker/cloud_sql_proxy
    sudo chmod +x /var/lib/docker/cloud_sql_proxy
    sudo nohup /var/lib/docker/cloud_sql_proxy -instances=${var.db_instance_uri} </dev/null &>/dev/null &
    

    这会启动代理,然后让startup_script退出0,然后让konlet启动你的容器。

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      相关资源
      最近更新 更多