h3poteto/fluentd-sidecar-injector

GitHub: h3poteto/fluentd-sidecar-injector

Kubernetes admission webhook服务器,用于在Pod创建时自动注入fluentd或fluent-bit日志收集容器作为sidecar。

Stars: 42 | Forks: 9

[![Build](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/6597b7e1be173236.svg)](https://github.com/h3poteto/fluentd-sidecar-injector/actions/workflows/build.yml) [![E2E](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/9dad91a1e5173237.svg)](https://github.com/h3poteto/fluentd-sidecar-injector/actions/workflows/e2e.yml) [![Docker](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/3a8bc99d35173238.svg)](https://github.com/h3poteto/fluentd-sidecar-injector/actions/workflows/docker-publish.yml) [![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/h3poteto/fluentd-sidecar-injector?sort=semver&style=square)](https://github.com/h3poteto/fluentd-sidecar-injector/releases) [![Dependabot](https://img.shields.io/badge/Dependabot-enabled-blue.svg)](https://dependabot.com) # fluentd-sidecar-injector `fluentd-sidecar-injector` 是一个用于 Kubernetes admission webhook 的 webhook 服务器。该服务器使用 mutation webhook 将 fluentd 或 fluent-bit 容器作为 sidecar 注入到指定的 Pod 中。其功能特点包括: - 自动注入 sidecar - 可通过 Pod 的注解控制注入行为 - 可自定义要注入的 fluentd 或 fluent-bit Docker 镜像 ## 安装 ### 使用 cert-manager(推荐) 该控制器会创建一个 webhook 服务器,您可以使用 [cert-manager](https://cert-manager.io/docs/) 管理 webhook 的证书。请确保在安装之前已安装 cert-manager。 您可以使用 helm 安装此控制器和 webhook 服务器。默认情况下,helm chart 会使用 `--use-cert-manager` 参数安装此控制器。 ``` $ helm repo add h3poteto-stable https://h3poteto.github.io/charts/stable $ helm install my-injector --namespace kube-system h3poteto-stable/fluentd-sidecar-injector ``` 请参阅 [helm 仓库](https://github.com/h3poteto/charts/tree/master/stable/fluentd-sidecar-injector) 了解相关参数。 ### 不使用 cert-manager 如果您不使用 cert-manager,请选择这种方式。但证书到期后不会自动续期,因此请在证书到期时重新安装此控制器。 ``` $ helm repo add h3poteto-stable https://h3poteto.github.io/charts/stable $ helm install my-injector --namespace kube-system h3poteto-stable/fluentd-sidecar-injector --set useCertManager=false ``` ### 确认 安装后,自定义资源和控制器将被安装。 ``` $ kubectl get sidecarinjectors -n kube-system NAME AGE my-injector-fluentd 1m56s $ kubectl get pods -n kube-system -l operator.h3poteto.dev=control-plane NAME READY STATUS RESTARTS AGE my-injector-manager-6d7f6bcd55-z5jcv 1/1 Running 0 2m17s ``` 同时会为 sidecar 注入器创建 admission webhook。 ``` $ kubectl get mutatingwebhookconfigurations NAME WEBHOOKS AGE sidecar-injector-webhook-my-injector-fluentd 1 5m15s $ kubectl get svc -n kube-system -l sidecarinjectors.operator.h3poteto.dev=webhook-service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sidecar-injector-my-injector-fluentd ClusterIP 100.69.147.98 443/TCP 4m2s $ kubectl get pods -n kube-system -l sidecarinjectors.operator.h3poteto.dev=webhook-pod NAME READY STATUS RESTARTS AGE my-injector-fluentd-handler-5969df9695-ftklp 1/1 Running 0 4m51s my-injector-fluentd-handler-5969df9695-x5n5r 1/1 Running 0 4m51s ``` ## 使用方法 安装此 webhook 服务器后,如果您在 Pod 上指定了注解 `fluentd-sidecar-injector.h3poteto.dev/injection: 'enabled'`,fluentd sidecar 容器将自动被注入。 例如: ``` apiVersion: apps/v1 kind: Deployment metadata: name: nginx-test labels: app: nginx-test spec: replicas: 1 selector: matchLabels: app: nginx-test template: metadata: annotations: fluentd-sidecar-injector.h3poteto.dev/injection: 'enabled' fluentd-sidecar-injector.h3poteto.dev/application-log-dir: '/var/log/nginx' fluentd-sidecar-injector.h3poteto.dev/collector: 'fluentd' labels: app: nginx-test spec: containers: - name: nginx image: nginx:latest ``` FluentD 将被注入到此 Pod 中。 ``` $ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-test-6cbf4485f8-kq8ws 2/2 Running 0 9s ``` ``` $ kubectl describe pod nginx-test-6cbf4485f8-kq8ws Name: nginx-test-6cbf4485f8-kq8ws Namespace: default Containers: nginx: Container ID: docker://ce74393381205786668a1fe2a4bc83ba058d380714b8a7ddca23966c8c7f0eb0 Image: nginx:latest Image ID: docker-pullable://nginx@sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f Port: Host Port: State: Running Started: Fri, 14 Feb 2020 13:49:21 +0900 Ready: True Restart Count: 0 Environment: Mounts: /var/log/nginx from fluentd-sidecar-injector-logs (rw) /var/run/secrets/kubernetes.io/serviceaccount from default-token-8rcns (ro) fluentd-sidecar: Container ID: docker://49503c3836fa5ebc40c55db3717f16f21fbdbfaae8859a8ed8a366d04a2b6d9b Image: ghcr.io/h3poteto/fluentd-forward:latest Image ID: docker-pullable://ghcr.io/h3poteto/fluentd-forward@sha256:5d93af333ad9fefbfcb8013d20834fd89c2bbd3fe8b9b9bfa620ded29d7b3205 Port: Host Port: State: Running Started: Fri, 14 Feb 2020 13:49:23 +0900 Ready: True Restart Count: 0 Limits: memory: 1000Mi Requests: cpu: 100m memory: 200Mi Environment: AGGREGATOR_HOST: 127.0.0.1 APPLICATION_LOG_DIR: /var/log/nginx TAG_PREFIX: prod TIME_KEY: time Mounts: /var/log/nginx from fluentd-sidecar-injector-logs (rw) ``` ### 自定义 fluent.conf 如果您需要使用自己的 fluent.conf,请使用 config-volume 选项。 以下 yaml 包含 fluent-conf configmap,它将被挂载到 `/fluentd/etc/fluent/fluent.conf`。 ``` apiVersion: apps/v1 kind: Deployment metadata: name: nginx-test labels: app: nginx-test spec: replicas: 1 selector: matchLabels: app: nginx-test template: metadata: annotations: fluentd-sidecar-injector.h3poteto.dev/injection: 'enabled' fluentd-sidecar-injector.h3poteto.dev/collector: 'fluentd' fluentd-sidecar-injector.h3poteto.dev/docker-image: 'fluent/fluentd:latest' fluentd-sidecar-injector.h3poteto.dev/application-log-dir: '/var/log/nginx' fluentd-sidecar-injector.h3poteto.dev/aggregator-host: 'fluentd.example.com' fluentd-sidecar-injector.h3poteto.dev/config-volume: 'fluent-conf' labels: app: nginx-test spec: containers: - name: nginx image: nginx:latest volumes: - name: fluent-conf configMap: name: fluent-conf --- apiVersion: v1 kind: ConfigMap metadata: name: fluent-conf labels: app: fluent-conf data: fluent.conf: |- @type tail path "#{ENV['APPLICATION_LOG_DIR']}/*.access.log" pos_file /var/tmp/application.log.pos tag "app.*" @type ltsv @type record_transformer hostname "#{Socket.gethostname}" @type forward host "#{ENV['AGGREGATOR_HOST']}" port "#{ENV['AGGREGATOR_PORT']} || 24224" ``` ### 注解 请按[此示例](`fluentd-sidecar-injector.h3poteto.dev/injection` 指定是否启用或禁用此注入器。如果要启用,请指定 `enabled`。 - `fluentd-sidecar-injector.h3poteto.dev/docker-image` 指定 sidecar Docker 镜像。默认值为 `ghcr.io/h3poteto/fluentd-forward:latest`。 - `fluentd-sidecar-injector.h3poteto.dev/collector` 指定收集器名称,可为 `fluentd` 或 `fluent-bit`。默认值为 `fluentd`。指定的收集器将被注入到您的 Pod 中。 - `fluentd-sidecar-injector.h3poteto.dev/aggregator-host` 用于[此处](https://github.com/h3poteto/docker-fluentd-forward/blob/master/fluent.conf#L39)。默认 Docker 镜像将接收的日志转发到另一个 fluentd 主机。此参数为必填项。 - `fluentd-sidecar-injector.h3poteto.dev/aggregator-port` 用于[此处](https://github.com/h3poteto/docker-fluentd-forward/blob/master/fluent.conf#L40)。默认值为 `24224`。 - `fluentd-sidecar-injector.h3poteto.dev/application-log-dir` 指定 fluentd 要监控的日志目录。此目录通过卷挂载在应用容器和 sidecar fluentd 容器之间共享。此参数为必填项。 - `fluentd-sidecar-injector.h3poteto.dev/tag-prefix` 是接收日志 tag 的前缀。它用于[此处](https://github.com/h3poteto/docker-fluentd-forward/blob/master/fluent.conf#L5)。 - `flud-sidecar-injector.h3poteto.dev/config-volume` 可以读取您自己的 fluent.conf。如果您将 `collector` 指定为 `fluent-bit`,则会读取 `fluent-bit.conf`。 - `fluentd-sidecar-injector.h3poteto.dev/custom-env` 是一个允许用户在 fluent.conf 中设置自己值的选项。请与 config-volume 选项一起使用。 - `fluentd-sidecar-injector.h3poteto.dev/expose-port` 是一个允许用户设置任意端口来暴露 fluentd 容器的选项。 - `fluentd-sidecar-injector.h3poteto.dev/memory-request` 是一个允许用户设置 sidecar 容器内存请求的选项。 - `fluentd-sidecar-injector.h3poteto.dev/memory-limit` 是一个允许用户设置 sidecar 容器内存限制的选项。 - `fluentd-sidecar-injector.h3poteto.dev/cpu-request` 是一个允许用户设置 sidecar 容器 CPU 请求的选项。 - `fluentd-sidecar-injector.h3poteto.dev/cpu-limit` 是一个允许用户设置 sidecar 容器 CPU 限制的选项。 - `fluentd-sidecar-injector.h3poteto.dev/send-timeout` 是 [此处](https://github.com/h3poteto/docker-fluentd-forward/blob/master/fluent.conf#L16) 中 fluentd 配置的发送超时时间。默认值为 `60s`。 - `fluentd-sidecar-injector.h3poteto.dev/recover-wait` 用于[此处](https://github.com/h3poteto/docker-fluentd-forward/blob/master/fluent.conf#L17)。默认值为 `10s`。 - `fluentd-sidecar-injector.h3poteto.dev/hard-timeout` 是 [此处](https://github.com/h3poteto/docker-fluentd-forward/blob/master/fluent.conf#L18) 中 fluentd 配置的超时时间。默认值为 `120s`。 - `fluentd-sidecar-injector.h3poteto.dev/time-key` 是 [此处](https://github.com/h3poteto/docker-fluentd-forward/blob/master/fluent.conf#L9) 中的 fluentd 配置。默认值为 `time`。 - `fluentd-sidecar-injector.h3poteto.dev/time-format` 是 [此处](https://github.com/h3poteto/docker-fluentd-forward/blob/master/fluent.conf#L10) 中的 fluentd 配置。默认值为 `%Y-%m-%dT%H:%M:%S%z`。 - `fluentd-sidecar-injector.h3poteto.dev/log-format` 是 [此处](https://github.com/h3poteto/docker-fluentd-forward/blob/master/fluent.conf#L7) 中的 fluentd 配置。默认值为 `json`。 - `fluentd-sidecar-injector.h3poteto.dev/refresh-interval` 是 [此处](https://github.com/h3poteto/docker-fluentbit-forward/blob/master/fluent-bit.conf#L11) 中的 fluent-bit 配置。默认值为 `60` 秒。 - `fluentd-sidecar-injector.h3poteto.dev/rotate-wait` 是 [此处](https://github.com/h3poteto/docker-fluentbit-forward/blob/master/fluent-bit.conf#L12) 中的 fluent-bit 配置。默认值为 `5` 秒。 ### 固定环境变量 以下值将为每个 fluentd-sidecar 设置。 您可以在使用 config-volume 选项的 fluent.conf 中使用这些值。 | 名称 | 默认值 | | ------------------- | ------------------------- | | NODE_NAME | `spec.nodeName` | | POD_NAME | `metadata.name` | | POD_NAMESPACE | `metadata.namespace` | | POD_IP | `status.podIP` | | POD_SERVICE_ACCOUNT | `spec.serviceAccountName` | | CPU_RESOURCE | `requests.cpu` | | CPU_LIMIT | `limits.cpu` | | MEM_RESOURCE | `requests.memory` | | MEM_LIMIT | `limits.memory` | 您可以在 [The Downward API](https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/#the-downward-api) 上了解更多关于这些值的信息。 ## 开发 请准备一个 Kubernetes 集群来安装此组件,并导出 `KUBECONFIG`。 ``` $ export KUBECONFIG=$HOME/.kube/config ``` 首先,构建 Docker 镜像并推送。 ``` $ docker build -t my-docker-registry/fluentd-sidecar-injector:experimental . $ docker push my-docker-registry/fluentd-sidecar-injector:experimental ``` 接下来,安装 CRDs。 ``` $ make install ``` 接下来,请在本地运行控制器。 ``` $ export WEBHOOK_CONTAINER_IMAGE=my-docker-registry/fluentd-sidecar-injector:experimental $ export POD_NAMESPACE=my-namespace $ make run ``` ## 许可证 该软件包根据 [MIT 许可证](https://opensource.org/licenses/MIT) 的条款开源提供。
标签:Admission Webhook, cert-manager, EVTX分析, fluent-bit, fluentd, GitOps, Go, Helm, MutatingWebhookConfiguration, NIDS, Pod 注入, Ruby工具, Sidecar, Sidecar 注入, Webhook Server, 子域名突变, 容器化, 容器编排, 日志审计, 日志收集, 日志聚合, 服务网格, 特权提升, 自动化部署, 请求拦截