Common IIoT application manifest examples

A list of common IIoT application manifests that you can use with k2d

Node-Red

kubectl apply -f https://downloads.portainer.io/k2d/k2d-nodered.yml
Manifest
apiVersion: v1
kind: Namespace
metadata:
  name: node-red
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: node-red
  namespace: node-red
  labels:
    app: node-red
spec:
  selector:
    matchLabels:
      app: node-red
  template:
    metadata:
      labels:
        app: node-red
    spec:
      containers:
      - name: node-red
        image: nodered/node-red:latest
        ports:
        - containerPort: 1880
        securityContext:
          privileged: true
        volumeMounts:
        - name: node-red-data
          mountPath: /data
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: TZ
          value: America/Los_Angeles
      volumes:
      - name: node-red-data
        persistentVolumeClaim:
          claimName: node-red-claim
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: node-red-claim
  namespace: node-red
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: node-red
  namespace: node-red
spec:
  selector:
    app: node-red
  type: LoadBalancer
  ports:
    - name: node-red-ui
      port: 1880
      protocol: TCP
      targetPort: 1880

Eclipse Mosquitto

kubectl apply -f https://downloads.portainer.io/k2d/k2d-mosquitto.yml
Manifest
kind: Namespace
apiVersion: v1
metadata:
  name: mosquitto
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mosquitto
  namespace: mosquitto
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mosquitto
  template:
    metadata:
      labels:
        app: mosquitto
    spec:
      containers:
      - name: mosquitto
        image: eclipse-mosquitto
        ports:
        - containerPort: 1883
        volumeMounts:
        - mountPath: /mosquitto/config/mosquitto.conf
          name: config
      volumes:
      - name: config
        configMap:
          name: mosquitto-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mosquitto-config
  namespace: mosquitto
data:
  mosquitto.conf: |
    listener 1883
    allow_anonymous true
---
apiVersion: v1
kind: Service
metadata:
  name: mosquitto-mqtt
  namespace: mosquitto
spec:
  selector:
    app: mosquitto  
  ports:
    - protocol: TCP
      port: 1883
      targetPort: 1883
  type: NodePort

InfluxDB

kubectl apply -f https://downloads.portainer.io/k2d/k2d-influxdb.yml
Manifest
apiVersion: apps/v1
kind: Deployment
metadata:
  name: influxdb-deployment
spec:
  selector:
    matchLabels:
      app: influxdb
  template:
    metadata:
      labels:
        app: influxdb
    spec:
      containers:
        - image: influxdb:1.8
          name: influxdb
          ports:
            - containerPort: 8086
              name: http-influx
              protocol: TCP
          volumeMounts:
            - mountPath: /var/lib/influxdb
              name: influxdb-data
            - mountPath: /etc/influxdb/influxdb.conf
              name: influxdb-config
              subPath: influxdb.conf
              readOnly: true
          envFrom:
            - secretRef:
                name: influxdb-secrets
      volumes:
        - name: influxdb-data
          persistentVolumeClaim:
            claimName: influxdb
        - name: influxdb-config
          configMap:
            name: influxdb-config

---
apiVersion: v1
kind: Service
metadata:
  name: influx
spec:
  ports:
    - port: 8086
      protocol: TCP
      targetPort: 8086
  selector:
    app: influxdb
  type: LoadBalancer

---
kind: "PersistentVolumeClaim"
apiVersion: "v1"
metadata:
  name: influxdb
spec:
  accessModes:
    - "ReadWriteOnce"
  resources:
    requests:
      storage: "10Gi"
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: influxdb-config
data:
  influxdb.conf: |+
    bind-address = "127.0.0.1:8088"
    
    [meta]
      dir = "/var/lib/influxdb/meta"

    [data]
      dir = "/var/lib/influxdb/data"
      wal-dir = "/var/lib/influxdb/wal"

    [http]
      auth-enabled = true
---
apiVersion: v1
kind: Secret
metadata:
  name: influxdb-secrets
type: Opaque
stringData:
  INFLUXDB_ADMIN_USER: admin  
  INFLUXDB_ADMIN_PASSWORD: admin  
  INFLUXDB_DB: generic  

Grafana

kubectl apply -f https://downloads.portainer.io/k2d/k2d-grafana.yml
Manifest
kind: Namespace
apiVersion: v1
metadata:
  name: monitoring
  labels:
    name: monitoring
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: grafana
  name: grafana
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      securityContext:
        runAsUser: 1000
        runAsGroup: 1000
      containers:
        - name: grafana
          image: grafana/grafana:9.1.0
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3000
              name: http-grafana
              protocol: TCP
          # readiness and liveness probes will be ignored by k2d
          # as they are not yet supported
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /robots.txt
              port: 3000
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 30
            successThreshold: 1
            timeoutSeconds: 2
          livenessProbe:
            failureThreshold: 3
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 3000
            timeoutSeconds: 1
          # requests will be ignored by k2d as they are not yet supported
          resources:
            requests:
              cpu: 250m
              memory: 750Mi
          volumeMounts:
            - mountPath: /var/lib/grafana
              name: grafana-pv
          user:
      volumes:
        - name: grafana-pv
          persistentVolumeClaim:
            claimName: grafana-claim
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: grafana-claim
  namespace: monitoring
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: monitoring
spec:
  ports:
    - port: 3000
      protocol: TCP
      targetPort: 3000
  selector:
    app: grafana
  type: NodePort