Kubernetes OpenShift Tech

Building a Modern Load Balancer and NAT gateway with Fedora bootable containers

18. Jun 2026

In my team, we have a space called “innovation week” where each engineer gets a week to work on a cool idea twice a year. From our internal documentation:

Innovation week is a space for engineers to work on a cool idea that they’ve had but which may not directly contribute to the team’s products or processes. Engineers are free to work on something that’s related to an existing tool or to invest this time to learn a new technology or tool.

I got my first hands-on experience with RHEL 10 image mode at the Red Hat Summit Zurich in January 2026. Since then, I’ve been kicking around the idea to build a modern highly available (HA) load balancer (LB) and NAT gateway appliance based on RHEL image mode (or rather the technology underpinning RHEL image mode: bootable containers).

This idea is a clear fit for innovation week as it ticks all the boxes: it’s a cool idea; it’s not immediately contributing to our products, but related to something we run in production; and it’s a learning opportunity for new tools. However, ultimately, I decided on this project for my innovation week of H1 2026 because I was eager to get more hands-on experience with bootable containers.

In the rest of this blog post, we’ll take a closer look at the design and the various components (both off-the-shelf and custom) that make up the proof-of-concept (PoC) implementation of this idea. Additionally, I’ll cover my learnings from a longer period of hands-on work with bootable containers.

If you’re not familiar with bootable containers yet, I recommend reading Fedora bootc’s “What is a Bootable Container?” and optionally also Fedora bootc’s “Getting Started with Bootable Containers”.

Architecture and Design

The PoC design consists of two main parts:

  1. A bootable container that contains all the software and generic config that’s required to set up a pair of VMs that act as a highly available (HA) load balancer and NAT gateway for a Kubernetes cluster running in a private network.
  2. A service on each VM that fetches all cluster-specific configuration from the cluster in front of which it is deployed. The most dynamic cluster-specific configuration are the backend node IPs for the Kubernetes API and the ingress controller. However, the controller also fetches other configurations from the cluster such as the specific floating IPs to use, SSH public keys, and credentials to manage cloud provider floating IP attachments to the active replica.

I discussed this design, along with a few alternatives, with other VSHNeers over the last few months, but we quickly came to the conclusion that the design outlined above is well suited to our primary use case: a load balancer and NAT gateway appliance for OpenShift clusters deployed in private networks on cloud infrastructure that doesn’t offer suitable managed LB and NAT gateway products.

In particular, we liked that this design allows us to leverage our existing rich tool set for managing Kubernetes clusters (Project Syn) to deploy the load balancer and NAT gateway configuration through the same pipeline as the cluster configuration.

Component choices

For building the bootable container base image, I considered RHEL 10 image mode, the Fedora bootc base images, and the Universal Blue base images. I ended up going with the Fedora 44 bootc base image, since that image strikes a nice balance between minimal and familiar, without introducing additional complexities such as managing RHEL entitlements for building the bootable container.

Initially, I had planned to use Ignition to apply custom config on VM first boot. However, after realizing that Ignition requires a bunch of auxiliary tooling and scripts that are missing from the Fedora bootc base image, I ended up using cloud-init instead.

For the actual load balancing and NAT gateway functionality, I mostly stuck to what we’re running in production: HAProxy for load balancing API and ingress traffic, Keepalived for managing internal VIP attachment with Floaty for cloud provider floating IP attachment, and conntrackd for egress TCP connection state synchronization between the two LB VMs.

For traffic routing, which is implemented using iptables on our production LBs, I decided to try out firewalld. This decision turned out to be quite well-suited to a declarative configuration approach, and I was able to set up fairly solid firewall and routing policies for the PoC with only a handful of firewalld config files.

For network interface management, I leveraged NetworkManager, which is Fedora’s default choice for network interface management. This was an easy choice, since I have plenty of experience with it from managing OpenShift clusters.

Finally, for building the service that fetches the cluster-specific config from Kubernetes, I used kubebuilder to build a custom Kubernetes operator in Go (with the slight twist that the operator’s controller-manager will run outside the cluster). Again, this is familiar technology: we’ve written a few Kubernetes operators already, most recently Espejote (I highly recommend the Espejote blog post if you haven’t read it already).

Building the custom bootable container

I spent the first day or so familiarizing myself with the process of building a custom bootable container outside a carefully curated lab environment. The first breakthrough was my discovery of the Universal Blue image-template repository on GitHub: that repository provides a nice experience for building custom bootable containers out of the box, including a fairly comprehensive set of build commands encoded in a Justfile (just is a modern take on make).

However, I quickly realized that my current local environment (Ubuntu 24.04 LTS) isn’t the ideal platform for some bootable containers workflows. In particular, I ended up using a Fedora Atomic VM to run the bootc-image-builder which allows building a bootable VM image for various platforms from a bootable container. For the PoC, I used bootc-image-builder to generate a qcow2 image that I could boot in libvirt/QEMU.

As already noted above, the second big takeaway from building my own bootable container was that the Ignition first boot experience of Fedora/RHEL CoreOS requires quite a bit more than just installing the ignition package. If you’re curious, feel free to check out how Fedora CoreOS builds its Ignition first boot experience with Dracut. In the spirit of iterating quickly, I ended up picking cloud-init as the tool for applying first boot configuration instead.

You can find the source code I used to build the fedora-bootc-loadbalancer bootable container on GitHub at simu/fedora-bootc-loadbalancer. Notably, this repository currently lacks any CI that regularly builds the container and associated qcow2 base image. For the PoC, I was doing all the container builds locally.

Testing the custom bootable container

While one of the advantages of bootable containers is that you can just run them in podman to test changes, I did most of the testing locally in libvirt/QEMU. The main reason for testing in libvirt was that I didn’t fancy spending a bunch of time trying to replicate a VM with multiple network interfaces when running the bootable container in podman.

There are two main approaches for creating VMs from a bootable container image: you can either boot the VM from any bootc-enabled ISO and use bootc switch to pivot the VM to your custom bootable container, or you can build an ISO or importable disk image of your bootable container with bootc-image-builder.

I used bootc-image-builder to generate a qcow2 image of the bootable container and created VMs from that image. I chose this approach, since provisioning the LB VMs from a custom base image is my preferred option for a potential future production setup. Additionally, once I started relying on the custom Kubernetes controller to render initial cluster-specific configurations during first boot, creating VMs from a custom base image which includes the controller binary was much simpler.

For the PoC, I used our OpenShift Lab cluster’s integrated container registry to store the bootable container. This, in combination with deploying an authentication config for bootc via cloud-init, allowed me to update the VMs with bootc upgrade and also enabled bootc switch to change the deployed image tag. Being able to fetch the latest bootable container from the registry allowed me to test changes to the bootable container relatively quickly even without the rapid iteration that’s enabled by running the bootable container in podman locally.

Note that while I used a private registry for the PoC, the bootable container doesn’t contain any secrets, and an eventual production-ready version would host the bootable container on a public registry. All required secrets are cluster-specific and should be injected at first boot via cloud-init or Ignition or updated through the Kubernetes API once the VM is operational to avoid having to build a separate bootable container for each cluster.

In addition to testing new versions via bootc upgrade, I also regularly built a new qcow2 base image from the latest version of the bootable container. Doing so allowed me to refine and improve the first boot process by creating new VMs based on the latest version of the bootable container.

Building the bootc-loadbalancer-controller-manager

Building and testing the Kubernetes operator that fetches the cluster-specific config from the Kubernetes API and renders appropriate configurations for the various services on the VMs was quite straight forward: I did a lot of the initial prototyping and testing against a local Kind cluster which enabled very quick iteration.

Once the controller was able to render the essential service configurations (HAProxy front and back ends, Keepalived config for the private VIPs, Floaty config for the public VIPs, and conntrackd config) based on the custom resource, I started to integrate the controller in the bootable container.

For the PoC, the integration of the controller into the bootable container build process was quite primitive: I simply copied the compiled Go binary into the repository that I used to build the bootable container and the container build process copied it to /usr/bin/bootc-loadbalancer-controller-manager in the container. Additionally, I added a very simple systemd service which runs the controller to the bootable container.

For the PoC, I side-stepped Kubernetes authentication for the controller: early testing used the Kind cluster’s admin kubeconfig injected into the LB VM through cloud-init. For the integration testing towards the end of the week, I used the service account and RBAC that’s generated by kubebuilder and a manually created long-lived service account token.

In the future, we’d probably want to build a more dynamic authentication mechanism in the controller, possibly using Kubernetes’ TokenRequest API.

Towards the end of the week, I extended the controller with a mechanism that reloads (or restarts) services on the LB VMs when their configuration is updated. This is implemented by hashing all configurations and tracking the currently deployed hashes for each LB VM in the custom resource’s status field. For a production-ready implementation, we’d probably want a secondary loop which triggers a reconciliation every time it sees one of the managed configuration files get changed on disk.

You can find the code for the Kubernetes controller on GitHub at simu/bootc-load-balancer-controller. Also note that the published version of the bootable container source code at simu/fedora-bootc-loadbalancer clones the controller GitHub repository and compiles the controller binary for each container build instead of relying on a manual copy.

SELinux adventures

Naturally, no blog post about building a custom system on Fedora is complete without some SELinux adventures.

After integrating the Kubernetes controller into the bootable container, I started testing the various service configurations. The initial tests were done on a single VM and with some creative integrations, such as configuring the API HAProxy backend on the libvirt VM to point to the Kind cluster on the host. During the initial testing I quickly found that the Keepalived configuration (which was copied almost verbatim from the working production LBs) didn’t work as expected: SELinux was saying “no” to Keepalived setting up the VRRP notification FIFO and Floaty reading from the same FIFO.

To my pleasant surprise, working with SELinux is quite ergonomic in 2026 (shout out to Computing for Geeks’ SELinux Survival Guide for Fedora which provides a fairly comprehensive overview of modern SELinux tooling).

First, I verified that SELinux was the root cause for Keepalived VRRP notifications not working correctly by temporarily switching to SELinux permissive mode with setenforce 0. After that, I refreshed my memory on how to work with SELinux, and installed the audit and policycoreutils-python-utils packages in my bootable container, since those aren’t part of the Fedora bootc base image.

At that point, I was able to extract the SELinux audit log entries in a nice format (including suggestions for remediation) with sealert. I then used the command line suggested by sealert, using ausearch and audit2allow to turn the log entries into a custom policy. Once the custom policy allowed Keepalived and Floaty to operate normally, I extracted the plain text policy definition and included a step to compile and install the custom policy in the bootable container build script.

After including the custom policy in the bootable container, VMs provisioned from (or updated to) the latest bootable container image automatically used the custom policy and there was no need to manually adjust SELinux anymore for fresh VMs.

After getting Keepalived and Floaty to work, I also extended the bootable container build script with some semanage port commands to label additional ports as http_port_t. This change allowed HAProxy to bind to all the configured front end ports, and to open connections to all the configured back ends.

Extending the controller to work without a Kubernetes API

While testing the controller on the LB VM, it quickly became clear that we needed a “bootstrap” rendering mode which works without a Kubernetes API. In this bootstrap mode, the controller renders initial configurations from a local YAML file which contains the custom resource and referenced cloud provider credentials secret.

After refactoring the controller’s reconcile logic to make it easier to call when there’s no working Kubernetes API, and introducing some extra command line arguments, the controller gained a “render-from-file” mode. The PoC uses this mode in cloud-init’s runcmd to generate initial configurations during first boot of each VM.

Configuring the network interfaces on the LB VMs

At this point, I had also implemented support for rendering custom NetworkManager .nmconnection configuration files in the controller. This enabled me to disable cloud-init’s network rendering completely and instead use the controller to configure the various network interfaces on each LB:

  • the public interface where client ingress traffic arrives and on which egress traffic is routed to the internet.
  • the private cluster network interface on which the LBs manage the default gateway IP and load balance the Kubernetes API.
  • a dummy interface on which all the cloud provider floating IPs are assigned so that loop back traffic on those IPs works as expected.

In order to generate these NetworkManager configurations, the controller must know which of the VM’s network interfaces are attached to the public internet and the cluster’s private network.

By default, the controller selects the interface that has the VM’s default route as the public interface. However, optionally, the public interface name can be specified as a command line argument. Additionally, the cluster network CIDR is a mandatory command line argument for the controller. The controller determines the private cluster network interface by searching for a network interface that’s assigned an IP in the cluster network CIDR.

The controller needs the interface names to read details about each interface from Linux. However, the controller then extracts the interfaces’ MAC addresses and uses those in the .nmconnection configuration files as stable identifiers for each interface. This approach ensures that the on-disk NetworkManager configuration doesn’t depend on the actual interface names (which may change in some circumstances in cloud provider environments).

At this point, the VMs were almost fully functional as load balancers (notably the services proxied by HAProxy weren’t yet reachable from outside the VM), but didn’t yet act as NAT gateways.

Configuring the firewall

While researching how to operate firewalld, I found the official firewalld blog post Policy Sets: A Home Router in four commands, which describes how a VM running firewalld can be turned into a functional simple router with only four commands.

After some testing, I started with firewalld’s gateway policy set as the base to define a custom firewalld configuration for the LB VMs. The final firewalld configuration extends the gateway policy to allow the LB VMs to act as NAT gateways/routers and exposes all the services proxied by HAProxy to external clients.

For the PoC implementation, the bootable container build script applies the following cluster-independent firewalld configurations:

  • It enables the gateway-lan-to-HOST, gateway-lan-to-world and gateway-world-to-host policies (which are part of the firewalld gateway policy set).
  • It adds a custom firewalld service definition for the OpenShift machine-config-server (TCP port 22623) in /usr/lib/firewalld/services.
  • It customizes the firewalld internal zone definition to allow traffic from the cluster network to the services exposed by HAProxy (Kubernetes API, machine-config-server, and ingress controller)

Additionally, the Kubernetes controller applies the following cluster-specific firewalld configurations:

  • It deploys a custom definition for the external zone which allows access to the services exposed by HAProxy (Kubernetes API and ingress controller) and blocks SSH access on the public floating IPs.
  • It adds the LB’s public interface to the external zone (via NetworkManager .nmconnection file)
  • It adds the LB’s private cluster network interface to the internal zone (via NetworkManager .nmconnection file)
  • It deploys a custom SNAT rule to use a floating IP as the source IP for traffic that’s forwarded from the cluster network to the public interface. This rule is deployed using firewalld’s direct mode, since the high-level firewalld configuration doesn’t currently allow configuring custom SNAT rules.

We translate the egress traffic source IP to a floating IP to ensure a failover of the internal gateway IP between the NAT gateway VMs doesn’t change the source IP of egress traffic, which would break established TCP connections to external servers. Keepalived and Floaty ensure that the internal default gateway VIP and the egress source floating IP are attached to the active LB replica. Finally, conntrackd ensures that egress TCP connection state is synchronized between the two LB replicas. All together, these three configurations provide transparent failover for TCP egress traffic.

End-to-end validation of the PoC

Initially, I had planned to set up a temporary OpenShift cluster for the end-to-end validation of the PoC.

However, I was running out of time, so I decided to do the end-to-end validation with a Talos Linux cluster running in a private libvirt network and a pair of VMs acting as LBs and NAT gateways for the cluster. Also, to avoid having to find real public IP addresses to use as floating IPs, I allocated fake cloud provider floating IPs from RFC-6890 TEST-NET-2 throughout the project.

The overall configuration of the end-to-end validation was set up as follows:

  • I allocated floating IPs for the API (198.51.100.100), the ingress controller (198.51.100.80) and the egress traffic (198.51.100.253) from TEST-NET-2.
  • I set up two libvirt networks:
    • a regular libvirt “NAT” network (192.168.122.0/24). This network acted as the LBs’ public network (host interface virbr0).
    • a libvirt “isolated” network (192.168.100.0/24). This network acted as the cluster’s private network (host interface virbr1).
  • The two LB VMs were each configured with a network interface in both of those libvirt networks.
    • Keepalived on the LB VMs managed 192.168.100.1 as the default gateway IP for the libvirt isolated network.
  • The Talos Linux VMs were configured with a single network interface in the isolated network (192.168.100.0/24) and received the default gateway IP via DHCP.
  • On the host machine, traffic from 198.51.100.253 which was received on virbr0 was masqueraded to the host’s primary IP. This established outbound connectivity for VMs in the isolated network.

Setting up this validation environment was not without its own challenges: I had to hack the libvirt dnsmasq config for the isolated network in order to distribute the default gateway IP managed by the LB VMs over DHCP. Additionally, I ended up building a very simple mock floating IP API which allowed the LB VMs to dynamically configure static next hop routes on the host. To use that API, I adapted the Keepalived example VRRP notification bash script to call the host’s mock API instead of using Floaty to handle the Keepalived VRRP notifications. Since this script is essentially a replacement for Floaty, the associated moving parts in the bootable container are called fake-floaty.

After a few iterations and some last-minute additions in the Kubernetes controller to generate HAProxy back ends suitable for Talos rather than OpenShift, I was able to bootstrap the Talos cluster with 198.51.100.100 as the Kubernetes API IP. Once the Talos cluster was bootstrapped, I also successfully validated the dynamic functionality of the PoC, watching the HAProxy configurations on the LBs get updated and HAProxy reloaded instantly when Talos nodes joined the cluster.

Conclusion and outlook

I learned a lot throughout the week. In particular, I gained a much deeper understanding of bootable containers and firewalld.

If you’re interested in digging into the implementation, you can find all the code on GitHub: the custom bootable container is built from simu/fedora-bootc-loadbalancer and the Kubernetes controller is built from simu/bootc-load-balancer-controller.

Overall, I believe the PoC showed promise. However, quite a bit of work is still needed to bring the implementation up to production quality. Currently, the happy path mostly works in a local environment, but I wasn’t able to verify the PoC on a real cloud provider due to time constraints and there are various failure paths where the controller hard crashes. Additionally, there are still a number of open questions, in particular in regard to the OpenShift bootstrap process. Further, some optional features which are available on our production LBs (such as the ability to configure HAProxy to expose node port services) aren’t implemented yet.

Finally, while there are currently no concrete plans to move forward with this project in the short term, the results we were able to show after a week of work on the PoC implementation are very promising. To conclude, we’ll definitely keep the bootable container approach in mind for any future products.

Simon Gerber

Simon Gerber is a DevOps engineer in VSHN.

Contact us

Our team of experts is available for you. In case of emergency also 24/7.

Contact us
Kubernetes Tech

Writing a Kubernetes Cluster Autoscaler Provider with externalgrpc

27. May 2026

Teaching Cluster Autoscaler to speak cloudscale.ch without forking the autoscaler or waiting for an upstream provider integration.

Introduction

What do you do when Kubernetes Cluster Autoscaler supports the scaling logic you need, but not the cloud provider you run on?

That was the problem behind this experiment. I wanted Cluster Autoscaler to work on cloudscale.ch. There was no upstream provider for it, and I did not want to fork the autoscaler or carry an in-tree provider forever.

The answer was externalgrpc: a cloud provider integration mode that lets Cluster Autoscaler keep its core decision logic while delegating cloud-specific actions to a separate gRPC service.

This post walks through how Cluster Autoscaler makes scaling decisions, what the provider contract looks like, how externalgrpc fits into the architecture, and the practical gotchas I ran into while building an autoscaler provider for cloudscale.ch.

The autoscaler knows when, not how

The first important mental model is this:

Cluster Autoscaler knows when the cluster should scale, but it does not inherently know how to create or delete machines.

The core autoscaler logic decides things like:

  • Are there pending Pods that cannot be scheduled anywhere?
  • Would those Pods fit on a node from a configured node group?
  • Has a node been idle long enough that its Pods could be moved elsewhere?
  • Which node group should be increased or decreased?

What it does not know is how to create a VM, which image to use, how to pass bootstrap data, how the node joins the cluster, or how to delete the machine again.

That part is delegated to a cloud provider plugin.

For large providers, there are already in-tree implementations. But if your provider is not on the list, you need another strategy.

What happens every 10 seconds

By default, Cluster Autoscaler runs a reconciliation loop roughly every 10 seconds. In each loop, it asks a set of questions:

  1. Are there unschedulable Pods?
  2. Would those Pods fit on a node from a configured node group?
  3. If yes, call NodeGroupIncreaseSize(group, delta).
  4. Are there nodes that have been idle for long enough?
  5. Can their Pods be rescheduled elsewhere?
  6. If yes, call NodeGroupDeleteNodes(group, nodes).

The provider does not make these decisions. The provider only receives the result of the decision, for example: “increase this node group by three nodes.”

That separation is useful. It means a provider implementation can stay relatively small. The hard Kubernetes scheduling logic remains in Cluster Autoscaler.

The simulator is the scheduler

Cluster Autoscaler does not reimplement Kubernetes scheduling from scratch. It imports the Kubernetes scheduler framework and uses the same kinds of filter logic the scheduler uses.

That includes scheduling constraints such as:

  • node resource fit
  • node affinity
  • taints and tolerations
  • topology spread constraints
  • inter-pod affinity
  • volume binding
  • node ports
  • volume limits

The autoscaler runs these checks against an in-memory snapshot of the cluster. For scale-down, it can simulate removing candidate nodes and see whether their Pods would fit elsewhere. For scale-up, it can simulate whether pending Pods would fit on a hypothetical node from a node group.

That is where one of the most important provider methods comes in: NodeGroupTemplateNodeInfo.

Node groups, flavours, and choosing what to scale

If the cloud provider supports multiple VM types, sizes, or flavours, the provider usually exposes those as separate node groups. For example, one node group might represent small general-purpose workers, another might represent larger memory-optimized workers, and another might represent nodes with different labels or taints.

Cluster Autoscaler then runs the simulation against the configured node groups. If more than one group could fit the pending Pods, the configured expander decides which group wins. Depending on configuration, that can be random, most-pods, least-waste, price, priority, or another supported strategy.

This gives you a useful amount of flexibility, but it is still not Karpenter. Cluster Autoscaler chooses from node groups that already exist as configured abstractions. Karpenter has a more dynamic provisioning model and can reason more directly about instance types, constraints, and provisioning choices.

So the mental model is:

  • Cluster Autoscaler: choose between predefined node groups
  • Karpenter: more dynamic node provisioning based on workload requirements and available instance types

For an externalgrpc provider, this means the provider should model each relevant cloudscale.ch flavour as a node group, return accurate template node information for each one, and let the autoscaler’s simulator and expander decide which group should grow.

Why externalgrpc?

If your cloud provider is not supported upstream, there are three realistic options:

ApproachWhat it meansTrade-off
Upstream in-tree providerAdd your provider to kubernetes/autoscalerHigh review and maintenance burden, tied to upstream release cycles
Fork Cluster AutoscalerMaintain your own autoscaler buildMaximum control, but you own the fork forever
externalgrpcRun a standalone provider service over gRPCSeparate release cycle, language-agnostic, small provider surface

For cloudscale.ch, externalgrpc was the pragmatic option.

It avoids the need to become an upstream autoscaler maintainer. It avoids carrying a fork. And because the provider is just a gRPC service, it can be implemented in any language. In this case, I used Go.

At the time of writing, it also aligns well with where the autoscaler project appears to be heading. The ongoing SIG Autoscaling refactor proposal points toward splitting provider implementations out of the main autoscaler repository. In that future, providers would either consume the autoscaler core as a library or communicate out of process via externalgrpc.

For an independent provider implementation, that makes externalgrpc a good escape hatch.

Architecture

At a high level, the architecture looks like this:

Pending Pods
    |
    v
Cluster Autoscaler
    |
    | gRPC over mTLS
    v
autoscaler-cloudscale
    |
    | cloudscale.ch REST API
    v
cloudscale.ch VMs
    |
    v
VM boots, kubelet joins, CCM stamps providerID

The Cluster Autoscaler remains the brain. It watches the Kubernetes cluster, notices pending Pods, runs scheduling simulations, and decides whether a node group should grow or shrink.

The external provider is the hands. It receives requests from Cluster Autoscaler and performs cloud-specific actions:

  • list cloudscale.ch servers
  • create VMs
  • tag VMs
  • delete VMs
  • map Kubernetes nodes back to cloudscale.ch servers

The provider also needs configuration for node groups, for example:

nodeGroups:
  - name: worker
    flavor: flex-8-2
    min: 1
    max: 5
    image: custom:talos-1.13.2
    userData: @talos
    tag: k8s-autoscaler-group

In my setup, the VM bootstrap is handled through Talos Linux machine configuration passed as user data. The VM boots, Talos configures the node, kubelet joins the cluster, and the cloud controller manager stamps the node with a provider ID.

That provider ID is critical. Without it, the autoscaler cannot reliably connect a Kubernetes Node back to the corresponding cloud VM. Scale-down depends on this mapping.

The provider contract: six important RPCs

The externalgrpc proto contains more methods, but the core provider behavior is built around a small set of RPCs:

RPCPurpose
RefreshReconcile provider state with the cloud
NodeGroupsReturn configured node groups
NodeGroupForNodeMap a Kubernetes node to a node group
NodeGroupTemplateNodeInfoDescribe what a new node would look like
NodeGroupIncreaseSizeCreate new servers for a node group
NodeGroupDeleteNodesDelete specific servers

The remaining methods are either bookkeeping or can be implemented as explicit Unimplemented stubs, as long as the service satisfies the proto contract.

The most important design decision is to make the cloud provider the source of truth. Do not trust only local state. VMs can be manually deleted, failed creates can leave partial state, and API calls can fail halfway through.

In practice, Refresh lists servers from the cloud provider API, filtered by tags, and rebuilds the provider’s internal view.

Conceptually:

servers, err := api.Servers.List(ctx, cloudscale.WithTagFilter(tags))
if err != nil {
    return err
}

byUUID := make(map[string]*cloudscale.Server, len(servers))
for i := range servers {
    byUUID[servers[i].UUID] = &servers[i]
}

cache.Store(byUUID)

Tags are what scope the provider to the right cluster and node group. In this implementation, group membership is represented with a tag such as:

k8s-autoscaler-group=<name>

TemplateNodeInfo: modelling future nodes

When scaling from zero, there may be no real worker node in the cluster. So how can Cluster Autoscaler know whether a pending Pod would fit on a node that does not exist yet?

The provider has to describe what a future node would look like.

NodeGroupTemplateNodeInfo returns a synthetic Kubernetes Node object. This object tells the autoscaler things like:

  • CPU capacity
  • memory capacity
  • disk-related properties
  • labels
  • taints
  • allocatable resources
  • maximum Pod count
  • special devices or constraints

This is where the provider has to “lie” to the autoscaler, but only in a very specific sense. The node is not real yet. It is a placeholder used for scheduling simulation.

As an analogy, this is conceptually similar to the idea of virtual nodes: an object that represents capacity that is not currently a normal worker node. This is only an analogy, not Virtual Kubelet and not a real virtual-node implementation. Cluster Autoscaler does not schedule Pods onto this synthetic node. It uses the template to answer the question: “If I created a node like this, would these pending Pods fit?”

In other words, the template node is not runtime capacity. It is simulated future capacity.

One easy mistake is to expose the raw VM flavor as the node capacity without accounting for kubelet reservations, system reservations, or eviction thresholds. A VM with 8 GiB of memory does not have 8 GiB of allocatable memory for workload Pods.

Another easy mistake is forgetting to set ResourcePods. If the template node says it can run zero Pods, the autoscaler will correctly conclude that no workload can ever fit there.

That bug is wonderfully frustrating: everything looks wired up, the autoscaler runs, but nothing scales.

Creating nodes: target size first, VM later

When Cluster Autoscaler decides to increase a node group, it calls NodeGroupIncreaseSize with a delta.

The provider then needs to:

  1. Increase the target size in its own node group state.
  2. Create the requested number of VMs.
  3. Tag them correctly.
  4. Pass the bootstrap configuration.
  5. Wait for the nodes to appear in Kubernetes.
  6. Let Refresh reconcile the actual cloud state again.

It is important to distinguish three different states: desired capacity, in-flight capacity, and joined Kubernetes nodes. A VM may be requested but not yet visible, booting but not yet joined, or joined but not yet Ready. During that period, Cluster Autoscaler must not repeatedly create more and more machines every 10 seconds.

Cluster Autoscaler also has guardrails for failed provisioning. If a node does not join within the configured provisioning duration, the autoscaler can treat that scale-up as failed and move on.

Bootstrapping with Talos

In this implementation, node bootstrap is intentionally kept outside the autoscaler’s core logic.

The node group config contains the Talos machine configuration as user data. When autoscaler-cloudscale creates a VM, it passes that user data to cloudscale.ch. Talos then handles the rest:

  • boot the custom image
  • apply machine configuration
  • use the configured certificates and join tokens
  • start kubelet
  • join the Kubernetes cluster

This keeps the provider focused on VM lifecycle management rather than becoming a full cluster lifecycle engine.

The one hard requirement is that the cluster has a working cloud controller manager. It must stamp Kubernetes nodes with a provider ID, because that is the bridge between Kubernetes objects and cloudscale.ch servers.

No provider ID means no reliable scale-down.

Demo: scale from zero workers

The demo shows a Kubernetes cluster on cloudscale.ch starting with only a control plane node and no workers. Workload pressure is then applied to trigger the autoscaler and the external provider.

To generate that pressure, the demo deploys 50 replicas of the Kubernetes pause container with small CPU and memory requests – a deliberately boring Deployment that exists only to create scheduling demand.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: scale-demo
spec:
  replicas: 50
  selector:
    matchLabels:
      app: scale-demo
  template:
    metadata:
      labels:
        app: scale-demo
    spec:
      containers:
        - name: pause
          image: registry.k8s.io/pause:3.9
          resources:
            requests:
              cpu: 500m
              memory: 128Mi

The Pods could not be scheduled because there were no worker nodes. Cluster Autoscaler noticed the pending Pods, simulated whether they would fit on a node from the configured worker group, and called the external provider.

The provider created three cloudscale.ch VMs. They booted the Talos image, installed to disk, rebooted, joined the cluster, and eventually became Ready. At that point, Kubernetes could schedule some of the pending Pods onto the new workers.

The important part of the demo is not the exact terminal output. It is the separation of responsibilities:

  • Kubernetes produced pending Pods.
  • Cluster Autoscaler simulated future capacity using TemplateNodeInfo.
  • The expander selected a configured node group.
  • The externalgrpc provider created the cloudscale.ch VMs.
  • Talos bootstrapped the nodes into the cluster.
  • The CCM stamped provider IDs so the autoscaler could map Kubernetes nodes back to cloud VMs.

That makes the demo a useful validation of the whole architecture without turning the blogpost into a screen-recording transcript.

Gotchas

1. TemplateNodeInfo is easy to get subtly wrong

The autoscaler’s decision quality depends heavily on the synthetic node returned by NodeGroupTemplateNodeInfo.

If allocatable CPU or memory is too optimistic, the autoscaler may under-scale. If it is too pessimistic, it may over-scale. If ResourcePods is missing or zero, nothing will schedule at all.

This method feeds both scale-from-zero and the internal “upcoming node” logic. Treat it as part of the scheduling model, not as a cosmetic metadata method.

2. Tags are not optional

Tags are how the provider knows which cloud VMs belong to which cluster and node group.

Without consistent tags, Refresh cannot reliably reconcile state. Scale-down becomes dangerous because the provider cannot know which machine corresponds to which Kubernetes node.

3. The cloud is the source of truth

Local state is useful, but it is not authoritative.

Manual deletes, failed creates, partial outages, quota issues, and API timeouts all happen. Refresh should reconcile against the provider API every loop and rebuild the cache from reality.

4. Lock ordering matters

Provider implementations often keep shared caches plus per-node-group state. If multiple mutexes are involved, lock ordering needs to be consistent.

One subtle bug here was a potential deadlock between Refresh and target-size updates. The fix was to always acquire locks in the same order.

5. No CCM, no reliable scale-down

A cloud controller manager is not just a nice addition. It is what stamps the Kubernetes node with the providerID that lets the autoscaler map a Kubernetes Node to a cloud VM.

Scale-up can appear to work without a complete mapping. Scale-down will not be safe.

Takeaways

Writing a Cluster Autoscaler provider is less about reimplementing autoscaling and more about providing the missing cloud-specific glue.

Cluster Autoscaler already knows how to:

  • detect pending Pods
  • simulate scheduling
  • account for DaemonSets
  • apply backoff
  • choose node groups
  • avoid duplicate scale-ups
  • decide when nodes can be removed

The provider needs to know how to:

  • describe a future node accurately
  • create VMs
  • delete VMs
  • tag resources
  • reconcile cloud state
  • map Kubernetes nodes back to cloud resources
  • bootstrap machines into the cluster

With externalgrpc, that provider can live as a standalone binary with its own release cycle. For unsupported clouds, lab environments, private infrastructure providers, or sovereign cloud platforms, that is a very practical integration model.

In this case, the result was a small Go service that taught Cluster Autoscaler how to operate on cloudscale.ch without modifying the autoscaler itself.

The autoscaler remained the brain. The external provider became the hands.

That is the real value of externalgrpc. It is not the most glamorous integration point, but it is exactly the right abstraction when you want to keep autoscaling logic upstream and put cloud-specific lifecycle logic in your own hands.

If you’d like to dive deeper, check out the blog post on my personal blog, where I explore the topic in more detail.

Marco De Luca

Contact us

Our team of experts is available for you. In case of emergency also 24/7.

Contact us
Events General Kubernetes Sovereignty

KubeCon Europe 2026 Recap – Sovereignty, AI Agents and a Strong Community

26. Mar 2026

KubeCon + CloudNativeCon Europe 2026 in Amsterdam is coming to an end – and it once again showed why this event remains the beating heart of the cloud native ecosystem.

A Clear Direction: Sovereignty and “Agentic” AI

Two themes were impossible to miss this year.

First: digital sovereignty.
Not as a buzzword, but as a real, practical goal. Across talks and discussions, it became clear that organizations are actively looking for ways to build independent, resilient platforms – based on open standards and open ecosystems.

Second: AI – especially “agentic” systems.
From hallway conversations to keynote stages, the focus has shifted from experimentation to application. The big question is no longer if AI will be integrated into platforms, but how.

K8up: Strong Interest and a Call for Maintainers

One of the highlights for us was the strong interest in K8up.

At the K8up kiosk in the Project Pavilion, we had many great conversations with users, contributors, and curious newcomers.

It became clear:
👉 The need for simple, reliable Kubernetes backup solutions is growing
👉 The community around K8up is highly engaged
👉 There is real momentum to push the project forward together

At the same time, we’re actively looking for maintainers and contributors to help shape the future of K8up.

If you’re interested in getting involved, join the discussion here:
https://github.com/k8up-io/k8up/issues/1187

Lightning Talk: Aarno on Stage

A special moment was Aarno Aukia’s lightning talk on K8up.

Short, focused, and right to the point – it sparked great discussions afterwards and brought even more attention to the project.

(And yes – in true Kubernetes fashion, there was even a live moment where an NGINX ingress got archived during a talk. Cloud native never gets boring.)

Servala: From Concept to Real Interest

Servala – Sovereign App Store was another big topic throughout the week, not only because of the goodie bags for the KubeTrain attendees:

What stood out most was the level of understanding and curiosity.

The conversations have clearly evolved:

  • From ‘What is Servala?’
  • To ‘How can we participate?’

This reflects a broader shift in the industry – towards ecosystems instead of isolated platforms, and towards practical implementations of sovereignty.

Switzerland Punching Above Its Weight

One thing that stood out clearly this year: Switzerland’s impact on the cloud native ecosystem is disproportionately strong.

Despite its size, Switzerland contributed 3 out of 48 CNCF projects present at KubeCon – roughly 6%.
Projects like Harbor, K8up and Capsule are actively shaping the ecosystem.

And that’s only part of the story.

When including major contributions such as Cilium, the influence of Swiss engineering and open source involvement becomes even more significant.

But it’s not just about projects.

Switzerland was highly visible across the board:

  • Talks and lightning talks
  • Maintainers and contributors
  • Active community participation
  • Strong presence at events and discussions

This combination of engineering quality, open collaboration and community engagement is what makes the Swiss cloud native scene stand out.

Clément Nussbaumer – PostFinance

A perfect example of what makes this community special:
Open, collaborative, and deeply involved.

Because in the end, the best conversations often happen outside of the actual sessions.

The Swiss Apéro – Community at Its Best

One of the highlights of the week was the KubeCon Swiss Apéro organized by Rocket Engineers.

Around 130 people from the Swiss cloud native community came together in Amsterdam.

More Than Just Talks

Beyond the official program, KubeCon once again delivered a full week of side events and community moments:

  • KubeTrain
  • KubeCon Swiss Apero
  • Upbound, Isovalent and many more community events
  • Countless spontaneous meetups and discussions

These moments are where ideas turn into collaborations.

What We Take Away

KubeCon Europe 2026 confirmed a few key trends:

  • Sovereignty is becoming a real, actionable priority
  • AI is moving into practical, platform-level use cases
  • Open ecosystems are replacing isolated solutions
  • Community remains the driving force behind everything

And maybe most importantly:

👉 The best ideas don’t happen in isolation – they happen when people come together

Thank You, Amsterdam

A big thank you to everyone we met throughout the week – partners, contributors, customers and the broader cloud native community.

We’re heading home with new ideas, new connections, and a lot of momentum.

See you next year in Barcelona!

Markus Speth

Marketing, Communications, People

Contact us

Our team of experts is available for you. In case of emergency also 24/7.

Contact us
General Kubernetes

Best Kubernetes Distributions in 2026 – And Why You Might Not Want to Run Them Yourself

