项目作者: h3poteto

项目描述 :
Webhook server for kubernetes admission webhook to inject fluentd as sidecar
高级语言: Go
项目地址: git://github.com/h3poteto/fluentd-sidecar-injector.git
创建时间: 2020-01-30T09:40:14Z
项目社区:https://github.com/h3poteto/fluentd-sidecar-injector

开源协议:MIT License

下载


Build
E2E
Docker
GitHub release (latest SemVer)
Dependabot

fluentd-sidecar-injector

fluentd-sidecar-injector is a webhook server for kubernetes admission webhook. This server inject fluentd or fluent-bit container as sidecar for specified Pod using mutation webhook. The feature is

  • Automatically sidecar injection
  • You can control injection using Pod’s annotations
  • You can change fluentd or fluent-bit docker image to be injected

Install

This controller creates a webhook server, and you can manage the certificate of the webhook with cert-manager. Make sure you have already installed cert-manager before you install.

You can install this controller and webhook server using helm. By default, the helm chart installs this controller with --use-cert-manager.

  1. $ helm repo add h3poteto-stable https://h3poteto.github.io/charts/stable
  2. $ helm install my-injector --namespace kube-system h3poteto-stable/fluentd-sidecar-injector

Please refer helm repository for parameters.

Without cert-manager

If you don’t use cert-manager, please choose this way. But the certificate will not be renewed when it expires. So please re-install this controller when it expires.

  1. $ helm repo add h3poteto-stable https://h3poteto.github.io/charts/stable
  2. $ helm install my-injector --namespace kube-system h3poteto-stable/fluentd-sidecar-injector --set useCertManager=false

Confirm

After install it, custom resources and controller will be installed.

  1. $ kubectl get sidecarinjectors -n kube-system
  2. NAME AGE
  3. my-injector-fluentd 1m56s
  4. $ kubectl get pods -n kube-system -l operator.h3poteto.dev=control-plane
  5. NAME READY STATUS RESTARTS AGE
  6. my-injector-manager-6d7f6bcd55-z5jcv 1/1 Running 0 2m17s

And it creates admission webhook for the sidecar injector.

  1. $ kubectl get mutatingwebhookconfigurations
  2. NAME WEBHOOKS AGE
  3. sidecar-injector-webhook-my-injector-fluentd 1 5m15s
  4. $ kubectl get svc -n kube-system -l sidecarinjectors.operator.h3poteto.dev=webhook-service
  5. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  6. sidecar-injector-my-injector-fluentd ClusterIP 100.69.147.98 <none> 443/TCP 4m2s
  7. $ kubectl get pods -n kube-system -l sidecarinjectors.operator.h3poteto.dev=webhook-pod
  8. NAME READY STATUS RESTARTS AGE
  9. my-injector-fluentd-handler-5969df9695-ftklp 1/1 Running 0 4m51s
  10. my-injector-fluentd-handler-5969df9695-x5n5r 1/1 Running 0 4m51s

Usage

After you install this webhook server, fluentd sidecar containers are automatically injected, if you specify the annotation fluentd-sidecar-injector.h3poteto.dev/injection: 'enabled' to the pods.

For example:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-test
  5. labels:
  6. app: nginx-test
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: nginx-test
  12. template:
  13. metadata:
  14. annotations:
  15. fluentd-sidecar-injector.h3poteto.dev/injection: 'enabled'
  16. fluentd-sidecar-injector.h3poteto.dev/application-log-dir: '/var/log/nginx'
  17. fluentd-sidecar-injector.h3poteto.dev/collector: 'fluentd'
  18. labels:
  19. app: nginx-test
  20. spec:
  21. containers:
  22. - name: nginx
  23. image: nginx:latest

FluentD is injected for this Pod.

  1. $ kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. nginx-test-6cbf4485f8-kq8ws 2/2 Running 0 9s
  1. $ kubectl describe pod nginx-test-6cbf4485f8-kq8ws
  2. Name: nginx-test-6cbf4485f8-kq8ws
  3. Namespace: default
  4. Containers:
  5. nginx:
  6. Container ID: docker://ce74393381205786668a1fe2a4bc83ba058d380714b8a7ddca23966c8c7f0eb0
  7. Image: nginx:latest
  8. Image ID: docker-pullable://nginx@sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f
  9. Port: <none>
  10. Host Port: <none>
  11. State: Running
  12. Started: Fri, 14 Feb 2020 13:49:21 +0900
  13. Ready: True
  14. Restart Count: 0
  15. Environment: <none>
  16. Mounts:
  17. /var/log/nginx from fluentd-sidecar-injector-logs (rw)
  18. /var/run/secrets/kubernetes.io/serviceaccount from default-token-8rcns (ro)
  19. fluentd-sidecar:
  20. Container ID: docker://49503c3836fa5ebc40c55db3717f16f21fbdbfaae8859a8ed8a366d04a2b6d9b
  21. Image: ghcr.io/h3poteto/fluentd-forward:latest
  22. Image ID: docker-pullable://ghcr.io/h3poteto/fluentd-forward@sha256:5d93af333ad9fefbfcb8013d20834fd89c2bbd3fe8b9b9bfa620ded29d7b3205
  23. Port: <none>
  24. Host Port: <none>
  25. State: Running
  26. Started: Fri, 14 Feb 2020 13:49:23 +0900
  27. Ready: True
  28. Restart Count: 0
  29. Limits:
  30. memory: 1000Mi
  31. Requests:
  32. cpu: 100m
  33. memory: 200Mi
  34. Environment:
  35. AGGREGATOR_HOST: 127.0.0.1
  36. APPLICATION_LOG_DIR: /var/log/nginx
  37. TAG_PREFIX: prod
  38. TIME_KEY: time
  39. Mounts:
  40. /var/log/nginx from fluentd-sidecar-injector-logs (rw)

