Upgrades
Upgrade one layer at a time, bottom up: each layer needs the one below it stable. Current pins live in the Software Inventory.
flowchart TD T[Talos + Kubernetes] --> G[Gateway API CRDs] G --> C[Cilium] C --> A[Argo CD] A --> CM[cert-manager] CM --> S[OpenBao + CSI Driver] S --> ST[Longhorn + CNPG] ST --> W[Workloads<br/>low → medium → complex] B[Bifrost Docker Compose<br/>independent]
| Phase | Component | Risk | Page |
|---|---|---|---|
| 1 | Talos, Kubernetes | High — rolling node reboots | Talos |
| 2 | Gateway API CRDs, Cilium | High — CNI restart, LB IPs can go dark | Cilium |
| 3 | Argo CD | Medium — GitOps paused during restart | Argo CD |
| 4 | cert-manager | Low, but TLS for every service | cert-manager |
| 5 | OpenBao, Secrets Store CSI Driver | Medium — every app reads secrets here | Secrets |
| 6 | Longhorn, CloudNativePG | Medium — storage disruption | Storage |
| 7 | Bifrost (Traefik, NetBird, Authentik) | Low — outside the cluster | Bifrost |
| 8–10 | Workloads | Low to complex | Workloads |
| — | CDK8s typed imports | After any cdk8s.yaml bump | CDK8s imports |
Known breaking changes per component: Breaking changes.
Phase 0: research versions
Section titled “Phase 0: research versions”Run before touching anything and note the results.
curl -s https://api.github.com/repos/siderolabs/talos/releases/latest | jq -r .tag_namehelm repo add cilium https://helm.cilium.io && helm search repo cilium/cilium --versions | head -3helm repo add argo https://argoproj.github.io/argo-helm && helm search repo argo/argo-cd --versions | head -3
# Workload chart repos, then the latest two versions of eachwhile read -r name url; do helm repo add "$name" "$url" >/dev/nulldone <<'REPOS'15 collapsed lines
longhorn https://charts.longhorn.iovm https://victoriametrics.github.io/helm-chartsgrafana https://grafana-community.github.io/helm-chartsharbor https://helm.goharbor.ioopenbao https://openbao.github.io/openbao-helmcsi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/chartsheadlamp https://kubernetes-sigs.github.io/headlampkyverno https://kyverno.github.io/kyvernotrivy https://aquasecurity.github.io/helm-chartsotel https://open-telemetry.github.io/opentelemetry-helm-chartsollama https://otwld.github.io/ollama-helmreloader https://stakater.github.io/stakater-chartscnpg https://cloudnative-pg.github.io/chartsmetrics-server https://kubernetes-sigs.github.io/metrics-serverfalco https://falcosecurity.github.io/chartsREPOShelm repo update >/dev/null
for chart in longhorn/longhorn vm/victoria-metrics-k8s-stack vm/victoria-logs-single \ grafana/grafana harbor/harbor openbao/openbao csi-driver/secrets-store-csi-driver \ headlamp/headlamp kyverno/kyverno trivy/trivy-operator otel/opentelemetry-collector \ ollama/ollama reloader/reloader cnpg/cloudnative-pg metrics-server/metrics-server falco/falco; do echo "=== $chart ===" && helm search repo "$chart" --versions | head -2done
# Bifrost imagescurl -s https://api.github.com/repos/netbirdio/netbird/releases/latest | jq -r .tag_namecurl -s https://api.github.com/repos/goauthentik/authentik/releases/latest | jq -r .tag_namecurl -s https://api.github.com/repos/traefik/traefik/releases/latest | jq -r .tag_namehelm search repo compares chart versions. A chart can lag the app it ships, so check the APP column too. Read the upstream issue tracker for the target release before bumping.
Post-upgrade verification
Section titled “Post-upgrade verification”just talos-healthkubectl get applications -n argocd # all Synced + Healthy
# Secretskubectl exec -n openbao openbao-0 -c openbao -- bao status # Sealed: falsekubectl exec -n harbor deploy/secret-sync -- ls /mnt/secrets/
# Storagekubectl get volumes.longhorn.io -n longhorn-system \ -o custom-columns=NAME:.metadata.name,STATE:.status.state,ROBUST:.status.robustnesskubectl get cluster -A # CNPG healthy
# GPUkubectl get node k8s-worker4 -o jsonpath='{.status.allocatable.nvidia\.com/gpu}' # 5kubectl exec -n ollama deploy/ollama -- nvidia-smi
# Edgecurl -I https://auth.madhan.appcurl -I https://grafana.madhan.appssh root@178.156.199.250 docker exec netbird-agent netbird status