容器技術的興起,特別是 Docker 的普及,讓應用程式佈署和管理更加便捷。然而,隨著容器數量的不斷增長,如何有效地監控和管理這些容器成為了新的挑戰。傳統的監控工具主要針對實體主機和虛擬機器,難以應對容器環境快速變動、數量龐大以及分散式佈署的特性。因此,瞭解容器監控的特殊性和挑戰,並掌握相應的工具和技術,對於維護容器化應用程式的穩定執行至關重要。在微服務架構下,一個應用程式可能由數百甚至數千個容器組成,每個容器都有其獨立的日誌輸出和效能指標。如何有效地收集、分析和管理這些分散的資料,是容器監控的核心問題。Docker 提供了多種日誌驅動器,例如 json-file、syslog、awslogs、gelf 等,可以根據不同的需求將容器日誌輸出到不同的目標,例如本地檔案、遠端伺服器或雲端平台。此外,Docker Stats 命令、cAdvisor 等工具可以提供容器的 CPU、記憶體、網路等效能資料,方便工程師實時監控容器的執行狀況。除了這些內建工具,還有許多第三方監控平台和工具可以與 Docker 整合,提供更全面的監控和分析功能。

容器管理

在深入瞭解容器協調、擴充套件及網路後,讓我們來談談當事情出錯時的應對方式。在生產環境中,可能會有數百到數千個容器在執行,因此有效且高效地管理它們是必要的。在此基礎上,我們將探討容器監控與管理的細節,包括捕捉日誌、收集資源度量及使用一些叢集範圍內的監控系統。首先,讓我們瞭解容器的整體監控方面,以及它可能與現有市場上已有的解決方案不同。

容器監控

監控包含容器的環境並不困難,但速度、數量及環境可能會使其變得複雜。傳統上,監控工具市場已經成熟,用於監控和管理實體主機、網路及虛擬機器。然而,容器是新興技術,市場仍在解決監控問題。容器監控之所以不同,主要是因為以下幾個方面和挑戰:

佈署環境

組織可能會在其自身資料中心內的實體基礎設施上直接執行一些容器,也可能在虛擬機器上與服務提供者(如 AWS Managed Service Partners)執行一些容器。這增加了一些管理上的複雜性。

容器的擴充套件性

整個應用程式可以在實體機或少數幾台虛擬機器上執行。但在容器中,最佳實踐建議一個服務對應一個容器,而一個應用程式可能由數百到數千個服務組成。這意味著數百到數千個容器。在微服務架構中,應用程式的擴充套件需要根據需求自動縮小或擴充套件容器的數量。

變更速度

與實體主機或虛擬機器不同的是,容器的壽命可能從幾秒鐘到幾天不等。當一個任務完成後,該容器就會消失。

各種工具的使用

雖然容器提供了速度和效率,但它們也增加了複雜性。佈署、管理和發現容器涉及大量工具。例如,您可以使用多種容器協調工具之一,如 Docker Swarm、Kubernetes 或 Mesos。您可以指定網路組態、要啟動的容器例項數量等。然後協調工具根據主機中的資源可用性來控制建立、刪除和管理這些容器。每次建立一個新的容器時,它都會獲得一個新的 IP 地址。所有這些變化使得設定整體監控和收集度量變得非常困難。

分散式資料

資料必須從各種工具中收集並合併到一個集中地點以便進行分析並找出潛在問題。Docker 提供了一些能力來取得這些資料和統計資訊以主動監控容器和整體系統。

目前有許多專用供應商選項,每個選項都有其自身優點。Docker 最近推出了生態系統技術合作夥伴 (ETP) 計劃,將其監控工具透過 API 與 Docker 整合的公司合作。您可以在 https://www.docker.com 查詢這樣的合作夥伴。

接下來我們來討論現有的日誌記錄和容器度量收集方法。您可以將這些資料提取到現有的監控工具中或構建一些儀錶板。

日誌記錄

在支援多個應用程式、多個叢集和多個執行服務副本的生產環境中,您可能會有大量的容器在執行。事實上事情是會出錯的,當發生問題時日誌記錄就變得非常重要以便進行故障排除。例如,回想一下微服務架構中我們提到的一個典型大型應用程式可能包含數百到數千個微服務。Docker 容器非常適合執行這麼多微服務因為它們提供了許多我們討論過的優勢。

問題是如何在每個容器都將 stdout 和 stderr 的所有內容輸出到日誌時管理這些日誌?如何保持所有這些日誌同步並放在一個使故障排除簡單高效的地方?Docker 再次提供了驅動程式來簡化我們的工作。每個驅動程式都幫助我們從容器和執行中的服務取得日誌資訊。它們在提供和格式化資訊以及將它們轉發到不同日誌處理程式方面有所不同。

