fbpx

ELK Stack – 使用 Prometheus 和 Fluentd 監控 Elastic Stack 中的 Kubernetes

Kubernetes 是一個開源容器調度系統,用於應用程式部署、擴展和管理的自動化,且似乎已經成為該領域標竿。

Kubernetes 讓單體應用程式轉變到微服務,使部署速度更快,在現今多變的環境已十分普遍。但另一方面,這讓監控應用程式及其基礎架構更加複雜。幸運的是,Elastic 多年來已廣泛用在基礎架構和應用程式的監控解決方案 —— 無論是 ELK Stack(Elasticsearch、Logstash 和 Kibana)還是最近的 Elastic Observability。雖然 Elastic Observability 可監控 Kubernetes 環境,但許多用戶還是希望使用他們已經有的開源監控工具。


本文章將探討如何使用 Prometheus 和 Fluentd,整合 Elastic Stack 來監控 Kubernetes。 
 

使用 Prometheus 和 Fluentd

Prometheus 是個眾所皆知的開源工具,是一個指標工具包,特別是在最近 Kubernetes 環境的指標監測方面佔有主導地位。Prometheus 使用 pull model 從端點抓取指標並將它們導入到 Prometheus 伺服器中。但是在儲存方面,Prometheus 在可擴展性和持久性方面存在一些限制,因為其地端儲存僅限於單個節點。為了消除這些限制,用戶應該在 Prometheus 本身中使用集群式的儲存,或者使用 Prometheus 的介面,來與遠端的儲存系統做整合。Fluentd 是一個眾所皆知的開源日誌收集工具,同樣也很受歡迎。

Fluentd 存在於各種日誌源和專門儲存日誌的儲存層之間,類似 Elastic Stack 中的 Logstash。因此,Fluentd 也需要一個長期的儲存系統。這就是我們將 Elasticsearch 作為日誌和指標的長期儲存工具,將 Kibana 作為視覺化工具的原因。事實上,使用 Elasticsearch、Fluentd 和 Kibana 的日誌監控解決方案也稱為 EFK Stack。
 

監控架構

在本文章中,我們將在 Kubernetes 集群上部署一個名為 Cloud-Voting-App 的簡單多容器應用程式,並監控包括該應用程式在內的 Kubernetes 環境。接下來將解釋如何使用 Prometheus 收集指標和使用 Fluentd 收集日誌、將它們提取到 Elasticsearch,再用 Kibana 監控它們。大概的架構如下圖所示。


kubernetes-prometheus-fluentd-1

將 Fluentd 當作 DaemonSet 進行部署

每個 Kubernetes 節點只能部署一個 Fluentd 案例。Fluentd 的官方 GitHub 儲存庫中提供了配置方法,Fluentd 的設定是解析每個容器所需的,而這些設定被添加到 ConfigMap 中。DaemonSet 的清單檔案已定義在文件cncf-projects/fluentd-daemonset-elasticsearch-rbac.yaml 中,因此您所要做的只需添加 Elasticsearch 集群的 URL 和憑證即可。如果想了解更多有關如何配置 Fluentd 的資訊,請查閱 Fluentd 官方文件

elk-kubernetes-1

Fluentd 在 Elasticsearch 中建立的索引預設名為 logstash-YYYY.mm.dd。提前建立一個 Index Template,以避免 text 和關鍵字字段不必要的混合。

elk-kubernetes-2

部署 Prometheus

Prometheus 可以藉由整合遠端儲存系統,將其提取的樣本以標準化格式寫入遠端 URL。更多詳細資訊請參考 Prometheus 官方文件。為了使用 Elasticsearch 作為 Prometheus 的遠端儲存系統,我們使用了官方的 Metricbeat 模組,更具體來說是 remote_write_metricset
 

以 Metricbeat 來進行部署 (Deploying Metricbeat as a Deployment)

