refactor(cilium): Flux is the only owner #709

Merged
k.renner merged 3 commits from cilium-flux-only into master 2026-08-28 14:30:06 +00:00
Member

Letzter Schritt aus #707. 3940 Zeilen weg. Talos trägt Cilium in keiner Form mehr, die HelmRelease ist der einzige Ort, an dem es konfiguriert ist.

Die Cluster-Seite ist bereits erledigt und belegt

Prüfung vorher jetzt
Cilium in den Machine-Configs 3 Knoten 0
Talos-Inventar-Einträge 41 13
davon Cilium/Hubble 28 0
upgrade-k8s --dry-run ohne Flag 28 Löschungen 0
Kubernetes 1.35.2 1.36.3

Die letzte Zeile ist der Zweck der ganzen Übung: ein nackter upgrade-k8s hätte das CNI zerstört und tut ihm jetzt nichts.

Der Ablauf: Inline-Manifest knotenweise entfernt (ohne Reboot, ohne Wirkung auf das laufende CNI), dann upgrade-k8s --manifests-no-prune — derselbe Lauf, der Kubernetes hochgezogen hat. Cilium durchgehend Ready, BGP durchgehend established mit je 5 Routen.

Was ich dabei falsch geplant hatte

--manifests-no-prune überspringt nicht nur die Löschung, sondern auch die Fortschreibung des Inventars. Der Lauf, der die 22 Objekte gerettet hat, ließ Talos also weiterhin Anspruch darauf erheben — die Mine war vertagt, nicht entschärft. Mein Schritt 4 behauptete das Gegenteil.

Talos bietet keinen Weg, einen veralteten Anspruch loszuwerden, außer dem Prune, der löscht. Also habe ich die 28 Einträge von Hand aus der ConfigMap entfernt.

Das ist Handarbeit an Cluster-Zustand, und ich benenne den Unterschied zu dem, was wir heute aufgeräumt haben: das Inventar ist abgeleitete Buchhaltung, keine Konfiguration, die ins Git gehört — und das Ergebnis ist in beide Richtungen prüfbar (28 → 0). Bei Konfiguration wäre das nicht akzeptabel gewesen.

Repo-Seite in diesem Commit

  • talos/patches/cilium-cni.yaml und talos/cilium.yaml gelöscht
  • Schritt 2b im Cold-Rebuild-Runbook: Cilium per helm install aus den HelmRelease-Werten, nach dem Bootstrap und vor Flux. Dass die Knoten bis dahin NotReady bleiben, steht jetzt ausdrücklich da — sonst sucht jemand den Fehler.
  • „Keep in lockstep" und „THREE COPIES" raus; sie beschrieben eine Duplikation, die es nicht mehr gibt.
  • RUNBOOK-baremetal-conversion.md korrigiert — es wies an, die Hälfte einer Datei zu extrahieren, die weg ist.

bootstrap.sh bleibt unangetastet. Seine Talos-Phase war tot und ist jetzt aus einem zweiten Grund tot; das Runbook sagt es.

Der Preis, offen gesagt

Der Cluster formt sich nicht mehr allein aus dem Machine-Config. Ein Cold Rebuild braucht einen dokumentierten helm install, den er vorher nicht brauchte. Das ist der Gegenwert dafür, dass Cilium an genau einer Stelle existiert.

Letzter Schritt aus #707. **3940 Zeilen weg.** Talos trägt Cilium in keiner Form mehr, die HelmRelease ist der einzige Ort, an dem es konfiguriert ist. ## Die Cluster-Seite ist bereits erledigt und belegt | Prüfung | vorher | jetzt | |---|---|---| | Cilium in den Machine-Configs | 3 Knoten | **0** | | Talos-Inventar-Einträge | 41 | **13** | | davon Cilium/Hubble | 28 | **0** | | `upgrade-k8s --dry-run` **ohne** Flag | **28 Löschungen** | **0** | | Kubernetes | 1.35.2 | **1.36.3** | Die letzte Zeile ist der Zweck der ganzen Übung: ein nackter `upgrade-k8s` hätte das CNI zerstört und tut ihm jetzt nichts. Der Ablauf: Inline-Manifest knotenweise entfernt (ohne Reboot, ohne Wirkung auf das laufende CNI), dann `upgrade-k8s --manifests-no-prune` — derselbe Lauf, der Kubernetes hochgezogen hat. Cilium durchgehend Ready, BGP durchgehend `established` mit je 5 Routen. ## Was ich dabei falsch geplant hatte `--manifests-no-prune` überspringt **nicht nur die Löschung, sondern auch die Fortschreibung des Inventars**. Der Lauf, der die 22 Objekte gerettet hat, ließ Talos also weiterhin Anspruch darauf erheben — die Mine war vertagt, nicht entschärft. Mein Schritt 4 behauptete das Gegenteil. Talos bietet keinen Weg, einen veralteten Anspruch loszuwerden, außer dem Prune, der löscht. Also **habe ich die 28 Einträge von Hand aus der ConfigMap entfernt.** Das ist Handarbeit an Cluster-Zustand, und ich benenne den Unterschied zu dem, was wir heute aufgeräumt haben: das Inventar ist abgeleitete Buchhaltung, keine Konfiguration, die ins Git gehört — und das Ergebnis ist **in beide Richtungen prüfbar** (28 → 0). Bei Konfiguration wäre das nicht akzeptabel gewesen. ## Repo-Seite in diesem Commit - `talos/patches/cilium-cni.yaml` und `talos/cilium.yaml` gelöscht - **Schritt 2b** im Cold-Rebuild-Runbook: Cilium per `helm install` aus den HelmRelease-Werten, nach dem Bootstrap und vor Flux. Dass die Knoten bis dahin `NotReady` bleiben, steht jetzt ausdrücklich da — sonst sucht jemand den Fehler. - „Keep in lockstep" und „THREE COPIES" raus; sie beschrieben eine Duplikation, die es nicht mehr gibt. - `RUNBOOK-baremetal-conversion.md` korrigiert — es wies an, die Hälfte einer Datei zu extrahieren, die weg ist. `bootstrap.sh` bleibt unangetastet. Seine Talos-Phase war tot und ist jetzt aus einem zweiten Grund tot; das Runbook sagt es. ## Der Preis, offen gesagt Der Cluster formt sich nicht mehr allein aus dem Machine-Config. Ein Cold Rebuild braucht einen dokumentierten `helm install`, den er vorher nicht brauchte. Das ist der Gegenwert dafür, dass Cilium an genau einer Stelle existiert.
claude-bot added 1 commit 2026-08-28 14:13:50 +00:00
refactor(cilium): Flux is the only owner
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was successful
bce155b852
Final step of PROPOSAL-cilium-single-owner.md. Talos no longer carries Cilium in
any form, and the HelmRelease is the only place it is configured.

The cluster side is already done and verified:

  - the cilium inline manifest is gone from all three machine configs, applied
    node by node with no reboot and no effect on the running CNI
  - Kubernetes went 1.35.2 -> 1.36.3 in the same operation, with
    --manifests-no-prune so the 22 objects Talos claimed were not deleted
  - Talos's bootstrap-manifest inventory went from 41 entries to 13, and the 28
    cilium/hubble entries are gone. A prune-enabled `upgrade-k8s --dry-run`
    reported 28 deletions before and reports 0 now

That last number is the point of the whole exercise. A bare `upgrade-k8s` used
to destroy the CNI and now does nothing to it.

The inventory entries had to be removed by hand. --manifests-no-prune skips the
prune AND the inventory rewrite, so the run that saved the objects also left
Talos still claiming them — the mine was deferred, not cleared. Talos offers no
way to drop a stale claim without the prune that deletes, so the ConfigMap was
edited directly. It is derived bookkeeping, not configuration, and the result is
verifiable in both directions, which is why this was acceptable where hand-
editing configuration would not be.

