PhoenixAI FE / CN run as StatefulSets, and a StatefulSet’s volumeClaimTemplates are immutable
after creation — so you cannot grow a component’s disk just by editing its size and re-applying.
This feature lets the operator do it for you: it expands the underlying PersistentVolumeClaims (PVCs)
in place, online, without deleting or recreating the StatefulSet or restarting the pods.
A StorageClass that supports expansion. The volumes you want to grow must use a StorageClass
with allowVolumeExpansion: true, and the CSI driver must support online resize. Check:
kubectl get storageclass <name> -o jsonpath='{.allowVolumeExpansion}{"\n"}' # must be true
The feature must be enabled on the operator (next section).
The feature is gated by a global operator switch (default false). Enable it via Helm:
# values.yaml
operator:
phoenixAIOperator:
enablePVCExpansion: true
The switch is global to the operator process and takes effect after the operator restarts; it cannot be toggled per cluster. While off, the operator behaves exactly as before (volume size changes are rejected by the Kubernetes API server).
Increase the storageSize of the relevant volume in your PhoenixAICluster (or PhoenixAIWarehouse)
and apply. For example, growing the CN data volume:
spec:
phoenixAICnSpec:
storageSpec:
name: cn
storageSize: 200Gi # was 100Gi
What the operator does:
<volume>-<statefulset>-<ordinal>, e.g. cn-data-<cluster>-cn-0);The StatefulSet’s
volumeClaimTemplatesintentionally stay at the original size — the PVC is the source of truth. This mismatch is expected and is not a bug.
This covers FE, CN, and the CN of a PhoenixAIWarehouse. (feProxy is stateless and has no volume.)
Expansion has two phases (block device, then filesystem). Watch the PVC:
kubectl get pvc -n <namespace>
kubectl describe pvc <pvc-name> -n <namespace> # conditions: Resizing / FileSystemResizePending
Expansion is complete when the PVC’s status.capacity reaches the requested size. The operator also
summarizes in-progress expansion on the component status:
kubectl get phoenixaicluster <name> -n <namespace> \
-o jsonpath='{.status.phoenixAICnStatus.reason}{"\n"}'
# e.g. "volume expansion in progress: cn-storage-data-...-cn-0 (expected 200Gi, current 100Gi, FileSystemResizePending)"
The reason clears automatically on the operator’s next periodic reconcile after every volume
has caught up — within about two minutes (the operator resyncs watched resources every 2 minutes; it
does not watch PVCs directly, so the summary is not refreshed the instant status.capacity catches
up). A reason that still shows an in-progress expansion is stale, not stuck, as long as the PVC
itself already reports the new capacity.
storageSize is smaller than the live
PVC (including the case where you previously expanded a PVC by hand), the operator does not shrink
it and the reconcile reports an error such as “PVC X is 200Gi but the CR requests 100Gi; the
operator does not shrink volumes — set the CR storageSize to at least 200Gi.” Fix it by setting the
CR storageSize to at least the current PVC size.storageClassName or accessModes on an existing volume is not
supported and is rejected. Adding a new volume to a cluster that already exists is likewise
rejected — a StatefulSet’s volume set is fixed at creation, so the operator cannot attach it.
(Removing a volume has no effect, for the same reason.) Only growing existing volumes is supported.storageClassName left unset means the cluster default StorageClass — that is fully supported.Some storage (e.g. older Azure Disk, vSphere) cannot expand while the volume is attached to a running
pod. There the PVC stays in FileSystemResizePending and status.capacity never catches up. The
operator does nothing destructive — it will not delete the pod or StatefulSet — so you must complete
the expansion with a planned, brief downtime of the affected component:
storageSize, confirm the PVC spec already shows the new size but
status.capacity is stuck.kubectl delete pod is not enough (the
StatefulSet re-attaches immediately). Scale the component (or that ordinal) down.status.capacity advances at the block level).status.capacity fully
catches up.The operator never intervenes during this process; it only reflects the PVC status.