2. Mar 2026

Kubernetes has become the backbone of modern digital infrastructure – powering everything from SaaS platforms to mission-critical systems in healthcare, finance, and public administration.
Yet one thing is still widely underestimated: Kubernetes by itself is not enough.

Running Kubernetes in production requires far more than the upstream project. You need networking, storage, observability, security hardening, upgrade tooling, and operational processes – all tightly integrated and continuously maintained.

That’s where Kubernetes distributions come in.

And if you don’t want to run all that complexity yourself, there’s another step up the abstraction ladder: Managed Kubernetes or Managed OpenShift.

In this post, we look at the Kubernetes distribution landscape in 2026 and explain why outsourcing operations is often the smartest choice.

What Is Kubernetes?

Kubernetes (K8s) is the open source orchestration system for containerized applications. Originally released by Google, it has become the de-facto standard for deploying, scaling, and operating containers across cloud, hybrid, and on-premises environments.

Today, Kubernetes is governed by the Cloud Native Computing Foundation (CNCF), ensuring vendor-neutral development, open standards, and a strong community-driven roadmap.

Kubernetes itself is best understood as the engine.
To actually go somewhere, you need the car built around it – and that’s exactly what Kubernetes distributions provide.

If you want to learn more about Kubernetes itself – what it does and how it powers modern applications – check out: What is Kubernetes? The Engine of the Digital World, Simply Explained.

Kubernetes Version Support in 2026

The latest Kubernetes version as of March 2nd, 2026 is v1.35. The Kubernetes project maintains release branches for the most recent three minor releases (currently 1.35, 1.34, 1.33). Kubernetes 1.19 and newer receive approximately 1 year of patch support. Kubernetes 1.18 and older received approximately 9 months of patch support.

At any given time, the three most recent minor versions are in mainstream support, with each release supported for roughly 14 months. This means regular upgrades are not optional – they are a core operational requirement.

Industry reports consistently show that the majority of production clusters run supported versions, but a significant share still lags behind due to operational complexity. According to Datadog’s 2025 Kubernetes adoption report, 78% of hosts are running Kubernetes versions in mainstream support, 19% are on older versions with extended support, and only 3% are running unsupported releases. This highlights how important regular updates and lifecycle management have become in production environments – and how easily they can be overlooked in self-managed setups.

What Defines a Kubernetes Distribution?

Much like Linux – where the kernel is combined with drivers, utilities, and configuration to form a complete operating system (a Linux distribution) – Kubernetes also needs to be bundled with essential tools and services to be usable in production. That’s what a Kubernetes distribution provides.

Just as there are different Linux distributions tailored for different needs – like Ubuntu, Debian or Red Hat Enterprise Linux (RHEL) – there are also many Kubernetes distributions, each offering different trade-offs in terms of usability, support, performance, and ecosystem integration.

A Kubernetes distribution is a pre-packaged version of upstream Kubernetes that combines the core components (API server, scheduler, controller manager, etc.) with the tools and services needed to operate it reliably.

Typical features bundled by distributions include:

  • Installer and upgrade tooling for control plane and worker nodes
  • Networking (CNI), ingress, and sometimes service mesh
  • Storage support through CSI drivers and backup integration
  • Security features like authentication, RBAC, and audit logs
  • Monitoring, logging, and alerting (often based on Prometheus and friends)
  • Developer tooling like GitOps pipelines, CLI, or dashboards

A distribution helps standardize your setup, reduce integration effort, and align with best practices. But even the best distribution still needs to be installed, upgraded, patched, and supported – which brings us to the next level.

Kubernetes and Red Hat OpenShift in 2026

Red Hat OpenShift is probably the most famous Kubernetes distribution and it comes with a clear opinionated approach. It builds on upstream Kubernetes and extends it into a full application platform.

Key characteristics of OpenShift include:

  • Full-stack lifecycle management and upgrades
  • Integrated developer experience with pipelines, GitOps, and image builds
  • OperatorHub for lifecycle-managed services
  • Strong multi-tenancy, access control, and policy enforcement
  • Built-in observability and compliance capabilities

OpenShift is designed for production from day one, particularly in regulated environments or large organizations that value consistency and governance.

The current OpenShift 4.21 platform (released in February 2026) is based on Kubernetes 1.34 and CRI-O 1.34. It reinforces OpenShift’s position as a trusted and comprehensive application platform where AI workloads, containers, and virtualization run side by side – across hybrid cloud environments, with integrated tools and services for cloud-native, virtual, and traditional applications.

If you’re in a regulated industry or need a platform that’s ready for production from day one, OpenShift is a strong candidate. If you prefer flexibility or want a minimal setup, other distributions might be a better fit.

The Kubernetes Distribution Landscape in 2026

While there are dozens of Kubernetes distributions, most fall into four practical categories.

Enterprise-Grade Kubernetes Distributions

Designed for large-scale and regulated environments with strong lifecycle management and governance requirements:

  • Red Hat OpenShift – feature-rich, highly integrated platform with built-in governance, observability, and developer tooling
  • VMware Tanzu Kubernetes Grid – integrates tightly with vSphere and enterprise lifecycle tooling
  • D2iQ Kubernetes Platform (DKP) – focuses on multi‑cluster, hybrid and edge operations with strong lifecycle and governance capabilities.
  • Mirantis Kubernetes Engine (MKE) – hardened enterprise distro with support for air-gapped and FIPS-compliant environments
  • Rancher RKE2 – secure Kubernetes distribution focused on hybrid and multi-cluster operations

Enterprise distributions often provide lifecycle automation (upgrades, patching), hardened security (CIS Benchmarks, FIPS), and tools for consistent multi-cluster policy enforcement and hybrid-cloud deployment.

Cloud-Managed Kubernetes Services

These services abstract away most of the control plane and offer Kubernetes as a service:

  • Amazon Elastic Kubernetes Service (EKS)
  • Google Kubernetes Engine (GKE)
  • Azure Kubernetes Service (AKS)
  • IBM Cloud Kubernetes Service, Oracle OKE, and others

These are ideal if you prefer to consume Kubernetes without managing infrastructure. They’re tightly integrated with their respective cloud ecosystems and handle the upgrades for you.

Lightweight and Edge-Optimized Kubernetes

Perfect for IoT, remote locations, or constrained environments:

  • k3s (by Rancher) – single-binary Kubernetes for edge, CNCF-certified
  • k0s (by Mirantis) – minimal, declarative, and ideal for embedded or hybrid deployments
  • MicroK8s – Canonical’s snap-based distribution for edge and dev/test
  • Talos Linux + Kubernetes – fully immutable and API-driven

These distributions prioritize small footprint, minimal dependencies, and low operational overhead.

Self-Hosted Open Source Kubernetes Distributions

These are open source Kubernetes distributions aimed at teams that want full control and flexibility over their clusters. They come without vendor lock-in, but require more operational effort.

  • OKD – community distribution that forms the upstream of Red Hat OpenShift
  • RKE2 (Rancher Kubernetes Engine 2) – secure, hardened Kubernetes distribution by Rancher
  • Charmed Kubernetes – Canonical’s opinionated but modular Kubernetes stack
  • Talos Linux + Kubernetes – fully immutable and API-managed Linux OS designed for Kubernetes

They provide flexibility, but managing lifecycle, upgrades, and integrations remains your responsibility.

Why Choose Managed Kubernetes or Managed OpenShift?

Even with a well-designed distribution, operating Kubernetes remains complex.

Teams are responsible for:

  • Cluster health, availability and scaling
  • Regular upgrades and security patching
  • Incident response and troubleshooting
  • Governance across multiple clusters or environments
  • Compliance and audit readiness

Managed Kubernetes and Managed OpenShift services exist to offload exactly this burden.

At VSHN, we operate Kubernetes and OpenShift clusters with clear SLAs and production-grade processes, including:

  • Automated upgrades and lifecycle management
  • 24/7 SLA-backed monitoring and incident response
  • Consistent multi-cluster governance and policy enforcement
  • Integration with managed databases, identity, and observability services
  • Support for hybrid, multi-cloud, and sovereign cloud environments
  • Proven compliance with ISO 27001, ISAE 3402 Report Type 2, KCSP, and Red Hat Premier CCSP standards

With a managed approach, your team no longer needs deep Kubernetes operations expertise in-house. You can focus on applications, innovation, and delivery – while we handle the complexity of the underlying platform.

Why Talos Makes Managed Kubernetes Even Stronger

Modern, immutable foundations like Talos Linux fundamentally change how Kubernetes clusters are operated.

Talos removes entire classes of operational and security risks by design:

  • No SSH access
  • No package manager
  • No configuration drift
  • Fully declarative and API-driven

In a managed setup, Talos enables highly standardized, reproducible, and secure clusters at scale.
Upgrades become predictable, rollback-safe, and auditable – making Talos particularly attractive for regulated and sovereign environments.

Combined with managed operations, Talos represents a clear direction for the future of Kubernetes: immutable, automated, and reliable.

So – Which Kubernetes Distribution Should You Choose?

Here’s a quick guide based on your needs:

  • Want a full-featured platform for hybrid cloud with enterprise support? → Red Hat OpenShift
  • Prefer cloud-native services with minimal operational overhead? → EKS, GKE, AKS
  • Need lightweight, minimal, or edge-ready setup? → k3s or k0s
  • Want full control and are ready to do the work? → RKE2, MicroK8s, OKD
  • Want the benefits without the operational burden? → Go with a Managed Kubernetes or Managed OpenShift provider like VSHN

Final Thoughts

