Skip to content

How to run Aeron Cluster on Kubernetes

Problem

You want to run a multi-node cluster of Aeron Cluster on Kubernetes

Discussion

Running on Kubernetes is achieved via the use of a Kubernetes stateful set and cluster scoped ClusterIps. Aeron Cluster configuration - using the sample ClusterConfig object - requires a reference to the index of CLUSTER_ADDRESSES in order to properly configure a node. This can be seen with the -Dnode.id=${POD_NAME##*-} argument below.

Note that DNS can be slow within Kubernetes, and as a result, the application should await proper DNS resolution. In the sample, this is found here

Example Cluster Controller

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: aeron-io-sample-cluster
  namespace: aeron-io-sample-cluster
  labels:
    app.kubernetes.io/name: aeron-io-sample-cluster
    app.kubernetes.io/instance: aeron-io-sample-cluster
spec:
  replicas: 3
  podManagementPolicy: Parallel
  serviceName: aeron-io-sample-cluster
  selector:
    matchLabels:
      app.kubernetes.io/name: aeron-io-sample-cluster
      app.kubernetes.io/instance: aeron-io-sample-cluster
  template:
    metadata:
      annotations:
        {}
      labels:
        app.kubernetes.io/name: aeron-io-sample-cluster
        app.kubernetes.io/instance: aeron-io-sample-cluster
    spec:
      serviceAccountName: aeron-io-sample-cluster
      volumes:
        - emptyDir:
            medium: Memory
            sizeLimit: 1Gi
          name: shm
      containers:
        - name: aeron-io-sample-cluster
          image: "cluster:latest"
          imagePullPolicy: IfNotPresent
          command:
            - /bin/bash
          args:
            - -c
            - /root/jar/entrypoint.sh -Dnode.id=${POD_NAME##*-}
          env:
            - name: DNS_DELAY
              value: "true"
            - name: CLUSTER_ADDRESSES
              value: aeron-io-sample-cluster-0.aeron-io-sample-cluster.aeron-io-sample-cluster.svc.cluster.local.,aeron-io-sample-cluster-1.aeron-io-sample-cluster.aeron-io-sample-cluster.svc.cluster.local.,aeron-io-sample-cluster-2.aeron-io-sample-cluster.aeron-io-sample-cluster.svc.cluster.local.
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
          volumeMounts:
            - mountPath: /dev/shm
              name: shm

Example Cluster Service

---
apiVersion: v1
kind: Service
metadata:
  name: aeron-io-sample-cluster
  namespace: aeron-io-sample-cluster
  labels:
    app.kubernetes.io/name: aeron-io-sample-cluster
    app.kubernetes.io/instance: aeron-io-sample-cluster
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    app.kubernetes.io/name: aeron-io-sample-cluster
    app.kubernetes.io/instance: aeron-io-sample-cluster

The full example is available on GitHub: Aeron Sample - Kubernetes