GitHub release: v1.4.1
For Community Edition, the release artifacts are available on GitHub Releases.
# Login to registry
docker login quay.io -u <username> -p <password>
# kubelb manager
docker pull quay.io/kubermatic/kubelb-manager-ee:v1.4.1
# ccm
docker pull quay.io/kubermatic/kubelb-ccm-ee:v1.4.1
# connection-manager
docker pull quay.io/kubermatic/kubelb-connection-manager-ee:v1.4.1
# kubelb-manager
helm pull oci://quay.io/kubermatic/helm-charts/kubelb-manager-ee --version v1.4.1
# kubelb-ccm
helm pull oci://quay.io/kubermatic/helm-charts/kubelb-ccm-ee --version v1.4.1
# kubelb-addons
helm pull oci://quay.io/kubermatic/helm-charts/kubelb-addons --version v0.4.0
Container image SBOMs are attached as OCI artifacts and attested with cosign.
Pull SBOM:
# Login to registry
oras login quay.io -u <username> -p <password>
## kubelb-manager
SBOM_DIGEST=$(oras discover --format json --artifact-type application/spdx+json \
quay.io/kubermatic/kubelb-manager-ee:v1.4.1 | jq -r '.referrers[0].digest')
oras pull quay.io/kubermatic/kubelb-manager-ee@${SBOM_DIGEST} --output sbom/
## kubelb-ccm
SBOM_DIGEST=$(oras discover --format json --artifact-type application/spdx+json \
quay.io/kubermatic/kubelb-ccm-ee:v1.4.1 | jq -r '.referrers[0].digest')
oras pull quay.io/kubermatic/kubelb-ccm-ee@${SBOM_DIGEST} --output sbom/
## kubelb-connection-manager
SBOM_DIGEST=$(oras discover --format json --artifact-type application/spdx+json \
quay.io/kubermatic/kubelb-connection-manager-ee:v1.4.1 | jq -r '.referrers[0].digest')
oras pull quay.io/kubermatic/kubelb-connection-manager-ee@${SBOM_DIGEST} --output sbom/
Verify SBOM attestation:
cosign verify-attestation quay.io/kubermatic/kubelb-manager-ee:v1.4.1 \
--type spdxjson \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify-attestation quay.io/kubermatic/kubelb-ccm-ee:v1.4.1 \
--type spdxjson \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify-attestation quay.io/kubermatic/kubelb-connection-manager-ee:v1.4.1 \
--type spdxjson \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
Docker images:
cosign verify quay.io/kubermatic/kubelb-manager-ee:v1.4.1 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify quay.io/kubermatic/kubelb-ccm-ee:v1.4.1 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify quay.io/kubermatic/kubelb-connection-manager-ee:v1.4.1 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
Helm charts:
cosign verify quay.io/kubermatic/helm-charts/kubelb-manager-ee:v1.4.1 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify quay.io/kubermatic/helm-charts/kubelb-ccm-ee:v1.4.1 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify quay.io/kubermatic/helm-charts/kubelb-addons:v0.4.0 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb/.github/workflows/release.yml@refs/tags/addons-v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
Release checksums (requires repository access):
cosign verify-blob --bundle checksums.txt.sigstore.json checksums.txt \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
GitHub release: v1.4.0
KubeLB v1.4 ships with a brand-new KubeLB Dashboard — a web UI for browsing tenants, LoadBalancers, Routes, WAF policies etc. across the fleet. A single chart and binary cover both Community and Enterprise editions; the edition is detected internally at runtime.
oci://quay.io/kubermatic/helm-charts/kubelb-dashboardKubeLB v1.4 Enterprise Edition is fully supported in air-gapped environments. Every release now publishes the complete list of container images and Helm charts shipped by KubeLB (including addons) as a release artifact, so customers can mirror them into an internal registry and pin-scan them from their own supply chain.
global.imageRegistry is honoured end-to-end, including by bundled addon sub-charts, so a single Helm flag rewrites every image reference.KubeLB now ships first-class Kubernetes NetworkPolicies for tenant isolation out of the box. Policies can be enabled or disabled, and additional policies can be added, at both Global/Config and Tenant level — so platform operators get a safe default while still being able to layer in per-tenant overrides.
LoadBalancer now has a spec.upstreamTLS field that controls how KubeLB’s Envoy proxy speaks to tenant backends. Two modes are supported:
Insecure — skip upstream certificate verification (useful for self-signed or short-lived backend certs).Verify — validate the backend certificate against a CA bundle sourced from a Secret.Tenants configure this with two annotations on the backing Service in the tenant cluster:
kubelb.k8c.io/backend-tls-policy — selects the mode.kubelb.k8c.io/backend-tls-ca-secret — points at the Secret holding the CA.replicas and resources via tenant.spec.envoyProxy, enabling per-tenant scaling without affecting other tenants.ingress-nginx bumped to v1.15.0 (addresses CVE-2026-3288).externalTrafficPolicy preservation for LoadBalancer services, for client-IP preservation on TCP services.spec.envoyProxy.podMonitor.enabled.RoundRobin, LeastRequest, or Random per LoadBalancer/Route, per tenant, or globally via the kubelb.k8c.io/lb-policy annotation.MaxEndpointsPerCluster on the Config CR, plus --max-node-address-count and --node-address-label-selector CCM flags with topology-aware zone spread.imagePullSecrets for Envoy Proxy — auto-detected from the manager pod or set explicitly on spec.envoyProxy.imagePullSecrets.A broad set of bug fixes land in v1.4, several already back-ported to the v1.3.x patch series:
nginx.ingress.kubernetes.io/ssl-passthrough: "true", fixing TLS handshake failures.backend-protocol: HTTPS / GRPCS, fixing 502 Bad Gateway on TLS backends.UpgradeConfigs on the Envoy HttpConnectionManager.observedGeneration drift on HTTPRoute / GRPCRoute / Gateway status sync (ArgoCD “perpetually progressing” bug).per_connection_buffer_limit_bytes (removes the lowered 32 KiB cap).timeoutSeconds and failureThreshold on Envoy proxy probes, plus readiness-probe stability under stats-scrape contention.(No, really, you MUST read this before you upgrade)
ShutdownManagerImage and Image fields have been dropped from Community Edition. (#388)externalTrafficPolicy field for LoadBalancer services. Support for Proxy Protocol v2 for preserving client IP for TCP services. (#276)spec.envoyProxy.podMonitor.enabled: true in the Config CR. (#313)replicas and resources via tenant.spec.envoyProxy. This allows per-tenant scaling of Envoy proxies without affecting other tenants. (#377)nginx.ingress.kubernetes.io/ssl-passthrough: "true" and causing TLS handshake failures. (#403)nginx.ingress.kubernetes.io/backend-protocol: HTTPS (or GRPCS) when the backend speaks TLS. Restores 1.2.x raw TCP passthrough for this specific case so the upstream nginx ingress controller can complete its TLS handshake against the backend through kubelb. (#376)UpgradeConfigs to Envoy HttpConnectionManager. (#328)observedGeneration mismatch in HTTPRoute / GRPCRoute / Gateway status sync that caused ArgoCD to show resources as perpetually progressing. (#373)timeoutSeconds and failureThreshold on envoy-proxy probes. (#287)per_connection_buffer_limit_bytes instead of a lowered 32 KiB buffer limit. (#345)pkg/conversion. (#261)kubelb-addons to v0.3.1 for kubelb-manager Helm chart. (#258)kubelb-addons chart to v0.3.1 with dependency bumps:Full Changelog: https://github.com/kubermatic/kubelb/compare/v1.3.0...v1.4.0
Enterprise Edition includes everything from Community Edition and more. The release notes below are for changes specific to just the Enterprise Edition.
spec.upstreamTLS field on the LoadBalancer CRD with two modes: Insecure (skip cert verification) and Verify (validate against CA certificate from Secret). Configurable via kubelb.k8c.io/backend-tls-policy and kubelb.k8c.io/backend-tls-ca-secret annotations on tenant Services. (#351)RoundRobin, LeastRequest, or Random per LoadBalancer/Route, per tenant, or globally via the kubelb.k8c.io/lb-policy annotation on tenant Services or Ingresses. (#317)MaxEndpointsPerCluster to the Config CR to cap upstream endpoints in the Envoy xDS snapshot. New --max-node-address-count and --node-address-label-selector flags on the CCM filter / limit node addresses forwarded to the LB cluster. When --max-node-address-count is enabled, addresses are selected with topology-aware round-robin spread across zones (topology.kubernetes.io/zone). (#295)imagePullSecrets for Envoy Proxy pods. Secrets are auto-detected from the manager pod or can be explicitly configured via spec.envoyProxy.imagePullSecrets in the Config CR. (#308)For Community Edition, the release artifacts are available on GitHub Releases.
# Login to registry
docker login quay.io -u <username> -p <password>
# kubelb manager
docker pull quay.io/kubermatic/kubelb-manager-ee:v1.4.0
# ccm
docker pull quay.io/kubermatic/kubelb-ccm-ee:v1.4.0
# connection-manager
docker pull quay.io/kubermatic/kubelb-connection-manager-ee:v1.4.0
# kubelb-manager
helm pull oci://quay.io/kubermatic/helm-charts/kubelb-manager-ee --version v1.4.0
# kubelb-ccm
helm pull oci://quay.io/kubermatic/helm-charts/kubelb-ccm-ee --version v1.4.0
# kubelb-addons
helm pull oci://quay.io/kubermatic/helm-charts/kubelb-addons --version v0.4.0
# kubelb-dashboard
helm pull oci://quay.io/kubermatic/helm-charts/kubelb-dashboard --version v1.0.0
Container image SBOMs are attached as OCI artifacts and attested with cosign.
Pull SBOM:
# Login to registry
oras login quay.io -u <username> -p <password>
## kubelb-manager
SBOM_DIGEST=$(oras discover --format json --artifact-type application/spdx+json \
quay.io/kubermatic/kubelb-manager-ee:v1.4.0 | jq -r '.referrers[0].digest')
oras pull quay.io/kubermatic/kubelb-manager-ee@${SBOM_DIGEST} --output sbom/
## kubelb-ccm
SBOM_DIGEST=$(oras discover --format json --artifact-type application/spdx+json \
quay.io/kubermatic/kubelb-ccm-ee:v1.4.0 | jq -r '.referrers[0].digest')
oras pull quay.io/kubermatic/kubelb-ccm-ee@${SBOM_DIGEST} --output sbom/
## kubelb-connection-manager
SBOM_DIGEST=$(oras discover --format json --artifact-type application/spdx+json \
quay.io/kubermatic/kubelb-connection-manager-ee:v1.4.0 | jq -r '.referrers[0].digest')
oras pull quay.io/kubermatic/kubelb-connection-manager-ee@${SBOM_DIGEST} --output sbom/
Verify SBOM attestation:
cosign verify-attestation quay.io/kubermatic/kubelb-manager-ee:v1.4.0 \
--type spdxjson \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify-attestation quay.io/kubermatic/kubelb-ccm-ee:v1.4.0 \
--type spdxjson \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify-attestation quay.io/kubermatic/kubelb-connection-manager-ee:v1.4.0 \
--type spdxjson \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
Docker images:
cosign verify quay.io/kubermatic/kubelb-manager-ee:v1.4.0 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify quay.io/kubermatic/kubelb-ccm-ee:v1.4.0 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify quay.io/kubermatic/kubelb-connection-manager-ee:v1.4.0 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
Helm charts:
cosign verify quay.io/kubermatic/helm-charts/kubelb-manager-ee:v1.4.0 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify quay.io/kubermatic/helm-charts/kubelb-ccm-ee:v1.4.0 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
cosign verify quay.io/kubermatic/helm-charts/kubelb-addons:v0.4.0 \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb/.github/workflows/release.yml@refs/tags/addons-v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com
Release checksums (requires repository access):
cosign verify-blob --bundle checksums.txt.sigstore.json checksums.txt \
--certificate-identity-regexp="^https://github.com/kubermatic/kubelb-ee/.github/workflows/release.yml@refs/tags/v.*" \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com