Skip to content

Commit 76b7c6b

Browse files
fix(backupstrategy-controller): run backup clients on a package-owned image (#4756)
## What this PR does The Altinity (ClickHouse) and RabbitMQ backup strategy Pods ran `platform-migrations`: a 349 MB image carrying `kubectl`, `helm`, `git`, `cozyhr` and `etcd-migrate`, whose `ENTRYPOINT` is `run-migrations.sh`. Both pins were stamped from `packages/core/platform/Makefile`, so any migration change re-digested the backup clients too, and only the `command:` override kept the Pods from running platform migrations (#3420). - New `packages/system/backupstrategy-controller/images/backup-http-client/`: `alpine:3.24` (digest-pinned, the same base the tree already uses) + `curl` + `jq` + `ca-certificates`, `USER 65532:65532`, no `ENTRYPOINT`. Everything is installed at build time, so the Pods still never run `apk add` and keep working air-gapped. - New `image-backup-http-client` target in the package's own `Makefile`, chained after `image-redis-backup` like the existing ones so only one `yq -i` writes `values.yaml` at a time. It stamps `chBackupClientImage` and `rabbitmqBackupClientImage` with the same ref. - Removed the cross-package stamps from `packages/core/platform/Makefile`, the WORKAROUND/TODO comments in the chart and the RabbitMQ example, and the stale "live violation" line in `docs/agents/image-refs.md`. - `hack/image-pin-consistency.bats`: dropped the `platform-migrations`-specific test, whose subject no longer exists. The general check (no repository pinned at more than one digest, computed from `hack/promote-retag.sh --dry-run`) still covers the two keys sharing one image. **Why one image for both strategies rather than `ch-backup-client` as the issue named it.** The RabbitMQ strategy had the same reuse and the same cross-package stamp; leaving it would have kept the stamp alive. Its script needs `curl --aws-sigv4` + `ca-certificates`, a subset of the ClickHouse one, so one image serves both. The two values keys stay separate so either strategy can move to its own image later. **Initial pin.** The image does not exist in ghcr until CI builds it, so both keys are committed as `backup-http-client:v1.6.0` without a digest, the same way `redis-backup` was introduced. PR CI rebuilds touched packages and overlays the fresh refs for e2e; release preparation's `make image` stamps tag+digest. Image size: 6.9 MB vs 349 MB. Verified locally: - `docker buildx build` for `linux/amd64,linux/arm64`; in the image as uid 65532: curl 8.22 with `--aws-sigv4`, jq 1.8.2, `date`, `seq`, writes to `/tmp` (the RabbitMQ script's only write), TLS verification against the bundled CA store. - `helm unittest` (23/23), `helm template` renders both strategies with `backup-http-client` and no `platform-migrations` reference. - `hack/cozytest.sh hack/image-pin-consistency.bats` and `hack/build-matrix_test.bats` pass. Not yet run end to end on a cluster; the e2e backup round-trips will exercise it. Fixes #3420 ### Screenshots N/A — no UI changes. ### Downstream repositories Walked the trigger map against the diff: it touches `packages/system/backupstrategy-controller` (new image, Makefile target, values comments/pins, template comments), `packages/core/platform/Makefile` (stamp removal only, no `values.yaml` key change), `hack/image-pin-consistency.bats`, `docs/agents/image-refs.md` and a comment in `examples/backups/rabbitmq`. No app package, schema, CRD, variant, asset, platform values key or `hack/package.mk` change. The website does not list first-party image repositories (searched for `platform-migrations` and `redis-backup`), so no mirror list needs the new one. - [x] No downstream repository is affected by this change - [ ] [cozystack/website](https://github.com/cozystack/website) - follow-up: - [ ] [cozystack/terraform-provider-cozystack](https://github.com/cozystack/terraform-provider-cozystack) - follow-up: - [ ] [cozystack/ansible-cozystack](https://github.com/cozystack/ansible-cozystack) - follow-up: - [ ] [cozystack/ccp](https://github.com/cozystack/ccp) - follow-up: - [ ] [cozystack/talm](https://github.com/cozystack/talm) - follow-up: - [ ] [cozystack/cozyhr](https://github.com/cozystack/cozyhr) - follow-up: - [ ] [cozystack/cozy-proxy](https://github.com/cozystack/cozy-proxy) - follow-up: - [ ] [cozystack/cozystack-telemetry-server](https://github.com/cozystack/cozystack-telemetry-server) - follow-up: - [ ] [cozystack/external-apps-example](https://github.com/cozystack/external-apps-example) - follow-up: - [ ] [cozystack/examples](https://github.com/cozystack/examples) - follow-up: - [ ] [cozystack/community](https://github.com/cozystack/community) - follow-up: ### Release note <!-- Write a release note: - Explain what has changed internally and for users. - Start with the same `type(scope):` prefix as in the PR title - Follow the guidelines at https://github.com/kubernetes/community/blob/master/contributors/guide/release-notes.md. --> ```release-note fix(backupstrategy-controller): the ClickHouse (Altinity) and RabbitMQ backup strategy Pods now run a dedicated `backup-http-client` image (alpine + curl + jq + ca-certificates, non-root, ~7 MB) instead of the 349 MB `platform-migrations` image. Air-gapped mirrors need the new `ghcr.io/cozystack/cozystack/backup-http-client` repository. ``` <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Improvements** * Altinity and RabbitMQ backups now use a dedicated backup HTTP client image, configured separately from the platform migrations image. * The client image includes the tools required for backup operations and runs with a non-root identity. * Both backup configurations receive the same digest-pinned image reference when the image is built. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Backported-from: 7c46fff
2 parents 3cb9192 + 4643366 commit 76b7c6b

9 files changed

Lines changed: 51 additions & 131 deletions

File tree

‎docs/agents/image-refs.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ If a package stamps a reference somewhere the two globs do not cover, add that f
4242

4343
## Invariants
4444

45-
- **Every first-party reference is tag+digest.** A bare tag with no digest is not reproducible and must not be committed. `securitygroup-controller:v0.0.0` is a live violation.
46-
- **Exactly one producer stamps each reference.** A reference no `Makefile` writes will never be refreshed by anything, including release preparation — `chBackupClientImage` in `packages/system/backupstrategy-controller/values.yaml` is a live violation, still pinned to `platform-migrations:v1.4.0-rc.2`.
45+
- **Every first-party reference is tag+digest.** A bare tag with no digest is not reproducible and must not be committed. The one exception is the first commit of a new image: it has no digest until it is built, so it lands as a bare `<repo>:<tag>` that the producing `make image` replaces. PR CI and release preparation both stamp it before anything pulls it, but a tree applied without a build pulls a tag that does not exist.
46+
- **Exactly one producer stamps each reference.** A reference no `Makefile` writes will never be refreshed by anything, including release preparation.
4747
- **A package that stamps a reference is in the root `Makefile` `build:` list.** `build-matrix.sh`, the main build and release preparation all iterate that one list, so a package outside it is never rebuilt by any path and its pin freezes permanently. `hack/build-matrix_test.bats` computes the set of packages whose Makefile runs `docker buildx build` and fails on any the list misses.
4848
- **Every consumer of references reads all three storage shapes**, via `hack/lib/image-refs.sh`.
4949
- **Scan wider than you rewrite.** A rewrite is deliberately narrow to avoid corrupting vendored defaults, so the check that follows it must not share that blind spot. `hack/promote-rewrite-tags.sh` rewrites the enumerated files, then greps the whole tree and fails if any reference to the release candidate survives.

‎examples/backups/rabbitmq/03-rabbitmq-strategy.yaml‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,6 @@ spec:
9292
- name: s3-ca
9393
mountPath: /etc/ssl/rabbitmq-backup-ca
9494
readOnly: true
95-
# command is load-bearing: the reused platform-migrations image's
96-
# ENTRYPOINT is run-migrations.sh.
9795
command: ["/bin/sh", "-c"]
9896
args:
9997
- |

‎hack/image-pin-consistency.bats‎

Lines changed: 8 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,12 @@
88
# tag. The first wins, the second hits the write-once guard, and the promotion
99
# fails — on release day, in a workflow that runs once per release.
1010
#
11-
# This is not hypothetical. platform-migrations was pinned twice: once in
12-
# packages/core/platform/values.yaml (stamped by its Makefile) and once as
13-
# .backupStrategyController.chBackupClientImage, which had no producer at all
14-
# and so froze at v1.4.0-rc.2 while the other advanced to v1.5.0. v1.6.0 is the
15-
# first release cut through the promote path rather than a full rebuild, so it
16-
# would have been the first to hit it.
17-
#
18-
# The general invariant is cheaper to hold than the specific one: a duplicate
19-
# pin can arise from any package reusing another's image, which the tree does
20-
# deliberately (backupstrategy-controller reuses platform-migrations as a
21-
# curl+jq runner rather than shipping a second one-binary tag).
11+
# This is not hypothetical. platform-migrations was once pinned twice, the
12+
# second copy by a key that had no producer: it froze at v1.4.0-rc.2 while the
13+
# other advanced to v1.5.0, and v1.6.0, the first release cut through the
14+
# promote path, would have been the first to hit it. A chart that renders one
15+
# image under several keys (backupstrategy-controller's backup client) must
16+
# have them stamped together.
2217
#
2318
# Harness compatibility note: CI runs this file under Bats through
2419
# `make bats-unit-tests`. It also remains compatible with the narrower legacy
@@ -65,36 +60,10 @@ load test_helper
6560
-- "${repo#ghcr.io/cozystack/cozystack/}" packages/ >&2 || true
6661
done
6762
echo >&2
68-
echo "Give the duplicate key a producer that stamps the same ref (see" >&2
69-
echo "packages/core/platform/Makefile), or drop the duplicate pin." >&2
63+
echo "Give the duplicate key a producer that stamps the same ref, or drop" >&2
64+
echo "the duplicate pin." >&2
7065
rm -rf "$tmp"
7166
return 1
7267
fi
7368
rm -rf "$tmp"
7469
}
75-
76-
@test "platform-migrations is pinned identically in both consumers" {
77-
# The specific instance, pinned separately so a regression names its cause
78-
# rather than only tripping the general check above. The two must match
79-
# exactly, not merely resolve to the same digest: backupstrategy-controller
80-
# renders its copy into a Pod spec, so a stale tag string there is what an
81-
# operator reads when asking what is running.
82-
a=$(yq -r '.migrations.image' packages/core/platform/values.yaml)
83-
b=$(yq -r '.backupStrategyController.chBackupClientImage' \
84-
packages/system/backupstrategy-controller/values.yaml)
85-
c=$(yq -r '.backupStrategyController.rabbitmqBackupClientImage' \
86-
packages/system/backupstrategy-controller/values.yaml)
87-
88-
if [ "$a" != "$b" ] || [ "$a" != "$c" ]; then
89-
echo "platform-migrations pins have drifted:" >&2
90-
echo " packages/core/platform/values.yaml .migrations.image" >&2
91-
echo " $a" >&2
92-
echo " backupstrategy-controller/values.yaml .chBackupClientImage" >&2
93-
echo " $b" >&2
94-
echo " backupstrategy-controller/values.yaml .rabbitmqBackupClientImage" >&2
95-
echo " $c" >&2
96-
echo >&2
97-
echo "packages/core/platform/Makefile stamps all three; do not hand-edit any." >&2
98-
return 1
99-
fi
100-
}