In 2026, Kubernetes is firmly established as the engine of the digital world. From cloud-native applications to mission-critical systems in enterprise and public sector environments, Kubernetes has become the foundation of modern IT platforms.

However, choosing the right Kubernetes distribution is only the first step. The real challenge lies in operating Kubernetes securely, reliably, and compliantly over time – especially in complex, regulated, or fast-growing environments.

In the enterprise space, Red Hat OpenShift has emerged as the de-facto standard. Its combination of mature lifecycle management, integrated security, strong governance mechanisms, and a comprehensive toolchain for developers and operators makes OpenShift the first choice for many organizations – particularly where compliance, scalability, and operational stability are critical.

At the same time, lightweight and modern distributions such as k3s, k0s, and Talos illustrate where Kubernetes technology is heading. Immutable, API-driven, and highly automated platforms significantly reduce operational complexity and attack surfaces. Their full potential, however, is only realized when they are operated in a standardized and professionally managed way.

This is where Managed Kubernetes, Managed OpenShift and Cloud Platform Operations come into play. They combine modern platform technologies with proven operational processes, clear SLAs, and continuous improvement. Teams can focus on applications, innovation, and business value without maintaining deep Kubernetes operations expertise in-house.

Whether it is OpenShift in the enterprise, cloud-managed Kubernetes, or modern immutable platforms like Talos, the decisive factor is not the distribution itself but an operating model that consistently delivers security, stability, and scalability.

If you want to run Kubernetes sustainably, securely, and future-proof, adopting a managed approach is often the most effective path – both technically and organizationally.

👉 Learn more about our offering:

Markus Speth

Marketing, Communications, People

Contact us

Our team of experts is available for you. In case of emergency also 24/7.

Contact us
Events General Kubernetes

VSHN at KubeCon Europe 2026 in Amsterdam – we look forward to seeing you!

11. Dec 2025

KubeCon + CloudNativeCon Europe 2026 – the cloud native community meets again in Amsterdam

From 23 – 26 March 2026, KubeCon + CloudNativeCon Europe returns to beautiful Amsterdam and brings together thousands of cloud native practitioners, platform engineers, SREs, developers and open source enthusiasts. For VSHN, this event has been one of the most important community gatherings for many years, and 2026 is no exception.

We will be on-site throughout the week, connecting with the community, learning about the latest CNCF developments, sharing our experience in operating reliable Kubernetes and OpenShift platforms, and meeting partners, customers, friends and fellow cloud native enthusiasts.

Community support – KubeTrain and KubeTrain Party

We are very excited to support the community as sponsor of KubeTrain 2026 and the KubeTrain Party.

KubeTrain – 22 March 2026: A fun and sustainable journey for everyone traveling together to KubeCon in Amsterdam. This initiative brings cloud native fans onto one train and creates networking and great conversations along the way.

KubeTrain Party – 22 March 2026: After arrival, the excitement continues at the official KubeTrain Party. Drinks, music, networking and a great start into KubeCon week.

Meet us at the KubeCon Swiss Apéro

Swiss Apéro – 24 March 2026: We will also be present and sponsoring the KubeCon Swiss Apéro 2026. It takes place at the Beach House, Strandzuid, Europaplein 22, 1078 GZ Amsterdam from 18:30. You can look forward to an evening full of conversations about Kubernetes, OpenShift, platform engineering, digital sovereignty, Servala and more.

Why you should meet us at KubeCon

VSHN is not just another Kubernetes service provider. For more than ten years, we have helped shape the cloud native landscape in Switzerland and beyond.

Here is why a conversation with us is worth your time:

  • We are the first Swiss Kubernetes Certified Service Provider (KCSP)
  • We are the first Swiss Red Hat Premier CCSP Partner
  • We operate Kubernetes and OpenShift platforms for organizations across Europe and beyond
  • We build and run Servala – the Sovereign App Store. Servala connects companies, developers and cloud providers with secure, scalable and user-friendly cloud native services and applications
  • Application Catalog – a large selection of managed services that integrate seamlessly into your development workflow
  • APPUiO – expert hosting for expert software engineers based on OpenShift
  • VSHN Solutions – your DevOps enabler – individual, modular, scalable
  • We help teams improve developer productivity, reliability and operational excellence
  • We live open source, collaboration and sustainable ecosystems
  • We actively grow and support the cloud native community

Our blog post What is Kubernetes? The Engine of the Digital World, Simply Explained explains the basics of Kubernetes in a simple and understandable way.

Our CNCF Sandbox Project – K8up

We also maintain our own CNCF Sandbox Project: K8up, a backup operator for Kubernetes and OpenShift that helps teams run backup and restore processes securely and automatically. As active maintainers, we contribute to strengthening the open source ecosystem and providing reliable tools for the Kubernetes community.

Community engagement – organizers of the largest cloud native meetup group in Switzerland

We organize the Cloud Native Computing Switzerland Meetup group with more than 3000 members, one of the most active tech communities in the country.

Our next Cloud Native Computing Meetup will take place on 10 March 2026 at the VSHNtower in Zurich – with exciting talks, exchange and networking. Join us.

And if you would like to contribute a talk, submit it here: https://cnc-meetup.ch/

What we are looking forward to at KubeCon 2026

  • The ongoing evolution of the Kubernetes ecosystem
  • Platform Engineering as a key discipline for modern software teams
  • Digital sovereignty and European alternatives
  • AI-assisted operations and smarter automation
  • New CNCF projects shaping the future of cloud native

Let us meet in Amsterdam

If you are attending KubeCon Europe 2026, we would love to meet you. Whether you want to talk about Kubernetes operations, OpenShift, Servala, cloud native strategies, backups with K8up or simply grab a coffee – get in touch with us.

You will find us:
🚆 On the KubeTrain
🎉 At the KubeTrain Party
🫕 At the Swiss Apéro
🇳🇱🌷🚲 All around KubeCon in Amsterdam

We look forward to seeing you in Amsterdam. Let us shape the future of cloud native together.

Markus Speth

Marketing, Communications, People

Contact us

Our team of experts is available for you. In case of emergency also 24/7.

Contact us
Events General Kubernetes

KCD Suisse Romande 2025 at CERN – Community, Cloud Native, and Two Great Days in Geneva

5. Dec 2025

The first Kubernetes Community Days Suisse Romande took place on December 4-5, 2025 – and what a venue: CERN Science Gateway in Geneva. A place where science meets innovation made the perfect backdrop for the local cloud native community to come together, share ideas, learn, and collaborate.
VSHN was proud to be Silver Sponsor of the KCD.

Around 300 participants from Switzerland and beyond gathered for two days filled with workshops, sessions, hallway talks, and a whole lot of Kubernetes energy. The atmosphere was fantastic – friendly, curious, and buzzing with exchange. Exactly what KCDs should be about.

Workshops, Talks and Great People

Day 1 kicked off with three parallel hands-on workshops, followed by CERN and LHC tours for those lucky enough to grab a spot. The combination of technology and the magic of CERN definitely created excitement early on.

Day 2 continued with even more workshops – and later the stage belonged to the speakers. Nearly 50 sessions touched on Kubernetes, platform engineering, open source tooling, DevOps culture, security, AI topics and more. Talks were held in French and English, highlighting the multilingual and open nature of the Swiss tech scene.

Among the featured speakers were well-known community voices including:

  • Jessie Frazelle – Zoo.dev
  • Sarah Novotny – Kosai / Operant AI
  • Mauricio Salatino – LearnK8s
  • Aurélie Vache – OVHcloud
  • Engin Diri – Pulumi
  • Shérine Khoury – Red Hat
  • Luc Juggery – Exoscale
  • Kasper Nissen – Lunar

But beyond names and sessions, what stood out most were conversations in the corridors, shared learnings, and genuine collaboration. Networking at events like this is where ideas turn into projects.

Why Events like KCD Matter

KCDs are community-driven by design – organized for practitioners and by practitioners, supported by CNCF. They create a space where we meet as peers, share solutions, discuss challenges, and grow together. For us at VSHN, this is exactly the spirit we believe in.

Cloud native is evolving fast – platforms, automation, developer experience, sovereignty, and AI are changing how we build and operate software. Meeting the community in person helps everyone stay ahead and shape what’s next. Aarno and Pierre were very happy to meet so many interested people.

See You Again in 2026

A huge thank you to the Cloud Native Suisse Romande organizers, all speakers, sponsors, and every participant we met at the booth.
We loved the conversations, the exchange, and the energy inside CERN.

Already looking forward to next year!

📬 Want to continue the conversation about Kubernetes, OpenShift, or Servala?
Reach out – we’re happy to connect.

👉 More info about KCD Suisse Romande

Markus Speth

Marketing, Communications, People

Contact us

Our team of experts is available for you. In case of emergency also 24/7.

Contact us
General Kubernetes

What is Kubernetes? The Engine of the Digital World, Simply Explained

22. Jul 2025

1. For the Curious but Non-Technical – What Are Containers, and What Is Kubernetes?

Imagine Switzerland’s world-famous logistics system: trains, trucks, planes, and, well, not too many ships – all reliably moving goods through mountains, valleys, cities, and across borders.

Now picture a few freight trains: each wagon is loaded with a container, and each container holds a specific product – cheese from Gruyères, watches from Biel, or chocolate from Bern.

In the digital world, software containers work the same way. Each container carries a specific application or service, along with everything it needs to run – the code, settings, and dependencies – so it can be moved and operated anywhere, whether that’s a laptop, a data center, or the cloud.

But what if you had hundreds or thousands of these containers running at once – all needing to be loaded, routed, monitored, restarted if they fail, and scaled up when demand grows?

