h3poteto/fluentd-sidecar-injector
GitHub: h3poteto/fluentd-sidecar-injector
Kubernetes admission webhook服务器,用于在Pod创建时自动注入fluentd或fluent-bit日志收集容器作为sidecar。
Stars: 42 | Forks: 9
[](https://github.com/h3poteto/fluentd-sidecar-injector/actions/workflows/build.yml)
[](https://github.com/h3poteto/fluentd-sidecar-injector/actions/workflows/e2e.yml)
[](https://github.com/h3poteto/fluentd-sidecar-injector/actions/workflows/docker-publish.yml)
[](https://github.com/h3poteto/fluentd-sidecar-injector/releases)
[](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, 子域名突变, 容器化, 容器编排, 日志审计, 日志收集, 日志聚合, 服务网格, 特权提升, 自动化部署, 请求拦截