diff --git a/README.md b/README.md index 05b2d81..552d07b 100644 --- a/README.md +++ b/README.md @@ -265,11 +265,12 @@ You can enable to scrape Reloader's Prometheus metrics by setting `serviceMonito **Note:** Reloading of OpenShift (DeploymentConfig) and/or Argo Rollouts has to be enabled explicitly because it might not be always possible to use it on a cluster with restricted permissions. This can be done by changing the following parameters: -| Parameter | Description | Type | -| ---------------- |------------------------------------------------------------------------------| ------- | -| isOpenshift | Enable OpenShift DeploymentConfigs. Valid value are either `true` or `false` | boolean | -| isArgoRollouts | Enable Argo Rollouts. Valid value are either `true` or `false` | boolean | -| reloadOnCreate | Enable reload on create events. Valid value are either `true` or `false` | boolean | +| Parameter | Description | Type | +|------------------|--------------------------------------------------------------------------------------------------| ------- | +| isOpenshift | Enable OpenShift DeploymentConfigs. Valid value are either `true` or `false` | boolean | +| isArgoRollouts | Enable Argo Rollouts. Valid value are either `true` or `false` | boolean | +| reloadOnCreate | Enable reload on create events. Valid value are either `true` or `false` | boolean | +| syncAfterRestart | Enable sync after reloader restarts for **Add** events. Valid value are either `true` or `false` | boolean | **ReloadOnCreate** reloadOnCreate controls how Reloader handles secrets being added to the cache for the first time. If reloadOnCreate is set to true: * Configmaps/secrets being added to the cache will cause Reloader to perform a rolling update of the associated workload. diff --git a/deployments/kubernetes/chart/reloader/templates/deployment.yaml b/deployments/kubernetes/chart/reloader/templates/deployment.yaml index 97ca4c3..c789883 100644 --- a/deployments/kubernetes/chart/reloader/templates/deployment.yaml +++ b/deployments/kubernetes/chart/reloader/templates/deployment.yaml @@ -204,6 +204,9 @@ spec: {{- if eq .Values.reloader.reloadOnCreate true }} - "--reload-on-create={{ .Values.reloader.reloadOnCreate }}" {{- end }} + {{- if eq .Values.reloader.syncAfterRestart true }} + - "--sync-after-restart={{ .Values.reloader.syncAfterRestart }}" + {{- end }} {{- if ne .Values.reloader.reloadStrategy "default" }} - "--reload-strategy={{ .Values.reloader.reloadStrategy }}" {{- end }} diff --git a/deployments/kubernetes/chart/reloader/values.yaml b/deployments/kubernetes/chart/reloader/values.yaml index e67405b..17b1cdd 100644 --- a/deployments/kubernetes/chart/reloader/values.yaml +++ b/deployments/kubernetes/chart/reloader/values.yaml @@ -17,6 +17,7 @@ reloader: ignoreSecrets: false ignoreConfigMaps: false reloadOnCreate: false + syncAfterRestart: false reloadStrategy: default # Set to default, env-vars or annotations ignoreNamespaces: "" # Comma separated list of namespaces to ignore namespaceSelector: "" # Comma separated list of 'key:value' labels for namespaces selection diff --git a/internal/pkg/cmd/reloader.go b/internal/pkg/cmd/reloader.go index 8317e89..da0acae 100644 --- a/internal/pkg/cmd/reloader.go +++ b/internal/pkg/cmd/reloader.go @@ -44,6 +44,7 @@ func NewReloaderCommand() *cobra.Command { cmd.PersistentFlags().StringVar(&options.ReloadStrategy, constants.ReloadStrategyFlag, constants.EnvVarsReloadStrategy, "Specifies the desired reload strategy") cmd.PersistentFlags().StringVar(&options.ReloadOnCreate, "reload-on-create", "false", "Add support to watch create events") cmd.PersistentFlags().BoolVar(&options.EnableHA, "enable-ha", false, "Adds support for running multiple replicas via leadership election") + cmd.PersistentFlags().BoolVar(&options.SyncAfterRestart, "sync-after-restart", false, "Sync add events after reloader restarts") return cmd } diff --git a/internal/pkg/controller/controller.go b/internal/pkg/controller/controller.go index 49c3350..f1934ff 100644 --- a/internal/pkg/controller/controller.go +++ b/internal/pkg/controller/controller.go @@ -31,6 +31,7 @@ type Controller struct { queue workqueue.RateLimitingInterface informer cache.Controller namespace string + resource string ignoredNamespaces util.List collectors metrics.Collectors recorder record.EventRecorder @@ -38,17 +39,24 @@ type Controller struct { } // controllerInitialized flag determines whether controlled is being initialized -var controllerInitialized bool = false +var secretControllerInitialized bool = false +var configmapControllerInitialized bool = false // NewController for initializing a Controller func NewController( client kubernetes.Interface, resource string, namespace string, ignoredNamespaces []string, namespaceLabelSelector map[string]string, collectors metrics.Collectors) (*Controller, error) { + if options.SyncAfterRestart { + secretControllerInitialized = true + configmapControllerInitialized = true + } + c := Controller{ client: client, namespace: namespace, ignoredNamespaces: ignoredNamespaces, namespaceSelector: namespaceLabelSelector, + resource: resource, } eventBroadcaster := record.NewBroadcaster() eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{ @@ -77,7 +85,7 @@ func NewController( // Add function to add a new object to the queue in case of creating a resource func (c *Controller) Add(obj interface{}) { if options.ReloadOnCreate == "true" { - if !c.resourceInIgnoredNamespace(obj) && c.resourceInNamespaceSelector(obj) && controllerInitialized { + if !c.resourceInIgnoredNamespace(obj) && c.resourceInNamespaceSelector(obj) && secretControllerInitialized && configmapControllerInitialized { c.queue.Add(handler.ResourceCreatedHandler{ Resource: obj, Collectors: c.collectors, @@ -175,7 +183,11 @@ func (c *Controller) Run(threadiness int, stopCh chan struct{}) { func (c *Controller) runWorker() { // At this point the controller is fully initialized and we can start processing the resources - controllerInitialized = true + if c.resource == "secrets" { + secretControllerInitialized = true + } else if c.resource == "configMaps" { + configmapControllerInitialized = true + } for c.processNextItem() { } diff --git a/internal/pkg/options/flags.go b/internal/pkg/options/flags.go index d8d5164..54c75da 100644 --- a/internal/pkg/options/flags.go +++ b/internal/pkg/options/flags.go @@ -24,7 +24,8 @@ var ( // ReloadStrategy Specify the update strategy ReloadStrategy = constants.EnvVarsReloadStrategy // ReloadOnCreate Adds support to watch create events - ReloadOnCreate = "false" + ReloadOnCreate = "false" + SyncAfterRestart = false // EnableHA adds support for running multiple replicas via leadership election EnableHA = false )