將 DigitalOcean Kubernetes (DOKS) 日志收集並傳送至 DigitalOcean 管理 OpenSearch

引言

本教程將展示如何從 DigitalOcean Kubernetes (DOKS) 叢簇收集並將日誌傳送至 DigitalOcean 管理 OpenSearch 實例,使用了 AxoSyslog,一個可伸縮的安全數據處理器。依照本指南,你將學習如何建立一個堅固的日誌系統, capture 和分析你的 Kubernetes 應用程序的日誌,使得監控、解決問題和保護你的基礎設施變得更簡單。

在本次教程中,你將使用 AxoSyslog 將日誌從 Kubernetes 叢簇傳送至 OpenSearch。

先決條件

開始之前,請確保你已準備以下先決條件:

  1. 你需要一個 DigitalOcean 雲端帳號 來創建和管理你的 Kubernetes 和 OpenSearch 資源。
  2. 你應該在本地電腦上安裝並配置 DigitalOcean 命令行界面 (CLI) 工具doctl
  3. 一個運行的 DigitalOcean Kubernetes (DOKS) 集群。
  4. 用於管理 Kubernetes 應用程式的 Kubernetes 包管理器,Helm,應該已安裝。
  5. 熟悉 Kubernetes、Helm 和 DigitalOcean 的管理服務。

使用案例

這個專案非常适合於你需要一個集中的日誌解決方案來監控和分析在 Kubernetes 集群中運行的各種應用程式的日誌的場合。無論你是在管理一小組應用程式還是大规模的基础設施,將日誌收集並转发到一個專用的 OpenSearch 集群都有助於:

  • 安全監控:通過實時分析記錄來侦測和應對安全事件。
  • 故障排除:通過訪問詳細記錄,快速識別和解決Kubernetes應用中的問題。
  • 合規性:記錄事件以符合行業規定。

通過將AxoSyslog與DigitalOcean Managed OpenSearch整合,您可以高效地處理和儲存的日志量,使您更容易抽取有價值的洞察並維護系統的健康和安全。

步驟1 – 創建OpenSearch集群

在這個步驟中,您將設定您的記錄系統的核心部件,即OpenSearch集群。OpenSearch將是您從Kubernetes集群收集的所有日志的目的地。您通過運行以下命令在您選擇的地區的DigitalOcean中創建新的OpenSearch實例。

doctl databases create opensearch-doks --engine opensearch --region lon1 --size db-s-1vcpu-2gb --num-nodes 1

lon1替換為您 desired region。 要列出可用的大小slug,請訪問我們的 API參考文檔。

步驟 2 – 產生一些隨機記錄

在將記錄傳送到OpenSearch之前,您需要一些記錄來進行操作。如果您还没有在Kubernetes集群中生成日志的应用程序,此步驟將向您展示如何部署一個記錄生成器。這個記錄生成器將產生一個穩定的事件流作為樣本記錄,可用来测试和展示您的記錄管線。

首先,添加記錄生成器的Helm圖表仓库並安装記錄生成器:

helm repo add kube-logging https://kube-logging.github.io/helm-charts
helm repo update

然後,使用Helm安装記錄生成器:

helm install --generate-name --wait kube-logging/log-generator

您可以通过查看它生成的記錄来验证記錄生成器是否正在运行:

kubectl logs -l app.kubernetes.io/name=log-generator

步驟 3 – 準備 AxoSyslog 收集器以進行安裝

在這個步驟中,您將配置 AxoSyslog 收集器,該收集器負責從您的 Kubernetes 集群收取記錄並將它們傳送到 OpenSearch。這包括為您的 OpenSearch 集群提供正確的連接詳細信息(主機名、用戶和密碼)。

我們將使用 helm 來安裝 AxoSyslog 收集器並傳遞自定義值。

配置 AxoSyslog 收集器以正確的位址、用戶名和密碼來訪問您的 OpenSearch 数据库,請按照以下步驟進行:

自動腳本

為了簡化配置,您可以使用一個自動化的腳本,該腳本會獲取必要的 OpenSearch 连线詳細信息並更新您的 AxoSyslog 配置文件。

將以下腳本保存為 update_axoflow_demo.sh

update_axoflow_demo.sh
#!/bin/bash

