Kubernetes Example

This document provides instructions for deploying the walt.id Enterprise API in a Kubernetes environment. It includes configuration details and deployment steps using deployment.yaml.

Prerequisites

  • Access to a Kubernetes cluster
  • kubectl configured to interact with your cluster
  • Familiarity with Kubernetes concepts such as Deployments, Services, and Ingress

Configuration Overview

The deployment.yaml file is structured into several key sections:

  • ConfigMap: Defines configuration settings for the enterprise API.
  • Deployment: Specifies the deployment settings, including the container image and volume mounts.
  • Service: Exposes the API to the network.
  • Ingress: Manages external access to the services

The Config Map

The ConfigMap defines configurations of the watl.id Enterprise API. Modify the values as needed for your environment. You can learn more about each configuration file in the configurations section here

apiVersion: v1
kind: ConfigMap
metadata:
  name: waltid-enterprise-api-config
data:
  _features.conf: |
    enabledFeatures = [
      admin
      dev-mode
    ]
  auth.conf: |
    requireHttps = false
  database.conf: |
    databaseType = mongodb
    fileStorage = {
      path = "data"
    }
    mongodb = {
      connectionString = "mongodb://root:password@localhost:27017/"
    }
  enterprise.conf: |
    baseDomain = "enterprise-demo.waltid.dev"
  web.conf: |
    webHost = "0.0.0.0"
    webPort = 3000

Deployment

kind: Deployment
apiVersion: apps/v1
metadata:
  name: waltid-enterprise-api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: waltid-enterprise-api
  template:
    metadata:
      labels:
        app: waltid-enterprise-api
      annotations:
        deployment/id: "_DEFAULT_DEPLOYMENT_"
    spec:
      imagePullSecrets:
        - name: waltid-regcred
      containers:
        - name: waltid-enterprise-api
          image: waltid/waltid-enterprise-api
          ports:
            - containerPort: 3000
              name: http-api
          volumeMounts:
              - name: waltid-enterprise-api-config
                mountPath: /config/_features.conf
                readOnly: true
                subPath: _features.conf
              - name: waltid-enterprise-api-config
                mountPath: /config/auth.conf
                readOnly: true
                subPath: auth.conf
              - name: waltid-enterprise-api-config
                mountPath: /config/database.conf
                readOnly: true
                subPath: database.conf
              - name: waltid-enterprise-api-config
                mountPath: /config/enterprise.conf
                readOnly: true
                subPath: enterprise.conf
              - name: waltid-enterprise-api-config
                mountPath: /config/web.conf
                readOnly: true
                subPath: web.conf
      volumes:
        - name: waltid-enterprise-api-config
          configMap:
            name: waltid-enterprise-api-config

Service

kind: Service
apiVersion: v1
metadata:
  name: waltid-enterprise-api
spec:
  ports:
    - name: http
      port: 80
      targetPort: http-api
      protocol: TCP
  selector:
    app: waltid-enterprise-api

Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: waltid-enterprise-ingress
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  ingressClassName: "traefik"
  tls:
    - hosts:
        - enterprise-demo.waltid.dev
      secretName: enterprise-demo-tls-secret
    - hosts:
        - waltid.enterprise-demo.waltid.dev
      secretName: waltid-enterprise-demo-tls-secret
  rules:
    - host: enterprise-demo.waltid.dev
      http:
        paths:
          - path: /auth/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /v1/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /.well-known/vct/v1/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /swagger
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /api.json
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /livez
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /features/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /debug/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
    - host: waltid.enterprise-demo.waltid.dev
      http:
        paths:
          - path: /auth/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /v1/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /.well-known/vct/v1/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /swagger
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /api.json
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /livez
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /features/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /debug/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http

Complete deployment.yml

apiVersion: v1
kind: ConfigMap
metadata:
  name: waltid-enterprise-api-config
data:
  _features.conf: |
    enabledFeatures = [
      admin
      dev-mode
    ]
  auth.conf: |
    requireHttps = false
  database.conf: |
    databaseType = mongodb
    fileStorage = {
      path = "data"
    }
    mongodb = {
      connectionString = "mongodb://root:password@localhost:27017/"
    }
  enterprise.conf: |
    baseDomain = "enterprise-demo.waltid.dev"
  web.conf: |
    webHost = "0.0.0.0"
    webPort = 3000
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: waltid-enterprise-api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: waltid-enterprise-api
  template:
    metadata:
      labels:
        app: waltid-enterprise-api
      annotations:
        deployment/id: "_DEFAULT_DEPLOYMENT_"
    spec:
      imagePullSecrets:
        - name: waltid-regcred
      containers:
        - name: waltid-enterprise-api
          image: waltid/waltid-enterprise-api
          ports:
            - containerPort: 3000
              name: http-api
          volumeMounts:
              - name: waltid-enterprise-api-config
                mountPath: /config/_features.conf
                readOnly: true
                subPath: _features.conf
              - name: waltid-enterprise-api-config
                mountPath: /config/auth.conf
                readOnly: true
                subPath: auth.conf
              - name: waltid-enterprise-api-config
                mountPath: /config/database.conf
                readOnly: true
                subPath: database.conf
              - name: waltid-enterprise-api-config
                mountPath: /config/enterprise.conf
                readOnly: true
                subPath: enterprise.conf
              - name: waltid-enterprise-api-config
                mountPath: /config/web.conf
                readOnly: true
                subPath: web.conf
      volumes:
        - name: waltid-enterprise-api-config
          configMap:
            name: waltid-enterprise-api-config
---
kind: Service
apiVersion: v1
metadata:
  name: waltid-enterprise-api
spec:
  ports:
    - name: http
      port: 80
      targetPort: http-api
      protocol: TCP
  selector:
    app: waltid-enterprise-api
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: waltid-enterprise-ingress
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  ingressClassName: "traefik"
  tls:
    - hosts:
        - enterprise-demo.waltid.dev
      secretName: enterprise-demo-tls-secret
    - hosts:
        - waltid.enterprise-demo.waltid.dev
      secretName: waltid-enterprise-demo-tls-secret
  rules:
    - host: enterprise-demo.waltid.dev
      http:
        paths:
          - path: /auth/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /v1/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /.well-known/vct/v1/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /swagger
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /api.json
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /livez
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /features/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /debug/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
    - host: waltid.enterprise-demo.waltid.dev
      http:
        paths:
          - path: /auth/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /v1/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /.well-known/vct/v1/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /swagger
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /api.json
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /livez
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /features/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http
          - path: /debug/
            pathType: Prefix
            backend:
              service:
                name: waltid-enterprise-api
                port:
                  name: http