【问题标题】:How do I get startup-script logs from Container-optimized OS in a GCE instance?如何从 GCE 实例中的容器优化操作系统获取启动脚本日志?
【发布时间】:2021-04-19 14:23:06
【问题描述】:

我正在使用这个启动脚本运行一个容器优化的计算实例:

#!/bin/bash

mkdir /home/my-app
cd /home/my-app
export HOME=/home/my-app

docker-credential-gcr configure-docker


docker run --rm --log-driver=gcplogs --name my-app --security-opt seccomp=./config.json gcr.io/my-project/my-app:latest

--log-driver--name 标志是根据 GCP community guidedocker docs 设置的。

但我没有看到容器启动的日志。

另外,当我通过 SSH 连接到实例并运行命令 logger "hello from logger" 时,我没有看到它出现在云记录器中。我已尝试将其转换为高级过滤器并删除除“hello from logger”字符串过滤器之外的所有过滤器。

如何正确设置日志记录?我在我的 NodeJS 应用程序中使用bunyan,但是当应用程序失败时,我完全没有可见性?我希望在云记录器中拥有来自 journalctl 的所有日志。或者,至少是journalctlstartup-script 部分。现在我正在通过 SSH 进入实例并运行 journalctl -r | grep startup-script 来检索它们。

更新

访问范围设置正确:

Stackdriver Logging API: Write Only
Stackdriver Logging API: Write Only

我使用的是默认计算引擎服务帐户。这里是我创建这个虚拟机的命令:

gcloud compute instance-templates create $APP_ID-template \
    --scopes=bigquery,default,compute-rw,storage-rw \
    --image-project=cos-cloud \
    --image-family=cos-77-lts \
    --machine-type=e2-medium \
    --metadata-from-file=startup-script=./start.sh \
    --tags=http-server,https-server

gcloud compute instance-groups managed create $APP_ID-group \
    --size=1 \
    --template=$APP_ID-template

启动脚本:

#!/bin/bash

mkdir /home/startDir
cd /home/startDir
export HOME=/home/startDir

docker-credential-gcr configure-docker

docker run --log-driver=gcplogs --name my-app --security-opt seccomp=./config.json gcr.io/project-id/app:latest

此 VM 运行 NodeJS 脚本。我没有为我的 NodeJS 脚本提供 JSON 密钥。 bunyan 记录器正在正确地将日志发送到云记录器。只有在服务器完全崩溃时才会发送日志失败。

日志 API 已启用。我得到了这个:

● stackdriver-logging.service - Fluentd container for Stackdriver Logging
   Loaded: loaded (/usr/lib/systemd/system/stackdriver-logging.service; static; vendor preset: disabled)
   Active: inactive (dead)

在 VM 中运行 sudo systemctl status stackdriver-logging 命令时

【问题讨论】:

  • 这项工作适合你吗``` resource.type="gce_instance" resource.labels.instance_id="xxxxxxxxxxxxxxxxxxxxxxx" protoPayload.metadata.instanceMetadataDelta.addedMetadataKeys="startup-script" ```跨度>
  • 不,它没有。我知道如何搜索日志。运行常规实例时显示启动脚本日志。此问题仅存在于容器优化操作系统中
  • 当使用 cos-stable-85-13310-1041-161 从启动脚本运行容器时,我确实会在 Cloud Logging 中的“VM 实例”下获取容器日志。您能否确认在本地运行容器时看到了这些日志(没有 --log-driver=gcplogs)?使用其他启动磁盘映像(例如 Ubuntu)时,您是否会在 Cloud Logging 中看到日志?
  • 我阅读了您的更新。创建实例时,您需要添加此标志以启用日志记录:--metadata=google-logging-enabled=true
  • 另外,你为什么使用镜像家族cos-77-lts

标签: google-cloud-platform google-compute-engine stackdriver google-cloud-stackdriver google-container-optimized-os


