Skip to content

K8SPG-864: add sidecarPVCs and sidecarVolumes#1394

Open
pooknull wants to merge 13 commits intomainfrom
K8SPG-864
Open

K8SPG-864: add sidecarPVCs and sidecarVolumes#1394
pooknull wants to merge 13 commits intomainfrom
K8SPG-864

Conversation

@pooknull
Copy link
Contributor

@pooknull pooknull commented Jan 8, 2026

K8SPG-864 Powered by Pull Request Badge

https://perconadev.atlassian.net/browse/K8SPG-864

DESCRIPTION

This PR adds the following fields to the cr.yaml:

  • .spec.instances[].sidecarPVCs
  • .spec.instances[].sidecarVolumes
  • .spec.proxy.pgBouncer.sidecarPVCs
  • .spec.proxy.pgBouncer.sidecarVolumes
  • .spec.backups.pgbackrest.repoHost.sidecarPVCs
  • .spec.backups.pgbackrest.repoHost.sidecarVolumes

The sidecarPVCs field defines PersistentVolumeClaims that should be created and associated with a specific resource. Example:

sidecarPVCs:
- name: sidecar-volume-claim
  spec:
    resources:
      requests:
        storage: 1Gi
    volumeMode: Filesystem
    accessModes:
      - ReadWriteOnce

The sidecarVolumes field defines volumes that should be attached to a specific resource. Example:

sidecarVolumes:
- name: sidecar-secret
  secret:
    secretName: mysecret
- name: sidecar-config
  configMap:
    name: myconfigmap
- name: backup-nfs
  nfs:
    server: "nfs-service.storage.svc.cluster.local"
    path: "/pg-some-name"

Helm PR: percona/percona-helm-charts#783

CHECKLIST

Jira

  • Is the Jira ticket created and referenced properly?
  • Does the Jira ticket have the proper statuses for documentation (Needs Doc) and QA (Needs QA)?
  • Does the Jira ticket link to the proper milestone (Fix Version field)?

Tests

  • Is an E2E test/test case added for the new feature/change?
  • Are unit tests added where appropriate?

Config/Logging/Testability

  • Are all needed new/changed options added to default YAML files?
  • Are all needed new/changed options added to the Helm Chart?
  • Did we add proper logging messages for operator actions?
  • Did we ensure compatibility with the previous version or cluster upgrade process?
  • Does the change support oldest and newest supported PG version?
  • Does the change support oldest and newest supported Kubernetes version?

