我已经创建了我的第一个计算实例容器优化操作系统以及以下范围:
Cloud SQL Enabled
Compute Engine Read Write
Service Control Enabled
Service Management Read Only
Stackdriver Logging API Write Only
Stackdriver Monitoring API Write Only
Stackdriver Trace Write Only
Storage Read Only
我需要安装 Cloud SQL Proxy 并遵循以下文档:https://cloud.google.com/sql/docs/postgres/connect-compute-engine#gce-connect-proxy
我可以毫无问题地使用 SSH,但无法执行命令:
leszek@backend-app ~ $ wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
2018-04-10 19:52:00 (211 MB/s) - 'cloud_sql_proxy' saved [7505002/7505002]
leszek@backend-app ~ $ chmod +x cloud_sql_proxy
leszek@backend-app ~ $ ./cloud_sql_proxy -instances=my-instance=tcp:0.0.0.0:54
32
-bash: ./cloud_sql_proxy: Permission denied
lgr@backend-app ~ $ sudo ./cloud_sql_proxy -instances=my-instance=tcp:0.0.0.0:5432
sudo: unable to execute ./cloud_sql_proxy: Permission denied
我遗漏了什么明显的东西以至于我甚至无法启动 sql_proxy 命令?
答案1
在容器操作系统上部署 CloudSQL 代理的最佳选择是使用官方 CloudSQL 容器和链接网络。
docker run -d -v /cloudsql:/cloudsql \
-v <PATH_TO_KEY_FILE>:/config \
-p 127.0.0.1:5432:5432 \
gcr.io/cloudsql-docker/gce-proxy:1.11 /cloud_sql_proxy \
-instances=<INSTANCE_CONNECTION_NAME>=tcp:0.0.0.0:5432 -credential_file=/config
答案2
Container-Optimized OS 使用“noexec”标志挂载大部分文件系统。可以通过运行以下命令来查看:
mount | grep noexec
“noexec”选项不允许直接执行已挂载文件系统上的任何二进制文件。这是因为 COS 上默认的安全锁定实现。
但是,Container-Optimized OS 文件系统中有一些可写位置(例如 /var/lib/docker 和 /var/lib/cloud)。这些位置被挂载为“可执行文件”(即,它们在没有 noexec 挂载标志的情况下挂载)。
按照文章中链接的指南,最好使用 Debian 或 Red Hat 实例。但是,如果您想在 Google Container-Optimized OS 实例上执行二进制文件 (cloud_sql_proxy),您可以尝试将文件复制到可写位置(例如 /var/lib/docker):
sudo cp cloud_sql_proxy /var/lib/docker
尝试在那里执行该文件:
sudo ./cloud_sql_proxy
这应该可以帮助你摆脱permissions denied
错误。
此时,假设实例已应用正确的范围,您将收到如下输出:
2018/04/23 08:48:21 must specify -projects, -fuse, or -instances
如果实例没有设置正确的范围,您将收到一条建议消息service account is not configured with sufficient permissions
。
如果是这种情况,您可以通过停止和编辑实例并将范围设置Cloud SQL
为启用来解决此错误。