‎packages/core/platform/Makefile‎

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,25 +42,6 @@ image-migrations:
4242
--metadata-file images/migrations.json \
4343
$(BUILDX_ARGS)
4444
rm -rf images/migrations/etcd-operator-crds
45-
# Stamp BOTH consumers of this image. backupstrategy-controller renders it
46-
# into the Altinity strategy Pod as a curl+jq runner — a WORKAROUND, not a
47-
# design: that Pod needs only curl/jq/sleep/date but gets 349 MB including
48-
# kubectl, helm and etcd-migrate, and this image's ENTRYPOINT is the
49-
# migration runner itself. It should get a dedicated ~23 MB image owned by
50-
# its own package, which would delete this cross-package stamp; see the TODO
51-
# in ../../system/backupstrategy-controller/values.yaml.
52-
#
53-
# Until then the two pins MUST move together. The second copy had no
54-
# producer, so it silently froze at v1.4.0-rc.2 while this one advanced, and
55-
# a promotion then tried to retag two different digests to the same stable
56-
# tag — which the write-once guard in hack/promote-retag.sh turns into a
57-
# failed release. hack/image-pin-consistency.bats keeps them in lockstep.
5845
IMAGE="$(REGISTRY)/platform-migrations:$(IMAGE_TAG)@$$(yq -e -o json -r '.["containerimage.digest"]' images/migrations.json)" \
5946
yq --inplace '.migrations.image = strenv(IMAGE)' values.yaml
60-
IMAGE="$(REGISTRY)/platform-migrations:$(IMAGE_TAG)@$$(yq -e -o json -r '.["containerimage.digest"]' images/migrations.json)" \
61-
yq --inplace '.backupStrategyController.chBackupClientImage = strenv(IMAGE)' \
62-
../../system/backupstrategy-controller/values.yaml
63-
IMAGE="$(REGISTRY)/platform-migrations:$(IMAGE_TAG)@$$(yq -e -o json -r '.["containerimage.digest"]' images/migrations.json)" \
64-
yq --inplace '.backupStrategyController.rabbitmqBackupClientImage = strenv(IMAGE)' \
65-
../../system/backupstrategy-controller/values.yaml
6647
rm -f images/migrations.json