以下是一些範例驅動程式:JSON、Syslog、Splunk、Amazon CloudWatch Logs 等。

  graph TD;
    A[Container] --> B[Log Drivers];
    B --> C[JSON File];
    B --> D[Syslog];
    B --> E[AWS Logs];
    B --> F[Splunk];
    B --> G[Journald];
    B --> H[GCP Logs];

內容解密:

此圖示展示了各種可用於 Docker 日誌記錄功能的驅動程式選項。

  • Container:代表正在執行中的 Docker 容器。
  • Log Drivers:代表 Docker 提供的一系列日誌驅動程式。
  • JSON File:這是 Docker 預設的日誌驅動程式。
  • Syslog:將日誌訊息傳送至本地或遠端 syslog 伺服器。
  • AWS Logs:將日誌訊息傳送至 Amazon CloudWatch Logs。
  • Splunk:將日誌訊息傳送至 Splunk 的 HTTP Event Collector。
  • Journald:將日誌訊息傳送至系統日誌。
  • GCP Logs:將日誌訊息傳送至 Google Cloud Platform 日誌。

這些選項我們會詳細討論,但更多細節請參考 Docker 線上檔案。

截至撰寫本文時,支援以下日誌驅動程式:

  • json-file:Docker daemon 的預設日誌驅動程式。每個 container 都使用 json-file ,除非您組態 container 或 daemon 使用其他驅動程式。輸出日誌檔案以易於理解的 JSON 格式呈現。
  • none:關閉日誌記錄功能。
  • Syslog:將日誌訊息傳送至本地或遠端安裝之 syslog server。如前所述,您可以修改主機上的 daemon.json 檔案以設定 log driver 為 syslog ,並指定 options 段中的選項。您也可以在 container 層級進行此操作。Syslog 將所有訊息帶到同一位置以便於排錯 ,但對於處理數百台 container(如微服務案例)則不足夠。
  • awslogs:將日誌訊息傳送至 Amazon CloudWatch Logs 。在此情況下 ,設定 log driver 為 awslogs ,並指定所需選項。
  • Splunk:透過 HTTP Event Collector 向 Splunk 傳送日誌訊息 。在此情況下 ,設定 log driver 為 Splunk 。Splunk-token 和 splunk-url 是必須指定之檔案或執行 container 時之必需選項。
  • journald:將日誌訊息傳送至系統記錄日誌 。在這種情況下 ,設定 log driver 為 journald 。可以使用 journalctl 或 Docker log 命令檢索記錄專案。
  • gcplogs:向 Google Cloud Platform 日誌傳送日誌訊息 ,您可以搜尋和分析這些訊息 。在此情況下 ,設定 log driver 為 gcplogs 。您還可以設定多種選項以包含更多詳細資訊於訊息中。
  graph TD;
    A[Logging Driver Options] --> B[JSON File Driver];
    A --> C[None Driver];
    A --> D[Syslog Driver];
    A --> E[AWS Logs Driver];
    A --> F[Splunk Driver];
    A --> G[Journald Driver];
    A --> H[GCP Logs Driver];

內容解密:

此圖示展示了不同型別之可用 Docker 日誌驅動程式:

  • Logging Driver Options :代表可供使用之各種 Docker 日誌驅動程式。
  • JSON File Driver :Docker 預設之 JSON 日誌驅動程式。
  • None Driver :關閉 Container 日誌記錄功能。
  • Syslog Driver :將 Container 日誌傳輸至本地或遠端之 Syslog Server 。
  • AWS Logs Driver :將 Container 日誌傳輸至 AWS CloudWatch Logs 。
  • Splunk Driver :透過 HTTP Event Collector 向 Splunk 傳輸 Container 日誌 。
  • Journald Driver :將 Container 日誌傳輸至系統記錄 。
  • GCP Logs Driver :將 Container 日誌傳輸至 Google Cloud Platform 。

我們已經介紹瞭如何使用不同型別之驅動程式來收集及分析 Container 日誌紀錄功能 , 接下來介紹如何利用這些資料 , 技術人員就能迅速且準確地進行排錯工作 , 接下來玄貓將會介紹如何統整以及進行視覺化處理 .

Docker 日誌管理與效能監控

在現代的雲端運算與容器化技術中,有效的日誌管理和效能監控是確保系統穩定執行的關鍵。Docker 提供了多種日誌驅動器和監控工具,讓我們能夠深入瞭解容器的執行狀況,並及時發現並解決潛在問題。以下將詳細探討 Docker 的日誌管理和效能監控機制。

