fix(bootstrap): der Serial-Lookup hat im Maintenance Mode nie funktioniert #711
Closed
claude-bot
wants to merge 7 commits from
bootstrap-serial-lookup-fix into main
pull from: bootstrap-serial-lookup-fix
merge into: :main
:main
:alert-fix/issue-1453
:claude/gitea-mcp-imagerepo
:feat/ma-youtube-music-po-token-v2
:feat/ma-youtube-music-po-token
:claude/coredns-talos-owned-2
:claude/coredns-talos-owned
:claude/k8s-gateway-ingress-resolver
:claude/egress-followups
:feat/wiki-cronjobs
:renovate/hermes-image
:renovate/ci-minor-patch
:renovate/influxdb
:renovate/home-assistant-minor-patch
:renovate/multus
:renovate/all-minor-patch
:renovate/pin-image-digests
:claude/mqtt-admin-register
:claude/shelly-manager-mdns
:feat/wiki-encyclopedia-pilot
:ci-image/claude-2.1.310
:claude/mosquitto-legacy-auth-removal
:claude/egress-lockdown
:fix/gate-embedded-refresh-interval
:fix/gate-embedded-browser-host
:feat/authentik-gate-forwardauth
:docs/drop-wildcard-references
:fix/netbird-controller-disable-dns
:feat/dns-labels-split-2
:feat/dns-labels-split-1
:fix/cloudflare-lb-sync-image-tag
:feat/cloudflare-lb-sync
:fix/wordpress-php85-php2shell
:feat/update-os
:chore/talos-1.13.12
:atlas/talos-v1.13.12-cve-2026-99999
:fix/gitea-webhook-sync-org-scope
:atlas/kuma-mcb-www-retries
:feat/hermes-gitea-pr-review-loop
:atlas/traefik-chart-42
:fix/monitoring-k8s-gateway-probe
:alert-fix/issue-1081-rotator
:ci-image/claude-2.1.306
:alert-fix/issue-1084-v2
:atlas/flux-2.9.6
:alert-fix/issue-1082
:feat/hermes-gitea-issues-kanban
:worktree-restore-test-real
:fix/hermes-multiplex-env
:feat/hermes-experts
:feat/hermes-ha-mcp
:feat/kuma-status-page
:fix/hermes-ha-updates-review
:feat/hermes-alert-monitor
:feat/hermes-ha-updates
:fix/turn-tcp-router
:fix/crowdsec-own-ca
:fix/livekit-service-links
:fix/crowdsec-lapi-transport-ca
:feat/matrix-element-call
:feat/kuma-public-coverage
:feat/ha-matrix-nabu-secret
:feat/hermes-matrix-cross-signing
:feat/hermes-matrix
:fix/wiki-basic-auth-in-service
:proposal/traefik-vip-maglev-dsr
:fix/hermes-dashboard-ws-ping-timeout
:fix/hermes-dashboard-ws-ping-interval
:fix/hermes-dashboard-refresh-token
:feat/wiki-drop-gate
:feat/wiki-oidc-provider
:fix/hermes-soul-talos-node-names
:claude/docs-konairius-main
:claude/drop-k-renner-org-secrets
:claude/prompts-main
:claude/default-branch-main
:feat/hermes-cli-logins
:claude/plan-step0-claude-bot
:alert-fix/issue-1363
:claude/homelab-konairius
:claude/konairius-org-secrets
:fix/hermes-image-registry-bot
:feat/hermes-use-custom-image
:feat/hermes-image
:feat/kuma-task5-monitors
:feat/hermes-gitea
:fix/hermes-configmap-namespace
:feat/hermes-homelab-context
:fix/uptime-kuma-script-mount
:feat/kuma-task4-bootstrap
:feat/kuma-task4-cluster
:feat/kuma-sync-default-notifications
:fix/hermes-image-policy
:fix/kuma-sync-foreign-key-create
:feat/hermes-agent
:chore/kuma-sync-smoke-remove
:feat/kuma-sync-smoke
:feat/kuma-sync-deploy
:ci-image/claude-2.1.303
:renovate/authentik
:feat/kuma-sync
:docs/uptime-kuma-plan
:chore/remove-autokuma
:fix/uptime-kuma-ipv6
:feat/autokuma-pilot-update
:fix/drop-flux-image-automation-alert
:feat/autokuma-pilot
:feat/autokuma
:fix/uptime-kuma-fail-guard
:fix/uptime-kuma-setup-diagnostics
:feat/uptime-kuma-vps
:ci/ansible-image-hvac
:claude/plan-homelab-konairius-main
:fix/kubejobfailed-resolve-on-later-success
:claude/homeassistant-konairius
:claude/ha-config-sync-identity
:feat/site-base-domain
:claude/review-bot-repos-konairius
:claude/authentik-konairius-images
:claude/notes-renovate-konairius
:claude/vsftpd-konairius-image
:claude/registry-bot-read-scope
:claude/registry-bot
:ci-image/claude-2.1.302
:claude/review-bot-approved
:claude/review-bot-backends
:fix/wp-pg-recovery-source
:feat/review-bot-status
:worktree-hcloud-wg-site
:node-dns-via-k8s-gateway
:chore/remove-paperclip
:worktree-k8s-gateway-chart-4
:fix/review-bot-approve-with-unverified
:chore/remove-wiki-maintenance-ci
:fix/review-bot-unique-tag
:fix/review-bot-rereview
:fix/review-bot-build-trigger
:fix/review-bot-backoff-cap
:fix/review-bot-rate-limit
:chore/disable-old-pr-review
:feat/review-bot-deploy
:feat/review-bot-service
:feat/pr-review-mistral
:fix/gitea-mcp-public-gitea-url
:alert-fix/issue-1242
:alert-fix/issue-1241
:fix/gitea-mcp-command
:feat/gitea-mcp
:claude/netbird-service-sync-pin
:claude/gitea-public
:feat/embed-knn-bench
:claude/pr-review-latest-cli
:ci-image/claude-2.1.296
:chore/decommission-openproject
:claude/pr-review-central
:feat/openproject-authentik-oidc
:fix/alloy-syslog-udm-cef-regex
:alert-fix/issue-1217
:alert-fix/issue-1214
:atlas/ren-1363-openproject-seeder-order
:atlas/ren-1367-gitea-1.27
:atlas/ren-1367-gitea-pre-upgrade-snapshot
:atlas/ren-1363-openproject
:atlas/ren-1345-ops-image-jq
:atlas/ren-1345-hermes-prometheus-read
:atlas/ren-1345-bridge-agent-secrets
:atlas/ren-802-retire-sml2mqtt
:atlas/ren-953-remove-legacy-users
:atlas/ren-1307-edge1-register
:atlas/ren-1307-edge1-cred-receiver
:atlas/ren-953-controller-ha-cert
:atlas/ren-1256-prune-shellies-secret
:atlas/ren-953-ha-mqtt-cert-sync
:atlas/ren-1256-adopt-shellies-secret
:atlas/ren-1203-eso-gitea-namespace
:atlas/ren-1203-gitea-package-retention
:atlas/ren-1196-agent-runtime-tzdata
:atlas/ren-1017-remove-legacy-shellies
:atlas/ren-1017-ht-wake-reland
:atlas/ren-1017-shelly-30
:atlas/ren-1167-revert-1183
:alert-fix/issue-1184
:atlas/ren-1017-ht-wake
:atlas/ren-1017-shelly-group5c
:atlas/ren-1017-shelly-group5b
:atlas/ren-1080-controller-1d03144-rotate-hold
:atlas/ren-1017-shelly-group5
:atlas/ren-1017-shelly-group4
:atlas/ren-1053-controller-a307693
:atlas/ren-1017-shelly-group3
:atlas/ren-1017-shelly-group2
:atlas/ren-1017-shelly-group1
:atlas/ren-1017-device-list
:atlas/ren-1017-shelly-accounts
:atlas/ren-953-agents-read-paperclip-pod
:atlas/ren-953-agents-read
:atlas/ren-953-ha-mqtt-tls
:atlas/ren-953-ha-account
:atlas/ren-953-evcc-cert
:atlas/ren-953-evcc-account
:atlas/ren-953-z2m-cert
:atlas/ren-953-z2m-account
:atlas/ren-953-health-probe-cert
:atlas/ren-931-agent-shelly-manager
:atlas/ren-900-controller-bump
:atlas/ren-900-mosquitto-dynsec
:atlas/ren-888-revoke-test-account
:atlas/ren-888-mqtt-account-controller
:atlas/ren-841-remove-repair-job
:atlas/ren-841-k8s-plugin-termination-receipt
:atlas/ren-841-lease-receipt-repair
:atlas/ren-802-suspend-open3e-int-rotator
:atlas/ren-826-remove-read-job
:atlas/ren-826-room-setpoint-read
:atlas/ren-809-remove-capture
:atlas/ren-809-open3e-fbh-capture
:atlas/ren-723-authentik-2026.8.3
:atlas/ren-772-remove-rekey-job
:atlas/ren-772-wp-repo4-rekey
:atlas/ren-722-mdns-relay-v191-attach
:atlas/ren-723-openbao-rolling
:atlas/ren-722-dhcp-lease-renew
:atlas/ren-722-cni-plugins-installer-v1.9.1
:atlas/ren-723-influxdb-snapshot
:atlas/ren-722-cni-plugins-v1.9.1
:atlas/ren-722-job-force-annotations
:atlas/ren-717-matrix-bridge-1791195981
:atlas/ren-702-paperclip-cap-kill
:atlas/ren-691-matrix-bridge-1791179547
:atlas/ren-685-matrix-bridge-1791177680
:ci-image/claude-2.1.289
:atlas/ren-671-matrix-bridge-1791152484
:atlas/ren-663-matrix-public
:atlas/ren-587-matrix-bridge
:atlas/ren-567-authentik-grant-types
:atlas/ren-567-mas
:atlas/ren-627-edge1-ssh-egress
:atlas/ren-621-loki-read-gateway
:atlas/ren-603-pclp-pg-memory
:atlas/ren-583-gitea-pvc-volumename
:atlas/ren-583-gitea-volume-60gi
:atlas/ren-563-claude-session-resume
:atlas/ren-563-revert-1111
:atlas/ren-567-matrix
:atlas/ren-563-acpx-session-resume
:atlas/ren-544-argus-token-v3
:atlas/ren-539-atlas-token-v3
:atlas/ren-541-claude-auto-memory
:atlas/ren-540-hestia-token-v3
:atlas/ren-528-review-bot-verify-repo
:atlas/ren-533-shelly-manager-probe
:atlas/ren-525-rotate-argus-token
:atlas/ren-509-rotate-agent-tokens
:atlas/ren-487-hubble-relay
:atlas/ren-488-govulncheck
:atlas/ren-487-agent-pod-egress
:atlas/ren-453-retire-immich-library
:atlas/ren-451-restore-abort
:atlas/ren-451-restore-test-skip-cnpg
:alert-fix/issue-1095
:atlas/ren-442-restore-capacity-gate
:z2m-ws90-converter
:alert-fix/issue-1089
:atlas/ren-419-ephemeral-wear-alert
:alert-fix/issue-1084
:alert-fix/issue-1081
:atlas/ren-414-agent-kubectl-sa
:atlas/ren-411-agent-gitea-egress
:atlas/ren-409-paperclip-14769
:atlas/ren-405-k8s-plugin-dist
:atlas/ren-401-kaniko-oom
:atlas/ren-401-paperclip-patched-image
:z2m-memory-limit
:atlas/ren-350-beets-write-retry
:fix/navidrome-native-api
:atlas/ren-350-paperclip-lidarr-cnp
:atlas/ren-350-beets-retry-skips
:atlas/ren-350-beets-write
:atlas/ren-350-beets-phase2
:atlas/ren-350-beets-cronjob
:atlas/ren-339-restore-test-teardown
:atlas/ren-339-restore-roll
:atlas/ren-339-restore-plugin
:atlas/ren-339-ha-backup-cleanup
:atlas/ren-339-ha-restore-test
:atlas/ren-315-renovate-groups
:atlas/ren-315-renovate-tool-install
:atlas/ren-107-retention-divergence-alert
:atlas/ren-159-remove-ren28-negative-probes
:atlas/ren-302-claude-agent-acp
:atlas/ren-298-agent-sandbox-v0.5.6
:atlas/ren-294-ical-proxy-926ead0
:atlas/ren-286-agent-runtime-own-workflow
:atlas/ren-285-agent-sandbox-labels
:atlas/ren-286-agent-runtime-images
:atlas/ren-285-agent-sandbox
:atlas/ren-148-paperless-ingress-scoping
:atlas/ren-93-promql-gate
:atlas/ren-268-ha-hacs-proxy
:atlas/ren-266-hacs-versions
:atlas/ren-245-ha-critical-alerts
:atlas/ren-243-ha-window
:feat/openbao-secret-exists-check
:atlas/ren-239-ical-proxy-main-73b5d97
:atlas/ren-238-ical-proxy-main-4783abe
:atlas/ren-201-ical-proxy-gitea-image
:atlas/ren-216-renovate
:atlas/ren-152-wal-backlog-retune
:atlas/ren-198-pin-kps-chart
:atlas/ren-176-ha-pg-walstorage
:atlas/ren-166-cilium-verdict-metric
:atlas/ren-7-alert-contacts
:atlas/ren-177-velero-cephfs-readonly-backuppvc
:feat/paperclip-api-door
:atlas/ren-186-cost-ledger-sync
:atlas/ren-183-yaml-anchors
:atlas/ren-161-promtool-ci
:atlas/ren-163-ceph-nearfull-headroom
:atlas/ren-7-restore-audiobooks
:atlas/ren-127-podmonitor-comment
:atlas/ren-165-wal-maxparallel-stage
:atlas/ren-141-ha-pg-32gi
:atlas/ren-147-cilium-agent-metrics-service
:atlas/ren-142-negative-control-probe
:atlas/ren-140-negative-test-probes
:atlas/ren-102-flux-ksm-crs
:atlas/ren-7-pilot-endpointmonitors
:atlas/ren-131-openbao-unavailable-for
:atlas/ren-106-narrow-eso-failed
:atlas/ren-116-probe-citation-path
:atlas/ren-103-scrape-doc-gaps
:atlas/ren-6-imc-deploy
:atlas/ren-100-externalsecret-healthcheck
:atlas/ren-91-imagepolicy-total-order
:atlas/ren-88-ceph-ec-pool-false-page
:atlas/ren-86-paperclip-dependson-monitoring
:atlas/ren-36-prometheus-read-path
:docs/probe-egress-dependency-and-revert-recipe
:docs/paperclip-claude-token
:fix/paperclip-memory
:docs/probe-cnp-egress-and-status-caveats
:feat/ren-21-paperless-app-health-probe
:feat/ren-21-navidrome-app-health-probes
:alert-fix/issue-968
:feat/paperclip-wiki-key
:feat/lidarr
:feat/wiki-api-key-paperclip
:feat/paperclip-signup-off
:feat/paperclip
:feat/netbird-retire-vps-proxy
:feat/navidrome
:feat/immich-bulk-cutover
:feat/immich-bulk-pvcs
:feat/wiki-image-automation
:chore/wiki-image-fact-drafter
:chore/wiki-image-facts-page
:chore/abs-drop-old-books-pvc
:chore/wiki-image-judge-one-request
:feat/abs-books-bulk
:feat/libation-strip-branding
:feat/cephfs-ec-bulk
:feat/open3e-int-broker-user
:feat/wiki-reloader
:chore/wiki-image-phases-4-6
:feat/wiki-anthropic-key
:feat/wiki-service-write-token
:chore/retire-python-wiki-index
:feat/wiki-machine-door
:chore/wiki-phase3-image
:chore/wiki-phase2-image
:chore/wiki-build-1790250017
:feat/wiki-gate
:fix/gitea-egress-wiki
:feat/wiki-service-manifests
:docs/proposal-wiki-web-api
:alert-fix/issue-937
:fix/alertmanager-info-inhibitor
:feat/cephx-allowed-ciphers-aes256k
:feat/cephx-drop-prior-csi-keys
:ci/wiki-consolidate-tilde-paths
:feat/cephx-csi-aes256k
:ci/wiki-consolidate-in-ci
:chore/talos-1.13.10
:feat/drain-tolerant-singletons
:ci/wiki-distill-skip-empty
:ci/wiki-audit-script
:fix/k8s-gateway-oci-chart
:docs/network-traffic-classes-as-built
:feat/node-ip-vlan-46
:alert-fix/issue-920
:feat/bird-attached-node0
:feat/node-vlan-46-link
:chore/cni-drop-stage-labels
:feat/cni-sole-writer-converge-b2
:feat/cni-sole-writer-converge-b1
:chore/cni-stage-k8s-1
:fix/whereabouts-reconciler-cordon
:chore/cni-stage-k8s-2
:chore/cni-stage-k8s-3
:feat/cni-staged-sole-writer
:feat/netbird-service-sync-phase2
:feat/netbird-service-sync-phase1
:chore/gitea-namespace-phase3
:feat/gitea-namespace-phase2
:feat/gitea-namespace-phase1
:ci-image/claude-2.1.280
:fix/ci-claude-refresh-mixed-pins
:fix/align-ci-claude-pins
:fix/ci-claude-bump-token-newline
:worktree-fix-paperless-memory-limit
:alert-fix/issue-897
:alert-fix/issue-896
:fix/wiki-maintenance-merge-verify
:feat/pick-model-newest-among-comparable
:feat/pick-model-typesafe
:fix/wiki-maintenance-rebase-push
:fix/wiki-maintenance-strip-secrets
:fix/wiki-maintenance-image-2.1.278
:feat/wiki-maintenance-ci
:fix/wiki-index-commit-tags
:fix/wiki-index-pin-digest-2
:alert-fix/issue-880
:fix/wiki-index-tree-paging
:fix/wiki-index-pin-digest
:fix/wiki-index-strip-credentials
:fix/gitea-webhook-egress-wiki-index
:fix/wiki-index-openbao-ingress
:feat/wiki-index-deploy
:feat/wiki-index-image
:fix/eso-allow-ai
:feat/wiki-embed
:fix/multus-only-cni-writer
:fix/cilium-cni-uninstall
:feat/onebase-room-telemetry
:fix/external-dns-scrape-policy
:feat/dns-monitoring
:fix/external-dns-annotation-prefix
:fix/ftp-scanner-probe
:fix/libation-accounts-persistence
:fix/libation-pin-14.2.1
:feat/ceph-read-affinity
:fix/bird-local-cidr
:feat/single-pod-table
:docs/traffic-classes
:feat/podpod-rules
:fix/bird-static
:fix/bird-digest
:feat/bird-mesh2
:feat/bird-kubectl
:feat/bird-mesh
:feat/bird-image-api
:feat/bird-daemonset
:alert-fix/issue-844
:feat/bird-image
:alert-fix/issue-843
:feat/pod-egress-vlan47
:docs/576-rejected-options
:feat/antrea-eval
:feat/nodeip-pod0
:feat/cilium-native-pod0
:feat/bgp-peer-ingress
:feat/bgp-listen-ingress
:feat/ingress-static-addressing
:feat/k8s-net-split-phase-a
:feat/cilium-pin-devices
:chore/ci-k8s-2026-09-08
:feat/flux-2.9.5
:feat/ci-tool-pins
:feat/openbao-seal-key-bootstrap
:feat/openbao-static-seal
:fix/openbao-alerts-immediate
:feat/intel-gpu-dashboard
:feat/intel-gpu-exporter
:feat/intel-gpu-monitoring-resource
:fix/reloader-configmap-annotations
:netbird-proxy-protocol-digest
:netbird-proxy-protocol-deploy
:netbird-proxy-protocol
:netbird-proxy-services-uid
:netbird-proxy-services-deploy
:netbird-proxy-services
:proxy-watchdog-cooldown
:proposal-node-roll-downtime
:alert-fix/issue-808
:lapi-transport-phase-2
:ceph-address-ranges
:fix/arp-flux-second-nic
:rehearsal-san
:osd-partlabel-no-ceph
:lapi-transport-post-crds
:san-host-device-nad
:san-rollout
:san-role-rename
:ceph-20-cutover
:rebuild-tooling
:apply-set-hygiene
:rebuild-image-resilience
:cold-rebuild-ordering
:fix/bootstrap-honour-vm-state
:chore/remove-paperless-eval
:issue-fix/789-cilium-node-ula
:issue-fix/787-mdns-relay-supervisor
:trmnl-firmware-sync-off
:trmnl-device-tls
:vmtest-flux
:eval-script-fixes
:alert-fix/issue-780
:worktree-eval-script-fixes
:eval-out-of-iac
:paperless-eval-jobs
:paperless-eval-fixes
:paperless-eval-instance
:crowdsec-tailer-polling
:crowdsec-alerting
:llama-single-slot
:llama-ctx-revert
:arm-crowdsec-proxy-1
:fix-proxy-deploy-triggers
:llama-ctx-fix
:arm-crowdsec-proxy-2
:llama-ctx-assist
:crowdsec-metrics-dashboard
:alert-fix/issue-761
:embed-batch-fix
:crowdsec-lapi-service-annotations
:ha-llm-agent
:paperless-eval
:crowdsec-bouncer-unpack-on-host
:embed-bgem3
:crowdsec-bouncer-fetch-controller
:crowdsec-edge-lapi
:alert-fix/issue-750
:embed-pvc
:immich-drop-pgvectors
:fix-stale-migration-docs
:embed-oom
:embed-eval
:paperless-reloader
:close-paperless-data-migration
:paperless-llm
:paperless-3x
:llama-gate-flow
:llama-authentik-gate
:alert-fix/issue-726
:llama-single-alias
:llama-alias-order
:llama-model-alias
:ai-eval
:remove-netbird-backup
:llama-thinking-alias
:llama-split-embed
:netbird-backup-vacuum-into
:llama-server
:intel-gpu-device-plugin
:ceph-osd-by-label
:alert-fix/issue-714
:alert-fix/issue-712
:cilium-track-untracked-settings
:proposal-cilium-single-owner
:fix-cilium-bootstrap-seed
:woodpecker-agent-probe
:add-missing-probes
:paperless-http-probes
:gatus-hardening
:gatus-drop-file-check
:gatus-config-reload
:drop-pbs2-gatus
:generic-blackbox-alert
:probe-ci-openbao
:cleanup-nas-1-remnants
:ci-image/claude-2.1.250
:woodpecker-deployment-dispatch-rest
:woodpecker-deployment-dispatch-pilot
:fix-monitor-selector-comments
:fix-wear-alert-design
:trim-comments-authentik
:trim-comments-apps
:trim-comments-helm
:trim-comments-netpol
:trim-comments-infra
:trim-comments-talos
:alert-fix/issue-675
:trim-manifest-comments
:drop-unused-barman-creds
:hetzner-creds-shared-path
:ephemeral-framing
:disk-dashboard-smart
:smartctl-privileged
:smartctl-seccomp
:smartctl-exporter
:disk-dashboard-status
:disk-dashboard
:ci-image/claude-2.1.247
:kaniko-fork-rest
:kaniko-replacement
:proposal-traffic-classes
:runbook-remote-rebuild-possible
:runbook-cold-rebuild-baremetal
:alert-fix/issue-657
:velero-stale-60h
:talos-1-13-9
:ceph-mon-disk-warn-default
:ceph-san-pool-widen
:no-ipv6-on-vlan-parents
:alert-fix/issue-649
:alert-fix/issue-645
:openbao-alerting
:openbao-ha-3-replicas
:alert-fix/issue-635
:ceph-san-cleanup
:ceph-san-nad
:whereabouts-ipam
:talos-1-12-11
:mdns-relay
:netbird-rotate-migration
:runbook-stale-sockets
:drop-monitoring-agent
:ansible-drop-dead-plays
:ansible-rotate-netbird
:ansible-drop-pve
:tofu-state-verify
:alert-fix/issue-603
:drop-decommissioned-dns
:tofu-drop-proxmox-vm
:drop-pve-monitoring
:talos-factory-installer
:cilium-reloader
:drop-talos-image-seeding
:cilium-vlan-bypass
:restore-replicapool-size
:restore-cephfs-metadata-size
:alert-fix/issue-592
:ceph-readd-neptune
:k8s-3-baremetal
:ceph-drop-neptune
:alert-fix/issue-591
:ceph-readd-saturn
:alert-fix/issue-590
:remove-vm-605
:remove-vm-151
:k8s-2-baremetal
:ceph-remove-k8s-2
:baremetal-conversion-runbook
:restore-after-jupiter
:alert-fix/issue-579
:ceph-readd-k8s-1
:k8s-1-network-fix
:alert-fix/issue-573
:k8s-1-ephemeral-on-crucial
:alert-fix/issue-571
:alert-fix/issue-569
:immich-window-scaledown
:ceph-exclude-k8s-1
:crowdsec-cpu-requests
:jupiter-baremetal-u2
:velero-restore-test-monthly
:ws90-reporting-config
:alert-fix/issue-562
:fix-ws90-merge-overclaim
:fix-ws90-debounce-rationale
:worktree-z2m-2.13.0-ws90-debounce
:kaniko-no-debug-image
:alert-fix/issue-557
:alert-fix/issue-554
:alert-fix/issue-550
:bump-stale-ci-images
:document-pool-no-redundancy-meaning
:fix-ci-pool-blocks-osd-maintenance
:rotate-cephx-daemon-keys
:fix-ceph-health-alert
:repoint-ci-workspaces
:ci-throwaway-cephfs
:rollout-archive-timeout
:archive-timeout-gf-pg
:reduce-pg-wal-fpi
:reduce-wal-segment-padding
:fix-prometheus-cardinality
:fix-barman-sidecar-visible
:feat-paperless-data-repoint
:feat-paperless-data-block
:fix-cnpg-write-tuning
:fix-emptydir-tmpfs
:fix-trmnl-renderer-tmpfs
:feat-ha-recorder-db-url
:alert-fix/issue-525
:fix-cnpg-backup-alerting
:feat-ha-recorder-postgres
:fix-ceph-mon-write-amplification
:fix-ceph-replica-size-2
:fix-ceph-deferred-write-amplification
:fix-326-noise-log-suppression
:fix-381-z2m-discovery
:decommission-rustfs-lxc
:document-hairpin-id-diff
:fix-rustfs-shim-replace
:fix-rotator-woodpecker-url
:alert-fix/issue-510
:bump-woodpecker-cli
:migrate-woodpecker-stage3
:migrate-woodpecker-stage2
:fix-eso-woodpecker-namespace
:migrate-woodpecker-namespace
:ceph-mon-data-avail-warn
:revert-image-gc-thresholds
:fix-ceph-toolbox-and-gc-thresholds
:fix-cilium-policy-map-exhaustion
:drop-stale-hetzner-dns
:fix-outpost-callback-path
:bump-ci-k8s-pins
:fix-wordpress-config-extra
:wordpress-renner-uno
:fix-authentik-double-passkey-touch
:pin-ical-proxy-image
:fix-trmnl-renderer-reloader
:fix-trmnl-render-lang
:fix-trmnl-session-expiry
:fix-trmnl-graphite-theme
:fix-trmnl-token-lifetime
:fix-trmnl-renderer-runtime
:feat-trmnl-renderer
:fix-trmnl-lb-address
:feat-trmnl-terminus
:retire-dead-monitoring
:heating-can-supervisorctl
:fix-native-teardown
:edge-capability-groups
:heating-can-image
:edge-bootstrap-selfcontained
:prometheus-pve-hostnames
:inventory-pve-hostnames
:chrony-allow-ipv6
:ntp-vrrp-linklocal-and-dad-sequencing
:ntp-service-address-health-gated
:ntp-anycast-capture-drift
:ntp-health-clock-correctness
:chrony-comment-correction
:worktree-chrony-makestep
:ci-k8s-validate
:rotator-repin
:mosquitto-rotate-health
:alert-fix/issue-454
:alert-fix/issue-452
:mosquitto-rotation-proposal
:mosquitto-openbao
:mosquitto-drop-apk
:paperless-drop-apk
:cni-plugins-image
:multus-drop-apk
:fix-jq-comment
:rename-alpine-jq
:fix-ci-yaml
:z2m-seed-drop-apk
:z2m-interview-watchdog
:alert-fix/issue-439
Labels
Clear labels
apollo
atlas
clio
daedalus
hestia
Hermes expert: Immich, Audiobookshelf, Libation, Navidrome, Music Assistant
Hermes expert: Talos, Flux, network, Authentik, Matrix, monitoring
Hermes expert: Paperless, wiki, ical-proxy, TRMNL, websites
Hermes expert: Gitea, Woodpecker, Renovate, review-bot, Hermes
Hermes expert: Home Assistant, IoT, MQTT, ESPHome, voice
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: konairius/homelab#711
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Die drei Commits aus #710, die es nicht mehr in den Merge geschafft haben, plus ein Fehler, den ein QEMU-Testlauf danach aufgedeckt hat.
Der Fehler
--insecureist ein Flag vonget, kein globales. Es stand vor dem Subcommand:talosctl bricht ab, ohne den Node je zu kontaktieren. Das ist der Maintenance-Mode-Zweig — und Maintenance Mode ist der einzige Zustand, in dem eine Maschine beim Cold Rebuild ist. Er schlug immer fehl und fiel auf den PKI-Zweig zurück, der auf einer Maschine ohne Config per Definition nicht funktionieren kann. Die Erkennung konnte also ausschließlich bereits konfigurierte Nodes identifizieren.
Warum das durch den Review kam: verifiziert wurde gegen die drei laufenden Nodes. Dort antwortet der Fallback und verdeckt, dass der erste Zweig tot ist.
Gegenprobe am laufenden Node:
Was den Fehler unsichtbar gehalten hat
2>/dev/nullauf beiden Versuchen hat genau die Zeile weggeworfen, die sagt was los ist. Der stderr wird jetzt gesammelt und nur ausgegeben, wenn keiner der beiden Zweige eine Seriennummer liefert — einer von beiden soll ja fehlschlagen.serialnumber is not foundstatt eines pauschalen „could not read a chassis serial from 10.0.1.5" ist der Unterschied zwischen Diagnose und Raten.patch=$(grep ...)hatte kein|| true. grep endet mit 1, wenn kein Patch die Seriennummer deklariert, und unterset -ebeendet eine fehlschlagende Kommandosubstitution das Skript — die Meldung, die genau für diesen Fall geschrieben wurde, war unerreichbar.Dieselbe Form steckte in der ersten Selftest-Assertion:
kubectl … | grep -q ' Ready'liest ein kaputtes kubectl als „kein Ready-Node gefunden" und meldet „confirmed NotReady", ohne irgendetwas geprüft zu haben. Die Node-Liste wird jetzt zuerst geholt, und ihr Fehlen ist ein Fehler.Was der QEMU-Lauf sonst gezeigt hat
Das echte Factory-Image (unser Schematic, v1.13.9) bootet unter dem QEMU-Provisioner durch, und
install_ciliumbringt daraus einenReady-Node mitKubeProxyReplacement: TrueundRouting: Tunnel [vxlan]— derselbe Datapath wie in Produktion, Kubernetes 1.36.3.Zwei harte Grenzen dieser Umgebung, damit sie niemand mitten in einer Probe entdeckt:
systeminformationhat auf QEMU keinserialnumber-Feld.patch_for_machineist dort prinzipiell nicht testbar.--disks-Hilfe: disks after the first one are added only to worker machines. Ein reiner Control-Plane-Cluster bekommt keine OSD-Disks, Ceph braucht also zusätzliche Worker-VMs.A per-node patch carries that node's addresses, VLAN parents and disk serials. Putting one on the wrong machine is the expensive mistake in a rebuild, and the current defence against it is an operator matching DHCP leases to hostnames by hand — at the one moment when the machines have no hostnames, because a node in maintenance mode sits on whatever untagged lease it picked up. Each patch now declares the chassis it belongs to: # talos-chassis-serial: MC016US129EDMHE00039 read from `talosctl get systeminformation`, which answers in maintenance mode over --insecure, before any config exists. bootstrap.sh asks the machine which patch is its own instead of trusting that a name resolved to the box we meant, and refuses to apply a patch whose serial does not match what the machine reports. The disk selectors were already a partial defence: they name drive serials, so the wrong patch fails to match a disk rather than installing somewhere unintended. That turns a mistake into a failed install. This turns it into a refusal before anything is written, and — more usefully — removes the guess entirely, because the machine identifies itself. Serials, verified against all three: MC016US129EDMHE00039 k8s-1 MF116VS129EDMHE00013 k8s-2 MC016US129EDMHE00006 k8s-3 Tested by running the lookup against each live node: every one resolves to its own file. The markers are comments, so `talosctl gen config` is unaffected — confirmed by regenerating with k8s-2.yaml. Not addressed here, but this is what makes it fixable: apply_node_config still finds machines by resolving k8s-N.srv.renner.uno, which cannot work during a cold rebuild — the runbook says to read the leases off the UDM for exactly that reason. With identity coming from the hardware, that loop can take addresses instead of names. Left as its own change so this one stays reviewable.The apply loop iterated over node names, resolved k8s-N.srv.renner.uno, and applied k8s-N.yaml to whatever answered. That is backwards for the case it exists to serve: during a cold rebuild the machines have no hostnames and no DNS records — they sit on whatever untagged lease they picked up, which is why the runbook says to read the leases off the UDM. Resolving those names at that point resolves nothing, so the phase could not have worked no matter what else was fixed. Now each address is asked who it is, and the patch declaring that chassis serial is what gets applied. A machine whose serial no patch declares is an error naming the serial, not something to improvise around. Addresses come from NODE_ADDRS for a rebuild: NODE_ADDRS="10.0.1.5 10.0.1.9 10.0.1.14" ./bootstrap.sh talos and default to the FQDNs, which is the right input when the cluster already exists and a node is being re-applied. The default prints a warning that it cannot work on a cold rebuild, rather than failing obscurely later. Two things this rework broke and that are fixed here rather than found in production: The serial lookup ran before the retry loop, so a machine still booting into maintenance mode failed immediately where the old code retried for ten minutes. Identification is now retried, and only a machine that answers with an unknown serial is a real error. patch_for_machine runs in a subshell there, so its internal fail cannot end the script — the loop re-runs it bare on the last attempt to surface the actual message, and there is an explicit guard so apply-config can never be reached with an empty --config-patch. Dropping the loop over WORKERS would have silently applied controlplane.yaml to any future worker. WORKERS has been empty since k8s-edge was retired, so the loop was dead, but the assumption was load-bearing: the serial says which machine a patch belongs to, not which base config it wants. The script now refuses to run if WORKERS is ever non-empty. resolve_node_ip and DNS_SERVER go with the old approach; nothing else used them. Verified: lookup resolves each of the three live nodes to its own patch, the selftest still passes end to end (node Ready, agent 1/1), and nothing was left running or pointed at the production context afterwards.Both bootstrap calls hardcoded --branch=master, which is why the flux phase could never be tried before it was needed: `flux bootstrap` commits its own sync manifests into the branch it reconciles, so running it wrote to the source a rebuild depends on. FLUX_BRANCH defaults to master and can be pointed at a throwaway branch: FLUX_BRANCH=rehearsal-$(date +%s) ./bootstrap.sh flux Nothing else about the phase changes, which is the point — a rehearsal that takes a different code path proves less than one that takes the same one. This is the only part of the break-glass path that can be exercised in advance. The waits after it — infrastructure, Ceph, the object store — need real disks, and no branch makes them work on a scratch cluster. The comment says so rather than leaving someone to discover it mid-rehearsal. Also moves install_cilium's doc comment back above install_cilium. Inserting patch_for_machine ahead of it left the comment describing the wrong function. Selftest re-run after the change: still green, node Ready and agent 1/1.🤖 Automated review — model
CLI default(complexity: complex), commit2a40ba61a72f57914048367b378c33abf025c2f9.Summary
This PR fixes the maintenance-mode chassis-serial lookup in
kubernetes/bootstrap.sh(the--insecureflag was placed before thegetsubcommand instead of after, sotalosctlrejected the command before ever contacting the node), adds three related robustness fixes (unswallowedgrep/command-substitution failures underset -e, adocker-basedselftestphase that exercises the Cilium CNI bootstrap path end-to-end, and aFLUX_BRANCHoverride for rehearsing the Flux phase), and tags the three per-node Talos patches with their chassis serials. The core fix is correct and well-verified (the PR body documents the QEMU repro), and the surrounding comments are unusually thorough. No blocking issues in the changed code; a couple of edge cases in the new retry loop and a stale doc are worth a look.🟡 Suggestions
kubernetes/bootstrap.sh:290-303(apply_node_configretry loop) — a late-succeeding "surface the real error" retry can produce a false failure. On the 60th iteration, if the silent probe (node_patch=$(patch_for_machine "$addr" 2>/dev/null), line 290) fails but the machine becomes reachable in the 10s before the follow-up bare callpatch_for_machine "$addr"at line 297 runs, that bare call succeeds and printsidentifies as ...— but its result is never captured intonode_patch(the call isn't assigned). The loop then falls through to[[ -n "$node_patch" ]] || fail "never identified the machine at $addr"(line 302), which still fails becausenode_patchholds the previous (empty) value. The script aborts right after printing what looks like a success line, even though the node just answered correctly. This is a narrow timing window (it only exists on the last iteration, coinciding with the 10s sleep), and re-running the script recovers, but it directly contradicts the "belt and braces" comment's intent above it.patch_for_machinereturns non-zero for both "could not read a chassis serial from $addr" (unreachable) and "$addr reports chassis serial '$serial', which no patch ... declares" (reachable, but no matching patch) — line 137 vs. 146. Since the silent probe discards stderr and only checks the exit status,apply_node_configtreats both as "no answer yet" (line 295) and keeps retrying for the full 60 attempts (~10 minutes) before the final loud call finally surfaces the real "no patch declares this serial" message. The comment aboveapply_node_config(lines 265-269) states the goal is exactly to not conflate these two cases ("an unreachable node must not be mistaken for one whose serial is unknown"), but the implementation doesn't actually distinguish them until the last retry.kubernetes/RUNBOOK-cold-rebuild.md:133still shows the exact flag order this PR identifies as broken:talosctl -n <maintenance-ip> --insecure get disks(--insecurebefore the subcommand). Per this PR's own diagnosis, that ordering fails withunknown command "disks"without ever contacting the node. The manual procedure in this runbook is explicitly meant to be read "before running the script" and used as a fallback ("can take over at any step if it stops") for the very cold-rebuild scenario this PR is about, so an operator following it verbatim would hit the same dead branch. Contrast withkubernetes/RUNBOOK-baremetal-conversion.md:185(talosctl -n <maintenance-ip> get disks --insecure), which already has the correct order — the cold-rebuild runbook is just stale relative to it.install_cilium(kubernetes/bootstrap.sh:151-183) dropped the original comment's note that the Cilium install "must run before the node-Ready wait below" (it timed out otherwise, since kubelet stays NotReady with no CNI). The call order is unchanged in both thetalosandselftestphases, so there's no functional regression, but the rationale for why the ordering matters no longer lives next to either call site.kubernetes/bootstrap.sh:202-204) checks fordocker,helm,yqbut nottalosctl/kubectl, and doesn't check[[ -f "$CILIUM_HR" ]]the way thetalosphase does (line 298). Missing tools/files will still fail loudly viaset -eand theEXITtrap still cleans up, so this is cosmetic, but thetalosphase's more complete preflight would be a nice match.🟢 Nits
kubernetes/bootstrap.sh:144—grep -l "^# talos-chassis-serial: ${serial}\$" ...:$serialis interpolated unescaped into a grep pattern. Not exploitable and not a real risk given real chassis serials are alphanumeric, but a serial containing a regex metacharacter would make the match looser than intended.Tests
No automated test framework covers this file; the new
selftestphase (lines 200-288) is itself the testing mechanism, and it's a genuine improvement — it exercisesinstall_ciliumagainst a throwaway Docker Talos cluster instead of relying on production nodes that already have a CNI (which is exactly how the--insecureordering bug and the historicalcni: noneregression, #709, went unnoticed). It's opt-in (needsdocker, not part ofall), which is reasonable for a bootstrap script. The PR body documents manual QEMU verification of the actual fix, which is the appropriate level of rigor for this kind of infrastructure script.Recommendation
Looks reasonable — no blocking issues; comments above are optional (though the stale
RUNBOOK-cold-rebuild.md:133command is worth fixing while this is fresh).Nachgereicht: der Fix ist jetzt gegen echten Maintenance Mode verifiziert, nicht nur gegen einen konfigurierten Node.
Dafür einen QEMU-Cluster mit
--presets iso,maintenanceerzeugt — die Maschine bekommt keine Config, also genau der Zustand beim Cold Rebuild. Beide Reihenfolgen direkt nebeneinander gegen diesen Node:Der Maintenance-Dienst beantwortet
--insecurealso. Der alte Code konnte ihn nicht erreichen, und zwar nicht aus Netzwerkgründen, sondern weil talosctl schon beim Parsen abbrach — der Fehler war unabhängig von der Erreichbarkeit des Nodes.Damit ist die Behauptung im Commit belegt: der Zweig, auf den ein Cold Rebuild ausschließlich angewiesen ist, war tot.
Bestätigt sich dabei ein zweites Mal: die Ausgabe enthält kein
serialnumber-Feld. VMs melden keine Chassis-Seriennummer,patch_for_machinebleibt auf QEMU als Ganzes nicht testbar — geprüft wurde hier ausschließlich der Transportweg.FLUX_BRANCH was supposed to make the flux phase rehearsable, and it only got half way. It made the git side safe -- a throwaway branch instead of master -- while the phase still ran load_staged_access, which copies the staged files over ~/.talos/config and ~/.kube/config unconditionally. Rehearsing against a scratch cluster would have replaced the operator's production access with a QEMU VM's, which is a worse outcome than the one FLUX_BRANCH was written to prevent. The six places that wrote into $HOME now write to TALOSCONFIG_PATH and KUBECONFIG_PATH, derived from the env vars talosctl and kubectl already read. Unset, they resolve to the same two paths as before, so a real rebuild takes an unchanged path -- verified that neither var is set in the normal environment. Set, the whole phase runs against throwaway files: TALOSCONFIG=/tmp/rehearsal/talosconfig \ KUBECONFIG=/tmp/rehearsal/kubeconfig \ FLUX_BRANCH=rehearsal-1 ./bootstrap.sh flux This is deliberately the same shape as FLUX_BRANCH: one variable, identical code path. A rehearsal that runs different code proves less than one that does not. KUBECONFIG is allowed to hold a colon-separated list, and this script writes to it. There is no sensible way to write to a list, so it is rejected with a message rather than silently clobbering the first entry. Verified by extracting load_staged_access from this file and running it with both vars pointed at scratch paths: the staged markers land in the scratch files, and ~/.kube/config and ~/.talos/config are byte-identical by sha256 before and after. The rehearsal itself has not been run yet -- it additionally needs GITEA_TOKEN, and `flux bootstrap` writes a branch and a deploy key into the real repository, which is not something to do as a side effect of a code change.🤖 Automated review — model
CLI default(complexity: complex), commit524c26c8047cd52f86617dce4d106e5532a1c2ae.Summary
This PR fixes the maintenance-mode serial lookup in
kubernetes/bootstrap.sh(a misplaced--insecureflag that made the cold-rebuild node-identification path always fail and silently fall back to a path that can't work on an unconfigured machine), plus two relatedset -e/pipeline swallowing bugs uncovered by an actual QEMU test run, and adds aselftestphase that proves the Cilium CNI install path against a throwaway Docker cluster. It also makes the talosconfig/kubeconfig write locations overridable so thefluxphase can be rehearsed without touching$HOME. The fix for the headline bug is correct and well-reasoned; I found no blocking defects, only a few small follow-ups worth a look.🟡 Suggestions
kubernetes/RUNBOOK-cold-rebuild.md:133—talosctl -n <maintenance-ip> --insecure get disksplaces--insecurebefore thegetsubcommand, the exact ordering this PR identifies as broken forget systeminformation(--insecureis a flag ofget, not global). If that diagnosis is right, this runbook line has the same bug and silently fails the same way on a real cold rebuild. Worth a quick check/fix while the failure mode is fresh, even though this file isn't part of the diff.kubernetes/bootstrap.sh:131-167(patch_for_machine) docstring says the lookup "works equally on a configured node, which is why the same path serves a rebuild and a single node being re-added." That's true for the identify step (it has a non---insecurefallback), but the subsequent apply step atkubernetes/bootstrap.sh:376still hardcodestalosctl apply-config --insecure.--insecuretalks to Talos's maintenance-mode listener, which an already-configured node doesn't expose (consistent with the runbook's own stage-2 example at line 202, which drops--insecureand uses--mode=tryinstead). If so, re-adding an already-configured single node viaapply_node_configwould identify correctly but then spin through all 60 apply attempts and fail with "Timeout applying to $addr". This predates the diff (the old DNS-based path had the same hardcoded--insecure), so it's not a regression, but the new docstring's claim is broader than what the code actually delivers — worth either scoping the comment down or handling the configured-node apply case for real.kubernetes/bootstrap.sh:112—fail()writes its message with a plainecho(stdout), not>&2. Inpatch_for_machine, calls likenode_patch=$(patch_for_machine "$addr" 2>/dev/null)only redirect stderr, so afail()invoked inside is captured intonode_patchas text instead of being discarded. It's harmless today only becausefail()alwaysexits non-zero, which the caller'sif node_patch=$(...) && [[ -n "$node_patch" ]]checks before ever using$node_patch's content — but it's a fragile invariant to lean on silently. Sendingfail()'s output to stderr would remove the dependency.🟢 Nits
kubernetes/bootstrap.sh:337-339—mkdir -p ~/.talosis left over from beforeTALOSCONFIG_PATHwas introduced; the very next line already doesmkdir -p "$(dirname "$TALOSCONFIG_PATH")", which is the directory that's actually used. The old line is now dead weight and, worse, hardcodes$HOMEin a section whose whole point is to stop touching it unconditionally.Tests
The PR's own test is the new
selftestphase, and it's a solid regression guard for the CNI bootstrap contract (assertsNotReadypre-Cilium,Ready+ agent1/1post-Cilium, and thatcluster.yamlstill declarescni: none/proxy.disabled). It isn't wired into any Woodpecker pipeline (checked.woodpecker/*.yml— nothing invokesbootstrap.sh), which matches the PR's framing of it as a manual pre-flight check requiring Docker; that's a reasonable tradeoff for infra code that can't run in ordinary CI. The actual headline fix (--insecureordering inpatch_for_machine) has no automated coverage — understandably, since it requires a real/maintenance-mode-capable node — but the PR body documents a manual QEMU repro (unknown commandvs.tls: certificate required) that's convincing evidence the fix is correct.Recommendation
Looks reasonable — no blocking issues; comments above are optional.
🤖 Automated review — model
CLI default(complexity: complex), commit28edd95de16a634505b0c9558d74cc2e3330077d.Summary
This PR fixes the maintenance-mode serial lookup added by the (unmerged) #710 — the
--insecureflag was placed before thegetsubcommand instead of after it, which madetalosctlreject the command before ever contacting the node and silently disabled the only code path a cold rebuild can use. It also fixes twoset -e/grepinteractions that hid the resulting failures, adds a Docker-basedselftestphase, and makes~/.talos/~/.kubepaths overridable viaTALOSCONFIG/KUBECONFIGso the newfluxrehearsal mode (FLUX_BRANCH) can't clobber the operator's real kubeconfig. I read the whole script and the three touched Talos patches; the core fix is correct and well-supported by the PR's own repro. I found no confirmed blocking issues, but one new code path (theselftestphase'stalosctl cluster createinvocation) is unverified and worth a second look before relying on it, and the cold-rebuild runbook is now out of sync with what this PR revives.🟡 Suggestions
kubernetes/bootstrap.sh:263—talosctl cluster create docker \ ...passesdockeras a bare positional argument. Iftalosctl cluster createtakes the provisioner via--provisioner/-p(as I recall from Talos' CLI, withdockeras the default) rather than as a positional, this would fail the exact same way the--insecurebug did —talosctlrejecting the invocation before doing anything — except this path isn't wired into CI (selftestis explicitly "not part ofall", and nothing in the repo's Woodpecker config or docs references it), so a syntax error here wouldn't be caught automatically. I couldn't verify this in the sandbox (notalosctl/docker/network access here). Worth running./bootstrap.sh selftestonce end-to-end (or checkingtalosctl cluster create --help) before trusting it as a pre-flight check — the PR body's QEMU test verifiedinstall_ciliumand the serial lookup on real-ish hardware, not this Docker code path specifically.kubernetes/RUNBOOK-cold-rebuild.md:391-396— the runbook still says "bootstrap.sh talosis dead — it cannot generate a config (#581), and Step 2 no longer uses it," directing operators to a manual apply procedure instead. This PR is squarely about making the automatedtalosphase's maintenance-mode identification actually work during a cold rebuild, which is the exact scenario that note tells people to bypass. Worth a follow-up updating that note (or confirming it's still accurate and the automated phase remains unused by design) so a rebuild under pressure doesn't get routed around a phase this PR just fixed.kubernetes/bootstrap.sh:86-88— theKUBECONFIGcolon-list check runs unconditionally at script start, before phase dispatch. It's relevant totalos/flux/wait-apps(which writeKUBECONFIG_PATH), but not toselftest, which exports its own isolatedKUBECONFIGand never touchesKUBECONFIG_PATH. An operator who normally runs with a multi-pathKUBECONFIG(a common kubectl convention) would hit this failure even for./bootstrap.sh selftest, where it's a false alarm. Minor — fails loud and early rather than misbehaving, but easy to scope to the phases that actually useKUBECONFIG_PATH.kubernetes/bootstrap.sh:360-367— on the last retry (i -eq 60)patch_for_machine "$addr"is called a second time, unsuppressed, to surface the real error. If that second call happens to succeed (the machine answers on this call after failing the first one this iteration), its output isn't captured intonode_patch, so the subsequent[[ -n "$node_patch" ]] || fail "never identified..."still fires and reports a misleading "never identified" failure despite the machine having just answered. Narrow race window (needs the very last retry to flip from failure to success within the same iteration), and the outcome is still a safe hard-stop rather than a wrong config being applied, so this is a nit rather than a real risk.🟢 Nits
kubernetes/talos/patches/k8s-1.yaml:1-10/k8s-2.yaml/k8s-3.yaml— chassis serial numbers are now committed in plaintext to whatpr.jsonshows is a public repo. These aren't credentials, but they are physical-hardware identifiers (useful for e.g. vendor-support impersonation). This matches the pre-existing convention of committing MAC addresses and disk serials in these same files, so it's not a new class of exposure introduced by this PR — just flagging for awareness, not asking for a change.Tests
The PR's own testing is unusually well-documented in its description: a real QEMU-provisioned node with the actual factory schematic was used to reproduce the original bug (
unknown command "systeminformation") and confirm the fix (tls: certificate required, i.e. the node was actually contacted), and to verifyinstall_ciliumbrings a node toReadywith the expected Cilium datapath. That's solid evidence for the core fix.The new
selftestphase (Docker-based CNI bootstrap check) is a good addition for future regression coverage ofinstall_cilium, but as noted above I couldn't confirm it was actually exercised as written — it's deliberately excluded fromalland isn't referenced by any CI config in this repo, so nothing currently exercises it automatically. Recommend running it once manually to confirm thetalosctl cluster create dockerinvocation is valid before treating it as a working pre-flight check.Recommendation
Looks reasonable — no confirmed blocking issues; comments above (particularly verifying the
selftestphase actually runs, and reconciling the runbook's "bootstrap.sh talos is dead" note) are worth following up on.Aufgelöst statt rebased — nach #716 und #717 ist von den sieben Commits nichts mehr offen:
$HOME-Isolation (2 Commits)vmtest-Phase überholt: echtes Factory-Image, drei Nodes, derselbe Codepfad statt eines nachgebautenFLUX_BRANCH--insecure-Flag-Fixpatch_for_machine, und diese Funktion existiert in master nichtNODE_ADDRSaus #716Der
--insecure-Fix war korrekt und gegen eine konfigurationslose Maschine verifiziert — nur behebt er einen Fehler in Code, der nie in master lag.Offen bleibt eine Entscheidung, kein Patch:
NODE_ADDRSbeantwortet „an welche Adresse", die Serial-Identifikation beantwortete „welche Maschine ist das überhaupt". Beim Cold Rebuild ohne DNS und ohne Hostnamen sind das verschiedene Fragen — dort liegen drei Leases vor, ohne Zuordnung zu den Nodes. Falls das zurückkommen soll, gehört es auf einen frischen Branch gegen den heutigenapply_node_config, nicht auf diesen Stand.Pull request closed