Repo side, this commit:

  - deletes talos/patches/cilium-cni.yaml and talos/cilium.yaml
  - adds Step 2b to RUNBOOK-cold-rebuild.md: install Cilium from the HelmRelease
    values with helm, after bootstrap and before Flux. The nodes stay NotReady
    until then, which the runbook now says out loud rather than leaving someone
    to wonder
  - drops the "keep in lockstep" and "THREE COPIES" comments, which described a
    duplication that no longer exists, and replaces them with one note saying
    where Cilium is configured
  - corrects RUNBOOK-baremetal-conversion.md, which told the reader to extract
    half of a file that is gone

bootstrap.sh is left alone. Its talos phase was already dead and is now dead for
a second reason; the runbook says so.

The cost, stated plainly: the cluster no longer forms itself from the machine
config. A cold rebuild needs one documented helm install that it did not need
before. That is the price of Cilium existing in exactly one place.
review-bot left a comment
Member

🤖 Automated review — model CLI default (complexity: complex), commit bce155b8524f5c4a7aeeb0ada6b27f6c90eecbd8.

Advisory review by the review-bot pipeline. It never approves; a human merges. Push new commits to get a fresh review.


Summary

This PR completes PROPOSAL-cilium-single-owner.md: it deletes the two Talos-side
copies of the Cilium manifest (talos/cilium.yaml, talos/patches/cilium-cni.yaml,
~3900 lines), updates the two runbooks to add a manual helm install step
(Step 2b) before Flux takes over on a cold rebuild, and cleans up now-stale
"keep in lockstep" comments in helmrelease.yaml. The intent and the live-cluster
verification described in the PR body are sound, but the repo-side documentation
update has two concrete defects that would mislead an operator during an actual
disaster-recovery run.

🔴 Blocking

  • talos/patches/cluster.yaml never gains the cni: none / proxy: disabled
    settings the new docs claim it has.
    The deleted talos/patches/cilium-cni.yaml
    was the only place in the repo that set these two machine-config keys (see the
    diff's second document in that file: cluster.network.cni.name: none +
    cluster.proxy.disabled: true, alongside the inline manifest). This PR deletes
    that file and drops it from the talosctl gen config patch list in both
    runbooks, but kubernetes/talos/patches/cluster.yaml (checked in full) has no
    cni or proxy key, and a repo-wide grep for cni:/proxy: under
    kubernetes/talos/ now returns nothing. Yet:

    • kubernetes/RUNBOOK-cold-rebuild.md:168-170 states "There is no CNI patch
      here any more. Talos supplies cni: none and proxy: disabled from
      cluster.yaml and nothing else."
    • kubernetes/RUNBOOK-baremetal-conversion.md:211-212 makes the same claim
      ("Talos supplies only cni: none and proxy: disabled").

    Neither claim is currently true. Following either runbook's talosctl gen config command as written would leave Talos on its default CNI/kube-proxy
    behaviour (the previous file had to override the defaults, which is why it
    existed), directly conflicting with Cilium's kubeProxyReplacement: true and
    the "exactly one CNI" goal this PR exists to achieve — the opposite of the
    intended outcome. The cni: none/proxy: disabled keys need to actually be
    added to a git-tracked patch that both runbooks' commands still pass (most
    naturally talos/patches/cluster.yaml), not just asserted in prose.

  • kubernetes/RUNBOOK-baremetal-conversion.md:201 — the talosctl gen config example in the "Build the config" code block still contains
    --config-patch @<cilium additive half> \, a placeholder referring to a
    document that used to be extracted from the now-deleted
    talos/patches/cilium-cni.yaml. The parallel code block in
    RUNBOOK-cold-rebuild.md (Step 2) was correctly edited to drop this line, but
    this one was missed. As written, the prose three lines below it ("There is no
    CNI patch to pass any more") directly contradicts the command example an
    operator would actually run.

🟡 Suggestions

  • Given the first blocking point, once cni: none/proxy: disabled are added
    to cluster.yaml, it would be worth a one-line note in
    PROPOSAL-cilium-single-owner.md's "Target state" section (currently only
    shows the intended YAML snippet in the abstract) pointing at the concrete file
    it now lives in, so the proposal and the runbooks don't drift again the way
    the three-copies problem did originally.

