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#
- Configure format of access logs so that it can be parsed by SnappyFlow
- 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 datapage inside the respective application underplugin=jvmanddocumentType=jvm - Dashboard for this data can be instantiated by Importing dashboard template
JVMto the application dashboard.