Skip to content

feat: Add poll-based secret synchronization with configurable sync interval#167

Open
gouthamMN wants to merge 3 commits intokubernetes-sigs:mainfrom
gouthamMN:gniranjan/secretRotation
Open

feat: Add poll-based secret synchronization with configurable sync interval#167
gouthamMN wants to merge 3 commits intokubernetes-sigs:mainfrom
gouthamMN:gniranjan/secretRotation

Conversation

@gouthamMN
Copy link

What type of PR is this?
/kind feature

What this PR does / why we need it:
Adds support for automatic, periodic secret synchronization from external providers using a configurable sync interval. This enables secrets to be automatically updated when they change in the external secret store without requiring manual updates to the SecretSync resource.

Key Changes:

  • Added optional syncInterval field to SecretSyncSpec allowing users to configure polling frequency (e.g., "5m", "10m", "1h")
  • Implemented automatic requeuing in the controller with configurable interval
  • Added validation for sync interval with min (1m) and max (24h) constraints
  • Maintained backward compatibility - secrets without syncInterval continue to sync only on resource create/update (existing behavior)

Implementation Details:

  • Controller fetches secrets from provider on each reconciliation cycle
  • When syncInterval is set, controller requeues after the specified duration
  • Hash-based change detection ensures secrets are only updated when data changes
  • Status conditions and lastSuccessfulSyncTime are updated on each sync

Testing:

  • Added unit tests for sync interval validation and requeue logic
  • Added e2e test verifying secret creation with sync interval configured
  • All existing tests pass, confirming backward compatibility
  • Tested with minimum interval (1m) in e2e environment

Examples:

apiVersion: secret-sync.x-k8s.io/v1alpha1
kind: SecretSync
metadata:
  name: my-secret
spec:
  serviceAccountName: default
  secretProviderClassName: my-provider
  syncInterval: "10m"  # Poll every 10 minutes
  secretObject:
    type: Opaque
    data:
      - sourcePath: foo
        targetKey: bar

Related: Addresses user feedback for automatic secret rotation and updates without requiring CSI driver mounts or manual resource updates.

Signed-off-by: Goutham Niranjan goutham.mn034@gmail.com

…terval

Adds support for automatic, periodic secret synchronization from external
providers using a configurable sync interval. This enables secrets to be
automatically updated when they change in the external secret store without
requiring manual updates to the SecretSync resource.

Key Changes:
- Added optional `syncInterval` field to SecretSyncSpec allowing users to
  configure polling frequency (e.g., "5m", "10m", "1h")
- Implemented automatic requeuing in the controller with configurable interval
- Added validation for sync interval with min (1m) and max (24h) constraints
- Maintained backward compatibility - secrets without syncInterval continue
  to sync only on resource create/update (existing behavior)

Implementation Details:
- Controller fetches secrets from provider on each reconciliation cycle
- When syncInterval is set, controller requeues after the specified duration
- Hash-based change detection ensures secrets are only updated when data changes
- Status conditions and lastSuccessfulSyncTime are updated on each sync

Testing:
- Added unit tests for sync interval validation and requeue logic
- Added e2e test verifying secret creation with sync interval configured
- All existing tests pass, confirming backward compatibility
- Tested with minimum interval (1m) in e2e environment

Examples:
```yaml
apiVersion: secret-sync.x-k8s.io/v1alpha1
kind: SecretSync
metadata:
  name: my-secret
spec:
  serviceAccountName: default
  secretProviderClassName: my-provider
  syncInterval: "10m"  # Poll every 10 minutes
  secretObject:
    type: Opaque
    data:
      - sourcePath: foo
        targetKey: bar
```

Related: Addresses user feedback for automatic secret rotation and updates
without requiring CSI driver mounts or manual resource updates.

Signed-off-by: Goutham Niranjan goutham.mn034@gmail.com
@linux-foundation-easycla
Copy link

linux-foundation-easycla bot commented Dec 26, 2025

CLA Signed

The committers listed above are authorized under a signed CLA.

@k8s-ci-robot k8s-ci-robot added the needs-triage Indicates an issue or PR lacks a `triage/foo` label and requires one. label Dec 26, 2025
@k8s-ci-robot k8s-ci-robot requested review from aramase and enj December 26, 2025 17:49
@k8s-ci-robot
Copy link
Contributor

This issue is currently awaiting triage.

If secrets-store-sync-controller contributors determine this is a relevant issue, they will accept it by applying the triage/accepted label and provide further guidance.

The triage/accepted label can be added by org members by writing /triage accepted in a comment.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@k8s-ci-robot
Copy link
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: gouthamMN
Once this PR has been reviewed and has the lgtm label, please assign enj for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@k8s-ci-robot
Copy link
Contributor

Welcome @gouthamMN!

It looks like this is your first PR to kubernetes-sigs/secrets-store-sync-controller 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes-sigs/secrets-store-sync-controller has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robot
Copy link
Contributor

Hi @gouthamMN. Thanks for your PR.

I'm waiting for a github.com member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should join the org to skip this step.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@k8s-ci-robot k8s-ci-robot added needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. size/L Denotes a PR that changes 100-499 lines, ignoring generated files. cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. and removed cncf-cla: no Indicates the PR's author has not signed the CNCF CLA. labels Dec 26, 2025
@enj enj added this to SIG Auth Dec 27, 2025
@enj enj moved this to Subprojects - Needs Triage in SIG Auth Dec 27, 2025
- Sync intervals persist across controller crashes/restarts by checking
  LastSuccessfulSyncTime
- Failed condition retries continue to bypass interval (immediate retry)
- Hash changes (SPC/SS updates, force sync) continue to trigger immediate sync
- Periodic polling only syncs when configured interval has elapsed

Signed-off-by: Goutham Niranjan goutham.mn034@gmail.com
- Refactor the Reconcile function to reduce cyclomatic complexity from 37
to below the 30 threshold by extracting logic into helper functions
- Pass failedCondition by pointer to avoid heavy struct copying (96 bytes)
- Fix Helm chart templates to safely handle nil providerContainer values
  by splitting compound condition into nested checks
- Apply gofmt formatting to all affected files

Signed-off-by: Goutham Niranjan goutham.mn034@gmail.com
@gouthamMN
Copy link
Author

/triage accepted

@k8s-ci-robot
Copy link
Contributor

@gouthamMN: The label triage/accepted cannot be applied. Only GitHub organization members can add the label.

Details

In response to this:

/triage accepted

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

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

Labels

cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. needs-triage Indicates an issue or PR lacks a `triage/foo` label and requires one. size/L Denotes a PR that changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants