This is an automated email from the ASF dual-hosted git repository.

lhotari pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar-helm-chart.git


The following commit(s) were added to refs/heads/master by this push:
     new 51cd95c  Update 4.6.0 upgrade notes
51cd95c is described below

commit 51cd95ca1aa1e465e18dddb097efe5b5a655fac3
Author: Lari Hotari <[email protected]>
AuthorDate: Thu Apr 30 22:03:12 2026 +0300

    Update 4.6.0 upgrade notes
---
 README.md | 46 ++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 40 insertions(+), 6 deletions(-)

diff --git a/README.md b/README.md
index 7627024..34c4d47 100644
--- a/README.md
+++ b/README.md
@@ -418,15 +418,49 @@ helm upgrade -n <namespace> -f values.yaml 
<pulsar-release-name> apachepulsar/pu
 
 For more detailed information, see our 
[Upgrading](http://pulsar.apache.org/docs/helm-upgrade/) guide.
 
-## Upgrading to Helm chart version 4.6.0 (upcoming release)
+## Upgrading to Helm chart version 4.6.0
 
-The ZooKeeper StatefulSet and Broker StatefulSet have been modified to use a 
separate headless service and a separate ClusterIP service.
-The StatefulSet will be deleted and re-created during an upgrade. Deleting the 
StatefulSet will not delete data for ZooKeeper. The pods will
-remain running until the upgrade has replaced them. The deletion is handled 
using a Helm pre-upgrade hook, which runs a Kubernetes job using a container 
that contains `kubectl`. The image is `alpine/k8s` by default and is 
configurable under the `images.kubectl` key in values.yaml.
+### ZooKeeper and Broker Services split into ClusterIP + headless
 
-When TLS is enabled for ZooKeeper and Brokers, it is recommended to perform a 
rolling restart after the new certificates have been issued by cert-manager. 
The hostnames of the broker and zookeeper pods have changed and the certificate 
CRDs reflect this change.
+> **Note:** Upgrading existing installs may cause a brief service disruption. 
The StatefulSet's `serviceName` is immutable, so the ZooKeeper and Broker 
StatefulSets are re-created during the upgrade (see [Upgrading: pre-upgrade 
cleanup Job](#upgrading-pre-upgrade-cleanup-job) below).
 
-In addition, the default for the main Broker service has been changed from 
headless to default ClusterIP service.
+PRs [#649](https://github.com/apache/pulsar-helm-chart/pull/649) and 
[#650](https://github.com/apache/pulsar-helm-chart/pull/650) replace the single 
Service that fronted each of the ZooKeeper and Broker StatefulSets with two:
+
+- a regular **ClusterIP Service** (`<release>-zookeeper`, `<release>-broker`) 
— used by clients; only routes to ready pods. The default for the main Broker 
service has changed from headless to ClusterIP.
+- a **headless Service** (`*-headless`, `clusterIP: None`, 
`publishNotReadyAddresses: true`) — used as the StatefulSet `serviceName` for 
stable per-pod DNS.
+
+#### Why
+
+**ZooKeeper.** The previous Service had `publishNotReadyAddresses: true`, so 
brokers and bookies could be routed to ZK pods that were still starting or 
unhealthy. Splitting into a ready-only ClusterIP Service for clients and a 
headless Service for per-pod DNS fixes that.
+
+**Brokers** (issue 
[#437](https://github.com/apache/pulsar-helm-chart/issues/437)). A broker 
registers itself in ZooKeeper using its **per-pod** DNS name; other brokers and 
clients then resolve that name to reach it. The previous headless Service did 
**not** set `publishNotReadyAddresses`, so the per-pod name only became 
resolvable after the pod's readiness probe passed (plus DNS-cache TTL). 
Meanwhile the load manager could already have assigned namespace bundles to the 
new broker, causi [...]
+
+- Client lookups now go through a regular ClusterIP Service that returns a 
single IP. The previous headless Service returned one A record per broker, 
which can exceed the 512-byte UDP DNS limit in larger clusters. Some DNS 
clients cannot handle this due to lack of TCP fallback for DNS (for example 
Alpine <3.18).
+- StatefulSets require a headless Service for pod identity, so the headless 
Service can only be paired with — not replaced by — a ClusterIP Service.
+
+#### Upgrading: pre-upgrade cleanup Job
+
+Because `serviceName` is immutable, an in-place upgrade from a pre-4.6.0 chart 
would fail. The chart ships a **`pre-upgrade` Job** per component that uses 
`kubectl` (image `images.kubectl`, default `alpine/k8s`) to delete the old 
StatefulSet with `--cascade=orphan`. Pods (and ZooKeeper on-disk data) are 
preserved and keep running until the new StatefulSet rolls them, but a brief 
disruption around the cutover is possible. The Job reads the existing chart 
label and only acts when the prior [...]
+
+> **GitOps users (ArgoCD, Flux, Pulumi, etc.):** the cleanup relies on Helm's 
`pre-upgrade` hook lifecycle, which isn't always honored by GitOps tooling that 
renders the chart and applies the manifests directly. Verify that your tool 
runs `helm.sh/hook: pre-upgrade` Jobs before the rest of the release — or 
disable the hook flags above and handle the StatefulSet deletion (with 
`--cascade=orphan`) as part of your migration — before upgrading to 4.6.0.
+
+#### TLS
+
+The hostnames of the broker and ZooKeeper pods have changed, and certificates 
now include the new `*-headless` DNS names as SANs. After cert-manager reissues 
them, do a rolling restart of ZooKeeper and brokers so the running pods pick up 
matching certificates.
+
+### In-chart JWT secret generation
+
+PR [#672](https://github.com/apache/pulsar-helm-chart/pull/672) removes the 
need to run `prepare_helm_release.sh` — or any out-of-band script — to seed JWT 
secrets before installing.
+
+Opt in with `auth.authentication.jwt.generateSecrets.enabled: true`. A 
`pre-install`/`pre-upgrade` Job mints the signing key (symmetric or RSA) and 
one token per `auth.superUsers` entry, storing them as the same 
`<release>-token-*` secrets the rest of the chart already consumes. The Job is 
idempotent — skipped if the signing key secret exists, and existing token 
secrets are never overwritten — and supports annotations on generated secrets 
for tooling like [reflector](https://github.com/e [...]
+
+A fully-authenticated cluster can now be deployed with a single `helm install`.
+
+### Standalone deployment mode
+
+PR [#674](https://github.com/apache/pulsar-helm-chart/pull/674) adds a 
top-level `standalone` toggle that deploys a single Pulsar standalone instance 
instead of separate ZooKeeper, BookKeeper, Broker, etc. workloads.
+
+The goal is to use the **same Helm chart for minimal development and test 
deployments on Kubernetes** — local Kind/k3d/minikube, ephemeral CI, developer 
sandboxes — without a separate chart or installer. Existing values, image 
overrides, and tooling carry over.
 
 ## Upgrading to Helm chart version 4.2.0
 

Reply via email to