That’s where Kubernetes comes in.

Just like a logistics control center coordinates trains, planes, and trucks across Switzerland and beyond, Kubernetes coordinates software containers. It decides where they should run, makes sure they’re healthy, scales them up and down, and restarts them if something goes wrong – all automatically.

Originally developed by Google, Kubernetes was inspired by the company’s internal system “Borg” and released as open source in 2014. Today, it’s maintained by the Cloud Native Computing Foundation and backed by a global community.

And even if you’ve never heard of Kubernetes before, it’s likely already part of your life. From online banking to e-commerce shops to streaming services – many of the apps you use every day are running on Kubernetes behind the scenes.

Just one example:

In short:

  • A container is a standardized software package that runs anywhere
  • Kubernetes is the smart system that operates thousands of containers efficiently

Without Kubernetes, companies would have to manage each container manually – like sending cargo across Switzerland without signals, schedules, or a central control tower.

A few ideas on how to explain Kubernetes in one sentence: 😊

2. A bit more technical – What Kubernetes actually does

Modern applications are no longer monolithic – they’re modular, cloud-native, and increasingly built around DevOps workflows. Instead of installing software directly on static servers, teams now package their applications into containers – lightweight, isolated units that include everything an app needs to run.

Now imagine you’re running:

  • 50 services
  • 500 containers
  • Across multiple environments (development, testing, production)
  • In a mix of public cloud, private servers, and edge locations

Managing that manually is not just difficult – it’s nearly impossible. That’s where Kubernetes comes in.

Kubernetes solves problems like:

  • Automatically starting and stopping containers based on real-time demand.
  • Restarting containers when something goes wrong.
  • Ensuring services are available and responsive.
  • Rolling out updates without downtime.
  • Distributing workloads to avoid overloading servers.

Real-world examples:

  • In retail: online shops use Kubernetes to handle traffic spikes, such as those on Black Friday. Kubernetes scales up – and then back down again to save costs.
  • In finance: Banks use Kubernetes to run apps that need high security and zero downtime, while continuously deploying new features.
  • In healthcare: Patient data platforms use Kubernetes to ensure compliance, redundancy, and secure access.
  • In SaaS: Tech companies use Kubernetes to ship updates faster, run multiple versions in parallel, and reduce infrastructure overhead.

Without Kubernetes, teams would still rely on scripts and manual steps to deploy and maintain software – slowing down innovation and increasing the risk of failure.

3. For the Tech-Curious – Clusters, Distributions, and What VSHN Does

What is a Kubernetes Cluster?

A single Kubernetes system is called a cluster. It includes:

  • Control plane: the brains of the operation, deciding what should run where.
  • Worker nodes: the servers where containers actually run.
  • Services and tools to keep things secure, observable, and resilient.

You can have a small cluster on your laptop or a massive multi-cluster setup across global data centers.

What is a Kubernetes Distribution?

Kubernetes is open source, but it comes in different versions called distributions – similar to how Linux has different flavors like Ubuntu or Red Hat. These are tailored variants of Kubernetes with added features, support, or integration.

Example Kubernetes distributions include:

  • Vanilla Kubernetes – the plain open source version.
  • Red Hat OpenShift – adds developer tools, hardened security, and enterprise support.
  • Rancher – focuses on multi-cluster and edge use cases.
  • EKS, AKS, GKE – managed Kubernetes services by AWS, Azure, and Google.

Each distribution serves different needs. Some focus on governance and compliance, others on developer experience or cost efficiency.

What VSHN Does with Kubernetes

At VSHN, Kubernetes is the backbone of everything we do.

We were the first Swiss Kubernetes Certified Service Provider (KCSP) and the first Swiss Red Hat Premier Certified CCSP Partner – official recognitions of our deep expertise and long-standing commitment to the Kubernetes ecosystem.

VSHN manages hundreds of Kubernetes clusters for customers of all sizes – from startups to banks and public institutions – running in public cloud, private cloud, on-premises, or Swiss or EU sovereign clouds like Exoscale, Cloudscale or IONOS.

We offer:

  • Managed OpenShift – We set up and operate your OpenShift cluster and take care of its entire lifecycle: security, monitoring, upgrades, and backups.
  • APPUiO – Expert hosting for expert software engineers. Our OpenShift Project-as-a-Service offering, ideal for getting started with Kubernetes at low cost. Try APPUiO for free at appuio.cloud/register with the code: K8s2025
  • Servala – Sovereign App Store – Our newest platform lets you deploy fully managed services – like databases, developer tools, and monitoring – in just a few clicks, all powered by Kubernetes.

Over the years, we’ve developed automation frameworks, monitoring tools, and proven best practices to help our customers focus on building software – not managing infrastructure.

Out of this experience, we’ve also launched two Open Source projects:

  • K8up – A Kubernetes backup operator and CNCF Sandbox project.
  • Project Syn – A modular, secure toolbox to manage fleets of Kubernetes clusters.

Where do Red Hat, OpenShift, and VSHN fit in the railway analogy?

Let’s stay with our Swiss railway analogy.

  • Kubernetes is the Swiss railway infrastructure – tracks, switches, schedules, and the control center. It ensures all trains (containers) run safely and efficiently.
  • Red Hat OpenShift is the premium freight rail operator – it adds polished locomotives, cargo workflows, and integrated safety systems to the tracks.
  • VSHN is your logistics partner and train operator – we run and maintain the network, the trains, and even the cargo. We make sure everything is on time, scalable, and secure.

Even better: with our Solutions, we don’t just operate the trains – we help you load, monitor, and optimize the containers inside.

And Servala? Think of it as the logistics warehouse next to the railway yard – a place where you can grab pre-packed cargo (managed services) and deploy it directly onto your Kubernetes rail network with a few clicks.

In this picture:

  • Red Hat builds the system and provides the premium trains (OpenShift).
  • VSHN operates the system reliably for you (Managed OpenShift, VSHN Solutions).
  • You focus on your cargo (apps) – while we ensure everything runs like a Swiss clock.

Why You Should Care – Even If You’re Not a Dev

Kubernetes is behind many of the services you use every day:

  • Online banking
  • E-commerce shops
  • Streaming services
  • Public digital services

Kubernetes is also a key technology for teams adopting DevOps – helping developers and operations work together more efficiently through automation, self-service infrastructure, and repeatable workflows.

For businesses, Kubernetes enables:

  • Faster time to market – deploy features daily, not quarterly.
  • Higher reliability – systems recover automatically from failure.
  • Cost optimization – only use the resources you need, when you need them.
  • Vendor flexibility – avoid cloud lock-in by running your workloads anywhere.

TL;DR

In 2025, Kubernetes is no longer a luxury – it’s the foundation of modern IT. Not just for tech giants – but for any team that wants to work faster and better. Kubernetes automates the deployment, scaling, and reliable operation of modern applications – in the cloud, on-premises, or in hybrid environments.

At VSHN, we make Kubernetes simple, reliable, and accessible – so you can build great digital products.

Further Reading

Curious how Kubernetes can help your team? Get in touch with us – we’d love to show you.

Disclaimer: This text was partially written by a human.

Markus Speth

Marketing, Communications, People

Contact us

Our team of experts is available for you. In case of emergency also 24/7.

Contact us
Kubernetes Tech

Stay Ahead of the Game with Kubernetes

13. Jan 2023

Kubernetes is a powerful platform for deploying and managing containerized applications at scale, and it has become increasingly popular in Switzerland in recent years.

One way to approach it is outsourcing. This can be a strategic and cost-effective option for organizations that do not have the in-house DevOps expertise, know-how, or resources to manage their infrastructure and application operations efficiently.

Not every tech company is in the business of building platforms and operating Kubernetes clusters. Thus by partnering with an experienced partner, companies can tap into a wealth of knowledge and expertise to help them run their applications.

Some companies adopt Kubernetes and look to leverage its capabilities themselves. It’s essential to consider time, effort, and possible implications while utilizing the latest developments and continually adding value to the core business.

In all cases, it will be helpful to align with fundamentals. For this reason, I have compiled a quick guide to Kubernetes in 2023 and best practices in Switzerland.

  1. Understand the basics: Before diving into Kubernetes, have a solid understanding of the reasoning and concepts. This could include cloud infrastructure, networking, containers, how they liaise with each other, and how they can be managed with Kubernetes.
  2. Plan your deployment carefully: When deploying applications with Kubernetes, you must plan thoroughly and consider your workloads’ specific needs and requirements. This includes but is not limited to resource requirements, network connectivity, scalability, latency, and security considerations.
  3. Use appropriate resource limits: One of the critical benefits of Kubernetes is its ability to manage resources dynamically based on the needs of your applications. To take advantage of this, try to set appropriate resource limits for your application. This will help ensure that your application has the resources they need to run effectively while preventing them from consuming too many resources and impacting other applications.
  4. Monitor your application: It’s essential to monitor your applications and the underlying Kubernetes cluster to ensure they are running smoothly and to identify any issues that may arise. You want to analyze the alerts and react accordingly. You can use several tools and practices to monitor your applications, including log analysis, monitoring with tools like Prometheus and Grafana, and alerting systems.
  5. Use appropriate networking configurations: Networking is critical to any Kubernetes deployment, and choosing the proper network configuration is substantial. What about load balancing, service discovery, and network segmentation?
  6. Secure your application: Security is a top concern for many companies and organizations in Switzerland. You cannot proceed without ensuring that your Kubernetes deployment is secure. At this stage, your team is implementing network segmentation, using secure container runtime environments, and implementing advanced authentication and authorization systems.
  7. Consider using a managed Kubernetes service: For companies without the resources or needing DevOps expertise to manage their clusters, managed Kubernetes services can be a business-saving solution. With managed services, you can get a production-ready cluster, i.e., a fully-managed Kubernetes environment, allowing teams and software engineers to focus on developing new features and deploying their applications rather than managing the underlying infrastructure.
  8. Stay up-to-date with the latest developments: The Kubernetes ecosystem is constantly evolving, and it’s better to stay up-to-date with the latest developments and best practices. This may involve subscribing to newsletters like VSHN, VSHN.timer, or Digests, attending conferences and CNCF meetups, and following key players in the Kubernetes community.

