ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用 Helm 在 Kubernetes 上部署 Fluentd 日志采集器并输出到 Elasticsearch:fluentd-elasticsearch Chart 完整指南

使用 Helm 在 Kubernetes 上部署 Fluentd 日志采集器并输出到 Elasticsearch:fluentd-elasticsearch Chart 完整指南 【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载导读本文围绕 Helm 仓库 incubator/fluentd-elasticsearch 中的 Fluentd Elasticsearch Chart系统讲解如何通过 Helm 在 Kubernetes 集群中以 DaemonSet 形态部署 Fluentd 日志采集器将节点上的容器日志、系统日志统一收集并写入 Elasticsearch。读完本文你将掌握该 Chart 的安装、卸载、全量配置参数、默认 Fluentd 配置文件的内部结构以及 RBAC、PodSecurityPolicy、探针、缓冲机制等源码级实现细节能够按需定制一套可复用的 Kubernetes 日志收集方案。注意当前仓库中的该 Chart 已标记为DEPRECATED已废弃见 Chart.yaml 中的deprecated: true与 README 开头的声明项目已迁移至作者自己的 Helm 仓库。本文基于本仓库实际代码展开用于理解其实现原理与配置方式在新项目中使用时建议寻找维护中的替代方案。TL;DR 快速安装在启用 Helm 的 Kubernetes 集群上一条命令即可完成部署$ helm install stable/fluentd-elasticsearch背景与设计目标该 Chart 通过 Helm 包管理器在 Kubernetes 集群上引导一个 Fluentd DaemonSet。它被设计为 GKE 上fluentd-gcp将日志发送到 Google Stackdriver的即插即用替代方案同时也适用于任何需要将日志写入 Elasticsearch 的场景。使用的 Docker 镜像内置了以下关键能力Google detect exceptions插件用于合并 Java 等多行堆栈异常为一条日志Prometheus exporter插件暴露 Fluentd 运行指标Kubernetes metadata filter插件为日志记录补充命名空间、Pod、容器等元数据Systemd插件采集 systemd journal 日志。前置条件Kubernetes 1.8且启用了 Beta API集群中可用的 HelmTiller / Helm 2 时代的经典部署方式README 中命令即基于 Helm 2 语法。安装 Chart以 release 名称my-release安装$ helm install --name my-release stable/fluentd-elasticsearch该命令会以默认配置在集群上部署 fluentd-elasticsearch。默认配置会创建一个 DaemonSet每个节点一个采集 Pod、一个 ConfigMap包含全部 Fluentd 配置、ServiceAccount、ClusterRole 与 ClusterRoleBinding。可在 配置参数 一节查看可调整的配置项。卸载 Chart$ helm delete my-release该命令会删除与 Chart 关联的所有 Kubernetes 组件并移除该 release。配置参数详解以下表格列出了 fluentd-elasticsearch Chart 的可配置参数及其默认值来自 README.md 与 values.yaml。ParameterDescriptionDefaultannotations可选的 DaemonSet 注解NULLpodAnnotations可选的 DaemonSet Pod 注解NULLconfigMapsFluentd 配置ConfigMap 内容默认配置文件elasticsearch.hostElasticsearch 主机elasticsearch-clientelasticsearch.portElasticsearch 端口9200elasticsearch.logstash_prefixElasticsearch Logstash 前缀logstashelasticsearch.buffer_chunk_limitElasticsearch 缓冲块上限2Melasticsearch.buffer_queue_limitElasticsearch 缓冲队列上限8elasticsearch.schemeElasticsearch 协议 schemehttpenv添加到 Fluentd Pod 的环境变量列表{}secret从 Secret 读取并注入到 Pod 的环境变量列表[]extraVolumeMounts额外的挂载卷例如 ES 启用 TLS 时挂载 SSL 证书—extraVolume额外的卷定义—image.repository镜像仓库gcr.io/google-containers/fluentd-elasticsearchimage.tag镜像标签v2.3.2image.pullPolicy镜像拉取策略IfNotPresentlivenessProbe.enabled是否启用存活探针truenodeSelector可选的 DaemonSet nodeSelector{}podSecurityPolicy.annotationsPod Security Policy 中的 Pod 注解{}podSecurityPolicy.enabled是否创建 Pod Security Policyfalserbac.create是否创建 RBACtrueresources.limits.cpuCPU 上限100mresources.limits.memory内存上限500Miresources.requests.cpuCPU 请求100mresources.requests.memory内存请求200MiserviceService 定义{}service.typeService 类型ClusterIP/NodePort未设置service.portsService 端口列表[{name:...}...]未设置service.ports[].name端口名称未设置service.ports[].portService 端口未设置service.ports[].nodePortNodePort 端口当 type 为 NodePort 时未设置service.ports[].protocol端口协议可选TCP/UDP未设置serviceAccount.create是否创建 ServiceAccounttrueserviceAccount.nameServiceAccount 名称—不设置则由 fullname 模板生成tolerations可选的 DaemonSet tolerations{}updateStrategy可选的 DaemonSet 更新策略type: RollingUpdate注意README 的默认值表格以resources.limits.cpu 100m等列出而当前 values.yaml 中resources默认为空对象{}注释中给出推荐值实际生效值以部署时的 values 为准。另外values.yaml中还存在一个 README 未列表格的参数elasticsearch.ssl_version默认TLSv1_2用于控制 ES 连接的 TLS 版本将在下文环境变量部分说明。通过--set指定参数使用--set keyvalue[,keyvalue]参数传给helm install例如$ helm install --name my-release \ stable/fluentd-elasticsearch按需覆盖例如指定 ES 地址与协议$ helm install --name my-release \ --set elasticsearch.hostmy-es-cluster \ --set elasticsearch.port9200 \ --set elasticsearch.schemehttps \ stable/fluentd-elasticsearch通过 values 文件指定参数也可以提供一个 YAML 文件包含上述参数的取值$ helm install --name my-release -f values.yaml stable/fluentd-elasticsearch配置如何流入容器环境变量注入机制从 daemonset.yaml 的源码可以看到values.yaml中的elasticsearch.*参数并不会直接进入 Fluentd 配置而是先被渲染为 Pod 的环境变量再由 Fluentd 配置文件通过#{ENV[xxx]}语法在运行时读取values 参数注入的环境变量elasticsearch.hostOUTPUT_HOSTelasticsearch.portOUTPUT_PORTelasticsearch.logstash_prefixLOGSTASH_PREFIXelasticsearch.schemeOUTPUT_SCHEMEelasticsearch.ssl_versionOUTPUT_SSL_VERSIONelasticsearch.buffer_chunk_limitOUTPUT_BUFFER_CHUNK_LIMITelasticsearch.buffer_queue_limitOUTPUT_BUFFER_QUEUE_LIMIT此外Pod 固定注入FLUENTD_ARGS--no-supervisor -q以非 supervisor 模式、静默方式运行 Fluentd和K8S_NODE_NAME通过fieldRef: spec.nodeName获取当前节点名供 Kubernetes metadata filter 使用。自定义环境变量envenv是一个字典适合注入自定义配置例如输出认证信息env: OUTPUT_USER: my_user随后即可在自定义配置中通过#{ENV[OUTPUT_USER]}引用values.yaml 中注释给出了示例。从 Secret 注入环境变量secretsecret是一个列表每个元素由name、secret_name、secret_key组成模板会渲染为secretKeyRef引用避免敏感信息直接出现在 values 中secret: - name: ELASTICSEARCH_PASSWORD secret_name: elasticsearch secret_key: password对应生成的 Pod 环境变量片段见 daemonset.yaml- name: ELASTICSEARCH_PASSWORD valueFrom: secretKeyRef: name: elasticsearch key: password默认 Fluentd 配置ConfigMap 的五个配置段Chart 的全部 Fluentd 配置通过 configmap.yaml 渲染进 ConfigMap并挂载到 Pod 的/etc/fluent/config.d目录。配置内容来自values.yaml的configMaps字段共五个配置段可整体或按段覆写。1.system.confFluentd 系统级配置system root_dir /tmp/fluentd-buffers/ /system设置 Fluentd 的根缓冲目录该目录同时被存活探针检查见下文探针一节。2.containers.input.conf容器日志输入这是整个配置的核心负责采集 Kubernetes 中所有容器的标准输出日志kubelet 会在宿主机的/var/log/containers下为每个容器的 Docker 日志创建符号链接链接名同时包含 Pod 名、命名空间、容器名与 Docker 容器 IDFluentd 通过tail插件以json格式监听/var/log/containers/*.log时间格式%Y-%m-%dT%H:%M:%S.%NZ用于解析 Docker 产生的时间戳每条原始日志被打上raw.kubernetes.*标签随后由detect_exceptions插件remove_tag_prefix raw、multiline_flush_interval 5、max_bytes 500000、max_lines 1000将多行堆栈异常合并为一条日志并去掉raw前缀配置注释中完整描述了日志的采集链路与最终形态经过kubernetes_metadata过滤器后日志记录会包含kubernetes.namespace、kubernetes.pod_name、kubernetes.container_name以及docker.container_id字段例如{ log: 2014/09/25 21:15:03 Got request with path wombat\n, stream: stderr, time: 2014-09-25T21:15:03.499185026Z, kubernetes: { namespace: default, pod_name: synthetic-logger-0.25lps-pod, container_name: synth-lgr }, docker: { container_id: 997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b } }这样用户无论 Pod 重启多少次对应多个 Docker 容器 ID都可以稳定地按 Pod 名或容器名检索日志。配置同时兼容 Docker 的 JSON 日志格式与 CRI 日志格式。3.system.input.conf系统组件日志输入通过多个tail源采集宿主机系统关键组件的日志文件包括/var/log/salt/minionSalt minion正则解析 severity 字段/var/log/startupscript.log启动脚本syslog格式/var/log/docker.logDocker daemon正则提取time/severity/message/err/status_code/var/log/etcd.logetcdformat none原样采集/var/log/kubelet.log、/var/log/kube-proxy.log、/var/log/kube-apiserver.log、/var/log/kube-controller-manager.log、/var/log/kube-scheduler.log、/var/log/rescheduler.log、/var/log/glbc.log、/var/log/cluster-autoscaler.log全部采用multiline格式与统一的format_firstline /^\w\d{4}/format1正则以处理 glog 多行日志三个systemd源docker.service、kubelet.service、node-problem-detector.service使用local持久化 storage 记录读取位置read_from_head true。4.forward.input.confTCP forward 输入source type forward /source接收通过 TCP 协议从其他 Fluentd 节点转发过来的消息便于搭建多级日志汇聚链路。5.monitoring.conf监控指标基于 Prometheus 插件暴露 Fluentd 自身运行指标供 Prometheus 抓取podAnnotations中注释给出了prometheus.io/scrape: true与prometheus.io/port: 24231的示例prometheus核心指标输入插件monitor_agentFluentd 内置监控接口prometheus_monitor采集 MonitorAgent 指标带host标签prometheus_output_monitor采集输出插件指标prometheus_tail_monitor采集in_tail插件指标。6.output.confKubernetes 元数据与 Elasticsearch 输出filter kubernetes.** type kubernetes_metadata /filter match ** id elasticsearch type elasticsearch log_level info include_tag_key true type_name _doc host #{ENV[OUTPUT_HOST]} port #{ENV[OUTPUT_PORT]} scheme #{ENV[OUTPUT_SCHEME]} ssl_version #{ENV[OUTPUT_SSL_VERSION]} logstash_format true logstash_prefix #{ENV[LOGSTASH_PREFIX]} reconnect_on_error true buffer type file path /var/log/fluentd-buffers/kubernetes.system.buffer flush_mode interval retry_type exponential_backoff flush_thread_count 2 flush_interval 5s retry_forever retry_max_interval 30 chunk_limit_size #{ENV[OUTPUT_BUFFER_CHUNK_LIMIT]} queue_limit_length #{ENV[OUTPUT_BUFFER_QUEUE_LIMIT]} overflow_action block /buffer /match要点说明先由kubernetes_metadatafilter 为日志补充 Pod、Namespace、容器等元数据再进行输出使用logstash_format true与logstash_prefix日志会按天写入形如logstash-2014.09.25的索引README 中给出了对应的 Elasticsearch 查询示例type_name _doc指定 ES 文档类型include_tag_key true将 tag 写入记录缓冲采用file 类型缓冲路径/var/log/fluentd-buffers/kubernetes.system.bufferflush_mode intervalflush_interval 5s定时冲刷retry_type exponential_backoff指数退避重试retry_max_interval 30retry_forever无限重试flush_thread_count 2overflow_action block防止数据丢失缓冲块大小与队列长度分别由OUTPUT_BUFFER_CHUNK_LIMIT默认2M和OUTPUT_BUFFER_QUEUE_LIMIT默认8控制即 README 表格中的elasticsearch.buffer_chunk_limit与elasticsearch.buffer_queue_limit。values.yaml末尾还注释给出了挂载 TLS 证书的完整示例当 Elasticsearch 开启 TLS 时通过extraVolumesextraVolumeMounts将es-certsSecret 以只读方式挂载到/certs。DaemonSet 的挂载与卷设计从 daemonset.yaml 可以看到采集 Pod 通过 hostPath 卷读取宿主机日志与 systemd 库卷名挂载点hostPath说明varlog/var/log/var/log宿主机全部日志目录容器日志符号链接、系统日志varlibdockercontainers/var/lib/docker/containers只读/var/lib/docker/containers直接访问 Docker 原始容器日志libsystemddir/host/lib只读/usr/lib64复制 systemd 库以解压 journalconfig-volume/etc/fluent/config.dConfigMapFluentd 全部配置Pod 还带有scheduler.alpha.kubernetes.io/critical-pod: 注解标记为关键 Pod避免被驱逐以及checksum/config注解基于 ConfigMap 内容生成校验和配置变更时自动触发 DaemonSet 滚动更新。存活探针livenessProbe当livenessProbe.enabledtrue默认时启用探针用于发现 Fluentd 静默挂起不排队、不冲刷缓冲的情况initialDelaySeconds: 600、periodSeconds: 60探针脚本逻辑若缓冲目录不存在则退出 1若缓冲文件在 900 秒STUCK_THRESHOLD_SECONDS默认取自LIVENESS_THRESHOLD_SECONDS变量脚本回退 300内无更新则判定卡死清空缓冲目录并退出 1若 300 秒LIVENESS_THRESHOLD_SECONDS内无更新则退出 1 触发重启。当需要调整采集范围或降低日志量时可调整阈值或直接关闭探针。RBAC 与 ServiceAccountChart 默认创建一套最小权限 RBACrbac.createtrue、serviceAccount.createtrueservice-account.yaml创建名为fullname的 ServiceAccountclusterrole.yamlClusterRole 仅授予对namespaces、pods资源的get/watch/list权限——这正是kubernetes_metadata过滤器获取 Pod 元数据所需的最小权限clusterrolebinding.yaml将 ServiceAccount 绑定到该 ClusterRole。自定义 ServiceAccount 名称可通过serviceAccount.name指定serviceAccount.createfalse时可复用集群中已存在的 ServiceAccount。Pod Security PolicypodSecurityPolicy.enabledfalse时默认不创建。开启后pod-security-policy.yaml会创建 PSP 并配套 role.yaml 与 rolebinding.yaml 授予使用权限。PSP 的关键约束privileged: false但allowPrivilegeEscalation: true允许卷类型configMap、emptyDir、hostPath、secretallowedHostPaths限定 hostPath 只能访问/var/log可读写、/var/lib/docker/containers只读、/usr/lib64只读hostNetwork、hostPID、hostIPC均关闭runAsUser/runAsGroup/seLinux/supplementalGroups为RunAsAnyfsGroup限定 1~65535annotations参数可注入 AppArmor、seccomp 等注解。Service 暴露默认不创建 Serviceservice: {}。需要暴露 Fluentd 端口如 Prometheus 监控端口 24231时配置service: type: ClusterIP ports: - name: monitor-agent port: 24231模板 service.yaml 会为每个端口渲染port/targetPort并支持nodePort与protocol。DaemonSet 中的containerPort同样由service.ports驱动因此两者的端口定义需保持一致。部署验证与注意事项安装完成后可通过以下命令验证 Pod 状态见 NOTES.txt$ kubectl --namespacerelease-namespace get pods -l app.kubernetes.io/namefluentd-elasticsearch,app.kubernetes.io/instancerelease-name需要特别留意该应用会采集所有控制台输出并转发到 Elasticsearch任何可能识别身份的信息包括 IP 地址、容器镜像、对象名称都不会被匿名化部署前需评估隐私与合规要求。如需按需查看某个配置段落可查看 values.yaml 中的configMaps字段并按段覆写所有模板逻辑命名、RBAC、卷、探针均可从templates/目录下的源码逐一核对。赞分享【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载相关推荐Bitnami Fluentd Helm Chart 实战指南在 Kubernetes 上构建 forwarder 与 aggregator 日志采集管道Bitnami Fluentd Helm Chart 实战指南在 Kubernetes 上构建 forwarder 与 aggregator 日志采集管道 本云原生容器编排GetQzonehistory 使用指南3步完成QQ空间数据导出与历史备份GetQzonehistory 使用指南3步完成QQ空间数据导出与历史备份 换设备重装系统前想把QQ空间原样带走却发现网页版没有导出按钮老说说只能一页页网页爬虫数据分析claude-skills 之 Rust 错误处理实战指南Result、Option、thiserror 与 anyhow 全解析claude skills 之 Rust 错误处理实战指南Result、Option、thiserror 与 anyhow 全解析 导读 本文以 claude上一篇3分钟掌握RCM注入NS-USBloader的跨平台Payload管理指南下一篇5分钟搞定Switch破解注入NS-USBloader完整使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表