跳至內容

日誌記錄

您可以使用 Fluent Bit(一個日誌處理器和轉發器)在中央目錄中收集 Kubernetes 日誌。這不是執行 Knative 的必要條件,但對於 Knative Serving 來說可能很有幫助,Knative Serving 會在不再需要 Pod 和相關日誌時自動刪除它們。

Fluent Bit 支援匯出到許多其他日誌提供者。如果您已經有現有的日誌提供者,例如 Splunk、Datadog、ElasticSearch 或 Stackdriver,您可以依照 FluentBit 文件來設定日誌轉發器。

設定日誌記錄元件

設定日誌收集需要兩個步驟

  1. 在每個節點上執行日誌轉發 DaemonSet。
  2. 在叢集中的某處執行收集器。

提示

在以下範例中,使用 StatefulSet,它將日誌儲存在 Kubernetes PersistentVolumeClaim 上,但您也可以使用 HostPath。

設定收集器

fluent-bit-collector.yaml 檔案定義了一個 StatefulSet,以及一個 Kubernetes Service,允許從叢集內部存取和讀取日誌。提供的組態會在名為 logging 的命名空間中建立監控組態。

重要

在設定轉發器之前,請先設定收集器。您在設定轉發器時會需要收集器的位址,而且轉發器可能會排隊處理日誌,直到收集器準備就緒。

System diagram: forwarders and co-located collector and nginx

程序

  1. 輸入下列命令來套用組態

    kubectl apply -f https://github.com/knative/docs/raw/main/docs/serving/observability/logging/fluent-bit-collector.yaml
    
    預設組態會將日誌分類為

    • Knative 服務或具有 app=Knative 標籤的 Pod。
    • 非 Knative 應用程式。

    注意

    日誌預設會使用 Pod 名稱進行記錄;可以在安裝之前或之後更新 log-collector-config ConfigMap 來變更此設定。

    警告

    更新 ConfigMap 後,您必須重新啟動 Fluent Bit。您可以刪除 Pod 並讓 StatefulSet 重新建立它來執行此操作。

  2. 若要透過網頁瀏覽器存取日誌,請輸入下列命令

    kubectl port-forward --namespace logging service/log-collector 8080:80
    
  3. 導覽至 https://#:8080/

  4. 選用:您可以開啟 nginx Pod 中的 Shell 並使用 Unix 工具搜尋日誌,方法是輸入下列命令

    kubectl exec --namespace logging --stdin --tty --container nginx log-collector-0
    

設定轉發器

請參閱 Fluent Bit 文件,以設定預設將日誌轉發到 ElasticSearch 的 Fluent Bit DaemonSet。

當您在安裝步驟期間建立 ConfigMap 時,您必須

  • 使用 fluent-bit-configmap.yaml 取代 ElasticSearch 組態,或者
  • 將下列區塊新增至 ConfigMap,並將 @INCLUDE output-elasticsearch.conf 更新為 @INCLUDE output-forward.conf

    output-forward.conf: |
      [OUTPUT]
          Name            forward
          Host            log-collector.logging
          Port            24224
          Require_ack_response  True
    

設定本機收集器

警告

此程序描述開發環境設定,不適用於生產環境。

如果您使用本機 Kubernetes 叢集進行開發,您可以建立 hostPath PersistentVolume,將日誌儲存在您的桌面作業系統上。這可讓您在檔案上使用常用的桌面工具,而無需使用 Kubernetes 專用的工具。

PersistentVolumeClaim 看起來會類似於下列內容

apiVersion: v1
kind: PersistentVolume
metadata:
  name: shared-logs
  labels:
    app: logs-collector
spec:
  accessModes:
    - "ReadWriteOnce"
  storageClassName: manual
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: logs-log-collector-0
    namespace: logging
  capacity:
    storage: 5Gi
  hostPath:
    path: <see below>

注意

hostPath 會根據您的 Kubernetes 軟體和主機作業系統而有所不同。

您必須更新 StatefulSet volumeClaimTemplates 以參考 shared-logs 磁碟區,如下列範例所示

volumeClaimTemplates:
  metadata:
    name: logs
  spec:
    accessModes: ["ReadWriteOnce"]
    volumeName: shared-logs

Kind

當您建立叢集時,您必須使用 kind-config.yaml 並為每個節點指定 extraMounts,如下列範例所示

apiversion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
  - role: control-plane
    extraMounts:
      - hostPath: ./logs
        containerPath: /shared/logs
  - role: worker
    extraMounts:
      - hostPath: ./logs
        containerPath: /shared/logs

然後,您可以使用 /shared/logs 作為 PersistentVolume 中的 spec.hostPath.path。請注意,目錄路徑 ./logs 相對於建立 Kind 叢集的目錄。

Docker Desktop

Docker Desktop 會自動在主機和客體作業系統之間建立一些共用掛載,因此您只需要知道您主目錄的路徑。以下是一些不同作業系統的範例

主機作業系統 hostPath
Mac OS /Users/${USER}
Windows /run/desktop/mnt/host/c/Users/${USER}/
Linux /home/${USER}

Minikube

Minikube 需要明確的命令才能將目錄掛載到執行 Kubernetes 的虛擬機器 (VM) 中。

下列命令會將目前目錄內的 logs 目錄掛載到 VM 中的 /mnt/logs

minikube mount ./logs:/mnt/logs

您也必須將 /mnt/logs 作為 PersistentVolume 中的 hostPath.path 參考。

我們使用分析和 Cookie 來了解網站流量。為此目的,您使用我們網站的資訊會與 Google 分享。瞭解更多。