記錄¶
您可以使用 Fluent Bit,一個日誌處理器和轉發器,將 Kubernetes 日誌收集到中央目錄中。這不是執行 Knative 的必要條件,但對於 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
-
導覽至
http://localhost:8080/
。 -
選用:您可以開啟
nginx
Pod 中的 Shell 並使用 Unix 工具搜尋日誌,方法是輸入命令kubectl exec --namespace logging --stdin --tty --container nginx log-collector-0
設定轉發器¶
請參閱 Fluent Bit 文件,以設定 Fluent Bit DaemonSet,預設會將日誌轉發到 ElasticSearch。
當您在安裝步驟中建立 ConfigMap 時,您必須
- 將 ElasticSearch 設定取代為
fluent-bit-configmap.yaml
,或 -
將下列區塊新增至 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
然後您可以在 PersistentVolume 中使用 /shared/logs
作為 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
您也必須在 PersistentVolume 中參考 /mnt/logs
作為 hostPath.path
。