如何从 GCE 实例中的 Container-optimized OS 获取启动脚本日志?
How do I get startup-script logs from Container-optimized OS in a GCE instance?
-
google-compute-engine
-
google-cloud-platform
-
stackdriver
-
google-cloud-stackdriver
-
google-container-optimized-os
我是 运行 具有此启动脚本的容器优化计算实例:
#!/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 guide and docker docs 设置。
但是我没有看到容器启动的日志。
此外,当我通过 SSH 连接到实例和 运行 命令 logger "hello from logger"
时,我没有看到它出现在云记录器中。我已经尝试将其转换为高级过滤器并删除除“hello from logger”字符串过滤器之外的所有过滤器。
如何正确设置日志记录?我在我的 NodeJS 应用程序中使用 bunyan
,但是当应用程序失败时我完全看不到它?我很想在云记录器中获取 journalctl
中的所有日志。或者,至少 journalctl
的 startup-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)
当 运行 sudo systemctl status stackdriver-logging
在 VM 中执行命令时
我可以使用以下高级过滤器日志在 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"
Google Compute Engine Container-Optimize OS 默认启用操作日志记录(以前称为 Stackdriver)。
在我的问题和解决方案列表中,问题 #3 是我遇到的最常见问题。
可能的问题#1:
默认情况下,新实例启用以下范围:
- Stackdriver 日志记录API:只写
- Stackdriver 监控API:只写
如果您修改了实例的访问范围,请确保 Stackdriver 范围已启用。这需要停止实例以修改范围。
可能的问题#2:
如果您为此实例使用自定义服务帐户,请确保该服务帐户至少具有角色 roles/logging.logWriter
。没有这个角色或类似角色,记录器将失败。
可能的问题#3:
一个常见的问题是项目所有者没有启用“云日志记录”API”。如果不启用此 API,实例记录器将失败。
要验证实例中的记录器是否出现故障,请通过 SSH 进入实例并执行此命令:
sudo systemctl status stackdriver-logging
如果您看到与日志记录相关的错误消息 API,请启用云日志记录 API。
通过 CLI 启用云日志记录API:
gcloud services enable logging.googleapis.com --project=<PROJECT_ID>
或通过 Google 云控制台:
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
设置。
查找“收集优先级 >= 警告的所有日志”部分。优先级为 0 -> 4。如果将“5”和“6”添加到列表中,则启动脚本将记录在操作日志记录中。
您可以更改日志级别,但此更改不会在重新启动后持续存在。我还没有找到使更改永久化的解决方案。
google-compute-engine
google-cloud-platform
stackdriver
google-cloud-stackdriver
google-container-optimized-os
我是 运行 具有此启动脚本的容器优化计算实例:
#!/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 guide and docker docs 设置。
但是我没有看到容器启动的日志。
此外,当我通过 SSH 连接到实例和 运行 命令 logger "hello from logger"
时,我没有看到它出现在云记录器中。我已经尝试将其转换为高级过滤器并删除除“hello from logger”字符串过滤器之外的所有过滤器。
如何正确设置日志记录?我在我的 NodeJS 应用程序中使用 bunyan
,但是当应用程序失败时我完全看不到它?我很想在云记录器中获取 journalctl
中的所有日志。或者,至少 journalctl
的 startup-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)
当 运行 sudo systemctl status stackdriver-logging
在 VM 中执行命令时
我可以使用以下高级过滤器日志在 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"
Google Compute Engine Container-Optimize OS 默认启用操作日志记录(以前称为 Stackdriver)。
在我的问题和解决方案列表中,问题 #3 是我遇到的最常见问题。
可能的问题#1:
默认情况下,新实例启用以下范围:
- Stackdriver 日志记录API:只写
- Stackdriver 监控API:只写
如果您修改了实例的访问范围,请确保 Stackdriver 范围已启用。这需要停止实例以修改范围。
可能的问题#2:
如果您为此实例使用自定义服务帐户,请确保该服务帐户至少具有角色 roles/logging.logWriter
。没有这个角色或类似角色,记录器将失败。
可能的问题#3:
一个常见的问题是项目所有者没有启用“云日志记录”API”。如果不启用此 API,实例记录器将失败。
要验证实例中的记录器是否出现故障,请通过 SSH 进入实例并执行此命令:
sudo systemctl status stackdriver-logging
如果您看到与日志记录相关的错误消息 API,请启用云日志记录 API。
通过 CLI 启用云日志记录API:
gcloud services enable logging.googleapis.com --project=<PROJECT_ID>
或通过 Google 云控制台:
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
设置。
查找“收集优先级 >= 警告的所有日志”部分。优先级为 0 -> 4。如果将“5”和“6”添加到列表中,则启动脚本将记录在操作日志记录中。
您可以更改日志级别,但此更改不会在重新启动后持续存在。我还没有找到使更改永久化的解决方案。