@pooknull pooknull marked this pull request as ready for review January 13, 2026 09:50
Comment on lines 1259 to 1266
if cluster.CompareVersion("2.9.0") >= 0 {
for _, p := range spec.SidecarPVCs {
instance.Spec.VolumeClaimTemplates = append(instance.Spec.VolumeClaimTemplates, corev1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{Name: p.Name},
Spec: p.Spec,
})
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this mean that users can only add sidecar PVCs while creating clusters? i guess we had the same limitation in other operators.

Comment on lines 51 to 53
if err := cl.Create(ctx, pvc); err != nil {
return errors.Wrapf(err, "create PVC %s", client.ObjectKeyFromObject(pvc).String())
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

but if we are creating PVCs ourselves why don't we just add them into statefulset volumes so they can also be added after cluster creation?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, i now realized we're doing this only for pgbouncer because it's a deployment. but if we do this for all, we'd overcome the limitation of adding sidecar pvcs after creation

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i don't think we should downgrade

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pooknull pooknull requested a review from egegunes February 10, 2026 11:56
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why this was deleted?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines 45 to 48
pvc := new(corev1.PersistentVolumeClaim)
pvc.Name = sidecarPVC.Name
pvc.Namespace = namespace
pvc.Spec = sidecarPVC.Spec
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we have some sort of labels added here so that we know that these pvcs are created by the operator?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

err := cl.Get(ctx, client.ObjectKeyFromObject(pvc), &corev1.PersistentVolumeClaim{})
if err == nil {
// already exists
continue
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What should happen if the pvcs are updated in terms of specs? should we update them of skip?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gkech
Copy link
Contributor

gkech commented Feb 11, 2026

let's check also why unit tests are failing on this pr

Run make check
REGISTRY_NAME is not set
Updated IMAGE to: docker.io/perconalab/percona-postgresql-operator:head
docker.io/perconalab/percona-postgresql-operator:head
git -C 'hack/tools/' clone https://github.com/CrunchyData/pgmonitor.git || git -C 'hack/tools/pgmonitor' fetch origin
fatal: cannot change to 'hack/tools/': No such file or directory
fatal: cannot change to 'hack/tools/pgmonitor': No such file or directory
make: *** [Makefile:49: get-pgmonitor] Error 128
Error: Process completed with exit code 2.

@egegunes egegunes added this to the v2.9.0 milestone Feb 12, 2026
Copilot AI review requested due to automatic review settings February 13, 2026 12:23
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds support for configuring extra volumes and operator-managed PVCs for sidecar containers across instance pods, pgBouncer, and pgBackRest repoHost, along with the necessary API/plumbing, RBAC, and tests.

Changes:

  • Extend CRDs/types with sidecarVolumes and sidecarPVCs for instances, pgBouncer, and pgBackRest repoHost.
  • Reconcile pod specs to mount the configured sidecar volumes/PVCs, and add a controller reconciler to create/update the defined PVCs.
  • Update RBAC and sidecar-related unit/E2E tests to cover the new fields.

Reviewed changes

Copilot reviewed 20 out of 28 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
pkg/apis/postgres-operator.crunchydata.com/v1beta1/zz_generated.deepcopy.go Deepcopy updates for new fields and new SidecarPVC type.
pkg/apis/postgres-operator.crunchydata.com/v1beta1/postgrescluster_types.go Adds sidecarVolumes/sidecarPVCs to instance set spec + defines SidecarPVC.
pkg/apis/postgres-operator.crunchydata.com/v1beta1/pgbouncer_types.go Adds sidecarVolumes/sidecarPVCs to pgBouncer pod spec.
pkg/apis/postgres-operator.crunchydata.com/v1beta1/pgbackrest_types.go Adds sidecarVolumes/sidecarPVCs to pgBackRest repoHost spec.
pkg/apis/pgv2.percona.com/v2/zz_generated.deepcopy.go Deepcopy updates for new Percona API fields.
pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go Adds Percona-level fields and maps them through ToCrunchy().
percona/controller/pgcluster/pvc.go New reconciler to create/update PVCs declared via sidecarPVCs.
percona/controller/pgcluster/controller_test.go Extends sidecar tests to assert volumes + PVC-backed volumes are present.
percona/controller/pgcluster/controller.go Calls PVC reconciler and adds PVC RBAC marker.
internal/postgres/reconcile.go Adds sidecarVolumes to instance pods (version-gated).
internal/pgbouncer/reconcile.go Adds sidecarVolumes and PVC-backed volumes to pgBouncer pod spec (version-gated).
internal/controller/postgrescluster/pgbackrest.go Adds sidecarVolumes and PVC-backed volumes to repoHost pod template (version-gated).
internal/controller/postgrescluster/instance.go Adds PVC-backed volumes to instance StatefulSet pod template (version-gated).
e2e-tests/tests/sidecars/01-create-cluster.yaml Sets sidecarVolumes/sidecarPVCs fields in the sidecars E2E test.
e2e-tests/tests/sidecars/01-assert.yaml Adds assertions for PVC creation/binding in the sidecars E2E test.
deploy/rbac.yaml Grants PVC verbs in deployment RBAC.
deploy/cw-rbac.yaml Same RBAC updates for cw deployment.
config/rbac/namespace/role.yaml Grants PVC verbs in generated namespace Role.
config/rbac/cluster/role.yaml Grants PVC verbs in generated cluster Role.
Makefile Minor formatting/line fix in after-release target.

Comment on lines +70 to +72
// K8SPG-864
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// K8SPG-864
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These new API fields are declared with omitempty but are missing the // +optional marker that is used throughout this API type for optional fields. Add // +optional so CRD generation/markers remain consistent with surrounding fields.

Suggested change
// K8SPG-864
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// K8SPG-864
// K8SPG-864
// +optional
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// K8SPG-864
// +optional

Copilot uses AI. Check for mistakes.
Comment on lines 806 to +807

SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These newly added spec fields don't have the // +optional marker used for other optional fields in this API type. Add // +optional to keep CRD generation/markers consistent and make intent explicit.

Suggested change
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// +optional
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// +optional

Copilot uses AI. Check for mistakes.
if err := cl.Create(ctx, pvc); err != nil {
return errors.Wrap(err, "failed to create pvc")
}
return nil
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ensureSidecarPVCs exits the whole function after creating the first missing PVC (return nil inside the loop). This prevents creation/update of any subsequent PVCs in the same pvcs slice during the same reconcile. Replace the early return with continue (or restructure) so the loop processes all entries and the function returns nil only after finishing.

Suggested change
return nil
continue

Copilot uses AI. Check for mistakes.
Comment on lines +1258 to +1270
// K8SPG-864
if cluster.CompareVersion("2.9.0") >= 0 {
for _, v := range spec.SidecarPVCs {
instance.Spec.Template.Spec.Volumes = append(instance.Spec.Template.Spec.Volumes, corev1.Volume{
Name: v.Name,
VolumeSource: corev1.VolumeSource{
PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{
ClaimName: v.Name,
},
},
})
}
}
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instance SidecarPVC volumes are added based only on CR version, not the same feature gate used for instance sidecars (feature.InstanceSidecars) and not conditioned on sidecars actually being configured. Consider gating this block consistently (and/or only adding PVC volumes when sidecars are enabled) to avoid creating unused volumes and to match how SidecarVolumes are handled.

Copilot uses AI. Check for mistakes.
Comment on lines +271 to +273
// K8SPG-864
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// K8SPG-864
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These new API fields are declared with omitempty but are missing the // +optional marker that is used throughout this API type for optional fields. Add // +optional so CRD generation/markers remain consistent with surrounding fields.

Suggested change
// K8SPG-864
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// K8SPG-864
// K8SPG-864
// +optional
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// K8SPG-864
// +optional

Copilot uses AI. Check for mistakes.
Comment on lines 1003 to +1004

SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These newly added spec fields don't have the // +optional marker used for other optional fields in this API type. Add // +optional to keep CRD generation/markers consistent and make intent explicit.

Suggested change
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// +optional
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// +optional

Copilot uses AI. Check for mistakes.
Comment on lines +99 to +105
return err
}
maps.Copy(pvc.Labels, ls)

// It's only allowed to update resources.requests and volumeAttributesClassName
pvc.Spec.Resources.Requests = sidecarPVC.Spec.Resources.Requests
pvc.Spec.VolumeAttributesClassName = sidecarPVC.Spec.VolumeAttributesClassName
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maps.Copy(pvc.Labels, ls) will panic if pvc.Labels is nil (possible for existing PVCs created without labels or with labels cleared). Initialize pvc.Labels to an empty map before copying/merging labels.

Copilot uses AI. Check for mistakes.
// +kubebuilder:rbac:groups=pgv2.percona.com,resources=perconapgclusters/finalizers,verbs=update
// +kubebuilder:rbac:groups=batch,resources=jobs,verbs=create;list;update
// +kubebuilder:rbac:groups="",resources="pods",verbs=create;delete
// +kubebuilder:rbac:groups="",resources="persistentvolumeclaims",verbs=create;update
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The kubebuilder RBAC marker for PersistentVolumeClaims only grants create/update, but the reconciler also does Get (and controller-runtime typically needs list/watch for caching). Update the marker to include at least get;list;watch;create;update (and patch if used) so generated RBAC matches the controller behavior.

Suggested change
// +kubebuilder:rbac:groups="",resources="persistentvolumeclaims",verbs=create;update
// +kubebuilder:rbac:groups="",resources="persistentvolumeclaims",verbs=get;list;watch;create;update

Copilot uses AI. Check for mistakes.
postgres-operator.crunchydata.com/cluster: sidecars
postgres-operator.crunchydata.com/pgbackrest: ""
postgres-operator.crunchydata.com/pgbackrest-dedicated: ""
name: sidecar-repohost-claim-sidecars-repo-host-0
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The asserted PVC name here (sidecar-repohost-claim-sidecars-repo-host-0) does not match the PVC name configured in the test setup (sidecar-repohost-claim) nor the controller logic which creates/uses PVCs by the provided name. This is likely to make the e2e test flaky/failing; align the expected name with the actual PVC name that will be created/mounted.

Suggested change
name: sidecar-repohost-claim-sidecars-repo-host-0
name: sidecar-repohost-claim

Copilot uses AI. Check for mistakes.
Comment on lines +494 to +496
// K8SPG-864
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// K8SPG-864
Copy link

Copilot AI Feb 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These new API fields are declared with omitempty but are missing the // +optional marker that is used throughout this API type for optional fields. Add // +optional so CRD generation/markers remain consistent with surrounding fields.

Suggested change
// K8SPG-864
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// K8SPG-864
// K8SPG-864
// +optional
SidecarVolumes []corev1.Volume `json:"sidecarVolumes,omitempty"`
// K8SPG-864
// +optional

Copilot uses AI. Check for mistakes.
@JNKPercona
Copy link
Collaborator

Test Name Result Time
backup-enable-disable passed 00:00:00
builtin-extensions passed 00:00:00
custom-envs passed 00:00:00
custom-extensions passed 00:00:00
custom-tls passed 00:00:00
database-init-sql passed 00:00:00
demand-backup passed 00:00:00
finalizers passed 00:00:00
init-deploy passed 00:00:00
huge-pages passed 00:00:00
monitoring passed 00:00:00
monitoring-pmm3 passed 00:00:00
one-pod passed 00:00:00
operator-self-healing passed 00:00:00
pitr passed 00:00:00
scaling passed 00:00:00
scheduled-backup passed 00:00:00
self-healing passed 00:00:00
sidecars failure 00:04:29
standby-pgbackrest passed 00:00:00
standby-streaming passed 00:00:00
start-from-backup passed 00:00:00
tablespaces passed 00:00:00
telemetry-transfer passed 00:00:00
upgrade-consistency passed 00:00:00
upgrade-minor passed 00:00:00
users passed 00:00:00
Summary Value
Tests Run 27/27
Job Duration 00:23:02
Total Test Time 00:04:29

commit: 608e287
image: perconalab/percona-postgresql-operator:PR-1394-608e2878a

Copy link
Collaborator

@hors hors left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pooknull please check sidecars test

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants