Deploying n8n workflow automation with Kubernetes
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.
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