eKool Case study

Building European cluster infrastructure on Hetzner with multiple environments


Project Duration


Team Members

Cost-effective, European infrastructure with multiple cluster environments

eKool is a school management tool bringing together pupils and their families, schools, and supervisory bodies - sold by eKool AS. It is used mainly in the Baltic region - 70% of the Estonian schools use it.


The company’s infrastructure had two main challenges. First, the current hosting infrastructure on Managed Kubernetes on Azure was far too expensive. Second, eKool wanted to expand to other regions and continents, but its current infrastructure was hard to manage and it took the DevOps team a lot of manual work to set up a new cluster environment. One reason for that was that the 60 microservices were written in pure YAML without Helm.

Another challenge was that there were no testing environments such that every commit directly went to the live system.


  • Cluster API to manage Kubernetes clusters efficiently
  • Cluster API Provider Hetzner for affordable and European hosting
  • GitOps approach for managing multiple clusters

Syself first introduced Cluster API together with the Cluster API Provider Hetzner to build and manage Kubernetes clusters. This replaced the Managed Kubernetes clusters on Azure. The new infrastructure cost only a fraction of the original one. Additionally, the German provider Hetzner is GDPR compliant and not bound to the American Cloud Act.

The different clusters were managed by Helm and Helmfile. Templating logic avoided copying object declarations from one part of the repository to another. It was possible to define a new cluster only with the absolute necessary variables - everything else was done automatically. Not only resources that were directly related to CAPI got managed like this, but also dependencies, e.g. the container network interface (CNI) Cilium.

With this approach one internal cluster, self-managed by CAPI, managed and created multiple other clusters easily.

To reduce the amount of code in YAML files, Syself used the Monochart. It makes a shorter syntax for defining Kubernetes objects possible, as long as many of the object’s properties use default values - as is most often the case. Since there was no need to adapt node affinity, pod disruption budgets, auto-scaling behavior, etc. in every application, the Monochart saved boilerplate code by setting intelligent defaults. Given the fact that eKool had around 60 microservices, the impact of saving unnecessary and duplicate code was substantial.

The Monochart gave eKool additional advantages, like the fact that API changes can be centrally managed in the Monochart, without looking at the definition of each application. It implements all best practices for defining different Kubernetes objects, so that the user cannot miss anything important during a stressful workday.


eKool saved a lot of money by switching from Azure to Hetzner. Additionally, the DevOps team has to do much less manual work and can concentrate on improving their hosting infrastructure and developer experience (DX).