天天看點

kubernetes nginx ingress controller日志efk收集分析

nginx ingress controller日志預設輸出到stdout,stderror。删除連結檔案,使之輸出到檔案。

FROM registry.cn-hangzhou.aliyuncs.com/hxpdocker/nginx-ingress-controller:0.11.0
RUN rm -rf /var/log/nginx/access.log && rm -rf /var/log/nginx/error.log      

修改nginx log format:

log-format-upstream:這個參數      
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
  labels:
    app: ingress-nginx
data:
  proxy-body-size: "100m"
  log-format-upstream: '{ "@timestamp": "$time_iso8601", "@fields": {"remote_addr": "$remote_addr","remote_user": "$remote_user","body_bytes_sent": "$body_bytes_sent", "request_time": "$request_time", "status": "$status", "request": "$request", "request_method": "$request_method", "http_referrer": "$http_referer", "http_x_forwarded_for": "$http_x_forwarded_for", "http_user_agent": "$http_user_agent" } }'      
kind: ConfigMap
apiVersion: v1
metadata:
  name: fluentd-es-config-nginx
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
data:
  system.conf: |-
    <system>
      root_dir /tmp/fluentd-buffers/
    </system>

  input.conf: |- 
    <source>
      @id nginx.access.log
      @type tail
      path /var/log/nginx/access.log
      pos_file /var/log/nginx.access.log.pos
      time_format %Y-%m-%dT%H:%M:%S.%NZ
      tag nginx.access
      format json
      read_from_head true
    </source>
    <source>
      @type tail
      @id nginx.error.log
      path /var/log/nginx/error.log
      pos_file /var/log/nginx.error.log.pos
      tag nginx.error
      read_from_head true
      format /^(?<time>\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<pid>\d+).(?<tid>\d+): (?<message>.*)$/
    </source>
    
  output.conf: |-
    <match nginx.access>
      @id elasticsearch.access
      @type elasticsearch
      @log_level info
      include_tag_key true
      host elasticsearch-logging.kube-system.svc.cluster.local
      port 9200
      logstash_format true
      logstash_prefix docker.nginx.access
      logstash_dateformat %Y-%m-%d
      type_name docker_container_nginx_access_log
      <buffer>
        @type file
        path /var/log/fluentd-buffers/nginx.access.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>
    
    <match nginx.error>
      @id elasticsearch.error
      @type elasticsearch
      @log_level info
      include_tag_key true
      host elasticsearch-logging.kube-system.svc.cluster.local
      port 9200
      logstash_format true
      logstash_prefix docker.nginx.error
      logstash_dateformat %Y-%m-%d
      type_name docker_container_nginx_error_log
      <buffer>
        @type file
        path /var/log/fluentd-buffers/nginx.error.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>      
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ingress-nginx
  template:
    metadata:
      labels:
        app: ingress-nginx
      annotations:
        prometheus.io/port: '10254'
        prometheus.io/scrape: 'true'
    spec:
      serviceAccountName: nginx-ingress-serviceaccount
      hostNetwork: true
      nodeSelector:
        nginx: app
      initContainers:
      - name: init-dns
        image: busybox
        command: ['sh', '-c', 'echo -e "nameserver 10.96.0.10\nsearch nginx-app.svc.cluster.local svc.cluster.local cluster.local\noptions ndots:5" > /etc/resolv.conf']
      containers:
        - name: nginx-ingress-controller
          image: registry.cn-hangzhou.aliyuncs.com/hxpdocker/nginx-ingress-controller:0.11.0_youben
          args:
            - /nginx-ingress-controller
            - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --annotations-prefix=nginx.ingress.kubernetes.io
            - --ingress-class=app
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
          - name: http
            containerPort: 80
          - name: https
            containerPort: 443
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          volumeMounts:
          - name: shared-data
            mountPath: /var/log/nginx
        - name: fluentd-es
          image: registry.cn-hangzhou.aliyuncs.com/hxpdocker/fluentd-elasticsearch:v2.0.4
          env:
          - name: FLUENTD_ARGS
            value: --no-supervisor -q
          volumeMounts:
          - name: shared-data
            mountPath: /var/log/nginx
          - name: config-volume
            mountPath: /etc/fluent/config.d
      volumes:
      - name: config-volume
        configMap:
          name: fluentd-es-config-nginx
      - name: shared-data
        emptyDir: {}      

繼續閱讀