By following best practices, IT leaders, stakeholders, and decision-makers can ensure that they use Kubernetes constructively and get the most out of the platform technology.

Aarno Aukia

Aarno is Co-Founder of VSHN AG and provides technical enthusiasm as a Service as CTO.

Contact us

Our team of experts is available for you. In case of emergency also 24/7.

Contact us
Kubernetes Tech

What is a Kubernetes distribution and what are the differences between Kubernetes and OpenShift?

30. Aug 2018

Update: here’s the Kubernetes distributions 2026 overview.

At VSHN and APPUiO.ch we rely on OpenShift as Kubernetes distribution. What a Kubernetes distribution is, why we use it and where the differences to ‘plain’ Kubernetes will be explained in this blog post.

What is Kubernetes?

The official description of Kubernetes is:

Kubernetes is a portable, extensible open-source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation.

The most important part of this description is the fact that Kubernetes is a platform and not a ready off-the-shelf product. This is an important piece of information for understanding this article.

What is a Kubernetes distribution?

To understand the differences between Kubernetes and OpenShift, first of all we have to clarify the term ‘Kubernetes distribution’: if Kubernetes is installed directly from the open source Kubernetes project, you ‘only’ get the core components (API server, controller manager, scheduler, Kubelet, kube-proxy). In order for Kubernetes to be really usable, you need a lot of other components like etcd, ingress controller, logging server, metrics collector (for example Prometheus), software defined network (SDN) and many more. This is very similar to Linux: the Linux kernel alone does not help much, you need a whole Linux distribution which provides a shell, package management, boot process and much more.

OpenShift is a Kubernetes distribution and makes Kubernetes a product

A ‘minimum viable Kubernetes distribution’ requires the following additional components and tools for productive operation:

  • Installation and upgrade mechanism: for an automated installation of all involved components.
  • SDN (software defined network): pods must be able to communicate with each other no matter where they are running. The SDN ensures that.
  • Ingress controller: to allow user access to applications running on the cluster.
  • Authentication: a central user and group database provides the authenticated and authorized access.
  • Security: Kubernetes executes containers via Docker or CRI-O. The security on the host system must be ensured accordingly.
  • Persistent storage: stateful applications such as databases require persistent storage.
  • Monitoring: constant monitoring of all cluster components and applications.
  • Backup: backup of cluster components and persistent data.

Optionally, further components are recommended:

  • Central logging with graphics and searchability
  • Application and cluster metrics including alerting

OpenShift as Kubernetes distribution

Essentially, OpenShift relies 100% on Kubernetes, but as a Kubernetes distribution, it comes with everything needed for a Kubernetes cluster. To name just the most important functions:

  • Operations tools: an official and supported way via Ansible allows the entire lifecycle of OpenShift to be executed. This includes the automated installation, as well as upgrades to newer versions of OpenShift.
  • Router: the OpenShift router (ingress controller) – based on HAProxy – ensures that access to applications within the cluster is made possible via HTTP(S).
  • Multi-tenancy: multi-tenancy is built-in the core on OpenShift projects, RBAC and other concepts to allow the use of the platform by various stakeholders.
  • Authentication: the most different authentication backends are supported, above all LDAP, Active Directory (AD) and others.
  • Metrics: the bundled metrics component collects all available data (RAM, CPU, network) of the applications running on the cluster and visualizes them in the web console.
  • Central logging: all lines logged by the application on stdout are automatically collected by the central logging component and are made available to the user via the web console.
  • Security: the platform is designed for maximum security. For example, security measures in the kernel of Red Hat Enterprise Linux like SELinux ensure that the security of the containers is guaranteed. Further measures such as ‘security context constraints’ (SCC) and the prevention of root containers ensure further security.
  • Builds and pipelines: directly in the cluster integrated build and pipeline capabilities enable a fully integrated CI / CD workflow.
  • Web console: all operations on the cluster are visually displayed to the user of the platform in a web console and allow an easy and quick access to the use of Kubernetes.
  • SDN: the included software defined networking provides connectivity between the pods running on the platform and for an adequate network security with network policies.
  • Container registry: Docker / container images are stored in the bundled registry and used for deployment onto the worker nodes.

All these built-in functionalities can be added to any Kubernetes cluster, but only with a lot of effort. Comparable to building your own Linux distribution, as for example  Linux From Scratch demonstrates. Kubernetes has a similar guide called Kubernetes The Hard Way.

OpenShift as PaaS

The strength of Kubernetes lies in the container orchestration. In addition, OpenShift offers classic Platform-as-a-Service (PaaS) functionalities. One of these is the automatic building and deployment of application code directly from a Git repository. Nevertheless, as a user of the platform and thanks to its great flexibility, you always have the choice of whether you want to use the integrated build functions, or rather build outside the cluster. This can be chosen for each deployment, so both types can be used on one cluster.

OpenShift as upstream to Kubernetes

Many developments in Kubernetes originally came from OpenShift. The best example is RBAC (role based access control). This feature has been part of OpenShift since the first release and has been gradually integrated into Kubernetes. RBAC has been an integral part of Kubernetes since Kubernetes version 1.6. The OpenShift ‘Route’ or the ‘DeploymentConfiguration’ object also played a key role in the current objects ‘Ingress’ and ‘Deployment’ in Kubernetes.
Since OpenShift is 100% based on Kubernetes, all Kubernetes native workloads are also supported, such as the ‘Deployment’ or the ‘Ingress’ object.
If you look more closely at the contributor statistics, you’ll find that Red Hat is one of the top 3 contributor companies, so Red Hat is crucial in the development of Kubernetes. With the purchase of the company CoreOS, Red Hat has acquired formidable Kubernetes know-how. The merger of OpenShift and Tectonic will be the next milestone of the Kubernetes distribution OpenShift.

Alternatives to OpenShift

OpenShift is not the only Kubernetes distribution on the market. A quick comparison shows the differences:

  • Cloud vendor Kubernetes: the big clouds offer their own Kubernetes distributions as a service. These are tailored to the respective cloud and are maintained by the providers. Installation on your own private cloud or on other public clouds is not possible.
  • Rancher: since version 2.0, Rancher focuses 100% on Kubernetes and offers a multi-cluster management function as a major strength. With Rancher, Kubernetes clusters in the cloud (for example, on Amazon or Google) can be managed centrally, as well as Kubernetes clusters with the ‘Rancher Kubernetes Engine’ on your own VMs. With the web interface, setting up a new cluster is very easy and application deployments using Helm are also directly available.
  • Tectonic: this distribution lies great importance on cloud-native automation. Through Red Hat’s acquisition of CoreOS, Tectonic will be merged with OpenShift and many of its features will inserted into OpenShift.
  • Canonical / Ubuntu Kubernetes: platform based on Ubuntu, which uses Juju as installation tool. In partnership with Google and Rancher, a hybrid cloud solution will be offered in the future.
  • SUSE CaaS platform: a very new platform based on SUSE MicroOS. Salt is used to ensure configuration management. Under the following link you can participate in the beta program: SUSE CaaS Platform Beta.

Further Kubernetes distributions include:

One very important aspect to consider is the cloud and / or vendor lock-in. Many of the Kubernetes distributions have their own characteristics, which may not be compatible with each other. Using the example of ‘cloud vendor’ distributions: these can only be used in the corresponding cloud. However, if you want to pursue a hybrid cloud approach, this is not possible due to the lock-in. In contrary, a self-installable distribution like OpenShift makes this option possible.
Pure open source distributions without manufacturer support are not recommended for productive environments, as this is of great advantage for a complex platform like Kubernetes.

APPUiO – Swiss Container Platform

The attentive reader may have noticed that there are some discrepancies between the ‘minimum viable Kubernetes distribution’ and OpenShift. This is exactly where APPUiO comes in: we refine OpenShift into a comprehensive, production-ready Kubernetes distribution by offering managed services. We automatically monitor and secure the cluster status, take care of regular updates, fix bugs, provide persistent storage and help with our know-how to make the most out of the platform.

More information about Kubernetes and OpenShift

At the Cloud Native Meetup on August 28, 2018 in Zurich, we also talked about Kubernetes distributions: you can find the slides on Speaker Deck. You can also find more about OpenShift, Docker and Kubernetes here. Another recommendable blog post on this topic by Tomasz Cholewa: 10 most important differences between OpenShift and Kubernetes (English, technical).

How can we help?

Through our experience in operating OpenShift clusters around the world, we offer managed OpenShift clusters on almost any public, private or on-premise cloud. Or are you interested in another Kubernetes distribution than OpenShift? We gladly help you with the evaluation, integration and operation and support with our many years of Kubernetes experience.
Contact us, follow us on Twitter or take a look on our services.
We are looking forward to your feedback! 

Tobias Brunner

Tobias Brunner is working since over 20 years in IT and more than 15 years with Internet technology. New technology has to be tried and written about.

Contact us

Our team of experts is available for you. In case of emergency also 24/7.

Contact us