Custom fluent.conf

If you need to use your own fluent.conf, use config-volume option.
The following yaml has fluent-conf configmap. It will be mounted on /fluentd/etc/fluent/fluent.conf.

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-test
  5. labels:
  6. app: nginx-test
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: nginx-test
  12. template:
  13. metadata:
  14. annotations:
  15. fluentd-sidecar-injector.h3poteto.dev/injection: 'enabled'
  16. fluentd-sidecar-injector.h3poteto.dev/collector: 'fluentd'
  17. fluentd-sidecar-injector.h3poteto.dev/docker-image: 'fluent/fluentd:latest'
  18. fluentd-sidecar-injector.h3poteto.dev/application-log-dir: '/var/log/nginx'
  19. fluentd-sidecar-injector.h3poteto.dev/aggregator-host: 'fluentd.example.com'
  20. fluentd-sidecar-injector.h3poteto.dev/config-volume: 'fluent-conf'
  21. labels:
  22. app: nginx-test
  23. spec:
  24. containers:
  25. - name: nginx
  26. image: nginx:latest
  27. volumes:
  28. - name: fluent-conf
  29. configMap:
  30. name: fluent-conf
  31. ---
  32. apiVersion: v1
  33. kind: ConfigMap
  34. metadata:
  35. name: fluent-conf
  36. labels:
  37. app: fluent-conf
  38. data:
  39. fluent.conf: |-
  40. <source>
  41. @type tail
  42. path "#{ENV['APPLICATION_LOG_DIR']}/*.access.log"
  43. pos_file /var/tmp/application.log.pos
  44. tag "app.*"
  45. <parse>
  46. @type ltsv
  47. </parse>
  48. </source>
  49. <filter app.*>
  50. @type record_transformer
  51. <record>
  52. hostname "#{Socket.gethostname}"
  53. </record>
  54. </filter>
  55. <match app.*>
  56. @type forward
  57. <server>
  58. host "#{ENV['AGGREGATOR_HOST']}"
  59. port "#{ENV['AGGREGATOR_PORT']} || 24224"
  60. </server>
  61. </match>

Annotations

Please specify these annotations to your pods like this.

Name Required Default
fluentd-sidecar-injector.h3poteto.dev/injection optional “”
fluentd-sidecar-injector.h3poteto.dev/docker-image optional ghcr.io/h3poteto/fluentd-forward:latest
fluentd-sidecar-injector.h3poteto.dev/collector optional fluentd
fluentd-sidecar-injector.h3poteto.dev/aggregator-host required “”
fluentd-sidecar-injector.h3poteto.dev/aggregator-port optional 24224
fluentd-sidecar-injector.h3poteto.dev/application-log-dir required “”
fluentd-sidecar-injector.h3poteto.dev/tag-prefix optional “”
fluentd-sidecar-injector.h3poteto.dev/custom-env optional “”
fluentd-sidecar-injector.h3poteto.dev/expose-port optional “”
fluentd-sidecar-injector.h3poteto.dev/config-volume optional “”
fluentd-sidecar-injector.h3poteto.dev/memory-request optional 200Mi
fluentd-sidecar-injector.h3poteto.dev/memory-limit optional 1000Mi
fluentd-sidecar-injector.h3poteto.dev/cpu-request optional 100m
fluentd-sidecar-injector.h3poteto.dev/cpu-limit optional “”

These annotations are used when collector is fluentd.

Name Required Default
fluentd-sidecar-injector.h3poteto.dev/send-timeout optional 60s
fluentd-sidecar-injector.h3poteto.dev/recover-wait optional 10s
fluentd-sidecar-injector.h3poteto.dev/hard-timeout optional 120s
fluentd-sidecar-injector.h3poteto.dev/time-key optional time
fluentd-sidecar-injector.h3poteto.dev/time-format optional %Y-%m-%dT%H:%M:%S%z
fluentd-sidecar-injector.h3poteto.dev/log-format optional json

These annotations are used when collector is fluent-bit.

Name Required Default
fluentd-sidecar-injector.h3poteto.dev/refresh-interval optional 60
fluentd-sidecar-injector.h3poteto.dev/rotate-wait optional 5

Fixed environment variables

The following values ​​will be set for each fluentd-sidecar.
You can use this value in your fluent.conf with config-volume option.

Name Default
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

You can find out more about the values on The Downward API.

Development

Please prepare a Kubernetes cluster to install this, and export KUBECONFIG.

  1. $ export KUBECONFIG=$HOME/.kube/config

At first, build docker and push it.

  1. $ docker build -t my-docker-registry/fluentd-sidecar-injector:experimental .
  2. $ docker push my-docker-registry/fluentd-sidecar-injector:experimental

Next, install CRDs.

  1. $ make install

Next, please run controller in local.

  1. $ export WEBHOOK_CONTAINER_IMAGE=my-docker-registry/fluentd-sidecar-injector:experimental
  2. $ export POD_NAMESPACE=my-namespace
  3. $ make run

License

The package is available as open source under the terms of the MIT License.