Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork606
A Kubernetes controller to watch changes in ConfigMap and Secrets and do rolling upgrades on Pods with their associated Deployment, StatefulSet, DaemonSet and DeploymentConfig – [✩Star] if you're using it!
License
stakater/Reloader
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Reloader is a Kubernetes controller that automatically triggers rollouts of workloads (like Deployments, StatefulSets, and more) whenever referencedSecrets orConfigMaps are updated.
In a traditional Kubernetes setup, updating aSecret orConfigMap does not automatically restart or redeploy your workloads. This can lead to stale configurations running in production, especially when dealing with dynamic values like credentials, feature flags, or environment configs.
Reloader bridges that gap by ensuring your workloads stay in sync with configuration changes — automatically and safely.
- ✅Zero manual restarts: No need to manually rollout workloads after config/secret changes.
- 🔒Secure by design: Ensure your apps always use the most up-to-date credentials or tokens.
- 🛠️Flexible: Works with all major workload types — Deployment, StatefulSet, Daemonset, ArgoRollout, and more.
- ⚡Fast feedback loop: Ideal for CI/CD pipelines where secrets/configs change frequently.
- 🔄Out-of-the-box integration: Just label your workloads and let Reloader do the rest.
flowchart LR ExternalSecret -->|Creates| Secret SealedSecret -->|Creates| Secret Certificate -->|Creates| Secret Secret -->|Watched by| Reloader ConfigMap -->|Watched by| Reloader Reloader -->|Triggers Rollout| Deployment Reloader -->|Triggers Rollout| DeploymentConfig Reloader -->|Triggers Rollout| Daemonset Reloader -->|Triggers Rollout| Statefulset Reloader -->|Triggers Rollout| ArgoRollout Reloader -->|Triggers Job| CronJob Reloader -->|Sends Notification| Slack,Teams,Webhook- Sources like
ExternalSecret,SealedSecret, orCertificatefromcert-managercan create or manage KubernetesSecrets— but they can also be created manually or delivered through GitOps workflows. SecretsandConfigMapsare watched by Reloader.- When changes are detected, Reloader automatically triggers a rollout of the associated workloads, ensuring your app always runs with the latest configuration.
Follow any of thisinstallation options.
To enable automatic reload for a Deployment:
apiVersion:apps/v1kind:Deploymentmetadata:name:my-appannotations:reloader.stakater.com/auto:"true"spec:template:metadata:labels:app:my-appspec:containers: -name:appimage:your-imageenvFrom: -configMapRef:name:my-config -secretRef:name:my-secret
This tells Reloader to watch theConfigMap andSecret referenced in this deployment. When either is updated, it will trigger a rollout.
Stakater offers an enterprise-grade version of Reloader with:
- SLA-backed support
- Certified images
- Private Slack support
Contactsales@stakater.com for info about Reloader Enterprise.
Reloader supports multiple annotation-based controls to let youcustomize when and how your Kubernetes workloads are reloaded upon changes inSecrets orConfigMaps.
Kubernetes does not trigger pod restarts when a referencedSecret orConfigMap is updated. Reloader bridges this gap by watching for changes and automatically performing rollouts — but it gives you full control via annotations, so you can:
- Reloadall resources by default
- Restrict reloads to onlySecrets or onlyConfigMaps
- Watch onlyspecific resources
- Useopt-in via tagging (
search+match) - Exclude workloads you don’t want to reload
Use these annotations to automatically restart the workload when referencedSecrets orConfigMaps change.
| Annotation | Description |
|---|---|
reloader.stakater.com/auto: "true" | Reloads workload when any referenced ConfigMap or Secret changes |
secret.reloader.stakater.com/auto: "true" | Reloads only when referenced Secret(s) change |
configmap.reloader.stakater.com/auto: "true" | Reloads only when referenced ConfigMap(s) change |
These annotations allow you to manually define which ConfigMaps or Secrets should trigger a reload, regardless of whether they're used in the pod spec.
| Annotation | Description |
|---|---|
secret.reloader.stakater.com/reload: "my-secret" | Reloads when specific Secret(s) change, regardless of how they're used |
configmap.reloader.stakater.com/reload: "my-config" | Reloads when specific ConfigMap(s) change, regardless of how they're used |
- ✅ This is useful in tightly scoped scenarios where config is shared but reloads are only relevant in certain cases.
- ✅ Use this when you know exactly which resource(s) matter and want to avoid auto-discovery or searching altogether.
This pattern allows fine-grained reload control — workloads only restart if the Secret/ConfigMap is both:
- Referenced by the workload
- Explicitly annotated with
match: true
| Annotation | Applies To | Description |
|---|---|---|
reloader.stakater.com/search: "true" | Workload | Enables search mode (only reloads if matching secrets/configMaps are found) |
reloader.stakater.com/match: "true" | ConfigMap/Secret | Marks the config/secret as eligible for reload in search mode |
- The workload must have:
reloader.stakater.com/search: "true" - The ConfigMap or Secret must have:
reloader.stakater.com/match: "true" - The resource (ConfigMap or Secret) must also be referenced in the workload (via env,
volumeMount, etc.)
- ✅ You want to reload a workload only if it references a ConfigMap or Secret that has been explicitly tagged with
reloader.stakater.com/match: "true". - ✅ Use this when you want full control over which shared or system-wide resources trigger reloads. Great in multi-tenant clusters or shared configs.
When you need to prevent specific ConfigMaps or Secrets from triggering any reloads, use the ignore annotation on the resource itself:
apiVersion:v1kind:ConfigMap# or Secretmetadata:name:my-configannotations:reloader.stakater.com/ignore:"true"
This instructs Reloader to skip all reload logic for that resource across all workloads.
By default, Reloader uses therollout strategy — it updates the pod template to trigger a new rollout. This works well in most cases, but it can cause problems if you're using GitOps tools like ArgoCD, which detect this as configuration drift.
To avoid that, you can switch to therestart strategy, which simply restarts the pod without changing the pod template.
metadata:annotations:reloader.stakater.com/rollout-strategy:"restart"
| Value | Behavior |
|---|---|
rollout (default) | Updates pod template metadata to trigger a rollout |
restart | Deletes the pod to restart it without patching the template |
✅ Userestart if:
- You're using GitOps and want to avoid drift
- You want a quick restart without changing the workload spec
- Your platform restricts metadata changes
reloader.stakater.com/autoandreloader.stakater.com/searchcannot be used together — theautoannotation takes precedence.- If both
autoand its typed versions (secret.reloader.stakater.com/auto,configmap.reloader.stakater.com/auto) are used,only one needs to be true to trigger a reload. - Setting
reloader.stakater.com/auto: "false"explicitly disables reload for that workload. - If
--auto-reload-allis enabled on the controller:- All workloads are treated as if they have
auto: "true"unless they explicitly set it to"false". - Missing or unrecognized annotation values are treated as
"false".
- All workloads are treated as if they have
Reloader can optionallysend alerts whenever it triggers a rolling upgrade for a workload (e.g.,Deployment,StatefulSet, etc.).
These alerts are sent to a configuredwebhook endpoint, which can be a generic receiver or services like Slack, Microsoft Teams or Google Chat.
To enable this feature, update thereloader.env.secret section in yourvalues.yaml (when installing via Helm):
reloader:env:secret:ALERT_ON_RELOAD:"true"# Enable alerting (default: false)ALERT_SINK:"slack"# Options: slack, teams, gchat or webhook (default: webhook)ALERT_WEBHOOK_URL:"<your-webhook-url>"# Required if ALERT_ON_RELOAD is trueALERT_ADDITIONAL_INFO:"Triggered by Reloader in staging environment"
This feature allows you to pause rollouts for a deployment for a specified duration, helping to prevent multiple restarts when several ConfigMaps or Secrets are updated in quick succession.
| Annotation | Applies To | Description |
|---|---|---|
deployment.reloader.stakater.com/pause-period: "5m" | Deployment | Pauses reloads for the specified period (e.g.,5m,1h) |
- Add the
deployment.reloader.stakater.com/pause-periodannotation to your Deployment, specifying the pause duration (e.g.,"5m"for five minutes). - When a watched ConfigMap or Secret changes, Reloader will still trigger a reload event, but if the deployment is paused, the rollout will have no effect until the pause period has elapsed.
- This avoids repeated restarts if multiple resources are updated close together.
- ✅ Your deployment references multiple ConfigMaps or Secrets that may be updated at the same time.
- ✅ You want to minimize unnecessary rollouts and reduce downtime caused by back-to-back configuration changes.
Reloader can be installed in multiple ways depending on your Kubernetes setup and preference. Below are the supported methods:
helm repo add stakater https://stakater.github.io/stakater-chartshelm repo updatehelm install reloader stakater/reloader
➡️ See full Helm configuration in thechart README.
Apply raw Kubernetes manifests directly:
kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml
Use the built-in Kustomize support:
kubectl apply -k https://github.com/stakater/Reloader/deployments/kubernetes
You can create your ownkustomization.yaml and use Reloader’s as a base:
apiVersion:kustomize.config.k8s.io/v1beta1kind:Kustomizationresources: -https://github.com/stakater/Reloader/deployments/kubernetesnamespace:reloader
By default, Reloader is deployed with the following resource requests and limits:
resources:limits:cpu:150mmemory:512Mirequests:cpu:10mmemory:128Mi
These flags let you customize Reloader's behavior globally, at the Reloader controller level.
| Flag | Description |
|---|---|
--reload-on-create=true | Reload workloads when a watched ConfigMap or Secret is created |
--reload-on-delete=true | Reload workloads when a watched ConfigMap or Secret is deleted |
--auto-reload-all=true | Automatically reload all workloads unless opted out (auto: "false") |
--reload-strategy=env-vars | Strategy to use for triggering reload (env-vars orannotations) |
--log-format=json | Enable JSON-formatted logs for better machine readability |
Reloader supports multiple strategies for triggering rolling updates when a watchedConfigMap orSecret changes. You can configure the strategy using the--reload-strategy flag.
| Strategy | Description |
|---|---|
env-vars (default) | Adds a dummy environment variable to any container referencing the changed resource (e.g.,Deployment,StatefulSet, etc.). This forces Kubernetes to perform a rolling update. |
annotations | Adds areloader.stakater.com/last-reloaded-from annotation to the pod template metadata. Ideal for GitOps tools like ArgoCD, as it avoids triggering unwanted sync diffs. |
- The
env-varsstrategy is the default and works in most setups. - The
annotationsstrategy is preferred inGitOps environments to prevent config drift in tools like ArgoCD or Flux. - In
annotationsmode, aConfigMaporSecretthat is deleted and re-created will still trigger a reload (since previous state is not tracked).
| Flag | Description |
|---|---|
--resources-to-ignore=configmaps | Ignore ConfigMaps (only one type can be ignored at a time) |
--resources-to-ignore=secrets | Ignore Secrets (cannot combine with configMaps) |
--ignored-workload-types=jobs,cronjobs | Ignore specific workload types from reload monitoring |
--resource-label-selector=key=value | Only watch ConfigMaps/Secrets with matching labels |
⚠️ Note:Onlyone resource type can be ignored at a time.Trying to ignoreboth
configmapsandsecretswill cause an error in Reloader.✅Workaround: Scale the Reloader deployment to0replicas if you want to disable it completely.
💡 Workload Type Examples:
# Ignore only Jobs--ignored-workload-types=jobs# Ignore only CronJobs--ignored-workload-types=cronjobs# Ignore both (comma-separated)--ignored-workload-types=jobs,cronjobs
🔧 Use Case: Ignoring workload types is useful when you don't want certain types of workloads to be automatically reloaded.
| Flag | Description |
|---|---|
--namespace-selector='key=value'--namespace-selector='key1=value1,key2=value2'--namespace-selector='key in (value1,value2)' | Watch only namespaces with matching labels. SeeLIST and WATCH filtering for more details on label selectors |
--namespaces-to-ignore=ns1,ns2 | Skip specific namespaces from being watched |
These flags allow you to redefine annotation keys used in your workloads or resources:
| Flag | Overrides |
|---|---|
--auto-annotation | Overridesreloader.stakater.com/auto |
--secret-auto-annotation | Overridessecret.reloader.stakater.com/auto |
--configmap-auto-annotation | Overridesconfigmap.reloader.stakater.com/auto |
--auto-search-annotation | Overridesreloader.stakater.com/search |
--search-match-annotation | Overridesreloader.stakater.com/match |
--secret-annotation | Overridessecret.reloader.stakater.com/reload |
--configmap-annotation | Overridesconfigmap.reloader.stakater.com/reload |
--pause-deployment-annotation | Overridesdeployment.reloader.stakater.com/pause-period |
--pause-deployment-time-annotation | Overridesdeployment.reloader.stakater.com/paused-at |
| Flag | Description |
|---|---|
--enable-pprof | Enablespprof for profiling |
--pprof-addr | Address to startpprof server on. Default is:6060 |
Reloader is compatible with Kubernetes >= 1.19
The Reloader documentation can be viewed fromthe doc site. The doc source is in thedocs folder.
File a GitHubissue.
Join and talk to us on Slack for discussing Reloader:
Please use theissue tracker to report any bugs or file feature requests.
- Deploy Reloader
- Run
okteto upto activate your development container make build./Reloader
PRs are welcome. In general, we follow the "fork-and-pull" Git workflow:
- Fork the repo on GitHub
- Clone the project to your own machine
- Commit changes to your own branch
- Push your work back up to your fork
- Submit aPull request so that we can review your changes
NOTE: Be sure to merge the latest from "upstream" before making a pull request!
Repository GitHub releases: As requested by the community inissue 685, Reloader is now based on a manual release process. Releases are no longer done on every merged PR to the main branch, but manually on request.
To make a GitHub release:
- Code owners create a release branch
release-vX.Y.Zfrommaster - Code owners runInit Release workflow to automatically generate version and manifests on the release branch
- Set the
TARGET_BRANCHparameter to release branch i.e.release-vX.Y.Z - Set the
TARGET_VERSIONto release version without 'v' i.e.X.Y.Z
- Set the
- A PR is created to bump the image version on the release branch, example:PR-798
- Code owners create a GitHub release with tag
vX.Y.Zand target branchrelease-vX.Y.Z, which triggers creation of images - Code owners create another branch from
masterand bump the helm chart version as well as Reloader image version.- Code owners create a PR with
release/helm-chartlabel, example:PR-846
- Code owners create a PR with
Repository git tagging: Push to the main branch will create a merge-image and merge-tag namedmerge-${{ github.event.number }}, for examplemerge-800 when pull request number 800 is merged.
View thereleases page to see what has changed in each release.
Apache2 ©Stakater
Reloader is maintained byStakater. Like it? Please let us know athello@stakater.com
Seeour other projects or contact us in case of professional services and queries onhello@stakater.com
About
A Kubernetes controller to watch changes in ConfigMap and Secrets and do rolling upgrades on Pods with their associated Deployment, StatefulSet, DaemonSet and DeploymentConfig – [✩Star] if you're using it!
Topics
Resources
License
Code of conduct
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.



