Google cloud platform 如何从GCE实例中的容器优化操作系统获取启动脚本日志?

Google cloud platform 如何从GCE实例中的容器优化操作系统获取启动脚本日志?,google-cloud-platform,google-compute-engine,stackdriver,google-cloud-stackdriver,google-container-optimized-os,Google Cloud Platform,Google Compute Engine,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

我正在使用以下启动脚本运行容器优化计算实例:

#!/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
#!/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
根据和设置
--日志驱动程序
--名称
标志

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

另外,当我进入实例并运行命令
logger“hello from logger”
时,我没有看到它显示在cloud logger中。我尝试将其转换为高级过滤器,并删除除“hello from logger”字符串过滤器之外的所有过滤器

如何正确设置日志记录?我在我的NodeJS应用程序中使用
bunyan
,但当应用程序失败时,我完全看不见?我希望云记录器中有来自
journalctl
的所有日志。或者,至少是
日志tl
启动脚本部分。现在,我正在通过对实例进行SSHing并运行
journalctl-r|grep启动脚本来检索它们

更新 访问范围设置正确:

Stackdriver Logging API: Write Only
Stackdriver Logging API: Write Only
我正在使用默认的计算引擎服务帐户。下面是我创建此VM时使用的命令:

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/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
#!/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
此虚拟机正在运行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="1234567890"
protoPayload.metadata.instanceMetadataDelta.addedMetadataKeys="startup-script"
根据GCP,要查看启动脚本日志,您需要登录到实例,并能够看到启动脚本输出已写入以下日志文件:

  • 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容器优化操作系统默认启用了操作日志记录(以前称为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>
[更新日期:2021年1月22日]

OP有两个问题。1)Stackdriver服务未运行。上面的步骤解决了该问题。2)启动脚本部分未转到Stackdriver

容器操作系统的当前配置的日志级别设置过低,无法将启动脚本日志发送到Stackdriver

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

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


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

这是否适用于您``resource.type=“gce_instance”resource.labels.instance_id=“XXXXXXXXXXXXXXXXXXXXXXXX”protoPayload.metadata.instanceMetadataDelta.addedMetadataKeys=“startup script”“``不,没有。我知道如何搜索日志。在运行常规实例时显示启动脚本日志。这个问题只存在于容器优化OSI中,当使用cos-stable-85-13310-1041-161从启动脚本运行容器时,请在“VM实例”下的云日志中获取容器日志。您能否确认在本地运行容器时(不带--log driver=gcplogs)看到了这些日志?在使用另一个启动盘映像(例如Ubuntu)时,您是否看到云日志记录中的日志?我阅读了您的更新。创建实例时,需要添加此标志以启用日志记录:
--metadata=google logging enabled=true
另外,为什么要使用image-family
cos-77-lts
?当我只搜索“某个字符串”时,它也会在元数据中找到包含“某个字符串”的日志。不管怎样,我已经验证了你的建议。不,没用。启动脚本日志不存在。您尝试过串行控制台输出吗?#1-一切正常#2-使用默认计算引擎服务帐户#3-启用日志记录。这是第一个命令输出:
● stackdriver-logging.service-用于stackdriver日志记录的Fluentd容器已加载:已加载(/usr/lib/systemd/system/stackdriver-logging.service;静态;供应商预设:禁用)活动:非活动(死)
非活动(死)
表示服务未运行。重新启动实例,ssh登录,然后再次检查。查看
stackdriver日志记录服务是否有错误。我刚刚调整了计算组的大小。如果它现在死了,它在100%的情况下都死了。看看这个问题,我添加了更多细节。