fluentd收集k8s集群pod日志


方案:

  使用fluentd部署在每個node節點上,通過配置node節點的標簽可選擇daemonset-fluentd部署在選定的node節點上

  通過在每個pod打上logging:true標簽,結合fluentd的containers.input.conf可以有選擇的匹配想要過濾的pod日志,從而可以過濾proxy,flannel容器的日志

參考:

  https://blog.51cto.com/xiaorenwutest/2500036

fluentd的comfigmap:

  

kind: ConfigMap
apiVersion: v1
metadata:
  name: fluentd-config
  namespace: logging
data:
  system.conf: |-
    <system>
      root_dir /tmp/fluentd-buffers/
    </system>
  containers.input.conf: |-                   # 日志源配置
    <source>
      @id fluentd-containers.log              # 日志源唯一標識符,后面可以使用該標識符進一步處理
      @type tail                              # Fluentd 內置的輸入方式,其原理是不停地從源文件中獲取新的日志。
      path /var/log/containers/*.log          # 掛載的服務器Docker容器日志地址
      pos_file /var/log/es-containers.log.pos # 檢查點 Fluentd重啟后會從該文件中的位置恢復日志采集
      tag raw.kubernetes.*                    # 設置日志標簽
      read_from_head true
      <parse>                                 # 多行格式化成JSON
        @type multi_format                    # 使用 multi-format-parser 解析器插件
        <pattern>
          format json                         # JSON解析器
          time_key time                       # 指定事件時間的時間字段
          time_format %Y-%m-%dT%H:%M:%S.%NZ   # 時間格式
        </pattern>
        <pattern>
          format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
          time_format %Y-%m-%dT%H:%M:%S.%N%:z
        </pattern>
      </parse>
    </source>
        
    <match raw.kubernetes.**>           # 匹配tag為raw.kubernetes.**日志信息
      @id raw.kubernetes
      @type detect_exceptions           # 使用detect-exceptions插件處理異常棧信息
      remove_tag_prefix raw             # 移除 raw 前綴
      message log                       
      stream stream                     
      multiline_flush_interval 5
      max_bytes 500000
      max_lines 1000
    </match>

    <filter kubernetes.**>        # 添加 Kubernetes metadata 數據
      @id filter_kubernetes_metadata
      @type kubernetes_metadata
    </filter>

    <filter kubernetes.**>        # 修復ES中的JSON字段
      @id filter_parser
      @type parser                # multi-format-parser多格式解析器插件
      key_name log                # 在要解析的記錄中指定字段名稱。
      reserve_data true           # 在解析結果中保留原始鍵值對。
      remove_key_name_field true  # key_name 解析成功后刪除字段。
      <parse>
        @type multi_format
        <pattern>
          format json
        </pattern>
        <pattern>
          format none
        </pattern>
      </parse>
    </filter>

    <filter kubernetes.**>           # 刪除一些多余的屬性
      @type record_transformer
      remove_keys $.docker.container_id,$.kubernetes.container_image_id,$.kubernetes.pod_id,$.kubernetes.namespace_id,$.kubernetes.master_url,$.kubernetes.labels.pod-template-hash
    </filter>


    <filter kubernetes.**>          # 只采集具有logging=true標簽的Pod日志
      @id filter_log
      @type grep
      <regexp>
        key $.kubernetes.labels.logging
        pattern ^true$
      </regexp>
    </filter>

  forward.input.conf: |-             # 監聽配置,一般用於日志聚合用
    <source>
      @id forward
      @type forward
    </source>

  output.conf: |-                    # 路由配置,將處理后的日志數據發送到ES
    <match **>                       # 標識一個目標標簽,后面是一個匹配日志源的正則表達式,我們這里想要捕獲所有的日志並將它們發送給 Elasticsearch,所以需要配置成**
      @id elasticsearch              # 目標的一個唯一標識符
      @type elasticsearch            # 支持的輸出插件標識符,輸出到 Elasticsearch
      @log_level info                # 指定要捕獲的日志級別,我們這里配置成 info,表示任何該級別或者該級別以上(INFO、WARNING、ERROR)的日志都將被路由到 Elsasticsearch。
      include_tag_key true
      host elasticsearch             # 定義 Elasticsearch 的地址
      port 9200
      logstash_format true           # Fluentd 將會以 logstash 格式來轉發結構化的日志數據
      logstash_prefix k8s            # 設置 index 前綴為 k8s
      request_timeout    30s
      <buffer>                       # Fluentd 允許在目標不可用時進行緩存
        @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 2M
        queue_limit_length 8
        overflow_action block
      </buffer>
    </match>

  fluentd的dameonset

apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluentd-es
  namespace: logging
  labels:
    k8s-app: fluentd-es
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: fluentd-es
  labels:
    k8s-app: fluentd-es
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
rules:
- apiGroups:
  - ""
  resources:
  - "namespaces"
  - "pods"
  verbs:
  - "get"
  - "watch"
  - "list"
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: fluentd-es
  labels:
    k8s-app: fluentd-es
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
subjects:
- kind: ServiceAccount
  name: fluentd-es
  namespace: logging
  apiGroup: ""
roleRef:
  kind: ClusterRole
  name: fluentd-es
  apiGroup: ""
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-es
  namespace: logging
  labels:
    k8s-app: fluentd-es
    version: v2.0.4
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  selector:
    matchLabels:
      k8s-app: fluentd-es
      version: v2.0.4
  template:
    metadata:
      labels:
        k8s-app: fluentd-es
        kubernetes.io/cluster-service: "true"
        version: v2.0.4
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
    spec:
      serviceAccountName: fluentd-es
      containers:
      - name: fluentd-es
        image: cnych/fluentd-elasticsearch:v2.0.4
        env:
        - name: FLUENTD_ARGS
          value: --no-supervisor -q
        resources:
          limits:
            memory: 500Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: config-volume
          mountPath: /etc/fluent/config.d
      nodeSelector:  #節點選擇
        beta.kubernetes.io/fluentd-ds-ready: "true" #節點需有這個標簽才會部署收集
      tolerations: #添加容忍
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: config-volume
        configMap:
          name: fluentd-config

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM