日志记录¶
您可以使用 Fluent Bit,一个日志处理器和转发器,在中央目录中收集 Kubernetes 日志。这对于运行 Knative 来说不是必需的,但对于 Knative Serving 来说可能会有帮助,Knative Serving 在不再需要时会自动删除 Pod 和相关日志。
Fluent Bit 支持导出到许多其他日志提供商。如果您已经拥有现有的日志提供商,例如 Splunk、Datadog、ElasticSearch 或 Stackdriver,您可以按照 Fluent Bit 文档 配置日志转发器。
设置日志组件¶
设置日志收集需要两个步骤
- 在每个节点上运行日志转发 DaemonSet。
- 在集群中的某个地方运行收集器。
提示
在以下示例中,使用 StatefulSet,它将日志存储在 Kubernetes 持久卷声明中,但您也可以使用 HostPath。
设置收集器¶
fluent-bit-collector.yaml
文件定义了一个 StatefulSet,以及一个 Kubernetes 服务,该服务允许从集群内部访问和读取日志。提供的配置将在名为 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 服务,或带有
-
要通过 Web 浏览器访问日志,请输入命令
kubectl port-forward --namespace logging service/log-collector 8080:80
-
导航到
https://127.0.0.1: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
持久卷,以在您的桌面操作系统上存储日志。这使您无需 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
您还必须在 PersistentVolume 中引用 /mnt/logs
作为 hostPath.path
。