【官方文档】Fluentd 使用容器部署(Kubernetes)

文章目录

    • 1. 准备开始
    • 2. Fluentd DaemonSet
      • 2.1. 获取 Fluentd DaemonSet 源
      • 2.2. DaemonSet 内容
    • 3. 日志记录到 Elasticsearch

官方文档地址: Kubernetes


【官方文档】Fluentd 使用容器部署(Kubernetes)_第1张图片
Kubernetes 为应用程序和集群日志提供了两个日志端点:

  1. 用于谷歌云平台的 stackdriver 日志。
  2. Elasticsearch。

这些场景的背后,都有一个日志代理负责日志收集、解析和分发:Fluentd。

本文档重点介绍如何在 Kubernetes 中部署 Fluentd,并扩展日志的不同目的地的可能性。

1. 准备开始

本文假设您有一个 Kubernetes 集群正在运行,或者至少有一个本地(单个)节点可以用于测试目的。

在开始之前,请确保您理解或对 Kubernetes 的以下概念有一个基本的认识:

  • Node
    在 Kubernetes 中,一个 node 是一个工作者,以前称为仆人。根据集群的不同,节点可以是虚拟机或物理机。每个节点都有运行 pod 所需的服务,并由主组件管理。
  • Pod
    一个 pod 是包含一个或多个容器(如 Docker 容器)的一个组,这些容器共享存储,以及关于如何运行容器的选项。 pods 总是在一个共享的上下文中运行。
  • DaemonSet
    DaemonSet 确保所有(或部分)node 运行一个 pod 的副本。当 node 被添加到集群时,pod 也被添加到其中。当 node 从集群中移除时,这些 pod 将被垃圾回收。删除 DaemonSet 将清理它创建的 pod。

由于应用程序运行在 pod 中,而且多个 pod 可能存在于多个 node 上,所以我们需要一个特定的 Fluentd-Pod 来负责每个节点上的日志收集:Fluentd DaemonSet

2. Fluentd DaemonSet

对于 Kubernetes,DaemonSet 确保所有(或部分)节点运行一个 pod 的副本。为了解决日志收集问题,我们将实现一个Fluentd DaemonSet

Fluentd 足够灵活,并且有合适的插件来将日志分发到不同的第三方应用程序(如数据库或云服务),所以主要的问题是:日志将存储在哪里?。一旦我们回答了这个问题,我们就可以继续配置 DaemonSet 了。

下面的步骤主要是将日志发送到一个 Elasticsearch Pod:

2.1. 获取 Fluentd DaemonSet 源

我们已经创建了一个 Fluentd DaemonSet,它已经准备好了适当的规则和容器镜像:https://github.com/fluent/fluentd-kubernetes-daemonset
(https://github.com/fluent/fluentd-kubernetes-daemonset)

请使用 GIT 从命令行获取存储库的副本:

$ git clone https://github.com/fluent/fluentd-kubernetes-daemonset

2.2. DaemonSet 内容

克隆的存储库包含多个配置,允许将 Fluentd 部署为 DaemonSet。存储库中分发的 Docker 容器镜像也是预先配置的,因此 Fluentd 可以从 Kubernetes 节点的环境中收集所有日志,并将适当的元数据附加到日志中。

这个存储库有一些针对 Alpine/Debian 的预置和流行的输出:DaemonSet preset settings。(404)

3. 日志记录到 Elasticsearch

fluentd-kubernetes-daemonset/目录中,找到YAML配置文件:

作为一个例子,让我们看看这个文件的一部分:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
  ...
spec:
    ...
    spec:
      containers:
      - name: fluentd
        image: quay.io/fluent/fluentd-kubernetes-daemonset
        env:
          - name:  FLUENT_ELASTICSEARCH_HOST
            value: "elasticsearch-logging"
          - name:  FLUENT_ELASTICSEARCH_PORT
            value: "9200"
          - name:  FLUENT_ELASTICSEARCH_SSL_VERIFY
            value: "true"
          - name:  FLUENT_ELASTICSEARCH_SSL_VERSION
            value: "TLSv1_2"
        ...

完整文件内容:https://github.com/fluent/fluentd-kubernetes-daemonset/blob/master/fluentd-daemonset-elasticsearch.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
    version: v1
spec:
  selector:
    matchLabels:
      k8s-app: fluentd-logging
      version: v1
  template:
    metadata:
      labels:
        k8s-app: fluentd-logging
        version: v1
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
        env:
          - name:  FLUENT_ELASTICSEARCH_HOST
            value: "elasticsearch-logging"
          - name:  FLUENT_ELASTICSEARCH_PORT
            value: "9200"
          - name: FLUENT_ELASTICSEARCH_SCHEME
            value: "http"
          # Option to configure elasticsearch plugin with self signed certs
          # ================================================================
          - name: FLUENT_ELASTICSEARCH_SSL_VERIFY
            value: "true"
          # Option to configure elasticsearch plugin with tls
          # ================================================================
          - name: FLUENT_ELASTICSEARCH_SSL_VERSION
            value: "TLSv1_2"
          # X-Pack Authentication
          # =====================
          - name: FLUENT_ELASTICSEARCH_USER
            value: "elastic"
          - name: FLUENT_ELASTICSEARCH_PASSWORD
            value: "changeme"
          # Logz.io Authentication
          # ======================
          - name: LOGZIO_TOKEN
            value: "ThisIsASuperLongToken"
          - name: LOGZIO_LOGTYPE
            value: "kubernetes"
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        # When actual pod logs in /var/lib/docker/containers, the following lines should be used.
        # - name: dockercontainerlogdirectory
        #   mountPath: /var/lib/docker/containers
        #   readOnly: true
        # When actual pod logs in /var/log/pods, the following lines should be used.
        - name: dockercontainerlogdirectory
          mountPath: /var/log/pods
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      # When actual pod logs in /var/lib/docker/containers, the following lines should be used.
      # - name: dockercontainerlogdirectory
      #   hostPath:
      #     path: /var/lib/docker/containers
      # When actual pod logs in /var/log/pods, the following lines should be used.
      - name: dockercontainerlogdirectory
        hostPath:
          path: /var/log/pods

这个 YAML 文件包含两个相关的环境变量,Fluentd 在容器启动时使用它们:

环境变量 描述 默认值
FLUENT_ELASTICSEARCH_HOST 指定主机名或 IP 地址。 elasticsearch-logging
FLUENT_ELASTICSEARCH_PORT Elasticsearch TCP 端口。 9200
FLUENT_ELASTICSEARCH_SSL_VERIFY 是否验证 SSL 证书。 true
FLUENT_ELASTICSEARCH_SSL_VERSION 指定 TLS 版本。 TLSv1_2

任何相关的更改都需要在部署之前在 YAML 文件中完成。默认情况下,假设集群中至少存在一个 Elasticsearch Pod elasticsearch-logging

你可能感兴趣的:(Fluentd,k8s,kubernetes,fluentd)