# 提取 opensearch-doks 的數據庫 ID
DB_ID=$(doctl databases list --format Name,ID --no-header | grep opensearch-doks | awk '{print $2}')

# 獲取主機名、用戶名和密碼
OPENSEARCHHOSTNAME=$(doctl databases connection $DB_ID --no-header --format Host)
OPENSEARCHUSERNAME=$(doctl databases connection $DB_ID --no-header --format User)
OPENSEARCHPASSWORD=$(doctl databases connection $DB_ID --no-header --format Password)

# 使用 yq 更新 axoflow-demo.yaml 文件
yq eval ".config.destinations.opensearch[0].address = \"$OPENSEARCHHOSTNAME\"" -i axoflow-demo.yaml
yq eval ".config.destinations.opensearch[0].user = \"$OPENSEARCHUSERNAME\"" -i axoflow-demo.yaml
yq eval ".config.destinations.opensearch[0].password = \"$OPENSEARCHPASSWORD\"" -i axoflow-demo.yaml

echo "axoflow-demo.yaml has been updated."

在運行該腳本之前,請確保您的腳本具有執行權限:

chmod +x update_axoflow_demo.sh && ./update_axoflow_demo.sh

此腳本將使用 doctl 从您的 DigitalOcean 帐户獲取必要信息,並据此更新您的 axoflow-demo.yaml 文件。

手動步驟以更新 axoflow-demo.yaml

如果您偏好手動配置您的 AxoSyslog 收集器,請按照以下步驟進行:

運行以下命令以提取 opensearch-doks 的數據庫 ID:

doctl databases list --format Name,ID --no-header | grep opensearch-doks | awk '{print $2}'

取得 Hostname、Username 和密碼,請分別執行以下命令:

doctl databases connection <id> --no-header --format Host
doctl databases connection <id> --no-header --format User
doctl databases connection <id> --no-header --format Password

現在,您需要手動更新 axoflow-demo.yaml 文件:

使用文字編輯器開啟您的 axoflow-demo.yaml 文件,並將相關字段更換為提取的值:

axoflow-demo.yaml
config:
  sources:
    kubernetes:
      # 收集 Kubernetes 日志
      enabled: true
  destinations:
    # 将日志发送到 OpenSearch
    opensearch:
      - address: "x.k.db.ondigitalocean.com"
        index: "doks-demo"
        user: "doadmin"
        password: "AVNS_x"
        tls:
          # 不驗證服務器的 TLS 憑證。
          peerVerify: false
        # 以 JSON 格式发送 syslog 字段 + .k8s.* 的元數據
        template: "$(format-json --scope rfc5424 --exclude DATE --key ISODATE @timestamp=${ISODATE} k8s=$(format-json .k8s.* --shift-levels 2 --exclude .k8s.log))"

步驟 4 – 安装 AxoSyslog-collector

configuration 完成后,下一步是將 AxoSyslog Collector 部署到您的 Kubernetes 集群中。这将启用日志的收集和转发到 OpenSearch。

通过添加 AxoSyslog Helm 仓库并使用自定义配置文件安装 AxoSyslog Collector:

helm repo add AxoSyslog https://axoflow.github.io/AxoSyslog-charts
helm repo update
helm install AxoSyslog -f axoflow-demo.yaml AxoSyslog/AxoSyslog-collector --wait

为确保日志被发送到正确的 OpenSearch 端口,请通过更新您的 configmap 来更新 AxoSyslog Collector 的配置:

kubectl get configmap AxoSyslog-AxoSyslog-collector -o yaml | sed 's/9200\/_bulk/25060\/_bulk/' | kubectl apply -f -

最后,删除现有的 pod 以應用更新后的配置:

kubectl delete pods -l app=AxoSyslog-AxoSyslog-collector

結論

透過 AxoSyslog 將 DigitalOcean Kubernetes 的日活动記錄集中的 OpenSearch,不僅能集中管理您的日誌,還能提升您監控、分析及保護應用程式的能力。根據本指南提供的步驟,您能夠迅速部署此解決方案,從而對 Kubernetes 環境獲得更深入的可见度,並確保您的基礎設施保持彈性和符合規範。

Source:
https://www.digitalocean.com/community/tutorials/collect-and-forward-kubernetes-logs-to-opensearch