在 Kubernetes 集群中,以 Metricbeat 實例進行部署。部署的清單檔案已在 cncf-projects/metricbeat-kubernetes-deployment.yaml 中被定義,因此您只需添加 Elasticsearch 集群的 URL 和憑證即可。清單檔案中設定的 Metricbeat remote_write 如下。 Metricbeat 現在藉由 http 從 Prometheus 在接口 9201 上監聽遠端的請求,並將來自 Prometheus 的指標寫入 metricbeat- * 索引。Metricbeat 可說是充當 Prometheus 的遠端儲存適配器 (adapter)。

elk-kubernetes-3

利用 Helm Chart 部署 Prometheus

將 Prometheus 部署到 Kubernetes 集群有多種方法,但這裡我們使用 Helm Chart 來部署 Prometheus。請參閱 GitHub 儲存庫中由 Prometheus 社群提供的 Helm Charts。 Prometheus 組件可以使用 Chart 的制定 YAML 文件進行自定,下圖顯示了文件 cncf-projects/prometheus_custom.yaml 中的自定形式。這裡將預設的 Prometheus Service 從 ClusterIP 改為 LoadBalancer,並將 remote_write 的 URL 設定為 Metricbeat 的Service,以便將指標寫入上述 Metricbeat 的 9201接口。Alertmanager 和 Pushgateway 在此禁止被使用。

elk-kubernetes-4

部署應用程式

Cloud-Voting-App 是本案例的監控目標,是一個簡單的多容器應用程式。應用程式介面是用 Python/Flask 建立的。資料元件使用的是 Redis。該應用程式使用 Prometheus Python Client 進行檢測,以導出一個簡單的指標 cloud_vote_total。該指標隨著每個 POST 請求而增加,其中 vote 變數用來指定標籤。

elk-kubernetes-5

讓我們打開 Kibana

現在我們已經部署了所有必需的元件。讓我們用 Cloud-Voting-App vote 幾次,然後打開 Kibana。

日誌

Fluentd 提取的日誌存儲在索引 logstash-* 中。如果您使用 Kibana Discover 檢查,您可以看到每個容器的日誌都使用 metadata kubernetes.* 進行索引。

elk-kubernetes-6

此外,Kibana 中的 Logs 應用程式允許您搜索、過濾和追蹤 Elastic Stack 中的所有日誌。現在 Fluentd 收集的所有 Kubernetes 容器日誌都能在 Logs 應用程式中的工具裡找到。

elk-kubernetes-7

指標

Prometheus 收集的指標透過 Metricbeat 儲存在名為 metricbeat-* 的索引中。Prometheus 指標是帶有前綴 prometheus 的字段。由於它們是一般的 metricbeat-* 索引,因此您可以使用 Kibana Lens 輕鬆視覺化以 prometheus 開頭的字段,如下所示。下方是每個 labels.pod 的 container_memory_usage_bytes 的視覺化結果。


kubernetes-prometheus-fluentd-4

應用程式的自訂指標 cloud_vote_total 也是如此。labels.vote 在 POST 中顯示每個變量。


kubernetes-prometheus-fluentd-5

Metricbeat 的 Prometheus 模組允許您使用預先定義好的儀表板來進行 Prometheus 特定的統計,無需任何配置。


kubernetes-prometheus-fluentd-6

告警

我們在部署 Prometheus 時禁用了 Alertmanager。如果您在 Elastic Stack 中收集日誌和指標,則可以充分利用 Kibana Alert 作為 Alertmanager 的替代方案來發布告警。我們不僅可以利用 Prometheus 的指標,還可以利用儲存在 Elasticsearch 中的所有資料,包括日誌和任何其他索引。此外,使用機器學習的進階告警在 Elastic Stack 中也是可行的。

結語

在這篇文章中,我們看到如何使用 Fluentd 和 Prometheus 將日誌和指標提取到 Elastic Stack 以監控 Kubernetes。 您現在可以註冊來免費試用 Elastic Cloud,或下載 Elastic Stack 自行託管來開始監控您的 Kubernetes 環境。如果您已經在使用這些免費和開源的工具,那麼就可以利用 Elastic Stack 來建立全面的數據觀測 (observability)。

相關文章