OTH Public Software

Local Installation of OTH using OTH Kubernetes Controller

It is possible to deploy the OTH Kubernetes Controller locally using something like kind or minikube.

The following have been used to bootstrap a kind cluster locally during development:

#!/usr/bin/env bash
set -euo pipefail

# Start kind cluster
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
EOF

# Setup ingress (nginx)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml

# setup dashboard ....
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF

cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

# ensure ingres is ready
until kubectl wait --namespace ingress-nginx --for=condition=ready pod --selector=app.kubernetes.io/component=controller --timeout=90s; do
    echo "waiting .. "
    sleep 1
done

# get the token

TOKEN=$(kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}")

echo "Admin token is"
echo $TOKEN
echo 
echo 
echo "Setup proxy for dashboad by:"
echo "kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 10443:443 --address 0.0.0.0"

echo "Go to https://localhost:10443/"

To locally deploy the solution the following steps are required:

  1. Install OTH Kubernetes Controller
  2. Setup stateful services (rabbitmq and mariadb)
  3. Bootstrap deployment
  4. Install deployment
  5. Test deployment

Each of the steps will be described in more detail.

Install of controller

Follow the directions here

Create local resources

OTH requires access to a MariaDB and RabbitMQ, these can be started using docker like this:

RabbitMQ

Start RabbitMQ by:

docker run -d --rm --name k8srabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=oth -e RABBITMQ_DEFAULT_PASS=opentele -e RABBITMQ_DEFAULT_VHOST=oth rabbitmq:3.8-management

MariaDB

Start MariaDB using:

docker run -d --rm --name k8smariadb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=opentele -e MYSQL_USER=oth -e MYSQL_PASSWORD=opentele -e MYSQL_DATABASE=clinician mariadb:10.3 

Deployment of OTH

Run bootstrap tool

Setup passwords for RabbitMQ and MariaDB using the oth-k8s-bootstrap tool like so:

export customer=test
export stage=demo
export name=$customer-$stage
oth-k8s-bootstrap init -n $name -c $customer -s $stage \
   -a $AWS_ACCESS_KEY_ID -k $AWS_SECRET_ACCESS_KEY \
   --pv 2.70.00 \
   --dbpassword opentele --dbadminpassword opentele \
   --rabbitmqpassword opentele

Note down your LAN IP.

Then create the OTH deployment like this (minimal deployment):

apiVersion: k8s.oth.io/v1alpha1
kind: Oth
metadata:
  name: oth-sample
  namespace: oth-sample
spec:
  # Add fields here
  productversion: "2.70.00"
  external:
    database: true
    rabbitmq: true
  deployment:
    tls:
      enabled: false
    fqdn: <your lan ip>.nip.io
    timezone: Europe/Copenhagen
    language: da-DK
    customer: oth
    stage: sample
    environment: demo
  database:
    hostname: <your lan ip>.nip.io
    username: oth
  rabbitmq:
    hostname: <your lan ip>.nip.io
    username: oth
    vhost: oth
  features:
    cors:
      whitelist:
        - http://192.168.0.132:8000
        - http://localhost:8000

Then deploy it using kubectl -n test-demo test-demo.yml.