跳至内容

日志记录

您可以使用 Fluent Bit(一个日志处理器和转发器)来收集 Kubernetes 日志到一个中央目录。这对于运行 Knative 来说不是必需的,但对于 Knative Serving 来说可能会有帮助,因为 Knative Serving 会在不再需要时自动删除 Pod 和相关的日志。

Fluent Bit 支持导出到许多其他日志提供商。如果您已经拥有现有的日志提供商,例如 Splunk、Datadog、ElasticSearch 或 Stackdriver,您可以按照 Fluent Bit 文档 配置日志转发器。

设置日志记录组件

设置日志收集需要两个步骤

  1. 在每个节点上运行一个日志转发 DaemonSet。
  2. 在集群中的某个地方运行一个收集器。

提示

在以下示例中,使用的是 StatefulSet,它将日志存储在 Kubernetes 持久卷声明上,但您也可以使用 HostPath。

设置收集器

fluent-bit-collector.yaml 文件定义了一个 StatefulSet,以及一个 Kubernetes 服务,它允许从集群内部访问和读取日志。提供的配置将在名为 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. 要通过 Web 浏览器访问日志,请输入以下命令

    kubectl port-forward --namespace logging service/log-collector 8080:80
    
  3. 导航到 https://127.0.0.1:8080/

  4. 可选:您可以通过输入以下命令在 nginx Pod 中打开一个 shell 并使用 Unix 工具搜索日志

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

设置转发器

请参阅 Fluent Bit 文档,了解如何设置一个默认将日志转发到 ElasticSearch 的 Fluent Bit DaemonSet。

当您在安装步骤中创建 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 持久卷来将日志存储在您的桌面操作系统上。这使您可以使用您通常的桌面工具操作文件,而无需使用特定于 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 用作 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 作为 hostPath.path 进行引用。

我们使用分析和 Cookie 来了解网站流量。有关您使用我们网站的信息将与 Google 共享,用于该目的。 了解更多。