Install Zabbix monitoring on Kubernetes cluster using Helm

Zabbix is an open-source monitoring tool used to monitor servers, networks, applications, and services. It enables IT administrators to track performance, detect issues, and receive alerts in real-time. This is an installation of Zabbix monitoring in a Kubernetes cluster. This installation uses Helm and And ensure that the Ingress NGINX Controller is installed on the Kubernetes cluster.

First, install Helm on the Kubernetes cluster. Here’s a step-by-step guide from Helm Documentation.

After installing Helm, create a namespace for Zabbix using the following command:

$ sudo kubectl create ns zabbix

Next, create PV and PVC for Zabbix server and PostgreSQL.

$ sudo vi pv-pvc-zabbix-server.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-zabbix-server
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "</path/to/destination/zabbix-server>"
  persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-zabbix-server
  namespace: zabbix
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

$ sudo vi pv-pvc-postgresql.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-zabbix-postgresql
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "</path/to/destination/database>"
  persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-zabbix-postgresql
  namespace: zabbix
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

Then apply the PV and PVC for Zabbix server and PostgreSQL.

$ sudo kubectl apply -f pv-pvc-zabbix-server.yml
$ sudo kubectl apply -f pv-pvc-postgresql.yml

Then, create a values.yml file. The values.yml file is a configuration file used to set deployment parameters for Zabbix in Kubernetes, especially when using Helm for deployment. If this configuration is executed through Helm, the values.yml file will be used to customize the Zabbix installation according to requirements, particularly concerning persistent storage for the Zabbix server component and the PostgreSQL database.

$ sudo vi values.yml
zabbixServer:
  persistence:
    enabled: true
    existingClaim: pvc-zabbix-server
    accessModes:
      - ReadWriteOnce
    size: 10Gi
    storageClass: ""

postgresql:
  primary:
    persistence:
      enabled: true
      existingClaim: pvc-zabbix-postgresql
      accessModes:
        - ReadWriteOnce
      size: 10Gi
      storageClass: ""

Now, download the Zabbix repository from Helm and begin the installation of Zabbix.

$ sudo helm repo add bitnami https://charts.bitnami.com/bitnami
$ sudo helm repo update
$ sudo helm search repo zabbix
$ sudo helm install zabbix zabbix/zabbix -n zabbix values.yml

Then, apply the patch to the Zabbix server and PostgreSQL. This patch aims to ensure that the data for Zabbix and PostgreSQL is stored persistently, so it remains intact even during restarts or pod migrations, which is crucial for maintaining the application’s continuity.

for zabbix server:
$ sudo kubectl patch deployment zabbix-zabbix-server -n zabbix --patch '
spec:
  template:
    spec:
      volumes:
        - name: zabbix-server-volume
          persistentVolumeClaim:
            claimName: pvc-zabbix-server
      containers:
        - name: zabbix-server
          volumeMounts:
            - name: zabbix-server-volume
              mountPath: /var/lib/zabbix 
'

for zabbix-postgresql:
$ sudo kubectl patch statefulset zabbix-postgresql -n zabbix --patch '
spec:
  template:
    spec:
      volumes:
        - name: postgresql-volume
          persistentVolumeClaim:
            claimName: pvc-zabbix-postgresql
      containers:
        - name: postgresql
          volumeMounts:
            - name: postgresql-volume
              mountPath: /var/lib/postgresql/data 
'

Next, create a secret for SSL and configure the ingress as a load balancer.

$ sudo kubectl create secret tls zabbix-tls --namespace zabbix --key inetmede.key --cert inetmede.crt
$ vi ingress-zabbix.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: zabbix-ingress
  namespace: zabbix
  annotations:
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/secure-backends: "true"
spec:
  ingressClassName: nginx
  tls:
   - hosts:
     - zabbix.inetmede.com
     secretName: zabbix-tls
  rules:
  - host: zabbix.inetmede.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: zabbix-zabbix-web
            port:
              number: 80

Then apply the Zabbix ingress.

$ sudo kubectl apply -f ingress-zabbix.yml

After applying the Ingress, check the installed Zabbix pods, services and ingress.

$ sudo kubectl get pods,svc,ing -n zabbix -owide

Access your Zabbix server from browser https://your-domain.com, default username Admin and password zabbix

Leave a Reply

Your email address will not be published. Required fields are marked *