‎packages/system/backupstrategy-controller/Makefile‎

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ include ../../../hack/package.mk
66

77
# PHONY so a stray file/dir named `image` cannot mark the aggregate up to date
88
# and skip both builds.
9-
.PHONY: image image-backupstrategy-controller image-redis-backup
9+
.PHONY: image image-backupstrategy-controller image-redis-backup image-backup-http-client
1010

11-
image: image-backupstrategy-controller image-redis-backup
11+
image: image-backupstrategy-controller image-redis-backup image-backup-http-client
1212

1313
image-backupstrategy-controller:
1414
docker buildx build -f images/backupstrategy-controller/Dockerfile ../../.. \
@@ -33,5 +33,18 @@ image-redis-backup: image-backupstrategy-controller
3333
yq -i '.backupStrategyController.redisBackupClientImage = strenv(IMAGE)' values.yaml
3434
rm -f images/redis-backup.json
3535

36+
# Chained after image-redis-backup for the same reason: one `yq -i` writer at a
37+
# time. Both keys get the same ref, so the repository stays pinned at a single
38+
# digest (hack/image-pin-consistency.bats).
39+
image-backup-http-client: image-redis-backup
40+
docker buildx build -f images/backup-http-client/Dockerfile images/backup-http-client \
41+
$(call image-tags,backup-http-client,v$(COZYSTACK_VERSION)) \
42+
$(call cache-args,backup-http-client) \
43+
--metadata-file images/backup-http-client.json \
44+
$(BUILDX_ARGS)
45+
IMAGE="$(REGISTRY)/backup-http-client:$(IMAGE_TAG)@$$(yq e '."containerimage.digest"' images/backup-http-client.json -o json -r)" \
46+
yq -i '.backupStrategyController.chBackupClientImage = strenv(IMAGE) | .backupStrategyController.rabbitmqBackupClientImage = strenv(IMAGE)' values.yaml
47+
rm -f images/backup-http-client.json
48+
3649
test:
3750
helm unittest .
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# backup-http-client runs the Altinity (ClickHouse) and RabbitMQ strategy Pods:
2+
# both scripts drive an HTTP API with curl and verify TLS against the bundled
3+
# ca-certificates; the Altinity one also parses JSON with jq, and the RabbitMQ
4+
# one moves its export to S3 with curl --aws-sigv4. Everything is installed at
5+
# build time so the Pods never run `apk add` and work on air-gapped clusters.
6+
FROM alpine:3.24@sha256:294b683cb724975bec92580e1e685676bd4b50bda910ddb8c51d4cabeaec77e6
7+
8+
RUN apk add --no-cache curl jq ca-certificates
9+
10+
USER 65532:65532

‎packages/system/backupstrategy-controller/templates/strategy-altinity-default.yaml‎

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,6 @@ spec:
2626
restartPolicy: Never
2727
containers:
2828
- name: ch-backup-client
29-
# WORKAROUND: this resolves to platform-migrations, which bundles
30-
# curl + jq + ca-certificates on alpine — so the Pod needs no
31-
# `apk add` and works air-gapped. That is the only reason it is
32-
# here. It is a 349 MB migration image standing in for a curl+jq
33-
# runner, and its own ENTRYPOINT is run-migrations.sh, so the
34-
# `command:` override below is load-bearing: drop it and this Pod
35-
# runs platform migrations with kubectl and helm on the PATH.
36-
# Replace with a dedicated ch-backup-client image owned by this
37-
# package; see the TODO in ../values.yaml.
3829
image: "{{ .Values.backupStrategyController.chBackupClientImage }}"
3930
imagePullPolicy: IfNotPresent
4031
# The clickhouse-backup HTTP API on :7171 enforces basic auth;
@@ -57,9 +48,8 @@ spec:
5748
args:
5849
- |
5950
set -euo pipefail
60-
# curl + jq are baked into the ch-backup-client image; no
61-
# `apk add` here so the Pod stays runnable on air-gapped
62-
# clusters.
51+
# curl + jq are baked into the image; no `apk add` here so
52+
# the Pod stays runnable on air-gapped clusters.
6353
host="chi-clickhouse-{{ printf "{{ .Release.Name }}" }}-clickhouse-0-0.{{ printf "{{ .Release.Namespace }}" }}.svc"
6454
api="http://${host}:7171"
6555
auth="-u ${API_USERNAME}:${API_PASSWORD}"

‎packages/system/backupstrategy-controller/templates/strategy-rabbitmq-default.yaml‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,6 @@ spec:
9999
value: {{ .Values.backupStorage.region | quote }}
100100
- name: S3_FORCE_PATH_STYLE
101101
value: {{ .Values.backupStorage.forcePathStyle | quote }}
102-
# command is load-bearing: the reused platform-migrations image's
103-
# ENTRYPOINT is run-migrations.sh. See rabbitmqBackupClientImage in
104-
# ../values.yaml.
105102
command: ["/bin/sh", "-c"]
106103
args:
107104
- |

‎packages/system/backupstrategy-controller/values.yaml‎

Lines changed: 14 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,16 @@
11
backupStrategyController:
22
image: "ghcr.io/cozystack/cozystack/backupstrategy-controller:v1.7.0@sha256:990c8ab93b9f14ee7f70473d199558c859fa5e9532d6b1f47a74698f34c07c1b"
3-
# chBackupClientImage is the image rendered into the Altinity strategy
4-
# Pod: it drives clickhouse-backup's HTTP API via curl + jq.
5-
#
6-
# WORKAROUND — platform-migrations is the wrong image for this job and
7-
# should be replaced by a dedicated one (see the TODO below). It is
8-
# reused here only because it happens to bundle curl + jq, and this
9-
# release could not absorb a new image. What that reuse actually costs:
10-
# - the strategy script needs exactly curl, jq, sleep and date, yet
11-
# this image is 349 MB carrying kubectl, helm, git, cozyhr and the
12-
# etcd-migrate binary into a tenant-adjacent backup Pod;
13-
# - its ENTRYPOINT is run-migrations.sh, so only the `command:`
14-
# override in strategy-altinity-default.yaml stands between this Pod
15-
# and running platform migrations with kubectl and helm on the PATH;
16-
# - it couples the backup client to migrations: bumping
17-
# ETCD_OPERATOR_VERSION or editing any migration script re-digests
18-
# this image, forcing this pin to move for reasons that have nothing
19-
# to do with backups. That coupling is what broke — see below.
20-
#
21-
# TODO: replace with a dedicated ch-backup-client image built by THIS
22-
# package's own Makefile (alpine + curl + jq + ca-certificates measures
23-
# 23 MB, 15x smaller). That also removes the cross-package stamp
24-
# entirely, because the pin would then be produced by the package that
25-
# owns it. The often-cited objection — "a second tag release CI must
26-
# re-digest each cut" — is not the real cost: every other first-party
27-
# image already pays it, automatically. The real defect was a pin with
28-
# NO producer, which a package-owned image cannot reproduce.
29-
#
30-
# DO NOT hand-edit: packages/core/platform/Makefile stamps this key with
31-
# the same ref it writes to .migrations.image there, so the two stay in
32-
# lockstep by construction. They previously did not — this key had no
33-
# producer at all and froze at v1.4.0-rc.2 while the other advanced to
34-
# v1.5.0. Two digests under one repository means a promotion tries to
35-
# retag both to the same stable tag, and the write-once guard in
36-
# hack/promote-retag.sh fails the release. hack/image-pin-consistency.bats
37-
# asserts no repository is pinned at more than one digest.
38-
chBackupClientImage: "ghcr.io/cozystack/cozystack/platform-migrations:v1.7.0@sha256:9018fba0873094431cf130cc949d4651a8d971d02e5925b70e6f22648818a4c5"
39-
# rabbitmqBackupClientImage is the image rendered into the RabbitMQ Job
40-
# strategy (strategy-rabbitmq-default.yaml): its script needs only curl +
41-
# ca-certificates to call the RabbitMQ management API and push the
42-
# definitions export to S3 (curl --aws-sigv4). It is a distinct key from
43-
# chBackupClientImage so the RabbitMQ strategy carries its own upgrade
44-
# cadence, but it reuses the same platform-migrations image for now — hence
45-
# it is stamped in lockstep with the two keys above (packages/core/platform/
46-
# Makefile), so the repository stays pinned at a single digest
47-
# (hack/image-pin-consistency.bats). Same TODO applies: replace with a
48-
# dedicated alpine + curl + ca-certificates image built by this package's
49-
# Makefile, which also lets this pin move on its own.
50-
# DO NOT hand-edit: stamped by packages/core/platform/Makefile.
51-
rabbitmqBackupClientImage: "ghcr.io/cozystack/cozystack/platform-migrations:v1.7.0@sha256:9018fba0873094431cf130cc949d4651a8d971d02e5925b70e6f22648818a4c5"
3+
# chBackupClientImage is rendered into the Altinity strategy Pod, which drives
4+
# clickhouse-backup's HTTP API with curl + jq. rabbitmqBackupClientImage is
5+
# rendered into the RabbitMQ strategy Pod, which calls the management API and
6+
# moves the definitions export to S3 with curl --aws-sigv4. Both run the
7+
# images/backup-http-client/ image (alpine + curl + jq + ca-certificates) and
8+
# must hold the same ref: one repository pinned at two digests fails the
9+
# release promotion (hack/image-pin-consistency.bats). They are separate keys
10+
# so either strategy can move to its own image later.
11+
# DO NOT hand-edit: `make image` stamps both.
12+
chBackupClientImage: "ghcr.io/cozystack/cozystack/backup-http-client:v1.6.0"
13+
rabbitmqBackupClientImage: "ghcr.io/cozystack/cozystack/backup-http-client:v1.6.0"
5214
# redisBackupClientImage is rendered into the Redis strategy Pod. The
5315
# spotahome operator ships no backup CRD, so the strategy runs a one-shot Job
5416
# that dumps an RDB snapshot to S3 and, on restore, loads it into a throwaway
@@ -76,9 +38,9 @@ backupStrategyController:
7638
memory: 1Gi
7739
ephemeral-storage: 4Gi
7840
# The Kafka metadata strategy carries no client image here: unlike the Altinity
79-
# and RabbitMQ drivers (curl-only, so a shared platform-migrations image works),
80-
# its driver runs the Kafka Admin-API CLI (kafka-topics / kafka-configs), which
81-
# only the Strimzi broker image ships. So the controller resolves the image from
41+
# and RabbitMQ drivers, which need only curl (plus jq for Altinity), its driver
42+
# runs the Kafka Admin-API CLI (kafka-topics / kafka-configs), which only the
43+
# Strimzi broker image ships. So the controller resolves the image from
8244
# the target Kafka broker at reconcile time (strategy-kafka-default.yaml renders
8345
# the container image as the "{{ .ClientImage }}" placeholder), and records it on
8446
# the Backup so cleanup can reuse it once the broker is gone. No pin to drift.

0 commit comments

Comments
 (0)