官方文档地址: Kubernetes
Kubernetes 为应用程序和集群日志提供了两个日志端点:
- 用于谷歌云平台的 stackdriver 日志。
- 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
。