From bc0e23906cc4ce79e6f5fa7cfd632852fa6b1edc Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Mon, 23 Mar 2026 17:11:38 +0100 Subject: [PATCH 1/4] feat: Implement annotation restarter.stackable.tech/ignore --- Cargo.nix | 18 +++++++-------- crate-hashes.json | 18 +++++++-------- .../src/restart_controller/statefulset.rs | 22 ++++++++++++++----- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/Cargo.nix b/Cargo.nix index c6cadaa..46246bf 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -4801,7 +4801,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "8425ce312cfadcc49c157bada79cac04c3ad5229"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; + sha256 = "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3"; }; libName = "k8s_version"; authors = [ @@ -9293,7 +9293,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "8425ce312cfadcc49c157bada79cac04c3ad5229"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; + sha256 = "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3"; }; libName = "stackable_certs"; authors = [ @@ -9479,7 +9479,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "8425ce312cfadcc49c157bada79cac04c3ad5229"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; + sha256 = "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3"; }; libName = "stackable_operator"; authors = [ @@ -9651,7 +9651,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "8425ce312cfadcc49c157bada79cac04c3ad5229"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; + sha256 = "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3"; }; procMacro = true; libName = "stackable_operator_derive"; @@ -9686,7 +9686,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "8425ce312cfadcc49c157bada79cac04c3ad5229"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; + sha256 = "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3"; }; libName = "stackable_shared"; authors = [ @@ -9767,7 +9767,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "8425ce312cfadcc49c157bada79cac04c3ad5229"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; + sha256 = "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3"; }; libName = "stackable_telemetry"; authors = [ @@ -9877,7 +9877,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "8425ce312cfadcc49c157bada79cac04c3ad5229"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; + sha256 = "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3"; }; libName = "stackable_versioned"; authors = [ @@ -9921,7 +9921,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "8425ce312cfadcc49c157bada79cac04c3ad5229"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; + sha256 = "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3"; }; procMacro = true; libName = "stackable_versioned_macros"; @@ -9989,7 +9989,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "8425ce312cfadcc49c157bada79cac04c3ad5229"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; + sha256 = "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3"; }; libName = "stackable_webhook"; authors = [ diff --git a/crate-hashes.json b/crate-hashes.json index 6839c8b..2bebff2 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -4,14 +4,14 @@ "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube-derive@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube-runtime@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#k8s-version@0.1.3": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-certs@0.4.0": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-operator-derive@0.3.1": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-operator@0.107.1": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-shared@0.1.0": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-telemetry@0.6.2": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-versioned-macros@0.8.3": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-versioned@0.8.3": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-webhook@0.9.0": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#k8s-version@0.1.3": "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-certs@0.4.0": "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-operator-derive@0.3.1": "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-operator@0.107.1": "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-shared@0.1.0": "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-telemetry@0.6.2": "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-versioned-macros@0.8.3": "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-versioned@0.8.3": "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.107.1#stackable-webhook@0.9.0": "08ahxagis53c7bxnj53xgzv5l619av1lwfc67cswrsp2wcakzns3", "git+https://github.com/stackabletech/product-config.git?tag=0.8.0#product-config@0.8.0": "1dz70kapm2wdqcr7ndyjji0lhsl98bsq95gnb2lw487wf6yr7987" } \ No newline at end of file diff --git a/rust/operator-binary/src/restart_controller/statefulset.rs b/rust/operator-binary/src/restart_controller/statefulset.rs index 2cbdd92..149a975 100644 --- a/rust/operator-binary/src/restart_controller/statefulset.rs +++ b/rust/operator-binary/src/restart_controller/statefulset.rs @@ -278,7 +278,13 @@ pub async fn get_updated_restarter_annotations( format!( "{}/{}", cm.metadata.uid.as_ref()?, - cm.metadata.resource_version.as_ref()? + if cm.annotations().get("restarter.stackable.tech/ignore") + == Some(&"true".to_owned()) + { + "any" + } else { + cm.metadata.resource_version.as_ref()? + } ), )) })); @@ -308,16 +314,22 @@ pub async fn get_updated_restarter_annotations( annotations.extend( secret_refs .flat_map(|secret_ref| secrets.get(&secret_ref)) - .flat_map(|cm| { + .flat_map(|secret| { Some(( format!( "secret.restarter.stackable.tech/{}", - cm.metadata.name.as_ref()? + secret.metadata.name.as_ref()? ), format!( "{}/{}", - cm.metadata.uid.as_ref()?, - cm.metadata.resource_version.as_ref()? + secret.metadata.uid.as_ref()?, + if secret.annotations().get("restarter.stackable.tech/ignore") + == Some(&"true".to_owned()) + { + "any" + } else { + secret.metadata.resource_version.as_ref()? + } ), )) }), From dc5a83e00e83bfd1eabfb47d141e02180a81822c Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Wed, 1 Apr 2026 11:15:15 +0200 Subject: [PATCH 2/4] test(restarter): Test annotation restarter.stackable.tech/ignore --- .../templates/kuttl/restarter/10-assert.yaml | 4 +- .../restarter/10-create-test-resources.yaml | 93 +++++++++++++++++++ tests/templates/kuttl/restarter/10-sleep.yaml | 44 --------- .../templates/kuttl/restarter/20-assert.yaml | 14 ++- .../kuttl/restarter/20-hot-reload.yaml | 14 +++ .../kuttl/restarter/20-update-cm.yaml | 7 -- .../templates/kuttl/restarter/21-assert.yaml | 16 ++++ .../kuttl/restarter/21-trigger-restart.yaml | 14 +++ .../templates/kuttl/restarter/test-script.sh | 25 +++++ 9 files changed, 177 insertions(+), 54 deletions(-) create mode 100644 tests/templates/kuttl/restarter/10-create-test-resources.yaml delete mode 100644 tests/templates/kuttl/restarter/10-sleep.yaml create mode 100644 tests/templates/kuttl/restarter/20-hot-reload.yaml delete mode 100644 tests/templates/kuttl/restarter/20-update-cm.yaml create mode 100644 tests/templates/kuttl/restarter/21-assert.yaml create mode 100644 tests/templates/kuttl/restarter/21-trigger-restart.yaml create mode 100644 tests/templates/kuttl/restarter/test-script.sh diff --git a/tests/templates/kuttl/restarter/10-assert.yaml b/tests/templates/kuttl/restarter/10-assert.yaml index 8926a3d..dbf238f 100644 --- a/tests/templates/kuttl/restarter/10-assert.yaml +++ b/tests/templates/kuttl/restarter/10-assert.yaml @@ -1,12 +1,12 @@ --- apiVersion: kuttl.dev/v1beta1 kind: TestAssert -timeout: 30 +timeout: 120 --- apiVersion: apps/v1 kind: StatefulSet metadata: - name: sleep + name: test status: readyReplicas: 1 replicas: 1 diff --git a/tests/templates/kuttl/restarter/10-create-test-resources.yaml b/tests/templates/kuttl/restarter/10-create-test-resources.yaml new file mode 100644 index 0000000..87eef0b --- /dev/null +++ b/tests/templates/kuttl/restarter/10-create-test-resources.yaml @@ -0,0 +1,93 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: configmap-not-ignored +data: + revision: "1" +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-not-ignored +stringData: + revision: "1" +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: configmap-ignored + annotations: + restarter.stackable.tech/ignore: "true" +data: + revision: "1" +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-ignored + annotations: + restarter.stackable.tech/ignore: "true" +stringData: + revision: "1" +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: test + labels: + restarter.stackable.tech/enabled: "true" +spec: + selector: + matchLabels: + app: test + serviceName: test + replicas: 1 + template: + metadata: + labels: + app: test + spec: + serviceAccount: integration-tests-sa + volumes: + - name: configmap-not-ignored + configMap: + name: configmap-not-ignored + - name: secret-not-ignored + secret: + secretName: secret-not-ignored + - name: configmap-ignored + configMap: + name: configmap-ignored + - name: secret-ignored + secret: + secretName: secret-ignored + containers: + - name: test + image: alpine + command: + - sleep + args: + - infinity + volumeMounts: + - mountPath: /config/configmap-not-ignored-subpath/revision + name: configmap-not-ignored + # Use a subPath, so that changes are only visible after a restart. + subPath: revision + - mountPath: /config/secret-not-ignored-subpath/revision + name: secret-not-ignored + # Use a subPath, so that changes are only visible after a restart. + subPath: revision + - mountPath: /config/configmap-ignored + name: configmap-ignored + - mountPath: /config/secret-ignored + name: secret-ignored + - mountPath: /config/configmap-ignored-subpath/revision + name: configmap-ignored + # Use a subPath, so that changes are only visible after a restart. + subPath: revision + - mountPath: /config/secret-ignored-subpath/revision + name: secret-ignored + # Use a subPath, so that changes are only visible after a restart. + subPath: revision + terminationGracePeriodSeconds: 5 diff --git a/tests/templates/kuttl/restarter/10-sleep.yaml b/tests/templates/kuttl/restarter/10-sleep.yaml deleted file mode 100644 index 4d592f6..0000000 --- a/tests/templates/kuttl/restarter/10-sleep.yaml +++ /dev/null @@ -1,44 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: sleep -data: - property: value ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: sleep - labels: - restarter.stackable.tech/enabled: "true" -spec: - selector: - matchLabels: - app: sleep - serviceName: "sleep" - replicas: 1 - template: - metadata: - labels: - app: sleep - spec: - serviceAccount: integration-tests-sa - volumes: - - name: config - configMap: - name: sleep - items: - - key: property - path: property - containers: - - name: sleep - image: alpine - command: - - sleep - args: - - infinity - volumeMounts: - - name: config - mountPath: /config - terminationGracePeriodSeconds: 5 diff --git a/tests/templates/kuttl/restarter/20-assert.yaml b/tests/templates/kuttl/restarter/20-assert.yaml index 5235897..c0b55ec 100644 --- a/tests/templates/kuttl/restarter/20-assert.yaml +++ b/tests/templates/kuttl/restarter/20-assert.yaml @@ -3,4 +3,16 @@ apiVersion: kuttl.dev/v1beta1 kind: TestAssert timeout: 180 commands: - - script: test "restarted" = $(kubectl exec sleep-0 -c sleep -n $NAMESPACE -- cat /config/property) + - script: | + . ../../../../templates/kuttl/restarter/test-script.sh + + # Resources mounted via subPath are not hot-reloaded by Kubernetes. + # It is expected, that the restart controller ignored the annotated resources and that only + # the resources not mounted via subPath were updated. + + assert_revision 1 configmap-not-ignored-subpath + assert_revision 1 secret-not-ignored-subpath + assert_revision 1 configmap-ignored-subpath + assert_revision 1 secret-ignored-subpath + assert_revision 2 configmap-ignored + assert_revision 2 secret-ignored diff --git a/tests/templates/kuttl/restarter/20-hot-reload.yaml b/tests/templates/kuttl/restarter/20-hot-reload.yaml new file mode 100644 index 0000000..557501c --- /dev/null +++ b/tests/templates/kuttl/restarter/20-hot-reload.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: configmap-ignored +data: + revision: "2" +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-ignored +stringData: + revision: "2" diff --git a/tests/templates/kuttl/restarter/20-update-cm.yaml b/tests/templates/kuttl/restarter/20-update-cm.yaml deleted file mode 100644 index 0ac0446..0000000 --- a/tests/templates/kuttl/restarter/20-update-cm.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: sleep -data: - property: restarted diff --git a/tests/templates/kuttl/restarter/21-assert.yaml b/tests/templates/kuttl/restarter/21-assert.yaml new file mode 100644 index 0000000..c5bed07 --- /dev/null +++ b/tests/templates/kuttl/restarter/21-assert.yaml @@ -0,0 +1,16 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 180 +commands: + - script: | + . ../../../../templates/kuttl/restarter/test-script.sh + + # After a restart, all resources should have been updated. + + assert_revision 2 configmap-not-ignored-subpath + assert_revision 2 secret-not-ignored-subpath + assert_revision 2 configmap-ignored-subpath + assert_revision 2 secret-ignored-subpath + assert_revision 2 configmap-ignored + assert_revision 2 secret-ignored diff --git a/tests/templates/kuttl/restarter/21-trigger-restart.yaml b/tests/templates/kuttl/restarter/21-trigger-restart.yaml new file mode 100644 index 0000000..08650bf --- /dev/null +++ b/tests/templates/kuttl/restarter/21-trigger-restart.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: configmap-not-ignored +data: + revision: "2" +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-not-ignored +stringData: + revision: "2" diff --git a/tests/templates/kuttl/restarter/test-script.sh b/tests/templates/kuttl/restarter/test-script.sh new file mode 100644 index 0000000..b2e69dc --- /dev/null +++ b/tests/templates/kuttl/restarter/test-script.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env sh + +get_revision () { + resource="$1" + + kubectl exec test-0 \ + --namespace "$NAMESPACE" \ + --container test -- \ + cat "/config/$resource/revision" +} + +assert_revision () { + expected_value="$1" + resource="$2" + + actual_value="$(get_revision "$resource")" + if test "$expected_value" = "$actual_value" + then + echo "[PASS] $resource contains expected value" + else + echo "[FAIL] $resource does not contain expected value: " \ + "expected: $expected_value != actual: $actual_value" + exit 1 + fi +} From 87a00e0055d3e750f9b4316ab280c89d1acdd1b9 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Wed, 1 Apr 2026 11:20:18 +0200 Subject: [PATCH 3/4] chore: Update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f5aee6..07502eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added + +- Support the `restarter.stackable.tech/ignore` annotation on ConfigMaps and Secrets to exclude + them from the restarter controller ([#410]). + +[#410]: https://github.com/stackabletech/commons-operator/pull/410 + ## [26.3.0] - 2026-03-16 ## [26.3.0-rc1] - 2026-03-16 From 4ec9e812844fc4b59910f0a39d1f46e83fb1dee1 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Wed, 1 Apr 2026 11:37:52 +0200 Subject: [PATCH 4/4] docs: Document the annotation "restarter.stackable.tech/ignore" --- .../commons-operator/pages/restarter.adoc | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/docs/modules/commons-operator/pages/restarter.adoc b/docs/modules/commons-operator/pages/restarter.adoc index e2e2c8b..69d4c36 100644 --- a/docs/modules/commons-operator/pages/restarter.adoc +++ b/docs/modules/commons-operator/pages/restarter.adoc @@ -30,3 +30,45 @@ Label:: `restarter.stackable.tech/enabled` The operator can restart StatefulSets when any referenced configuration object (ConfigMap or Secret) changes. To enable this, set the `restarter.stackable.tech/enabled` label on the StatefulSet to `true`. + +Annotation:: `restarter.stackable.tech/ignore` + +If a resource is only used for initialization or is hot-reloaded and should not trigger a restart, add the annotation `restarter.stackable.tech/ignore: "true"` to the corresponding ConfigMap or Secret: + +[source,yaml] +---- +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: statefulset-with-enabled-restarter + labels: + restarter.stackable.tech/enabled: "true" +spec: + template: + spec: + volumes: + - name: hot-reloaded-configmap + configMap: + name: hot-reloaded-configmap + - name: hot-reloaded-secret + secret: + secretName: hot-reloaded-secret +... +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: hot-reloaded-configmap + annotations: + restarter.stackable.tech/ignore: "true" +... +--- +apiVersion: v1 +kind: Secret +metadata: + name: hot-reloaded-secret + annotations: + restarter.stackable.tech/ignore: "true" +... +----