KubeMQ
ConfigureKubernetes

Kubernetes (Helm)

Configure a KubeMQ cluster on Kubernetes — values.yaml, the KubemqCluster CR, interfaces, and HA.

Install KubeMQ firstHelm install. This page covers how to configure a KubeMQ cluster.

On Kubernetes, KubeMQ runs through the operator. You describe the server with a KubemqCluster custom resource, the operator reconciles it into a StatefulSet, Services, and configuration, and the Helm charts render that resource from your values.yaml. Because the chart writes values straight into the CR, a Helm value path equals the KubemqCluster spec.* path with the leading spec. removed (spec.grpc.portgrpc.port).

This guide is the single source of truth for complete, runnable Helm and CRD configurations. The Configuration overview and the reference pages show minimal single-setting snippets and link here.

Configure with values.yaml

For anything beyond the license key, supply a values.yaml file. Each value maps 1:1 to a KubemqCluster spec.* field — the chart renders your values verbatim into the CR spec, so there is no separate Helm schema to learn. A complete values.yaml:

values.yaml
# Replace with your license key
key: YOUR_LICENSE_KEY

# High availability: 3 replicas (set standalone: true for a single node)
replicas: 3
standalone: false

# Persistent store
volume:
  size: 20Gi
  storageClass: fast-ssd

# Interfaces — .port moves the listener + Service port together
grpc:
  port: 50000
  expose: LoadBalancer

# REST is on by default; MCP / A2A / CloudEvents ride the REST HTTP port
# (disabled: false is the default — shown here only to be explicit)
rest:
  disabled: false
  port: 9090
  expose: ClusterIP

api:
  port: 8080
  expose: LoadBalancer

# Store limits and retention — enforced on the `legacy` engine only (see callout below)
store:
  messagesRetentionMinutes: 1440
  maxChannels: 0

# Pod resources
resources:
  requestsCpu: "2"
  requestsMemory: 4Gi
  limitsCpu: "4"
  limitsMemory: 8Gi

store.messagesRetentionMinutes and the other store.max* limits are enforced by the legacy engine only — and a new cluster on a clean store comes up on next. So the 1440 above does nothing on a default install: native Events Store and Queues channels have no age, size, or count cap and grow until the disk does. Size by spec.volume.size, or use Kafka topic channels where age eviction matters. See Native retention scope.

Install (or upgrade) the cluster with the file:

Terminal
helm install --wait -n kubemq kubemq-cluster kubemq-charts/kubemq-cluster -f values.yaml

The same configuration as a KubemqCluster CR — apply it directly with kubectl apply -f if you manage the resource yourself rather than through Helm:

kubemqcluster.yaml
apiVersion: core.k8s.kubemq.io/v1beta1
kind: KubemqCluster
metadata:
  name: kubemq-cluster
  namespace: kubemq
spec:
  key: YOUR_LICENSE_KEY
  replicas: 3
  standalone: false
  volume:
    size: 20Gi
    storageClass: fast-ssd
  grpc:
    port: 50000
    expose: LoadBalancer
  rest:
    disabled: false
    port: 9090
    expose: ClusterIP
  api:
    port: 8080
    expose: LoadBalancer
  store:
    messagesRetentionMinutes: 1440
    maxChannels: 0
  resources:
    requestsCpu: "2"
    requestsMemory: 4Gi
    limitsCpu: "4"
    limitsMemory: 8Gi

REST is enabled by default on the chart. The cluster chart ships rest.disabled: false (spec.rest.disabled: false), so REST — and the MCP, A2A, and CloudEvents connectors that ride the REST HTTP port — are reachable out of the box. disabled is an opt-out boolean: omit the key entirely to leave REST on; set rest.disabled: true only to turn REST off, which also takes MCP, A2A, and CloudEvents offline.

Version floor. The first-class spec.telemetry.*, spec.audit.*, and spec.http.* fields, and the aligned spec.authentication.* fields, are present throughout the current GA chart line — kubemq-crds and kubemq-cluster 3.x (latest 3.2.0) with kubemq-controller 2.x (operator v2.3.0). Anything older than the 3.0.0 / 2.0.0 GA release predates this reference and will reject these fields: upgrade to the current line rather than trying to work out which pre-GA build carried which field.

On Kubernetes, .port moves everything together. For grpc, rest, and api, setting spec.<iface>.port makes the operator emit the matching listener env var (CONNECTORS_GRPC_PORT / CONNECTORS_REST_PORT / API_PORT) and set the Kubernetes Service port/targetPort and the container port — the in-pod listener and the Service port move as one. This matches Docker, where the same *_PORT setting moves the actual listener (which you then publish with -p) — see the Docker guide.

Single-node vs HA

The same chart runs both topologies — the difference is replicas.

values.yaml
key: YOUR_LICENSE_KEY
replicas: 1
standalone: true
values.yaml
key: YOUR_LICENSE_KEY
replicas: 3
standalone: false

A single replica (or standalone: true) runs one non-clustered node — the equivalent of one Docker container. Three or more replicas give you high availability; the operator wires up clustering across the pods. For the full deployment and HA reference, see Deployment & HA.

Expose interfaces

Each interface (grpc, rest, api) is fronted by its own Kubernetes Service. Control the Service type with expose and the published node port with nodePort:

values.yaml
grpc:
  expose: LoadBalancer    # ClusterIP | NodePort | LoadBalancer
api:
  expose: NodePort
  nodePort: 32080         # only used with NodePort
  • ClusterIP — reachable only inside the cluster (the default for internal-only interfaces).
  • NodePort — published on every node at nodePort; useful for direct access without a cloud load balancer.
  • LoadBalancer — provisions an external load balancer (cloud environments).

nodePort applies only when expose: NodePort. On Docker there is no Service — publish ports with -p instead (see the Docker guide).

Zero-config Kafka

On a fresh cluster, enabling the Kafka connector is the whole story — no separate engine setting to manage:

values.yaml
key: YOUR_LICENSE_KEY
replicas: 3
standalone: false

kafka:
  enabled: true

With the store empty and store.engine left unset, the operator auto-selects the next persistence engine at first boot — see Storage Engines → Zero-config engine selection for the full selection rules.

The default replicas: 3 means Kafka producers should use acks>=1 for durable writes. The next engine acknowledges a publish only after it's quorum-replicated across raft peers, so an acks=0 producer won't see a stalled or leaderless partition.

External reachability needs spec.kafka.expose plus an advertised host/port pair — see Connectors → Kafka for the full listener/TLS/SAN details.

Configure by domain

Every server setting — with its type, default, valid values, and both per-target columns — lives in the domain reference pages.

Verify

Confirm the operator has reconciled the cluster and the pods are ready.

Check the KubemqCluster resource and its status:

Terminal
kubectl get kubemqcluster -n kubemq

Inspect the full status, including the reconcile phase and any conditions:

Terminal
kubectl describe kubemqcluster kubemq-cluster -n kubemq

Confirm the server pods are running:

Terminal
kubectl get pods -n kubemq

To reach the dashboard, port-forward the API service and open http://localhost:8080:

Terminal
kubectl port-forward -n kubemq svc/kubemq-cluster 8080:8080

Was this page helpful?

On this page