簡體   English   中英

如何從 GCE 實例中的 Container-optimized OS 獲取啟動腳本日志?

[英]How do I get startup-script logs from Container-optimized OS in a GCE instance?

我正在使用此啟動腳本運行容器優化的計算實例:

#!/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 社區指南docker 文檔設置的。

但是我沒有看到容器啟動的日志。

此外,當我通過 SSH 連接到實例並運行命令logger "hello from logger"時,我沒有看到它出現在雲記錄器中。 我試過將它轉換為高級過濾器並刪除除“hello from logger”字符串過濾器之外的所有過濾器。

如何正確設置日志記錄? 我在我的 NodeJS 應用程序中使用bunyan ,但是當應用程序失敗時我完全沒有可見性? 我很想在雲記錄器中擁有來自journalctl的所有日志。 或者,至少是journalctlstartup-script部分。 現在我正在通過 SSH 連接到實例並運行journalctl -r | grep startup-script來檢索它們。 journalctl -r | grep startup-script

更新

正確設置訪問范圍:

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/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命令時

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 啟用 Cloud Logging API:

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

或者通過谷歌雲控制台:

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設置。

查找 Collects all journal logs with priority >= warning 部分。 優先級為 0 -> 4。如果將“5”和“6”添加到列表中,則啟動腳本將記錄在操作日志中。

您可以更改日志級別,但此更改不會在重新啟動后持續存在。 我還沒有找到使更改永久化的解決方案。

我可以使用以下高級過濾器日志在 Cloud Logging 中查看啟動腳本日志:

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

根據 GCP 文檔查看啟動腳本日志,您需要登錄實例並能夠看到啟動腳本 output 已寫入以下日志文件:

  • CentOS 和 RHEL:/var/log/messages
  • Debian:/var/log/daemon.log
  • Ubuntu: /var/日志/系統日志
  • SLES:/var/日志/消息

為了節省一些時間,您可以使用此命令查看日志:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM