[英]How to upgrade Container-Optimized OS (COS) virtual machine?
[英]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
的所有日志。 或者,至少是journalctl
的startup-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 范圍已啟用。 這需要停止實例以修改范圍。
可能的問題#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 已寫入以下日志文件:
為了節省一些時間,您可以使用此命令查看日志:
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.