ghcr.io/fluent/fluent-operator/fluent-bit:5.0.6
简化Kubernetes中Fluent Bit和Fluentd的管理
Fluent Operator
Fluent Operator为基于Fluent Bit和Fluentd构建日志层提供了极大的灵活性。
安装后,Fluent Operator提供以下功能:
- Fluent Bit管理:自动部署和销毁Fluent Bit DaemonSet。
- Fluentd管理:自动部署和销毁Fluentd StatefulSet。
- 自定义配置:通过标签选择输入/过滤/输出插件。
- 动态重载:无需重启Fluent Bit和Fluentd Pod即可更新配置。
- 多租户日志隔离:Fluentd通过https://github.com/kube-logging/fluent-plugin-label-router%E6%8F%92%E4%BB%B6%E6%94%AF%E6%8C%81%E5%A4%9A%E7%A7%9F%E6%88%B7%E6%97%A5%E5%BF%97%E9%9A%94%E7%A6%BB%E3%80%82
- 可插拔部署组件:Fluent Bit或Fluentd可单独部署。
目录
- Fluent Operator
- 目录
- 概述
- Fluent Bit
- Fluentd
- 快速开始
- 前提条件
- 安装
- 使用YAML部署Fluent Operator
- 使用Helm部署Fluent Operator
- Fluent Operator演练
- 收集Kubernetes日志
- 使用YAML部署Kubernetes日志栈
- 使用Helm部署Kubernetes日志管道
- 收集审计日志
- Fluentd
- 插件
- Fluent Bit
- Fluentd
- 最佳实践
- 插件分组
- 监控
- 自定义解析器
- 其他
- 自定义插件
- 路线图
- 开发
- 要求
- 运行
- 贡献
- 文档
- 清单
- 社区
- 关于社区
- 联系我们
- 视频和博客
概述
尽管Fluent Bit和Fluentd都能收集、处理(解析和过滤)日志并将其转发到最终目的地,但它们在不同方面各有优势。
Fluent Bit因其轻量高效,是日志采集器的理想选择;而Fluentd则因其丰富的插件,更擅长对日志进行高级处理。
- 仅Fluent Bit模式:如果只需收集日志并发送到最终目的地,仅需Fluent Bit。
- Fluent Bit + Fluentd模式:如果还需对收集的日志进行高级处理或发送到更多目标,还需Fluentd。
- 仅Fluentd模式:如果需要通过HTTP或Syslog等网络接收日志,然后处理并发送到最终目标,仅需Fluentd。
Fluent Operator包含Fluent Bit和Fluentd的CRD及控制器,允许您根据上述三种模式配置日志处理管道。
Fluent Bit将以DaemonSet形式部署,Fluentd将以StatefulSet形式部署。整体工作流程如下:
Fluent Bit
为Fluent Bit定义了以下CRD:
FluentBit:定义Fluent Bit DaemonSet及其配置。需要自定义Fluent Bit镜像ghcr.io/fluent/fluent-operator/fluent-bit以配合FluentBit Operator实现动态配置重载。ClusterFluentBitConfig:选择集群级别的输入/过滤/输出插件,并将最终配置生成到Secret中。FluentBitConfig:选择命名空间级别的过滤/输出/解析器和集群级别的解析器插件,并将最终配置生成到Secret中。ClusterInput:定义集群级别的输入配置段。Parser:定义命名空间级别的解析器配置段。ClusterParser:定义集群级别的解析器配置段。MultilineParser:定义命名空间级别的多行解析器配置段。ClusterMultilineParser:定义集群级别的多行解析器配置段。Filter:定义命名空间级别的过滤配置段。ClusterFilter:定义集群级别的过滤配置段。Output:定义命名空间级别的输出配置段。ClusterOutput:定义集群级别的输出配置段。
每个**ClusterInput、ClusterParser、ClusterFilter、ClusterMultilineParser、ClusterOutput** 都代表一个Fluent Bit配置段,由**ClusterFluentBitConfig**通过标签选择器选择。Fluent Operator监听这些对象,构建最终配置,并创建Secret存储配置,该Secret将挂载到Fluent Bit DaemonSet中。整体工作流程如下:
为使Fluent Bit在配置更改时能获取并使用最新配置,添加了名为Fluent Bit watcher的包装器,用于在检测到Fluent Bit配置更改时立即重启Fluent Bit进程。这样无需重启Fluent Bit Pod即可重载新配置。采用这种方式是因为Fluent Bit本身没有重载接口,更多详情请参考此https://github.com/fluent/fluent-bit/issues/365%E3%80%82
Fluentd
为Fluentd定义了以下CRD:
Fluentd:定义Fluentd StatefulSet及其配置。需要自定义Fluentd镜像kubesphere/fluentd以配合Fluentd Operator实现动态配置重载。FluentdConfig:选择集群级别或命名空间级别的输入/过滤/输出插件,并将最终配置生成到Secret中。ClusterFluentdConfig:选择集群级别的输入/过滤/输出插件,并将最终配置生成到Secret中。Filter:定义命名空间级别的过滤配置段。ClusterFilter:定义集群级别的过滤配置段。Output:定义命名空间级别的输出配置段。ClusterOutput:定义集群级别的输出配置段。
快速开始
前提条件
运行Fluent Operator需要Kubernetes v1.16.13+。
安装
使用YAML部署Fluent Operator
安装最新稳定版本
kubectl create namespace fluent
kubectl apply -f https://github.com/fluent/fluent-operator/releases/latest/download/setup.yaml
# 您可以在 manifests/setup/kustomization.yaml 中修改命名空间
# 然后使用以下命令安装到其他命名空间
# kubectl kustomize manifests/setup/ | kubectl apply -f -
安装开发版本
使用 Helm 部署 Fluent Operator
[!NOTE] 需要 Helm v3.2.1 或更高版本。
标准安装(CRD 包含在图表中):
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
helm install fluent-operator fluent/fluent-operator \
--create-namespace -n fluent
默认容器运行时为 containerd。如果集群使用不同的运行时,请设置 --set containerRuntime=docker 或 --set containerRuntime=crio。
Helm 在首次安装时会安装 CRD,但在后续的 helm upgrade 或 helm uninstall 调用中不会升级或删除它们。要在升级图表时更新 CRD:
helm pull fluent/fluent-operator --untar
kubectl apply --server-side --force-conflicts -f fluent-operator/crds/
helm upgrade fluent-operator fluent/fluent-operator -n fluent
高级安装 — 通过单独的 fluent-operator-fluent-bit-crds 和 fluent-operator-fluentd-crds 图表实现 CRD 的完整 Helm 生命周期管理:
# 步骤 1:将 Fluent Bit CRD 作为单独管理的发布版本安装
helm install fluent-operator-fluent-bit-crds fluent/fluent-operator-fluent-bit-crds -n fluent --create-namespace
# 步骤 2:将 Fluentd CRD 作为单独管理的发布版本安装(可选)
helm install fluent-operator-fluentd-crds fluent/fluent-operator-fluentd-crds -n fluent
# 步骤 3:安装操作员,跳过 CRD(已在上面安装)
helm install fluent-operator fluent/fluent-operator -n fluent --skip-crds
通过这种方法,可以使用 helm upgrade fluent-operator-fluent-bit-crds / helm upgrade fluent-operator-fluentd-crds 升级 CRD,并可以通过 --set additionalAnnotations."helm\.sh/resource-policy"=keep 防止删除。
有关从 v3.x 升级的更多信息,请参见 MIGRATION-v4.md 指南。
Fluent Operator 演练
有关 Fluent Operator 的各种用例的更多信息,请参考 https://github.com/kubesphere-sigs/fluent-operator-walkthrough%E3%80%82
收集 Kubernetes 日志
本指南提供了一个日志管道,包括 Fluent Bit DaemonSet 及其日志输入/过滤/输出配置,用于收集 Kubernetes 日志,包括容器日志和 kubelet 日志。
[!NOTE] 开始之前,您需要一个运行中的 Elasticsearch v5+ 集群来接收日志数据。请记住根据您自己的 es 设置调整 output-elasticsearch.yaml。Kafka 和 Fluentd 输出是可选的,默认情况下处于关闭状态。
使用 YAML 部署 Kubernetes 日志栈
kubectl apply -f manifests/logging-stack
# 您可以在 manifests/logging-stack/kustomization.yaml 中更改命名空间
# 然后使用以下命令安装到另一个命名空间
# kubectl kustomize manifests/logging-stack/ | kubectl apply -f -
使用 Helm 部署 Kubernetes 日志管道
Kubernetes 日志管道(通过 Fluent Bit 收集容器日志)默认启用(Kubernetes: true)。要同时部署 Fluentd 作为日志聚合层:
helm upgrade fluent-operator fluent/fluent-operator -n fluent --set fluentd.enable=true
几分钟后,您应该会看到一个可用的索引:
$ curl localhost:9200/_cat/indices
green open ks-logstash-log-2020.04.26 uwQuoO90TwyigqYRW7MDYQ 1 1 99937 0 31.2mb 31.2mb
成功!
收集审计日志
Linux 审计框架提供了一个符合 CAPP(受控访问保护配置文件)的审计系统,可可靠地收集系统上任何与安全相关(或非安全相关)事件的信息。参考 manifests/logging-stack/auditd,它支持从 Linux 审计框架收集审计日志的方法。
kubectl apply -f manifests/logging-stack/auditd
# 您可以在 manifests/logging-stack/auditd/kustomization.yaml 中更改命名空间
# 然后使用以下命令安装到另一个命名空间
# kubectl kustomize manifests/logging-stack/auditd/ | kubectl apply -f -
几分钟后,您应该会看到一个可用的索引:
$ curl localhost:9200/_cat/indices
green open ks-logstash-log-2021.04.06 QeI-k_LoQZ2h1z23F3XiHg 5 1 404879 0 298.4mb 149.2mb
Fluentd
Fluentd 作为日志转发层,通过网络从 Fluent Bit 或其他应用接收日志。
有关 Fluent Operator Fluentd CRD 的各种用例的更多信息,请参考 https://github.com/kubesphere-sigs/fluent-operator-walkthrough#fluent-bit--fluentd-mode%E3%80%82
插件
Fluent Bit
此处可找到支持的 Fluent Bit 插件。
Fluentd
此处可找到支持的 Fluentd 插件。
最佳实践
插件分组
此处可找到插件组信息。
监控
此处可使用 Fluent Bit 中的内置 HTTP 服务器。
自定义解析器
此处可在 Fluent Bit 中自定义解析器。
其他
如果您想了解更多关于 Fluent-Operator 的信息,请参考 其他。
自定义插件
此处可了解如何在 FluentBit 和 Fluentd 中使用自定义插件。
路线图
- 支持 containerd 日志格式
- 添加 Fluentd CRD 作为日志聚合层,组名称为
fluentd.fluent.io - 添加 FluentBit 集群 CRD,新组名称为
fluentbit.fluent.io - 将整个项目重命名为 Fluent Operator
- 支持更多 Fluentd 和 FluentBit 插件
开发
要求
- golang v1.16+。
- kubectl v1.19.2+。
- kubebuilder v3.1+(项目使用 v3.1.0 构建)
- 可访问 Kubernetes 集群 v1.19.2+
运行
确保为本地开发 Kubernetes 集群加载了 KUBECONFIG 文件。
- 安装 CRD:
make install export NAMESPACE=something设置操作员的命名空间- 运行:
make run
贡献
文档
API 文档是自动生成的。要修改它,请编辑结构体字段上方的注释,然后运行 go run cmd/doc-gen/main.go。
清单
manifests/setup 文件夹下的大多数文件是从 config 自动生成的。不要直接编辑它们,而是运行 make manifests,然后相应地替换这些文件。
社区
视频和博客
- 从 FluentBit Operator 到 Fluent Operator:漫长的发展之路 - Benjamin Huo
- 什么是 Fluent Operator 以及如何使用它 - Henrik Rexed
- 深入了解 Fluent Bit Operator:Kubernetes 原生日志处理器 - Feynman Zhou 与 Dhruv Kela
- 快速入门:5 分钟了解 Fluent Operator(中文)- Dehao Cheng
轩辕镜像配置手册
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
Docker 配置
登录仓库拉取
通过 Docker 登录认证访问私有仓库
专属域名拉取
无需登录使用专属域名
K8s Containerd
Kubernetes 集群配置 Containerd
K3s
K3s 轻量级 Kubernetes 镜像加速
Dev Containers
VS Code Dev Containers 配置
Podman
Podman 容器引擎配置
Singularity/Apptainer
HPC 科学计算容器配置
其他仓库配置
ghcr、Quay、nvcr 等镜像仓库
Harbor 镜像源配置
Harbor Proxy Repository 对接专属域名
Portainer 镜像源配置
Portainer Registries 加速拉取
Nexus 镜像源配置
Nexus3 Docker Proxy 内网缓存
系统配置
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
镜像拉取常见问题
使用与功能问题
配置了专属域名后,docker search 为什么会报错?
docker search 限制
Docker Hub 上有的镜像,为什么在轩辕镜像网站搜不到?
站内搜不到镜像
机器不能直连外网时,怎么用 docker save / load 迁镜像?
离线 save/load
docker pull 拉插件报错(plugin v1+json)怎么办?
插件要用 plugin install
WSL 里 Docker 拉镜像特别慢,怎么排查和优化?
WSL 拉取慢
轩辕镜像安全吗?如何用 digest 校验镜像没被篡改?
安全与 digest
第一次用轩辕镜像拉 Docker 镜像,要怎么登录和配置?
新手拉取配置
轩辕镜像合规吗?轩辕镜像的合规是怎么做的?
镜像合规机制
轩辕镜像支持 docker push 上传本地镜像吗?
不支持 push
错误码与失败问题
docker pull 提示 manifest unknown 怎么办?
manifest unknown
docker pull 提示 no matching manifest 怎么办?
no matching manifest(架构)
镜像已拉取完成,却提示 invalid tar header 或 failed to register layer 怎么办?
invalid tar header(解压)
Docker pull 时 HTTPS / TLS 证书验证失败怎么办?
TLS 证书失败
Docker pull 时 DNS 解析超时或连不上仓库怎么办?
DNS 超时
docker 无法连接轩辕镜像域名怎么办?
域名连通性排查
Docker 拉取出现 410 Gone 怎么办?
410 Gone 排查
出现 402 或「流量用尽」提示怎么办?
402 与流量用尽
Docker 拉取提示 UNAUTHORIZED(401)怎么办?
401 认证失败
遇到 429 Too Many Requests(请求太频繁)怎么办?
429 限流
docker login 提示 Cannot autolaunch D-Bus,还算登录成功吗?
D-Bus 凭证提示
为什么会出现「单层超过 20GB」或 413,无法加速拉取?
413 与超大单层
账号 / 计费 / 权限
用户好评
来自真实用户的反馈,见证轩辕镜像的优质服务