🟢 Nits

None beyond the above.

Tests

Not applicable — this is a documentation/manifest-deletion change with no
automated test coverage in this repo for runbook accuracy or Talos config
generation. The PR body describes manual verification of the live-cluster side
(machine configs, inventory ConfigMap, upgrade-k8s --dry-run), which is
credible and appropriately called out as the risky, hand-applied part. The
repo-side gap above (missing cni/proxy settings) is exactly the kind of
thing that verification didn't and couldn't catch, since the live cluster was
patched by hand rather than via a fresh talosctl gen config from this repo's
patches — a cold-rebuild dry run (talosctl gen config + talosctl validate
using the exact commands in the runbook) would have caught it.

Recommendation

Request changes — 2 blocking issues.

🤖 **Automated review** — model `CLI default` (complexity: complex), commit `bce155b8524f5c4a7aeeb0ada6b27f6c90eecbd8`. > Advisory review by the `review-bot` pipeline. It never approves; a human merges. Push new commits to get a fresh review. --- ## Summary This PR completes PROPOSAL-cilium-single-owner.md: it deletes the two Talos-side copies of the Cilium manifest (`talos/cilium.yaml`, `talos/patches/cilium-cni.yaml`, ~3900 lines), updates the two runbooks to add a manual `helm install` step (Step 2b) before Flux takes over on a cold rebuild, and cleans up now-stale "keep in lockstep" comments in `helmrelease.yaml`. The intent and the live-cluster verification described in the PR body are sound, but the repo-side documentation update has two concrete defects that would mislead an operator during an actual disaster-recovery run. ## 🔴 Blocking - **`talos/patches/cluster.yaml` never gains the `cni: none` / `proxy: disabled` settings the new docs claim it has.** The deleted `talos/patches/cilium-cni.yaml` was the *only* place in the repo that set these two machine-config keys (see the diff's second document in that file: `cluster.network.cni.name: none` + `cluster.proxy.disabled: true`, alongside the inline manifest). This PR deletes that file and drops it from the `talosctl gen config` patch list in both runbooks, but `kubernetes/talos/patches/cluster.yaml` (checked in full) has no `cni` or `proxy` key, and a repo-wide grep for `cni:`/`proxy:` under `kubernetes/talos/` now returns nothing. Yet: - `kubernetes/RUNBOOK-cold-rebuild.md:168-170` states "There is no CNI patch here any more. Talos supplies `cni: none` and `proxy: disabled` from `cluster.yaml` and nothing else." - `kubernetes/RUNBOOK-baremetal-conversion.md:211-212` makes the same claim ("Talos supplies only `cni: none` and `proxy: disabled`"). Neither claim is currently true. Following either runbook's `talosctl gen config` command as written would leave Talos on its default CNI/kube-proxy behaviour (the previous file had to override the defaults, which is why it existed), directly conflicting with Cilium's `kubeProxyReplacement: true` and the "exactly one CNI" goal this PR exists to achieve — the opposite of the intended outcome. The `cni: none`/`proxy: disabled` keys need to actually be added to a git-tracked patch that both runbooks' commands still pass (most naturally `talos/patches/cluster.yaml`), not just asserted in prose. - **`kubernetes/RUNBOOK-baremetal-conversion.md:201`** — the `talosctl gen config` example in the "Build the config" code block still contains `--config-patch @<cilium additive half> \`, a placeholder referring to a document that used to be extracted from the now-deleted `talos/patches/cilium-cni.yaml`. The parallel code block in `RUNBOOK-cold-rebuild.md` (Step 2) was correctly edited to drop this line, but this one was missed. As written, the prose three lines below it ("There is no CNI patch to pass any more") directly contradicts the command example an operator would actually run. ## 🟡 Suggestions - Given the first blocking point, once `cni: none`/`proxy: disabled` are added to `cluster.yaml`, it would be worth a one-line note in `PROPOSAL-cilium-single-owner.md`'s "Target state" section (currently only shows the intended YAML snippet in the abstract) pointing at the concrete file it now lives in, so the proposal and the runbooks don't drift again the way the three-copies problem did originally. ## 🟢 Nits None beyond the above. ## Tests Not applicable — this is a documentation/manifest-deletion change with no automated test coverage in this repo for runbook accuracy or Talos config generation. The PR body describes manual verification of the live-cluster side (machine configs, inventory ConfigMap, `upgrade-k8s --dry-run`), which is credible and appropriately called out as the risky, hand-applied part. The repo-side gap above (missing `cni`/`proxy` settings) is exactly the kind of thing that verification didn't and couldn't catch, since the live cluster was patched by hand rather than via a fresh `talosctl gen config` from this repo's patches — a cold-rebuild dry run (`talosctl gen config` + `talosctl validate` using the exact commands in the runbook) would have caught it. ## Recommendation Request changes — 2 blocking issues. <!-- pr-review:sha=bce155b8524f5c4a7aeeb0ada6b27f6c90eecbd8 -->
claude-bot added 1 commit 2026-08-28 14:21:21 +00:00
fix(talos): move cni: none and proxy: disabled into cluster.yaml
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was successful
1f18599b4c
Both blocking findings from the review on #709, and both were real.

The deleted cilium-cni.yaml was the only place in the repo that set
cluster.network.cni.name: none and cluster.proxy.disabled: true. They sat in its
second document next to the inline manifest, so removing the file removed them
too — a fresh `talosctl gen config` from this repo's patches would have produced
a config with Talos's default CNI and kube-proxy running, against a Cilium
release configured with kubeProxyReplacement: true. Two runbooks meanwhile
asserted that cluster.yaml supplied both, which it did not.

RUNBOOK-baremetal-conversion.md also still passed `@<cilium additive half>` in
its gen-config example, three lines above prose saying there is no CNI patch any
more. The equivalent block in the cold-rebuild runbook had been fixed; this one
was missed.

Verified the way it should have been in the first place — by running the
runbook's own command rather than inspecting the live cluster:

    talosctl gen config homelab https://k8s.renner.uno:6443 \
      --output-types controlplane \
      --config-patch @talos/patches/cluster.yaml \
      --config-patch @talos/patches/registry-mirror.yaml \
      --config-patch @talos/patches/k8s-1.yaml

    -> cni=none  proxy.disabled=true
    -> 0 cilium manifests

The live cluster could never have caught this. It has carried both settings
since it was built, and the node configs were patched by hand rather than
regenerated, so nothing in the verification touched the path a rebuild actually
uses.
review-bot left a comment
Member

🤖 Automated review — model CLI default (complexity: complex), commit 1f18599b4c077202d05a5826cb388d41b685c974.

Advisory review by the review-bot pipeline. It never approves; a human merges. Push new commits to get a fresh review.


Summary

This PR finishes making the Cilium HelmRelease the single source of truth for CNI configuration: it deletes the two Talos-side copies (talos/cilium.yaml, the rendered inline manifest, and talos/patches/cilium-cni.yaml, the additive/delete patch pair), moves the two settings Talos still needs (cluster.network.cni.name: none, cluster.proxy.disabled: true) into talos/patches/cluster.yaml, and rewrites the cold-rebuild and baremetal-conversion runbooks to install Cilium via a documented helm install step (new Step 2b) instead of relying on a Talos inline manifest. I traced every changed and deleted file against the rest of the repo (including bootstrap.sh, CI configs, and other doc cross-references) and the change is internally consistent: the surviving cluster.yaml keys use valid Talos v1alpha1 paths, no other kustomization/config still points at the deleted files, and the new runbook steps line up with the HelmRelease's namespace, chart version range, and values. No blocking issues found.

🟡 Suggestions

  • kubernetes/bootstrap.sh:86,126 still reference the now-deleted talos/patches/cilium-cni.yaml. Running ./bootstrap.sh talos (or the default ./bootstrap.sh with no phase argument) will now hard-fail at the [[ -f ... ]] || fail ... check on line 86. This isn't a regression introduced by this PR — the talos phase was already broken per issue #581 and is already flagged dead in RUNBOOK-baremetal-conversion.md:417 and the updated RUNBOOK-cold-rebuild.md:139, and the PR body explicitly calls out leaving bootstrap.sh untouched as a deliberate choice. Still, since the reference is now to a file that no longer exists at all (not just unusable), it may be worth a follow-up to either delete the dead talos phase from the script or have it fail immediately with a message pointing at the runbook, rather than leaving a stale path check.
  • RUNBOOK-cold-rebuild.md:233 pins helm install ... --version 1.20.1 while the HelmRelease (kubernetes/infrastructure/cilium/helmrelease.yaml:24) tracks >=1.20.0 <1.21.0. The runbook already warns "Pin --version to whatever the HelmRelease range currently resolves to," so this is self-documented, but a hardcoded version in a runbook will silently drift out of the allowed range over time with no CI check to catch it.

Tests

This is docs/config-only (no application code), so there's no automated test suite to extend. The PR body describes the verification the author actually performed against the live cluster (machine-config inventory counts, upgrade-k8s --dry-run before/after, BGP/Cilium staying Ready through the migration), which is the appropriate form of validation for this kind of change and is more convincing than a static review can be. I could not independently verify those cluster-side claims (no access to the live cluster from this checkout) — the repo-side consistency is what I checked instead.

Recommendation

Looks reasonable — no blocking issues; comments above are optional.