Docker 日誌管理

Docker 提供多種日誌驅動器,讓我們可以根據需要選擇合適的日誌記錄方式。以下是幾種常見的日誌驅動器及其應用場景。

預設日誌驅動器:json-file

json-file 是 Docker 的預設日誌驅動器,它會將容器的日誌記錄到本地檔案中。這種方式簡單易用,適合開發和測試環境。可以透過以下命令檢查當前的日誌驅動器:

docker info | grep 'Logging Driver'

預期結果應該是 Logging Driver: json-file

更改日誌驅動器

我們可以在 Daemon 級別或容器級別更改日誌驅動器。以下是具體操作:

  1. Daemon 級別:修改 /etc/docker/daemon.json 檔案,新增或修改 log-driver 欄位:
{
  "log-driver": "syslog",
  "log-opts": {
    "syslog-address": "tcp://192.168.0.42:123"
  }
}
  1. 容器級別:在執行容器時指定日誌驅動器,例如:
docker run -it --log-driver=syslog --log-opt syslog-address=udp://192.168.0.42:123 ubuntu:latest sh

GELF 日誌驅動器

GELF(Graylog Extended Log Format)是一種流行的日誌格式,常用於 ELK(Elasticsearch, Logstash, Kibana)堆積疊中。我們可以透過以下命令將容器日誌傳送到 GELF 端點:

docker run -it --log-driver=gelf --log-opt gelf-address=udp://localhost:12201 ubuntu:latest sh

這樣,容器的日誌就會被傳送到指定的 GELF 端點,方便進一步分析和處理。

停用日誌記錄

如果不需要記錄容器日誌,可以在執行容器時指定 none 日誌驅動器:

docker run -it --log-driver=none ubuntu:latest sh

這樣,該容器的所有日誌都將被停用。

效能監控

效能監控是確保系統穩定執行的重要手段。Docker 提供了多種工具和方法來監控容器的效能資料。

Docker Stats 命令

docker stats 命令可以實時顯示正在執行容器的效能資料。以下是具體使用方法:

docker stats [Options] [Containers]

例如,要檢視所有正在執行的容器的效能資料:

docker stats

預期結果如下圖所示:

CONTAINER CPU% MEM USAGE / LIMIT MEM% NET I/O BLOCK I/O PIDS
b4831186f0d4 0.00% 1.98 MiB / 47.08 GiB 0.00% 0 B / 0 B 2.12 MB / 0 B 1

我們可以透過 --format 選項自定義輸出格式。例如:

docker stats --format "table {{.Name }} \t {{.ID }} \t {{.CPUPerc}} \t {{.MemUsage}}"

這樣可以更方便地檢視特定資料。

REST API 效能監控

Docker 提供了 REST API 介面來取得容器的效能資料。例如,要取得特定容器的效能資料:

curl --unix-socket /var/run/docker.sock -X GET 'http:/v1.24/containers/<container ID>/stats'

這個 API 介面會每秒重新整理一次資料,我們可以根據需要進行程式化處理。

cAdvisor

cAdvisor(Container Advisor)是 Google 開發的一個監控工具,它可以提供詳細的容器使用和效能資料。cAdvisor 本身也是一個 Docker 輸送容器,我們可以透過以下命令佈署它:

docker run \
    --volume=/:/rootfs:ro \
    --volume=/var/run:/var/run:ro \
    --volume=/sys:/sys:ro \
    --volume=/var/lib/docker/:/var/lib/docker:ro \
    --publish=8080:8080 \
    --detach=true \
    --name=cadvisor \
    --privileged \
    --device=/dev/kmsg \
    google/cadvisor:latest

佈署完成後,我們可以透過瀏覽器存取 http://<host-ip>:8080 檢視 cAdvisor 的圖形化介面。

個人見解與未來趨勢

在實際應用中,隨著容器數量的增加,單一宿主機上的日誌管理和效能監控將變得越來越複雜。未來趨勢可能會向以下方向發展:

  • 中央化日誌管理系統:搭建一個中央化的日誌管理系統來聚合所有容器生成的資料,提供更強大的查詢和分析能力。
  • AI 與機器學習:利用 AI 和機械學習技術進行自動異常檢測和預測性維護。
  • 雲原生監控工具:結合 Kubernetes 和 Prometheus等工具實作更高階別的監控與報警機制。

透過有效地管理和監控 Docker 日誌與效能資料,我們可以更好地保障系統穩定執行,及時發現並解決潛在問題。