在Google Cloud Compute上使用容器优化操作系统(COS),从Docker容器中访问VM项目的默认服务帐户凭据的最佳方法是什么?
$ gcloud compute instances create test-instance \
--image=cos-stable --image-project=cos-cloud
$ ssh (ip of the above)
# gcloud ...
Command not found
# docker run -ti google/cloud-sdk:alpine /bin/sh
# gcloud auth activate-service-account
... --key-file: Must be specified.
Run Code Online (Sandbox Code Playgroud)
如果凭据在VM上,那么Docker可以安装这些凭据.通常凭证将在.config/gcloud/,并执行此操作docker run -v ~/.config/gcloud:~/.config/gcloud image.容器操作系统中是否有这样的凭证,特别是因为缺少这些凭证,这一点并不明显gcloud.
如果VM上的凭据失败并且可安装,则选项似乎包括:
.json然后,为服务帐户创建凭证文件
.json到容器;gcloud auth activate-service-account是否有规范或最佳实践方法为Docker容器提供VM项目的服务帐户凭据?
Google Cloud已经拥有了一个安全策略模型,即所需的模型:项目中的VM应具有服务帐户提供的访问权限.为了避免复杂性以及错误配置或事故的可能性,正确的解决方案将采用此现有安全模型,即不涉及创建,下载,分发和维护凭证文件.
感觉这将是一个需要用COS,Docker和Kubernetes解决的常规问题,所以我假设我错过了一些直截了当的东西 - 但是解决方案对我来说并不明显.
编辑 - 注意set-service-account API …
google-compute-engine google-cloud-platform google-container-registry google-container-os google-iam
GOOGLE_APPLICATION_CREDENTIALS当没有设置时,是否有一种方法可以以编程方式访问 GCP 实例上当前使用的服务帐户的电子邮件?(即使用默认服务帐户时)
我查看了 GCP 文档,但我发现的唯一资源在未设置时无法与默认服务帐户一起使用。GOOGLE_APPLICATION_CREDENTIALS我知道可以使用gcloud(请参阅此SO问题或文档)来做到这一点,但是这些解决方案在ContainerOptimizedOS上运行时不适用。我花了几周时间与 GCP 支持团队沟通,但他们最终无法帮助我,并将我重定向到 Stack Overflow 寻求帮助。
google-compute-engine service-accounts google-cloud-platform google-container-os google-cloud-iam
gcr.io/distroless/java
如何添加自定义pki证书?
对于我的设置,我正在与 AWS 中托管的第三方 MQTT VerneMQ 代理合作。我已获得用户名/密码凭据,可以使用特定的 clientId 通过安全 MQTT(端口 8883)进行连接。我的目标(尽管与当前的问题无关)仅仅是订阅一个主题并将流量从该主题重定向到 Google PubSub。
我编写了一个简单的 NodeJS 程序来建立上述连接,并且在本地运行时效果非常好ts-node
const client = connect(`mqtts://${process.env.MQTT_HOST}`, {
port: parseInt(process.env.MQTT_PORT, 10),
clientId: process.env.MQTT_CLIENT_ID,
username: process.env.MQTT_USERNAME,
password: process.env.MQTT_PASSWORD,
rejectUnauthorized: false,
});
client.on('error', handleError);
client.on('connect', (p) => {
console.log('connect', JSON.stringify(p));
client.subscribe({ [mqttTopic]: { qos: 0 } });
});
client.on('message', (topic, msg) => onMessageReceived(msg));
Run Code Online (Sandbox Code Playgroud)
然后我继续对其进行 Dockerize
FROM node:lts-alpine
RUN apk update
WORKDIR /app
COPY . .
RUN npm i
EXPOSE 8883
CMD ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)
并且通过 本地运行得非常好docker run。
当我使用“将容器映像部署到此虚拟机实例”选项(使用容器优化的操作系统映像)将映像加载到 …
我按照此说明 https://cloud.google.com/monitoring/agent/install-agent#linux-install
$ curl -O "https://repo.stackdriver.com/stack-install.sh"
$ sudo bash stack-install.sh --write-gcm
Unidentifiable or unsupported platform.
Run Code Online (Sandbox Code Playgroud)
/ etc/os-release的内容.
$ cat /etc/os-release
BUILD_ID=8820.0.0
NAME="Container-VM Image"
GOOGLE_CRASH_ID=Lakitu
VERSION_ID=55
BUG_REPORT_URL=https://crbug.com/new
PRETTY_NAME="Google Container-VM Image"
VERSION=55
GOOGLE_METRICS_PRODUCT_ID=26
HOME_URL="https://cloud.google.com/compute/docs/containers/vm-image/"
ID=gci
Run Code Online (Sandbox Code Playgroud)
为了更新特定包,需要更新整个OS映像
所以,似乎我们必须等到更新堆栈驱动程序代理安装的映像版本或放弃它.
此vm图像也不是我的选择.默认情况下,新创建的GKE节点使用Container-VM映像.所以现在我将尝试通过创建节点gcloud container node-pools create --image-type
将我的问题归结为最简单的情况,我使用Compute Engine和以下启动脚本:
#! /bin/bash
sudo useradd -m drupal
su drupal
cd /home/drupal
touch test.txt
Run Code Online (Sandbox Code Playgroud)
我可以在此命令后确认drupal用户是否存在,测试文件也是如此.但是我希望测试文件的所有者是'drupal'(因此是su).但是,当我将其用作启动脚本时,我仍然可以确认ROOT是文件的所有者:
意思是我的
su drupal
Run Code Online (Sandbox Code Playgroud)
不工作.sudo su drupal也没有任何区别.我正在使用Google Container OS,但在Debian 8图像上也是如此.
google-compute-engine google-cloud-platform containeros google-container-os
这是场景:
Running with gitlab-runner 10.4.0-rc1 (fb4078b3)
on docker-auto-scale (fa6cab46)
Using Docker executor with image registry.gitlab.com/gitlab-examples/kubernetes-deploy ...
Using docker image sha256:f5f6ae0793e2d8907a16c95a4062bc93a98de76e5caf476afdd75a55f0a4808c for predefined container...
Pulling docker image registry.gitlab.com/gitlab-examples/kubernetes-deploy ...
Using docker image registry.gitlab.com/gitlab-examples/kubernetes-deploy ID=sha256:94b90ce9f86870a6ad41b6696878dcd3f3053a34547e55acc90de6c6bdc09735 for build container...
Running on runner-fa6cab46-project-5122416-concurrent-0 via runner-fa6cab46-srm-1515712084-0dfb4a6e...
Cloning repository...
Cloning into '/builds/Cardamone/gulp-bootstrap-kickstart'...
Checking out 64575330 as master...
Skipping Git submodules setup
$ command build
Checking docker engine...
Missing …Run Code Online (Sandbox Code Playgroud) google-compute-engine google-kubernetes-engine google-container-os
这是关于 Google Container VM Image(beta) https://cloud.google.com/compute/docs/containers/vm-image/ 的问题
我登录了一个由容器 VM 映像制作的实例。并运行
sudo /usr/share/google/dockercfg_update.sh
Run Code Online (Sandbox Code Playgroud)
上面的脚本执行“docker login”到私有容器注册表。
它会导致错误。
/usr/share/google/dockercfg_update.sh: 27: cannot create /root/.dockercfg: Read-only file system
Run Code Online (Sandbox Code Playgroud)
/root 目录在容器虚拟机中似乎是只读的。如何通过 root 用户“docker login”?
google-compute-engine google-cloud-platform google-container-os
如何将 Cloud-Config 服务的输出获取到 Stackdriver Logging?
我正在使用 node.js API 创建我的 VM 实例,并按照此处找到的示例创建我的服务:https : //cloud.google.com/container-optimized-os/docs/how-to/run-container -instance#starting_a_docker_container_via_cloud-config
一切都运行成功,但我可以看到日志输出的唯一方法是通过 SSH 连接到实例并运行sudo journalctl -ef,但我真的很想将日志流式传输到 Stackdriver Logging。但是 COS 似乎不允许我安装日志代理。
这是我的服务文件,它/home/ci/run.sh只是运行一些 docker 容器,这些容器运行一些测试并输出到标准输出:
- path: /etc/systemd/system/ciservice.service
permissions: 0644
owner: root
content: |
[Unit]
Description=Run tests
Wants=gcr-online.target
After=gcr-online.target
[Service]
User=ci
Group=ci
Environment="HOME=/home/ci"
ExecStartPre=/usr/bin/docker-credential-gcr configure-docker
ExecStart=/bin/bash /home/ci/run.sh
Run Code Online (Sandbox Code Playgroud)
我正在使用容器优化操作系统,因为它带有 Docker、开箱即用的 GCR 访问、安全性,并且可以快速启动。但我想我可能不得不切换回基于 Ubuntu/Debian 的映像,因为这将允许我安装日志代理,但代价是在自定义映像中进行更多的基本配置。
对此使用 COS 的任何帮助将不胜感激,因此在此先感谢您 :)
google-compute-engine stackdriver google-container-os google-cloud-stackdriver
我创建了一个 GCP VM 实例,选项Deploy as Container指向我的私有 GCR(nginx 定制)中的一个图像。
同样在创建实例时,我已经允许“https”和“http”流量。
尽管应用程序运行良好,但在通过sshdocker 容器 ( docker ps)连接实例时,我发现容器端口没有暴露。想知道这里的容器如何通过实例处理 http/https 请求?
google-compute-engine docker google-cloud-platform google-kubernetes-engine google-container-os
docker ×2
stackdriver ×2
containeros ×1
dockerfile ×1
google-iam ×1
mqtt ×1
mqtt-vernemq ×1
node.js ×1