Actualizar y copias de seguridad¶
Cómo desplegar una versión nueva sin sorpresas, cuándo usar dos réplicas y qué copiar para poder restaurar kubelatch. También cubre la clave de cifrado y cómo desinstalar.
Saber cuándo hay una versión nueva¶
En los 30 segundos siguientes al arranque y luego una vez al día, kubelatch lee https://docs.kubelatch.com/releases/latest.json, que dice cuál es la última versión publicada; un intento fallido se repite una hora después. La petición no lleva identificador, ni versión, ni nada de tu instancia (A qué nos comprometemos). Cuando esa versión es más nueva que la tuya, los administradores ven:
- un aviso en la campana, «Hay una versión nueva de kubelatch: 0.31.0.», con el enlace «Cómo actualizar»;
- en «Inicio», una recomendación de la instalación más en la línea bajo el título, que lleva a la lista de salud de «Edición»;
- la fila «Versión» en «Edición»:
0.30.0 · hay 0.31.0 publicada, con «Novedades», que abre las notas de esa versión en Novedades, y el mismo «Cómo actualizar».
«Cómo actualizar» abre esta página. El aviso no lleva contador ni se puede descartar: desaparece al actualizar. Una compilación sin versión (dev) nunca comprueba.
Para comprobar sin esperar al día siguiente, pulsa «Comprobar ahora» en la fila «Versión». Con dos réplicas, solo comprueba en ese momento la que responde; la otra sigue con su comprobación diaria.
KUBELATCH_UPDATE_CHECK=false desactiva la comprobación, y «Versión» pasa a decir comprobación desactivada. En una instalación aislada de internet, KUBELATCH_UPDATE_CHECK_URL la apunta a un espejo interno del documento (Configuración).
Actualizar kubelatch¶
Los comandos usan $MGMT_KUBECONFIG y $KUBELATCH_VERSION, como en Instalar, y el values.yaml con el que instalaste.
Auditoría anterior a 24 horas
Desde la 0.27, una instancia que nunca tuvo clave de licencia funciona como Free y conserva la auditoría 24 horas como máximo (la 0.26 conservaba 7 días). Un minuto después del primer arranque de la versión nueva, la tarea de retención borra la auditoría anterior. Para conservarla, ten una clave puesta para entonces: define KUBELATCH_LICENSE antes de actualizar, o instala la clave en «Edición» justo después. Una clave de prueba vale. Ver Ediciones y licencia.
- Lee las notas de la versión nueva y pon esa versión en
KUBELATCH_VERSION. La versión del chart es la de kubelatch: el chart trae su imagen. - Avisa a los equipos si es horario de trabajo: el rollout corta los
execyport-forwardabiertos. -
Actualiza con los mismos values:
helm --kubeconfig "$MGMT_KUBECONFIG" upgrade kubelatch oci://ghcr.io/picaportelabs/charts/kubelatch \ --version "$KUBELATCH_VERSION" -n kubelatch -f values.yaml kubectl --kubeconfig "$MGMT_KUBECONFIG" -n kubelatch rollout status deploy/kubelatch -
Comprueba la versión en el log (la línea
listeningllevaversion) o con/kubelatch-server version:kubectl --kubeconfig "$MGMT_KUBECONFIG" -n kubelatch exec deploy/kubelatch -- /kubelatch-server version -
Si las notas de la versión dicen que cambió el manifiesto de bootstrap, actualízalo en cada cluster: Actualizar el bootstrap. Mientras no lo hagas, el cluster sigue funcionando con lo que su manifiesto permite.
Un cambio de configuración es el mismo helm upgrade con el values.yaml editado. Qué reinicia los pods y qué no:
| Cambio | Rollout |
|---|---|
| Versión nueva (imagen) | Sí. |
Cualquier value bajo config |
Sí: los pods llevan el hash del ConfigMap. |
secrets.env, con secrets.create |
Sí: los pods llevan el hash de ese Secret. |
Un Secret tuyo (kubelatch-secrets, kubelatch-tls…) |
No. Reinicia con kubectl --kubeconfig "$MGMT_KUBECONFIG" -n kubelatch rollout restart deploy/kubelatch. Un certificado renovado no necesita reinicio: kubelatch lo recarga. |
replicas, hardening, networkPolicy, el Ingress |
No: no tocan los pods. |
Nunca cambies el nombre tras instalar
Nunca cambies el nombre de la release, nameOverride ni fullnameOverride después de instalar. El chart deriva de ellos el Secret de la clave generada (<fullname>-encryption-key) y el Cluster de la base de datos (<fullname>-db). Un nombre nuevo significa una clave nueva y una base de datos nueva y vacía, y kubelatch arranca con ellas sin ningún error. Los objetos viejos se conservan, pero nada los usa.
Qué pasa durante un rollout¶
Con maxSurge: 1 y maxUnavailable: 0, el pod nuevo está Ready (migraciones aplicadas, Postgres accesible) antes de que el viejo empiece a terminar. El pod viejo sigue sirviendo durante shutdownDelaySeconds (5 s por defecto, un preStop que espera) antes de recibir SIGTERM: es lo que tardan kube-proxy y el balanceador en dejar de mandarle conexiones nuevas. Las peticiones nuevas nunca encuentran a nadie escuchando. Si tu balanceador tarda más en dejar de enviar tráfico a un destino, sube shutdownDelaySeconds (como mucho 25).
Pero un rollout corta las conexiones largas en curso. Al recibir SIGTERM, kubelatch:
- Deja de aceptar conexiones.
- Da 3 s a las peticiones normales para terminar.
- Cierra todo
exec,attach,port-forward,watchylogs -fabierto, y completa sus filas de auditoría conkubelatch restarting.
terminationGracePeriodSeconds: 60 deja margen para la espera y todo ello. kubectl reintenta solo los watch; un exec o un port-forward hay que relanzarlo.
Volver a iniciar sesión tras la 0.19.0¶
Actualizar a la 0.19.0 o posterior desde una versión anterior cierra una vez la sesión web de todo el mundo: la cookie de sesión cambió de nombre (ahora lleva el prefijo __Host-). Las credenciales, las sesiones de la CLI y los kubeconfigs no se ven afectados.
La política de endurecimiento y CloudNativePG¶
Hasta la 0.59.0, la política de endurecimiento rechaza también los bindings a Roles de namespace cuyo nombre empieza por kubelatch-, y CloudNativePG llama kubelatch-db al Role de la base de datos del chart. Con hardening.enabled: true y postgres.mode: cnpg, la base de datos sigue funcionando, pero el operador deja de gestionarla: ni cambios en el Cluster, ni actualizaciones, ni failover.
La política actual reserva solo los ClusterRoles. Un helm upgrade la instala en el cluster de gestión. En un cluster donde la aplicaste a mano, vuelve a aplicar el fichero del chart nuevo.
El operador retoma el Cluster en su siguiente reintento, hasta unos 17 minutos después, y aplica todos los cambios pendientes. Un imageName nuevo, por ejemplo, reinicia los pods de la base de datos; con una sola instancia, kubelatch no está disponible hasta que el pod vuelve. Para saber si hay una imagen pendiente antes de actualizar, compara estas dos:
kubectl --kubeconfig "$MGMT_KUBECONFIG" -n kubelatch get cluster kubelatch-db -o jsonpath='{.spec.imageName}{"\n"}'
kubectl --kubeconfig "$MGMT_KUBECONFIG" -n kubelatch get pods -l cnpg.io/cluster=kubelatch-db -o jsonpath='{.items[*].spec.containers[0].image}{"\n"}'
Para elegir el momento en vez de esperar al reintento, anota el Cluster cuando la política ya esté aplicada, y el operador lo retoma al momento:
kubectl --kubeconfig "$MGMT_KUBECONFIG" -n kubelatch annotate cluster kubelatch-db kubelatch.io/reconcile="$(date +%s)" --overwrite
Migraciones¶
Las migraciones se aplican al arrancar, con un lock de Postgres: con dos réplicas, una migra y la otra espera. Son solo hacia delante. Para volver a una versión anterior del binario, restaura la base de datos de la copia previa a la actualización (helm rollback solo devuelve los manifiestos).
Volver a una versión sin roles personalizados
Las migraciones que trajeron los roles personalizados mantienen la versión anterior funcionando sobre la base de datos ya migrada, así que basta un helm rollback para volver a ella. Esa versión no conoce los roles personalizados: enviaría el grupo de un rol personalizado sin su prefijo role-, y su reconciliador quitaría esos grupos de lo que kubelatch-proxy puede suplantar. El apiserver rechaza una petición en cuanto rechaza uno de sus grupos, así que quien tenga un rol personalizado recibiría 403 en todo en ese cluster, también con sus roles de sistema. Antes de volver a una versión anterior a los roles personalizados, revoca todos los permisos de roles personalizados: en «Roles», «Eliminar» cada rol personalizado y elige «Revocar todos y eliminar», o revócalos uno a uno en «Permisos».
Dos réplicas¶
replicas: 2
Con dos réplicas o más, el chart añade un PodDisruptionBudget con minAvailable: 1: un drenado de nodo deja siempre un pod sirviendo. Cómo repartir los pods, qué comparten las réplicas y qué se guarda cada una (los límites de peticiones, una clave pegada en «Edición», la última sincronización que se muestra, el documento de descubrimiento del proveedor OIDC) está en Varias réplicas.
Con la base de datos en CloudNativePG, su alta disponibilidad va aparte: De una instancia a tres.
Copias de seguridad¶
Necesitas dos cosas, y por separado:
| Qué | Por qué |
|---|---|
| La base de datos de Postgres | Contiene todo: cuentas y hashes de contraseña, clusters con sus tokens cifrados, permisos, credenciales (solo su SHA-256) y auditoría. |
KUBELATCH_ENCRYPTION_KEY |
No está en Postgres. Sin ella, los tokens de las ServiceAccounts de la copia son irrecuperables. |
- Haz un
pg_dumpdiario, o usa los snapshots de tu servicio gestionado. Con CloudNativePG, activa sus copias: Copias de seguridad. - Guarda la clave en el gestor de secretos, aparte de las copias.
- Prueba una restauración antes de necesitarla: restaura en otro Postgres y arranca un kubelatch apuntando a él con la misma clave.
Sin la clave, la copia está incompleta
Una copia de Postgres restaurada con otra clave arranca, pero ningún cluster funciona hasta rotar sus tokens, y todo el mundo tiene que volver a entrar. Guarda siempre la clave junto a tu procedimiento de restauración.
Ajustes de Postgres¶
idle_in_transaction_session_timeout: el reconciliador mantiene una transacción abierta durante toda una pasada (hasta 2 minutos de llamadas al cluster, más la escritura). Si tu Postgres tiene ese timeout, debe superar los 3 minutos. Si no, las pasadas largas fallan conterminating connectiony el cluster queda en «Error» hasta la siguiente.- Roles: un único rol hace las migraciones y el tráfico, y es el dueño de las tablas. No reutilices el rol de kubelatch para nada más.
- Tamaño: ver Auditoría y retención.
Si se pierde o se cambia la clave de cifrado¶
KUBELATCH_ENCRYPTION_KEY firma las sesiones y cifra los tokens de las ServiceAccounts de cada cluster. kubelatch solo admite una clave a la vez: no hay rotación con dos claves. Cambiarla (o perderla) tiene estos efectos:
- Todo el mundo vuelve a iniciar sesión: las cookies anteriores no valen.
- Ningún cluster puede usarse hasta renovar sus tokens. En «Clusters» aparecen en «Error» con
could not prepare the reconciler client: rotate the cluster's tokens, la tarjeta «Namespaces» y conceder un permiso responden409pidiendo rotar los tokens, y «Reconciliar» responde502con el mismo motivo, que se ve en la página del cluster. kubectl recibe un503conkubelatch cannot query its database; el log diceproxy: load cluster. - Una clave de licencia pegada en «Edición» no se puede abrir: kubelatch funciona como Free, con un aviso en «Edición», hasta que vuelvas a instalar la clave. La auditoría ya recogida se conserva, con la retención que configuraste; solo deja de servirse lo anterior a 24 horas hasta que una clave vuelva a verificar. Una clave en
KUBELATCH_LICENSEno se ve afectada. - No cambian: contraseñas (argon2id), credenciales
klt_(SHA-256), permisos y auditoría.
Si solo la perdiste del gestor de secretos, recupérala del Secret que carga el pod y no hace falta rotar. De tu Secret, o del que generó el chart (secrets.generateEncryptionKey):
kubectl --kubeconfig "$MGMT_KUBECONFIG" -n kubelatch get secret kubelatch-secrets -o jsonpath='{.data.KUBELATCH_ENCRYPTION_KEY}' | base64 -d
kubectl --kubeconfig "$MGMT_KUBECONFIG" -n kubelatch get secret kubelatch-encryption-key -o jsonpath='{.data.encryption-key}' | base64 -d
Para cambiarla a propósito, o si ya no está en ninguna parte:
- Genera una clave nueva:
head -c32 /dev/urandom | base64. -
Pon la clave nueva en su sitio y guárdala en el gestor de secretos:
- Con tu propio Secret, actualiza
KUBELATCH_ENCRYPTION_KEYenkubelatch-secrets. - Con la clave generada, borra el Secret
kubelatch-encryption-keyy ejecutahelm upgradecon los mismos values: el chart genera una nueva, que copias al gestor de secretos.
En los dos casos, reinicia los pods: el cambio de un Secret no redespliega solo. Espera a que termine el rollout antes de seguir. Mientras dura, conviven pods con la clave vieja y la nueva, y unos tokens guardados a mitad podrían no descifrarse en el otro pod.
kubectl --kubeconfig "$MGMT_KUBECONFIG" -n kubelatch rollout restart deploy/kubelatch kubectl --kubeconfig "$MGMT_KUBECONFIG" -n kubelatch rollout status deploy/kubelatch - Con tu propio Secret, actualiza
-
Para cada cluster, abre su página en «Clusters» y elige «Reenrolar» en su menú: genera el comando de enrolamiento y ejecútalo con el kubeconfig de ese cluster. Volver a aplicar el bootstrap va incluido. Ver Registrar un cluster.
- Comprueba que cada cluster vuelve a «Listo».
Desinstalar¶
-
Borra cada cluster desde «Clusters», que limpia su RBAC, y quita después su bootstrap (Eliminar un cluster). Si kubelatch ya no llega a él, límpialo todo en el propio cluster:
kubectl --kubeconfig <kubeconfig-del-cluster> delete -l app.kubernetes.io/managed-by=kubelatch clusterroles,clusterrolebindings,rolebindings -A kubectl --kubeconfig <kubeconfig-del-cluster> delete namespace kubelatch-system kubectl --kubeconfig <kubeconfig-del-cluster> delete validatingadmissionpolicybinding,validatingadmissionpolicy kubelatch-reconciler-jailEn los dos casos, si aplicaste a mano la política de endurecimiento, bórrala también: no lleva las etiquetas de kubelatch. En el cluster de gestión,
hardening.enabledla quita con la release.kubectl --kubeconfig <kubeconfig-del-cluster> delete validatingadmissionpolicybinding,validatingadmissionpolicy kubelatch-bindings -
Desinstala la release:
helm --kubeconfig "$MGMT_KUBECONFIG" uninstall kubelatch -n kubelatchBorra todo lo que creó el chart salvo lo que guarda datos o no se puede volver a crear, que se queda en su sitio:
Se queda Bórralo con La clave de cifrado generada ( kubelatch-encryption-key)kubectl --kubeconfig "$MGMT_KUBECONFIG" -n kubelatch delete secret kubelatch-encryption-keyLa base de datos de CloudNativePG ( Cluster kubelatch-db, sus volúmenes y, con las copias activadas, suObjectStorey suScheduledBackup)Desinstalar y los datos Tus Secrets y el namespace kubectl --kubeconfig "$MGMT_KUBECONFIG" delete namespace kubelatch(borra también todo lo anterior: elCluster, sus volúmenes y la clave generada, así que exporta antes lo que necesites) -
Borra tu propia base de datos de Postgres, si era externa, después de exportar la auditoría si la necesitas.