🤖 **Automated review** — model `CLI default` (complexity: complex), commit `1f18599b4c077202d05a5826cb388d41b685c974`. > Advisory review by the `review-bot` pipeline. It never approves; a human merges. Push new commits to get a fresh review. --- ## Summary This PR finishes making the Cilium HelmRelease the single source of truth for CNI configuration: it deletes the two Talos-side copies (`talos/cilium.yaml`, the rendered inline manifest, and `talos/patches/cilium-cni.yaml`, the additive/delete patch pair), moves the two settings Talos still needs (`cluster.network.cni.name: none`, `cluster.proxy.disabled: true`) into `talos/patches/cluster.yaml`, and rewrites the cold-rebuild and baremetal-conversion runbooks to install Cilium via a documented `helm install` step (new Step 2b) instead of relying on a Talos inline manifest. I traced every changed and deleted file against the rest of the repo (including `bootstrap.sh`, CI configs, and other doc cross-references) and the change is internally consistent: the surviving `cluster.yaml` keys use valid Talos v1alpha1 paths, no other kustomization/config still points at the deleted files, and the new runbook steps line up with the HelmRelease's namespace, chart version range, and values. No blocking issues found. ## 🟡 Suggestions - `kubernetes/bootstrap.sh:86,126` still reference the now-deleted `talos/patches/cilium-cni.yaml`. Running `./bootstrap.sh talos` (or the default `./bootstrap.sh` with no phase argument) will now hard-fail at the `[[ -f ... ]] || fail ...` check on line 86. This isn't a regression introduced by this PR — the talos phase was already broken per issue #581 and is already flagged dead in `RUNBOOK-baremetal-conversion.md:417` and the updated `RUNBOOK-cold-rebuild.md:139`, and the PR body explicitly calls out leaving `bootstrap.sh` untouched as a deliberate choice. Still, since the reference is now to a file that no longer exists at all (not just unusable), it may be worth a follow-up to either delete the dead `talos` phase from the script or have it fail immediately with a message pointing at the runbook, rather than leaving a stale path check. - `RUNBOOK-cold-rebuild.md:233` pins `helm install ... --version 1.20.1` while the HelmRelease (`kubernetes/infrastructure/cilium/helmrelease.yaml:24`) tracks `>=1.20.0 <1.21.0`. The runbook already warns "Pin `--version` to whatever the HelmRelease range currently resolves to," so this is self-documented, but a hardcoded version in a runbook will silently drift out of the allowed range over time with no CI check to catch it. ## Tests This is docs/config-only (no application code), so there's no automated test suite to extend. The PR body describes the verification the author actually performed against the live cluster (machine-config inventory counts, `upgrade-k8s --dry-run` before/after, BGP/Cilium staying `Ready` through the migration), which is the appropriate form of validation for this kind of change and is more convincing than a static review can be. I could not independently verify those cluster-side claims (no access to the live cluster from this checkout) — the repo-side consistency is what I checked instead. ## Recommendation Looks reasonable — no blocking issues; comments above are optional. <!-- pr-review:sha=1f18599b4c077202d05a5826cb388d41b685c974 -->
claude-bot added 1 commit 2026-08-28 14:29:34 +00:00
docs(cilium): derive the bootstrap install from the HelmRelease
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was successful
17d4c55485
The install command in Step 2b hardcoded --version 1.20.1 and the chart repo
URL. That is a copy of the HelmRelease in a text file nobody runs between
rebuilds, so it would have gone stale unnoticed and the next rebuild would have
installed something Flux immediately fought — the same failure the deleted
bootstrap seed produced, in a new place.

Everything now comes out of helmrelease.yaml at the moment the command runs:
the repo URL from the HelmRepository, the values from .spec.values, and
--version from .spec.chart.spec.version verbatim. Helm accepts the semver range
and resolves it exactly as Flux does, so the two cannot pick different releases.

Verified by running the block as written:

    --version ">=1.20.0 <1.21.0"  ->  cilium:v1.20.1, operator-generic:v1.20.1
    enable-bgp-control-plane: "true"    bpf-lb-sock: "true"
    bpf-policy-map-max: "65536"         ipv4-native-routing-cidr: 10.0.0.0/8
    ServiceMonitor objects: 0

which is the config the cluster is running.

The only literal left is --set prometheus.serviceMonitor.enabled=false, and it
is a bootstrap constraint rather than a value: the CRD arrives with the
monitoring stack long afterwards. Because nothing else is overridden,
helm-controller adopts this release instead of replacing it.

This does not make the step unnecessary. Flux's controllers are pods and cannot
reconcile a CNI they need in order to run; something has to seed it. What it
does mean is that the step has nothing left in it to maintain.
k.renner merged commit ecb19e5085 into master 2026-08-28 14:30:06 +00:00
review-bot left a comment
Member

🤖 Automated review — model CLI default (complexity: complex), commit 17d4c55485931742e29ea42718060013018214c7.

Advisory review by the review-bot pipeline. It never approves; a human merges. Push new commits to get a fresh review.


Summary