【解决方案1】:

Google Compute Engine Container-Optimize OS 默认启用操作日志记录(以前称为 Stackdriver)。

在我的问题和解决方案列表中,问题 #3 是我的经验中最常见的。

可能的问题 #1:

默认情况下,新实例启用以下范围:

  • Stackdriver Logging API:只写
  • Stackdriver Monitoring API:只写

如果您修改了实例的访问范围,请确保启用 Stackdriver 范围。这需要停止实例以修改范围。

可能的问题 #2:

如果您为此实例使用自定义服务帐户,请确保该服务帐户至少具有角色 roles/logging.logWriter。如果没有此角色或类似角色,记录器将失败。

可能的问题 #3:

一个常见的问题是项目所有者没有启用“Cloud Logging API”。如果不启用此API,实例记录器将失败。

要验证实例中的记录器是否失败,请通过 SSH 连接到实例并执行以下命令:

sudo systemctl status stackdriver-logging

如果您看到与日志记录 API 相关的错误消息,请启用 Cloud Logging API。

通过 CLI 启用 Cloud Logging API:

gcloud services enable logging.googleapis.com --project=<PROJECT_ID>

或通过 Google Cloud Console:

https://console.cloud.google.com/apis/library/logging.googleapis.com

可能的问题 #4:

通过 CLI 创建实例时,需要指定以下命令行选项,否则日志服务将无法启动:

--metadata=google-logging-enabled=true

[2021 年 1 月 22 日更新]

OP 有两个问题。 1) Stackdriver 服务没有运行。上述步骤解决了这个问题。 2) 启动脚本部分不会转到 Stackdriver。

Container OS 的当前配置将日志级别设置得太低,无法将启动脚本日志发送到 Stackdriver。

日志级别由文件/etc/stackdriver/logging.config.d/fluentd-lakitu.conf设置。

查找“收集所有优先级 >= 警告的日志日志”部分。 PRIORITY 是 0 -> 4。如果将“5”和“6”添加到列表中,则启动脚本会记录在操作日志中。

您可以更改日志级别,但此更改不会在重新启动后持续存在。我还没有找到永久更改的解决方案。

【讨论】:

  • #1 - 一切都好。 #2 - 使用默认计算引擎服务帐户。 #3 - 启用日志记录。这是第一个命令输出:● stackdriver-logging.service - Fluentd container for Stackdriver Logging Loaded: loaded (/usr/lib/systemd/system/stackdriver-logging.service; static; vendor preset: disabled) Active: inactive (dead)
  • inactive (dead) 表示服务未运行。重启实例,ssh 登录,然后再次检查。查看stackdriver-logging服务是否有错误。
  • 我刚刚调整了计算组的大小。如果它现在已经死了,那么它在 100% 的情况下已经死了。查看问题,我添加了更多详细信息。
【解决方案2】:

我可以使用以下高级过滤器日志在 Cloud Logging 中查看启动脚本日志:

resource.type="gce_instance"
resource.labels.instance_id="1234567890"
protoPayload.metadata.instanceMetadataDelta.addedMetadataKeys="startup-script"

根据 GCP doc 查看启动脚本日志,您需要登录到实例并能够看到启动脚本输出写入以下日志文​​件:

  • CentOS 和 RHEL:/var/log/messages
  • Debian:/var/log/daemon.log
  • Ubuntu:/var/log/syslog
  • SLES:/var/log/messages

为了节省一些时间,您可以使用此命令查看日志:

gcloud compute ssh instance-id --project your-project --zone us-central1-a --command="sudo journalctl -r | grep startup-script"

【讨论】:

  • 当我只搜索“some-string”时,它也会在元数据中找到带有“some-string”的日志。无论如何,我已经测试了您的建议。不,没有工作。启动脚本日志不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 2020-10-13
  • 1970-01-01
  • 2022-08-06
  • 2014-05-03
相关资源
最近更新 更多