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
Install Kubernetes cluster locally minikube
Install helm
Create the namespace in the Kubernetes cluster with this command :
kubectl create namespace collabora
Setting up Kubernetes Ingress Controller
Nginx:
Install Nginx Ingress Controller
minikube addons enable ingress
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
namespaceCreate an
my_values.yaml
for your minikube setup (if your setup differs e.g. take an look in thenvalues.yaml ./collabora-online/values.yaml
) of the helmchartreplicaCount: 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 ofRouter
:
ingress: className: "haproxy"
Install helm-chart using below command
helm install --create-namespace --namespace collabora collabora-online ./kubernetes/helm/collabora-online/ -f my_values.yaml
Finally spin the collabora-online in kubernetes
Nginx case: Skip to step 7
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
Each container port is mapped to a
NodePort
port via theService
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
toNodePort
30536
Container port
443
toNodePort
31821
Container port
1024
toNodePort
30480
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 inmy_values.yaml
file to achieve that