Skip to main content

Monitoring Nginx on Kubernetes

Overview#

Nginx monitoring involves monitoring of the following elements:

  • Nginx Access Logs

  • Nginx Error Logs

  • Nginx Server Health

Pre-reading#

Refer to the links below for generic approach to monitoring application metrics and logs in Kubernetes environment

Refer to Nginx monitoring on instances for sfAgent configurations

Configuration#

Configure Nginx server to enable monitoring#

  1. Configure format of access logs so that it can be parsed by SnappyFlow
  2. Enable Nginx status module to monitor Nginx server health

These configurations can be achieved with the below ConfigMap:

apiVersion: v1 kind: ConfigMap metadata:   name: nginx-configmap   labels:     snappyflow/appname: <app_name>     snappyflow/projectname: <project_name> data:   nginx.conf: |     worker_processes  5;     events {         worker_connections  4096;     }     http {         default_type application/octet-stream;         log_format upstream_time  '$remote_addr:$remote_port $remote_user [$time_local] '                        '"$request" $status $body_bytes_sent '                        '"$http_referer" "$http_user_agent" "$http_referer" '                        'rt=$request_time uct=$upstream_connect_time uht=$upstream_header_time urt=$upstream_response_time';         server {             listen          80;             error_log /var/log/nginx/error1.log;             access_log /var/log/nginx/access1.log upstream_time;             location /nginx_status {                 stub_status;             }         }     } 

sfKubeAgent#

sfKubeAgent is deployed as sidecar container in the NGINX pod and can be used to monitor Nginx server health as well as Access Logs & Error Logs. Below YAML files provide example for setting up NGINX monitoring with sfKubeAgent.

sfKubeAgent ConfigMap (sfAgent-config.yaml)

apiVersion: v1 kind: ConfigMap metadata:   name: sfagent-configmap   labels:     snappyflow/appname: <app_name>     snappyflow/projectname: <project_name> data:     config.yaml: |+       ---       key: "<profile_key>"       metrics:         plugins:         - name: kube-sfagent-nginx           enabled: true           interval: 300           config:             location: nginx_status             port: 80             secure: false       logging:         plugins:         - name: nginx-access           enabled: true           config:             log_path: "/var/log/nginx/access1.log"         - name: nginx-error           enabled: true           config:             log_path: "/var/log/nginx/error1.log" 

Pod description YAML running NGINX and sfKubeAgent

apiVersion: v1 metadata:  name: my-first-pod  labels:   snappyflow/appname: <app_name>   snappyflow/projectname: <project_name> spec:  containers:  - name: nginx-container    image: nginx:latest    imagePullPolicy: IfNotPresent    ports:    - name: http      containerPort: 80      protocol: TCP    volumeMounts:    - name: varlog      mountPath: /var/log/nginx    - name: nginx-config      mountPath: /etc/nginx/nginx.conf      subPath: nginx.conf    # Snappyflow's sfkubeagent container  - name: nginx-sfagent    image: snappyflowml/sfagent:latest    imagePullPolicy: Always    command:      - /app/sfagent      - -enable-console-log    env:      - name: APP_NAME        value: <app_name>      - name: PROJECT_NAME        value: <project_name>    volumeMounts:      - name: nginx-sfagent-config        mountPath: /opt/sfagent/config.yaml        subPath: config.yaml      - name: varlog        mountPath: /var/log/nginx  volumes:  - name: nginx-sfagent-config    configMap:      name: sfagent-configmap  - name: nginx-config    configMap:      name: nginx-configmap  - name: varlog    emptyDir: {} 

Centralized logging#

Log monitoring (both access and error logs) can be implemented through Centralized Logging approach as well which does not require sfKubeAgent. Centralized logging however requires running a busybox container as a sidecar container to stream logs to container’s stdout.

Add the label - snappyflow/component: nginx, which signals to apply Nginx to container’s stdout.

Viewing data and dashboards#

  • Data generated by plugin can be viewed in browse data page inside the respective application under plugin=jvm and documentType=jvm
  • Dashboard for this data can be instantiated by Importing dashboard template JVM to the application dashboard.