· Kk · 2 min read

Kubernetes & n8n: Setup n8n using K8S (Part 1)

cloudkubernetesn8nk8ssoar

 Intro

Aim of this article is to Publish n8n workflow automation tool into a Kubernetes environment.  n8n is quite flexible and can be used for IOT devices for your hobby projects to act as a SOAR tool at enterprise level.

NOTE

A new version "Scaling n8n on Kuberetes" is written for HELM chart based installation

Pre-Reqs

  • Familiarity with Kubernetes (k8s)

Package components

The deployment is split into following
  • n8n-pvc0.yaml  - PersistentVolumeClaim To mount directory for n8n database and configs
  • n8n-pvc1.yaml  - PersistentVolumeClaim To mount directory for n8n workflows
  • n8n-deployment.yaml  - Actual deployment definitions
  • n8n-svc.yaml  - Service To expose n8n for UI access

n8n-pvc0.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: n8n-claim0
  name: n8n-claim0
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
status: {}

n8n-pvc1.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: n8n-claim1
  name: n8n-claim1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi
status: {}

n8n-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    io.kompose.service: n8n
  name: n8n
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: n8n
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        io.kompose.service: n8n
    spec:
      containers:
        - args:
            - n8n
            - start
          env:
            - name: N8N_BASIC_AUTH_ACTIVE
              value: "true"
            - name: N8N_BASIC_AUTH_PASSWORD
              value: thehive
            - name: N8N_BASIC_AUTH_USER
              value: thehive
            - name: N8N_PROTOCOL
              value: "http"
            - name: N8N_PORT
              value: "5678"
          image: n8nio/n8n
          name: n8n
          ports:
            - containerPort: 5678
          resources: {}
          volumeMounts:
            - mountPath: /root/.n8n
              name: n8n-claim0
            - mountPath: /opt/workflows
              name: n8n-claim1
      restartPolicy: Always
      volumes:
        - name: n8n-claim0
          persistentVolumeClaim:
            claimName: n8n-claim0
        - name: n8n-claim1
          persistentVolumeClaim:
            claimName: n8n-claim1
status: {}

n8n-svc.yaml


apiVersion: v1
kind: Service
metadata:
  labels:
    io.kompose.service: n8n
  name: n8n
spec:
  ports:
    - name: "5678"
      port: 5678
      targetPort: 5678
  selector:
    io.kompose.service: n8n
status:
  loadBalancer: {}

Apply in following order

kubectl create ns n8n
kubectl -n n8n apply -f n8n-pvc0.yaml
kubectl -n n8n apply -f n8n-pvc1.yaml
kubectl -n n8n apply -f n8n-deployment.yaml
kubectl -n n8n apply -f n8n-svc.yaml


After few minutes, you should be able to access n8n UI from the service IP or depending on how you have exposed the service. Or another trick is to use minikube tunnel, and use the same ClusterIP to access it

curl http://<cluster_ip>:5678