Collabora Online for Kubernetes

In order for Collaborative Editing to function correctly on kubernetes, it is vital to ensure that all users editing the same document end up being served by the same pod. Using the WOPI protocol, the https URL includes a unique identifier (WOPISrc) for use with this document. Thus load balancing can be done by using WOPISrc – ensuring that all URLs that contain the same WOPISrc are sent to the same pod.

Helm chart for deploying Collabora Online in Kubernetes cluster

Yaml files available at https://github.com/CollaboraOnline/online/tree/master/kubernetes/helm/collabora-online

Deploying Collabora Online in Kubernetes

  1. Install Kubernetes cluster locally minikube

  2. Install helm

  3. Create the namespace in the Kubernetes cluster with this command :

    kubectl create namespace collabora
    
  4. Setting up Kubernetes Ingress Controller

    1. Nginx:

    Install Nginx Ingress Controller

    minikube addons enable ingress
    
    1. HAProxy:

    Install HAProxy Kubernetes Ingress Controller

    Note

    Openshift uses minimized version of HAproxy called Router that doesnot support all functionality of HAProxy but for COOL we need advance annotations Therefore it is recommended deploy HAproxy Kubernetes Ingress in collabora namespace

  5. Create an my_values.yaml for your minikube setup (if your setup differs e.g. take an look in then values.yaml ./collabora-online/values.yaml) of the helmchart

    replicaCount: 3
    
    ingress:
       enabled: true
       annotations:
          haproxy.org/timeout-tunnel: "3600s"
          haproxy.org/backend-config-snippet: |
             mode http
             balance leastconn
             stick-table type string len 2048 size 1k store conn_cur
             http-request set-var(txn.wopisrcconns) url_param(WOPISrc),table_conn_cur()
             http-request track-sc1 url_param(WOPISrc)
             stick match url_param(WOPISrc) if { var(txn.wopisrcconns) -m int gt 0 }
             stick store-request url_param(WOPISrc)
       hosts:
          - host: chart-example.local
             paths:
             - path: /
             pathType: ImplementationSpecific
    
    image:
       tag: "latest"
    

    Note

    • If you have multiple host and aliases setup set aliasgroups in my_values.yaml:

    collabora:
       - host: "<protocol>://<host-name>:<port>"
         # if there are no aliases you can ignore the below line
         aliases: ["<protocol>://<its-first-alias>:<port>, <protocol>://<its-second-alias>:<port>"]
       # more host and aliases list is possible
    
    • Specify server_name when the hostname is not reachable directly for example behind reverse-proxy

    collabora:
       server_name: <hostname>:<port>
    
    • In Openshift , it is recommended to use HAproxy deployment instead of default router. And add className in ingress block so that Openshift uses HAProxy Ingress Controller instead of Router:

    ingress:
       className: "haproxy"
    
  6. Install helm-chart using below command

    helm install --create-namespace --namespace collabora collabora-online ./kubernetes/helm/collabora-online/ -f my_values.yaml
    
  7. Finally spin the collabora-online in kubernetes

    1. Nginx case: Skip to step 7

    2. HAProxy case: HAProxy service is deployed as NodePort so we can access it with node’s ip address. To get node ip

    minikube ip
    

    Example output:

    192.168.0.106
    
    1. Each container port is mapped to a NodePort port via the Service object. To find those ports

    kubectl get svc --namespace=haproxy-controller
    

    Example output:

    |----------------|---------|--------------|------------|------------------------------------------|
    |NAME            |TYPE     |CLUSTER-IP    |EXTERNAL-IP |PORT(S)                                   |
    |----------------|---------|--------------|------------|------------------------------------------|
    |haproxy-ingress |NodePort |10.108.214.98 |<none>      |80:30536/TCP,443:31821/TCP,1024:30480/TCP |
    |----------------|---------|--------------|------------|------------------------------------------|
    
    In this instance, the following ports were mapped:
    • Container port 80 to NodePort 30536

    • Container port 443 to NodePort 31821

    • Container port 1024 to NodePort 30480

  8. Now in this case to make our hostname available we have to add the following line into /etc/hosts:

    192.168.0.106   chart-example.local
    

    To check if everything is setup correctly you can run:

    curl -I -H 'Host: chart-example.local' 'http://192.168.0.106:30536/'
    

    It should return a similar output as below:

    HTTP/1.1 200 OK
    last-modified: Tue, 18 May 2021 10:46:29
    user-agent: COOLWSD WOPI Agent 6.4.8
    content-length: 2
    content-type: text/plain
    

Useful commands to check what is happening

Where is this pods, are they ready?

kubectl -n collabora get pod

example output :

NAME                                READY   STATUS    RESTARTS   AGE
collabora-online-5fb4869564-dnzmk   1/1     Running   0          28h
collabora-online-5fb4869564-fb4cf   1/1     Running   0          28h
collabora-online-5fb4869564-wbrv2   1/1     Running   0          28h

What is the outside host that multiple coolwsd servers actually answering?

kubectl get ingress -n collabora

example output :

|-----------|------------------|--------------------------|------------------------|-------|
| NAMESPACE |       NAME       |           HOSTS          |         ADDRESS        | PORTS |
|-----------|------------------|--------------------------|------------------------|-------|
| collabora | collabora-online |chart-example.local       |                        |  80   |
|-----------|------------------|--------------------------|------------------------|-------|

To uninstall the helm chart

helm uninstall collabora-online -n collabora

Notes

  • If you wish to dive into advanced settings of kubernetes deployment feel free check values.yaml and update values in my_values.yaml file to achieve that