# AIStor Operator RELEASE.2026-09-18T18-03-16Z

Released: 2026-09-18

This release replaces the in-place MinIO upgrade path with StatefulSet-based upgrades, configures tenants through `config.yaml` v3 where the AIStor release supports it, and adds S3-over-RDMA to the ObjectStore API. It also retires the `sts.min.io/v1alpha1` PolicyBinding API and moves every operator-built image onto a hardened base with a read-only root filesystem.

---

## Component Versions

| Component | Tag | Previous |
| --- | --- | --- |
| Operator | `RELEASE.2026-09-18T18-03-16Z` | `RELEASE.2026-07-21T22-41-48Z` |
| MinIO Sidecar | `RELEASE.2026-09-18T00-46-19Z` | `RELEASE.2026-07-14T22-07-12Z` |
| MinKMS Sidecar | `RELEASE.2026-09-18T18-00-03Z` | `RELEASE.2026-07-14T22-12-08Z` |
| KES Sidecar | `RELEASE.2026-07-14T22-03-37Z` | unchanged |

Images the operator deploys, as pinned by the Helm charts in this cycle:

| Image | Tag | Previous |
| --- | --- | --- |
| `minio` | [`RELEASE.2026-09-07T08-39-31Z`](https://dl.min.io/aistor/minio/release/notes/release-notes-RELEASE.2026-09-07T08-39-31Z.md) | unchanged |
| `mc` | [`RELEASE.2026-09-06T02-44-40Z`](https://dl.min.io/aistor/mc/release/notes/release-notes-RELEASE.2026-09-06T02-44-40Z.md) | unchanged |
| `kes` | [`RELEASE.2026-08-24T11-11-49Z`](https://dl.min.io/aistor/kes/release/notes/release-notes-RELEASE.2026-08-24T11-11-49Z.md) | unchanged |
| `minkms` | `RELEASE.2026-09-16T11-16-36Z` | [`RELEASE.2026-08-04T13-17-26Z`](https://dl.min.io/aistor/minkms/release/notes/release-notes-RELEASE.2026-08-04T13-17-26Z.md) |
| `aihub` | `RELEASE.2025-12-11T18-08-15Z` | unchanged |
| `prompt` | `RELEASE.2025-01-17T21-55-43Z` | unchanged |
| `minwall` | `RELEASE.2026-05-21T06-25-56Z` | unchanged |
| `warp` | `v1.7.0` | unchanged |

### Helm Charts

| Chart | Version | Previous |
| --- | --- | --- |
| `aistor-operator` | `6.0.0` | `5.11.4` |
| `minkms-operator` | `1.11.0` | `1.10.1` |
| `aistor-objectstore` | `1.1.0` | `1.0.17` |

### OpenShift Operator Bundles

| Bundle | Version |
| --- | --- |
| `minio-object-store-operator` | `2026.9.18180316` |
| `minio-minkms-operator` | `2026.9.18180316` |

### Container Images

```bash
docker pull quay.io/minio/aistor/operator:RELEASE.2026-09-18T18-03-16Z
docker pull quay.io/minio/aistor/minio-sidecar:RELEASE.2026-09-18T00-46-19Z
docker pull quay.io/minio/aistor/minkms-sidecar:RELEASE.2026-09-18T18-00-03Z
docker pull quay.io/minio/aistor/kes-sidecar:RELEASE.2026-07-14T22-03-37Z
```

A `.fips` tag of each image carries the FIPS 140-3 build.

```bash
helm repo add minio https://helm.min.io
helm upgrade --install aistor-operator minio/aistor-operator --version 6.0.0
```

---

## New Features

- **S3 over RDMA.** `spec.rdma` covers both RDMA paths: S3 client traffic, GPU-Direct included, and inter-node erasure-coded shard transfers. A GPU is needed only for the GPU-Direct sub-path (#1521).

- **RDMA pods are scheduled for the fabric.** The operator places them on the host network with the required security context and device mounts, and injects a required anti-affinity so one server runs per node. A pool may override it (#1521).

- **`config.yaml` v3 configuration with user-supplied overrides.** Tenants on AIStor `RELEASE.2026-04-11T03-20-12Z` or newer are configured through `config.yaml` rather than `MINIO_ARGS`. A `config.yaml` key in the configuration secret merges your settings in (#1419, #1637, #1675).

- **Per-pool `setDriveCount`** (immutable, 2–16) and an `appliedConfigYAMLHash` status field come with it. Tenants on older releases stay on `MINIO_ARGS`, which is sticky once chosen (#1419).

- **Hot reload of configuration changes.** With `hotReload` on, the MinIO sidecar sends SIGHUP so MinIO reloads `config.yaml` in place. Off by default, because some AIStor releases cannot hot-reload pool changes (#1419).

- **Version resolution for digest-pinned images.** A digest names no version, so the operator runs the image once as a short-lived pod to read it, caching per digest. Needed to choose the configuration style and upgrade path (#1675).

- **`additionalHostsTemplate`** on a pool, for declaring extra host entries alongside the generated ones (#1675).

- **Fortanix DSM HSM backend** in the updated MinKMS server, alongside the existing backends.

---

## Bug Fixes

### Object store reconciliation

- **Flipping `spec.certificates.disableAutoCert` no longer leaves a multi-server object store down indefinitely.** The scheme change reached pods as an ordinary rolling update, splitting the cluster across two schemes. It is now applied to every pod at once (#1702).

- **A TLS scheme change no longer parks the object store for five minutes.** A rate limiter advanced its backoff on every call rather than on failures, so a pool delete and recreate hit the five-minute ceiling with nothing having failed (#1717).

- **A spec edit landing mid-reconcile is no longer adopted halfway.** The mount secret could come from the old spec and the pod template from the new one, leaving stale values such as `MINIO_RDMA_INTERNODE` behind. Each pass now works from a single spec (#1717).

- **Upgrade completion is detected for suffixed tags.** A whole `.rdma` or hotfix tag was compared against the bare date the server reports, so the non-rolling upgrade path never saw an upgrade finish (#1665).

### Webhooks

- **The object-store and Sidekick webhook readiness probes moved to `/readyz`.** Both shared a `/healthz` making a live API call on every check, so under load the probe timed out and dropped the pod from the Service (#1673).

- Readiness now checks in-memory state only: certificate validity, synced informer caches, a populated CA bundle, and for Sidekick a resolvable injected image. Liveness keeps to conditions a restart can fix (#1673).

### Cluster-domain detection

- **The operator, both webhooks and the MinKMS sidecar detect the cluster domain at startup.** None ran detection, so a cluster not using `cluster.local` resolved names against the wrong domain unless overridden (#1637).

- Detection improved: the kubeadm ConfigMap probe runs before DNS, lookups honour the caller's deadline instead of blocking on an unresponsive resolver, and the log names the mechanism that answered (#1637).

---

## CRD Changes

### ObjectStore (`aistor.min.io/v1`)

| Field | Change |
| --- | --- |
| `spec.rdma` | Added. `enabled` (required, default `false`), `internode`, `peerPort` (default 5555), `devicePath` (default `/dev/infiniband`), `fabric.nodeAddressLabel` and `fabric.secondaryNodeAddressLabel`. The two fabric labels must differ |
| `spec.pools[].setDriveCount` | Added. Integer 2–16, immutable once set. Needs `config.yaml` v3 |
| `spec.pools[].additionalHostsTemplate` | Added. Extra host entries rendered alongside the generated ones |
| `status.appliedConfigYAMLHash` | Added. Hash of the `config.yaml` last applied |

### PolicyBinding (`sts.min.io`)

| Field | Change |
| --- | --- |
| `v1alpha1` | **Removed.** The CRD serves `v1beta1` only. Stored objects are unaffected; `v1beta1` was already the storage version |

---

## Helm Chart Changes

| Value | Default | Purpose |
| --- | --- | --- |
| `operators.object-store.hotReload` | `false` | Reload `config.yaml` via SIGHUP instead of restarting MinIO |
| `operators.object-store.disableImageDigestResolve` | `false` | Skip the version probe for digest-pinned images and drop the RBAC it needs |
| `global.operator.securityContext.readOnlyRootFilesystem` | `true` | Read-only root filesystem, in both operator charts |
| `objectStore.rdma` | unset | Renders `spec.rdma`, in `aistor-objectstore` 1.1.0 |

- The `object-store-operator` Service and its OpenShift serving certificate are no longer rendered.
- The `aistor-object-store` cluster role gains `patch` on `objectstores` and `get` on `statefulsets`. With `disableImageDigestResolve: true` it drops the pod and pod-log permissions.
- OpenShift deployments now receive the container security context, minus the `runAsUser` and `runAsGroup` the SCC assigns.
- The license secret is no longer mounted. The chart still creates `minio-license`; the operator reads it through the API. No action required.
- `aistor-objectstore` 1.1.0 changed nothing else. Upgrading without `objectStore.rdma` renders exactly what 1.0.17 did.

---

## Breaking Changes

- **The `sts.min.io/v1alpha1` PolicyBinding API is no longer served.** Any manifest, script or client sending `apiVersion: sts.min.io/v1alpha1` fails after the upgrade. Stored objects need no conversion (#1710).

- **The in-place MinIO upgrade path is removed,** along with the HTTPS endpoint on port 4221, its Service and its TLS certificate. Upgrades now run through the pool StatefulSets (#1479).

- **Some tenant upgrades now require approval and incur downtime.** Below AIStor `RELEASE.2025-12-20T04-58-37Z` a rolling update can never complete, so the operator replaces all pool pods at once — after you annotate the object store with `aistor.min.io/approve-upgrade=true` (#1479, #1675).

- Upgrading the operator alone never triggers that; only a subsequent AIStor version change does. PVCs are retained, so pods return with their data (#1479).

- **Every operator-generated container runs with a read-only root filesystem.** Components that write get a size-limited `emptyDir` at `/tmp`: 100Mi by default, 1Gi for the object-store pool, 10Mi for KES. User-supplied sidecars and init containers are untouched (#1445).

- **On plain Kubernetes the injected Sidekick init container now starts as UID 65532, not 1000.** Review any volume permissions or PodSecurity policy that assumed 1000 (#1692).

- **Chart deployments replacing `global.operator.securityContext` wholesale keep the old behaviour.** Your value replaces the default in full; add `readOnlyRootFilesystem: true` to pick up the hardening (#1445).

---

## Security Updates

- Built with **Go 1.27.1**, up from Go 1.26.5, across the operator and every sidecar (#1713).

- `govulncheck` now runs across every Go module rather than the root alone, and all findings were resolved: [GO-2026-6094](https://pkg.go.dev/vuln/GO-2026-6094), [GO-2026-6263](https://pkg.go.dev/vuln/GO-2026-6263) and [GO-2026-6266](https://pkg.go.dev/vuln/GO-2026-6266). The one remaining suppression carries a written justification (#1713).

- `google.golang.org/grpc` upgraded to v1.83.2 for [GO-2026-6348](https://pkg.go.dev/vuln/GO-2026-6348) (#1714), after an earlier move to v1.82.1 (#1635). Further dependency upgrades landed in #1677.

- **The operator no longer serves HTTP on any port.** Removing the binary-update endpoint removed the only listener it had (#1479).

- **Images are built on Red Hat's hardened static base** instead of a UBI micro layer, so they carry no OS package surface and cannot inherit base-image CVEs. The trust store is Red Hat's 146 roots (#1445, #1692).

- The updated MinKMS server is rebuilt on Go 1.27 with refreshed dependencies.

---

## Security & Compliance

### Software Bill of Materials (SBOM)

- [SPDX JSON](sbom-RELEASE.2026-09-18T18-03-16Z.spdx.json)
- [CycloneDX JSON](sbom-RELEASE.2026-09-18T18-03-16Z.cyclonedx.json)
- [Go Modules](go-modules-RELEASE.2026-09-18T18-03-16Z.txt)

---

## Upgrade Instructions

For detailed upgrade instructions, please read: https://docs.min.io/aistor/upgrade-aistor-server/upgrade-aistor-kubernetes-helm/

Environment-specific upgrade guides:

- **Public registries**: https://docs.min.io/aistor/upgrade-aistor-server/upgrade-kubernetes-standard/
- **Private registries**: https://docs.min.io/aistor/upgrade-aistor-server/upgrade-kubernetes-private-registry/
- **Airgap**: https://docs.min.io/aistor/upgrade-aistor-server/upgrade-kubernetes-airgapped/

Chart, operator and sidecar images are only validated in the combination listed above. Only update single component versions when MinIO support asks for it.

Before upgrading, check for PolicyBinding resources still on the removed API version:

```bash
kubectl get policybindings.v1beta1.sts.min.io -A
grep -rl "sts.min.io/v1alpha1" <your manifest directory>
```

### New Configuration Options

| Variable | Default | Purpose |
| --- | --- | --- |
| `OPERATOR_HOTRELOAD` | unset (off) | `on` reloads `config.yaml` via SIGHUP instead of restarting MinIO |
| `OPERATOR_RESOLVE_IMAGE_DIGEST` | `on` | `off` skips the digest version probe and drops the pod-creation RBAC |

The `-license` flag is obsolete. It is still accepted so an existing deployment keeps starting, but the operator now reads the license from the `minio-license` secret through the API.

### Migration Notes

- Change any `sts.min.io/v1alpha1` PolicyBinding manifests to `sts.min.io/v1beta1`.
- **Upgrade the MinIO sidecar together with the operator.** Sidecars before `RELEASE.2026-09-18T00-46-19Z` exit on the `-hot-reload` flag this operator passes, leaving a crash loop. The new sidecar still works with older operators.
- With `OPERATOR_RESOLVE_IMAGE_DIGEST` on, the operator needs `create` and `get` on `pods` and `get` on `pods/log` in the object-store namespaces. Set it `off` if you cannot grant them.
- Review volume permissions and PodSecurity policies assuming the Sidekick init container runs as UID 1000.
- Plan downtime for the first tenant upgrade from an AIStor release older than `RELEASE.2025-12-20T04-58-37Z`.
- RDMA clients reaching the fabric address by IP fail hostname verification; operator-issued certificates carry DNS names only. Supply a certificate whose SANs cover those addresses.

### Support

For enterprise support:

- SUBNET Support: https://subnet.min.io
- Documentation: https://docs.min.io
