Actualizar ArgoCD¶
ArgoCD se actualiza solo, siempre a la última versión estable. La
Application argocd de symintel/gitops
instala el manifiesto oficial de la rama stable del repo de ArgoCD y le suma
la configuración propia (Dex, RBAC, health check, cuenta ci): cuando sale una
versión nueva, ArgoCD se aplica a sí mismo.
| Pieza | Qué hace |
|---|---|
argocd/apps/argocd.yaml |
La Application: sigue argocd/config con sincronización automática y ServerSideApply |
argocd/config/kustomization.yaml |
Base: https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml. Encima, configMapGenerator con behavior: merge para argocd-cm, argocd-rbac-cm y argocd-cmd-params-cm |
Rol Ansible k3s_argocd |
Primera instalación y saltos de versión mayor (version: latest en k3s_install.yml) |
Es una actualización sin supervisión
Una versión nueva se aplica sin preguntarte, y ArgoCD es lo que despliega
todo lo demás. Ya pasa por el pipeline de gitops (los manifiestos de la
versión nueva se validan al cambiar tu repo), pero no cuando cambia
el repo de ArgoCD. Si una versión nueva da problemas, ver
Si una versión nueva falla.
Cuánto tarda en enterarse¶
El repo-server guarda los manifiestos generados una hora
(reposerver.default.cache.expiration: 1h en argocd-cmd-params-cm), así que
una versión nueva se detecta como máximo una hora después de publicada.
Para adelantarlo:
La primera vez: actualizar a mano, y después activar la app¶
El orden importa
Una ArgoCD vieja (2.x) no puede compararse a sí misma en un clúster
con Kubernetes 1.36 (.status.terminatingReplicas: field not declared in
schema), así que no puede ser ella quien se actualice. La primera
actualización la hace el rol de Ansible. No hagas git push del cambio
de gitops antes (reemplaza argocd-config por argocd en el
ApplicationSet).
-
Comprueba la versión actual y la que va a instalar:
-
Simulación en el servidor, sin cambiar nada (tiene que terminar sin errores; los avisos failed to migrate last-applied-configuration son normales):
-
Actualiza con Ansible (desde
ansible/enhomelab):El rol resuelve
version: latest(la última estable) y aplica el manifiesto oficial con--server-side --force-conflicts(obligatorio desde ArgoCD 3.3, cuyo CRD deApplicationSetsupera el límite del apply normal). -
Verifica que todo vuelve a sano. Con la versión nueva desaparece el error de comparación de las apps:
-
Ahora sí,
git pushdegitops. El ApplicationSet cambiaargocd-configporargocd: la Application vieja se borra sin borrar sus recursos (los ConfigMaps de Dex y RBAC quedan), y la nueva los adopta. Vuelve a comprobar conkubectl -n argocd get applications.
Mantenerse en una versión (pausar las actualizaciones)¶
Para fijar una versión, cambia la base de argocd/config/kustomization.yaml,
en gitops, de stable a un tag:
Para volver a las actualizaciones automáticas, vuelve a poner stable. En el
rol de Ansible, el equivalente es k3s_install.gitops_argocd.version: v3.5.3.
Si una versión nueva falla¶
- Fija la versión anterior en
gitops(sección anterior) y espera a que se aplique. -
Si ArgoCD no arranca y no puede aplicar nada, vuelve a instalar la versión que funcionaba directo con
kubectl(no depende de ArgoCD): -
Las notas de actualización de ArgoCD dicen qué cambia en cada versión menor.
Si falla¶
| Síntoma | Revisar |
|---|---|
ComparisonError … terminatingReplicas: field not declared in schema |
ArgoCD es anterior a la 3.5: hay que hacer la primera actualización con Ansible (arriba) |
argocd queda OutOfSync tras activarla |
Es normal unos minutos: ArgoCD le agrega a cada recurso su anotación de seguimiento |
The CustomResourceDefinition "applicationsets.argoproj.io" is invalid: metadata.annotations: Too long |
Se aplicó sin --server-side; usa los comandos de esta página |
| Se pierde el login con GitHub tras actualizar | argocd-cm debe tener la clave dex.config (kubectl -n argocd get cm argocd-cm -o jsonpath='{.data.dex\.config}') y el Secret argocd-secret sus claves dex.* (Dex) |
| Una versión nueva no se detecta | Espera una hora, o fuerza: kubectl -n argocd annotate application argocd argocd.argoproj.io/refresh=hard --overwrite |