aws-logging-monitoring/logging/forwarder.yaml (393 lines of code) (raw):

# Copyright 2021 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # [START gkeonaws_logging_forwarder_serviceaccount_stackdriver_log_forwarder] # Service account for Log Forwarder (Fluent Bit). apiVersion: v1 kind: ServiceAccount metadata: name: stackdriver-log-forwarder namespace: kube-system # [END gkeonaws_logging_forwarder_serviceaccount_stackdriver_log_forwarder] --- # [START gkeonaws_logging_forwarder_clusterrole_stackdriver_user:stackdriver_log_forwarder] # ClusterRole with permissions required by Log Forwarder (Fluent Bit) and its sidecar. apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: stackdriver-user:stackdriver-log-forwarder rules: - apiGroups: - "" resources: - nodes - pods - namespaces verbs: - watch - get - list - apiGroups: - '*' resources: - 'serviceaccounts/token' verbs: - 'create' # [END gkeonaws_logging_forwarder_clusterrole_stackdriver_user:stackdriver_log_forwarder] --- # [START gkeonaws_logging_forwarder_clusterrolebinding_stackdriver_user:stackdriver_log_forwarder] # ClusterRoleBinding for Log Forwarder (Fluent Bit). apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: stackdriver-user:stackdriver-log-forwarder namespace: kube-system roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: stackdriver-user:stackdriver-log-forwarder subjects: - kind: ServiceAccount name: stackdriver-log-forwarder namespace: kube-system # [END gkeonaws_logging_forwarder_clusterrolebinding_stackdriver_user:stackdriver_log_forwarder] --- # [START gkeonaws_logging_forwarder_daemonset_stackdriver_log_forwarder] # Log Forwarder (Fluent Bit) DaemonSet to tail log files. apiVersion: apps/v1 kind: DaemonSet metadata: name: stackdriver-log-forwarder namespace: kube-system labels: app: stackdriver-log-forwarder spec: selector: matchLabels: app: stackdriver-log-forwarder managed-by: stackdriver template: metadata: labels: app: stackdriver-log-forwarder managed-by: stackdriver spec: nodeSelector: kubernetes.io/os: linux containers: - name: stackdriver-gke-addon image: gcr.io/gke-multi-cloud-release/gke-addon-sidecar:gke_multicloud.docker_images_20210323_1546_RC00 imagePullPolicy: IfNotPresent command: - /app/cloud/kubernetes/multicloud/addonsidecar/gke_addon_sidecar - --http_server=localhost:9681 - --ksa_name=stackdriver - --ksa_namespace=kube-system - --token_audience=PROJECT_ID.svc.id.goog - --gcp_project_id=PROJECT_ID - --gcp_sts_audience=identitynamespace:PROJECT_ID.svc.id.goog:https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/CLUSTER_NAME - name: stackdriver-log-forwarder image: gcr.io/gke-multi-cloud-release/fluent-bit:v1.7.7-gke.4 imagePullPolicy: IfNotPresent ports: - containerPort: 2020 resources: requests: cpu: 50m memory: 50Mi limits: cpu: 100m memory: 600Mi env: - name: METADATA_SERVER value: http://127.0.0.1:9681 - name: NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName volumeMounts: - name: varlog mountPath: /var/log - name: stackdriver-log-forwarder-config mountPath: /fluent-bit/etc/ terminationMessagePath: /dev/termination-log terminationMessagePolicy: File serviceAccountName: stackdriver-log-forwarder terminationGracePeriodSeconds: 60 tolerations: - key: "CriticalAddonsOnly" operator: "Exists" - key: node-role.gke.io/observability effect: NoSchedule volumes: - name: varlog hostPath: path: /var/log - name: stackdriver-log-forwarder-config configMap: name: stackdriver-log-forwarder-config updateStrategy: rollingUpdate: maxUnavailable: 1 type: RollingUpdate # [END gkeonaws_logging_forwarder_daemonset_stackdriver_log_forwarder] --- # [START gkeonaws_logging_forwarder_configmap_stackdriver_log_forwarder_config] # Log Forwarder (Fluent Bit) configuration map. apiVersion: v1 kind: ConfigMap metadata: name: stackdriver-log-forwarder-config namespace: kube-system labels: app: stackdriver-log-forwarder data: # Configuration files for service, input, filter, and output plugins. # ====================================================== filter-kubernetes.conf: | [FILTER] # https://docs.fluentbit.io/manual/filter/kubernetes Name kubernetes Match k8s_container.* Kube_URL https://kubernetes.default.svc.cluster.local:443 Kube_Tag_Prefix k8s_container. Regex_Parser k8s-container-custom-tag Annotations Off fluent-bit.conf: | [SERVICE] # https://docs.fluentbit.io/manual/service Flush 1 Log_Level warn Daemon off Parsers_File parsers.conf HTTP_Server On HTTP_Listen 0.0.0.0 HTTP_Port 2020 # https://docs.fluentbit.io/manual/configuration/buffering storage.path /var/log/fluent-bit-buffers/ storage.sync normal storage.checksum off storage.backlog.mem_limit 10M @INCLUDE input-systemd.conf @INCLUDE input-containers.conf @INCLUDE filter-kubernetes.conf @INCLUDE output-stackdriver.conf input-systemd.conf: | [INPUT] # https://docs.fluentbit.io/manual/input/systemd Name systemd Tag container-runtime Path /var/log/journal DB /var/log/fluent-bit-k8s-node-journald-containerd.db Systemd_Filter _SYSTEMD_UNIT=containerd.service storage.type filesystem [INPUT] # https://docs.fluentbit.io/manual/input/systemd Name systemd Tag kubelet Path /var/log/journal DB /var/log/fluent-bit-k8s-node-journald-kubelet.db Systemd_Filter _SYSTEMD_UNIT=kubelet.service storage.type filesystem [FILTER] # https://docs.fluentbit.io/manual/pipeline/filters/modify Name modify Match_Regex ^(container-runtime|kubelet)$ Add logging.googleapis.com/local_resource_id k8s_node.${NODE_NAME} Add gke.googleapis.com/log_type system input-containers.conf: | [INPUT] # https://docs.fluentbit.io/manual/input/tail Name tail Tag_Regex var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$ Tag k8s_container.<namespace_name>.<pod_name>.<container_name> Path /var/log/containers/*.log Exclude_Path *_kube-system_*.log,*_gke-connect_*.log,*_knative-serving_*.log,*_gke-system_*.log,*_istio-system_*.log,*_monitoring-system_*.log,*_config-management-system_*.log,*_gatekeeper-system_*.log,*_cnrm-system_*.log Parser cri DB /var/log/fluent-bit-k8s-container-application.db Buffer_Chunk_Size 512KB Buffer_Max_Size 5M Rotate_Wait 30 Mem_Buf_Limit 30MB Skip_Long_Lines On Refresh_Interval 10 storage.type filesystem Ignore_Older 4h [INPUT] # https://docs.fluentbit.io/manual/input/tail Name tail Tag_Regex var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$ Tag k8s_container.<namespace_name>.<pod_name>.<container_name> Path /var/log/containers/*_kube-system_*.log Parser cri DB /var/log/fluent-bit-k8s-container-kube-system.db Buffer_Chunk_Size 512KB Buffer_Max_Size 5M Rotate_Wait 30 Mem_Buf_Limit 30MB Skip_Long_Lines On Refresh_Interval 10 storage.type filesystem Ignore_Older 4h [INPUT] # https://docs.fluentbit.io/manual/input/tail Name tail Tag_Regex var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$ Tag k8s_container.<namespace_name>.<pod_name>.<container_name> Path /var/log/containers/*_gke-connect_*.log Parser cri DB /var/log/fluent-bit-k8s-container-gke-connect.db Buffer_Chunk_Size 512KB Buffer_Max_Size 2M Rotate_Wait 30 Mem_Buf_Limit 30MB Skip_Long_Lines On Refresh_Interval 10 storage.type filesystem Ignore_Older 4h [INPUT] # https://docs.fluentbit.io/manual/input/tail Name tail Tag_Regex var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$ Tag k8s_container.<namespace_name>.<pod_name>.<container_name> Path /var/log/containers/*_knative-serving_*.log Parser cri DB /var/log/fluent-bit-k8s-container-knative-serving.db Buffer_Chunk_Size 512KB Buffer_Max_Size 2M Rotate_Wait 30 Mem_Buf_Limit 30MB Skip_Long_Lines On Refresh_Interval 10 storage.type filesystem Ignore_Older 4h [INPUT] # https://docs.fluentbit.io/manual/input/tail Name tail Tag_Regex var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$ Tag k8s_container.<namespace_name>.<pod_name>.<container_name> Path /var/log/containers/*_gke-system_*.log Parser cri DB /var/log/fluent-bit-k8s-container-gke-system.db Buffer_Chunk_Size 512KB Buffer_Max_Size 2M Rotate_Wait 30 Mem_Buf_Limit 30MB Skip_Long_Lines On Refresh_Interval 10 storage.type filesystem Ignore_Older 4h [INPUT] # https://docs.fluentbit.io/manual/input/tail Name tail Tag_Regex var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$ Tag k8s_container.<namespace_name>.<pod_name>.<container_name> Path /var/log/containers/*_istio-system_*.log Parser cri DB /var/log/fluent-bit-k8s-container-istio-system.db Buffer_Chunk_Size 512KB Buffer_Max_Size 2M Rotate_Wait 30 Mem_Buf_Limit 30MB Skip_Long_Lines On Refresh_Interval 10 storage.type filesystem Ignore_Older 4h [INPUT] # https://docs.fluentbit.io/manual/input/tail Name tail Tag_Regex var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$ Tag k8s_container.<namespace_name>.<pod_name>.<container_name> Path /var/log/containers/*_monitoring-system_*.log Parser cri DB /var/log/fluent-bit-k8s-container-monitoring-system.db Buffer_Chunk_Size 512KB Buffer_Max_Size 2M Rotate_Wait 30 Mem_Buf_Limit 30MB Skip_Long_Lines On Refresh_Interval 10 storage.type filesystem Ignore_Older 4h [INPUT] # https://docs.fluentbit.io/manual/input/tail Name tail Tag_Regex var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$ Tag k8s_container.<namespace_name>.<pod_name>.<container_name> Path /var/log/containers/*_config-management-system_*.log Parser cri DB /var/log/fluent-bit-k8s-container-config-management-system.db Buffer_Chunk_Size 512KB Buffer_Max_Size 2M Rotate_Wait 30 Mem_Buf_Limit 30MB Skip_Long_Lines On Refresh_Interval 10 storage.type filesystem Ignore_Older 4h [INPUT] # https://docs.fluentbit.io/manual/input/tail Name tail Tag_Regex var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$ Tag k8s_container.<namespace_name>.<pod_name>.<container_name> Path /var/log/containers/*_gatekeeper-system_*.log Parser cri DB /var/log/fluent-bit-k8s-container-gatekeeper-system.db Buffer_Chunk_Size 512KB Buffer_Max_Size 2M Rotate_Wait 30 Mem_Buf_Limit 30MB Skip_Long_Lines On Refresh_Interval 10 storage.type filesystem Ignore_Older 4h [INPUT] # https://docs.fluentbit.io/manual/input/tail Name tail Tag_Regex var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$ Tag k8s_container.<namespace_name>.<pod_name>.<container_name> Path /var/log/containers/*_cnrm-system_*.log Parser cri DB /var/log/fluent-bit-k8s-container-cnrm-system.db Buffer_Chunk_Size 512KB Buffer_Max_Size 2M Rotate_Wait 30 Mem_Buf_Limit 30MB Skip_Long_Lines On Refresh_Interval 10 storage.type filesystem Ignore_Older 4h # Input collected above are with namespaces "kube-system", "gke-connect", # "knative-serving", "gke-system", "istio-system", "monitoring-system", # "config-management-system", "gatekeeper-system" and "cnrm-system", # which are system namespaces. [FILTER] # https://docs.fluentbit.io/manual/filter/record_modifier Name record_modifier Match *.kube-system.* Record gke.googleapis.com/log_type system [FILTER] # https://docs.fluentbit.io/manual/filter/record_modifier Name record_modifier Match *.gke-connect.* Record gke.googleapis.com/log_type system [FILTER] # https://docs.fluentbit.io/manual/filter/record_modifier Name record_modifier Match *.knative-serving.* Record gke.googleapis.com/log_type system [FILTER] # https://docs.fluentbit.io/manual/filter/record_modifier Name record_modifier Match *.gke-system.* Record gke.googleapis.com/log_type system [FILTER] # https://docs.fluentbit.io/manual/filter/record_modifier Name record_modifier Match *.istio-system.* Record gke.googleapis.com/log_type system [FILTER] # https://docs.fluentbit.io/manual/filter/record_modifier Name record_modifier Match *.monitoring-system.* Record gke.googleapis.com/log_type system [FILTER] # https://docs.fluentbit.io/manual/filter/record_modifier Name record_modifier Match *.config-management-system.* Record gke.googleapis.com/log_type system [FILTER] # https://docs.fluentbit.io/manual/filter/record_modifier Name record_modifier Match *.gatekeeper-system.* Record gke.googleapis.com/log_type system [FILTER] # https://docs.fluentbit.io/manual/filter/record_modifier Name record_modifier Match *.cnrm-system.* Record gke.googleapis.com/log_type system [FILTER] # https://docs.fluentbit.io/manual/filter/nest Name nest Match * Operation nest Wildcard gke.googleapis.com* Nest_under logging.googleapis.com/labels output-stackdriver.conf: | [OUTPUT] # https://docs.fluentbit.io/manual/pipeline/outputs/stackdriver Name stackdriver Match k8s_container.* Resource k8s_container k8s_cluster_name CLUSTER_NAME k8s_cluster_location CLUSTER_LOCATION # Custom RegEx for matching the fields in the local_resource_id # https://github.com/fluent/fluent-bit/pull/3200 custom_k8s_regex ^(?<namespace_name>[^_.]+)\.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)\.(?<container_name>[^.]+)$ [OUTPUT] # https://docs.fluentbit.io/manual/pipeline/outputs/stackdriver Name stackdriver Match_Regex ^(container-runtime|kubelet)$ Resource k8s_node k8s_cluster_name CLUSTER_NAME k8s_cluster_location CLUSTER_LOCATION # Custom RegEx for matching the fields in the local_resource_id # https://github.com/fluent/fluent-bit/pull/3200 custom_k8s_regex ^(?<node_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)$ parsers.conf: | [PARSER] Name k8s-container-custom-tag Format regex Regex ^(?<namespace_name>[^_.]+)\.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)\.(?<container_name>[^.]+)$ [PARSER] Name cri Format regex Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<log>.*)$ Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%L%z # [END gkeonaws_logging_forwarder_configmap_stackdriver_log_forwarder_config]