标签: google-container-os

在Docker Container内的Container OS上访问Google Cloud服务帐户凭据

在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上,那么Doc​​ker可以安装这些凭据.通常凭证将在.config/gcloud/,并执行此操作docker run -v ~/.config/gcloud:~/.config/gcloud image.容器操作系统中是否有这样的凭证,特别是因为缺少这些凭证,这一点并不明显gcloud.

如果VM上的凭据失败并且可安装,则选项似乎包括:

  1. 将凭据放在容器元数据/环境变量中;
  2. .json然后,为服务帐户创建凭证文件
    1. 将其上传到VM,然后挂载; 要么
    2. 添加.json到容器;
  3. 运行Docker容器(例如cloud-sdk-docker)获取凭据并通过例如共享挂载分区与主机共享.理想情况下,这将是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

11
推荐指数
1
解决办法
3687
查看次数

以编程方式获取 GCP 上的当前服务帐号

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

10
推荐指数
1
解决办法
8940
查看次数

9
推荐指数
1
解决办法
6451
查看次数

Google 容器操作系统上的 MQTT 连接失败

对于我的设置,我正在与 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

当我使用“将容器映像部署到此虚拟机实例”选项(使用容器优化的操作系统映像)将映像加载到 …

node.js mqtt docker google-container-os mqtt-vernemq

8
推荐指数
0
解决办法
175
查看次数

如何在Google Container VM映像中安装Stackdriver监控代理?

我按照此说明 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)

https://cloud.google.com/compute/docs/containers/vm-image/faq#what_is_the_software_package_manager_for_container-vm_image

为了更新特定包,需要更新整个OS映像

所以,似乎我们必须等到更新堆栈驱动程序代理安装的映像版本或放弃它.

此vm图像也不是我的选择.默认情况下,新创建的GKE节点使用Container-VM映像.所以现在我将尝试通过创建节点gcloud container node-pools create --image-type

google-kubernetes-engine stackdriver google-container-os

7
推荐指数
3
解决办法
1989
查看次数

计算引擎启动脚本无法作为非root用户执行

将我的问题归结为最简单的情况,我使用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是文件的所有者:

ls -l结果

意思是我的

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

7
推荐指数
1
解决办法
1423
查看次数

GitLab CI 构建失败并显示错误:设备上没有剩余空间。

这是场景:

  • 使用默认设置在谷歌云项目中创建了一个 kubernetes 集群
  • 在 gitlab 上配置自动开发操作,如快速入门所示
  • 配置了一个 .gitlab-ci.yml 文件,如默认 kubernetes 模板所示(仅在设置正确的 DNS 后使用我的自定义域更改了 KUBE_DOMAIN)
  • 一旦我将某些内容推送到 master 分支,就会在管道中触发构建作业,但它会失败。下面是控制台输出:

    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

7
推荐指数
1
解决办法
6850
查看次数

docker 使用 root 用户登录 Container-VM Image

这是关于 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

5
推荐指数
1
解决办法
1303
查看次数

将 Container-Optimized OS 服务日志输出发送到 Stackdriver Logging

如何将 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

4
推荐指数
1
解决办法
1486
查看次数

Google Cloud - 从 GCR 部署为容器 - 端口未在 docker 容器中公开

我创建了一个 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

4
推荐指数
1
解决办法
2751
查看次数