日誌記錄¶
您可以使用 Fluent Bit(一個日誌處理器和轉發器)在中央目錄中收集 Kubernetes 日誌。這不是執行 Knative 的必要條件,但對於 Knative Serving 來說可能很有幫助,Knative Serving 會在不再需要 Pod 和相關日誌時自動刪除它們。
Fluent Bit 支援匯出到許多其他日誌提供者。如果您已經有現有的日誌提供者,例如 Splunk、Datadog、ElasticSearch 或 Stackdriver,您可以依照 FluentBit 文件來設定日誌轉發器。
設定日誌記錄元件¶
設定日誌收集需要兩個步驟
- 在每個節點上執行日誌轉發 DaemonSet。
- 在叢集中的某處執行收集器。
提示
在以下範例中,使用 StatefulSet,它將日誌儲存在 Kubernetes PersistentVolumeClaim 上,但您也可以使用 HostPath。
設定收集器¶
fluent-bit-collector.yaml
檔案定義了一個 StatefulSet,以及一個 Kubernetes Service,允許從叢集內部存取和讀取日誌。提供的組態會在名為 logging
的命名空間中建立監控組態。
重要
在設定轉發器之前,請先設定收集器。您在設定轉發器時會需要收集器的位址,而且轉發器可能會排隊處理日誌,直到收集器準備就緒。
程序¶
-
輸入下列命令來套用組態
預設組態會將日誌分類為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 重新建立它來執行此操作。
- Knative 服務或具有
-
若要透過網頁瀏覽器存取日誌,請輸入下列命令
kubectl port-forward --namespace logging service/log-collector 8080:80
-
導覽至
https://#:8080/
。 -
選用:您可以開啟
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
參考。