This PR finishes the Cilium single-owner migration (step 6 of PROPOSAL-cilium-single-owner.md, follow-up to #707): it deletes the two Talos-side Cilium manifests (talos/cilium.yaml, talos/patches/cilium-cni.yaml, ~3900 lines of rendered/templated YAML), moves the two settings Talos genuinely needs (cluster.network.cni.name: none, cluster.proxy.disabled: true) into talos/patches/cluster.yaml, removes now-stale "keep in lockstep" comments from helmrelease.yaml, and rewrites the cold-rebuild and baremetal-conversion runbooks to install Cilium via helm install from the HelmRelease values as a new Step 2b. No blocking issues found — the schema placement, the deleted content, and the runbook's helm/yq commands all check out against what's actually in the repo.

🟡 Suggestions

  • kubernetes/bootstrap.sh:86 and :126 still hard-reference patches/cilium-cni.yaml, which this PR deletes. Running ./bootstrap.sh talos (or ./bootstrap.sh with no args) will now fail immediately at the [[ -f ... ]] || fail "cilium-cni.yaml patch not found" check instead of failing later during talosctl gen config (the pre-existing #581 failure the runbooks already documented). The PR description explicitly acknowledges this phase was already dead and stays dead "for a second reason," which the runbook now states — so this isn't a regression in practical terms, but the script itself gives no hint of why, and a future reader of bootstrap.sh alone (without also reading RUNBOOK-cold-rebuild.md) will hit a confusing "file not found" for a file that was deliberately removed. Worth either pointing the fail message at the runbook or stripping the dead talos phase in a follow-up.

Tests

No test suite applies here — this is documentation plus declarative Talos/Helm config. The safety net is operational (described in the PR body: inventory went 41→13 entries, upgrade-k8s --dry-run went from 28 deletions to 0, Cilium/BGP stayed up through the migration), which is appropriate for this kind of change and not something a unit test could cover.

Recommendation

Looks reasonable — no blocking issues; comment above is optional.

🤖 **Automated review** — model `CLI default` (complexity: complex), commit `17d4c55485931742e29ea42718060013018214c7`. > Advisory review by the `review-bot` pipeline. It never approves; a human merges. Push new commits to get a fresh review. --- ## Summary This PR finishes the Cilium single-owner migration (step 6 of `PROPOSAL-cilium-single-owner.md`, follow-up to #707): it deletes the two Talos-side Cilium manifests (`talos/cilium.yaml`, `talos/patches/cilium-cni.yaml`, ~3900 lines of rendered/templated YAML), moves the two settings Talos genuinely needs (`cluster.network.cni.name: none`, `cluster.proxy.disabled: true`) into `talos/patches/cluster.yaml`, removes now-stale "keep in lockstep" comments from `helmrelease.yaml`, and rewrites the cold-rebuild and baremetal-conversion runbooks to install Cilium via `helm install` from the HelmRelease values as a new Step 2b. No blocking issues found — the schema placement, the deleted content, and the runbook's helm/yq commands all check out against what's actually in the repo. ## 🟡 Suggestions - `kubernetes/bootstrap.sh:86` and `:126` still hard-reference `patches/cilium-cni.yaml`, which this PR deletes. Running `./bootstrap.sh talos` (or `./bootstrap.sh` with no args) will now fail immediately at the `[[ -f ... ]] || fail "cilium-cni.yaml patch not found"` check instead of failing later during `talosctl gen config` (the pre-existing #581 failure the runbooks already documented). The PR description explicitly acknowledges this phase was already dead and stays dead "for a second reason," which the runbook now states — so this isn't a regression in practical terms, but the script itself gives no hint of why, and a future reader of `bootstrap.sh` alone (without also reading `RUNBOOK-cold-rebuild.md`) will hit a confusing "file not found" for a file that was deliberately removed. Worth either pointing the `fail` message at the runbook or stripping the dead `talos` phase in a follow-up. ## Tests No test suite applies here — this is documentation plus declarative Talos/Helm config. The safety net is operational (described in the PR body: inventory went 41→13 entries, `upgrade-k8s --dry-run` went from 28 deletions to 0, Cilium/BGP stayed up through the migration), which is appropriate for this kind of change and not something a unit test could cover. ## Recommendation Looks reasonable — no blocking issues; comment above is optional. <!-- pr-review:sha=17d4c55485931742e29ea42718060013018214c7 -->
Sign in to join this conversation.