¿Qué es la aplicación del lado del servidor (SSA) de Kubernetes?

Server-Side Apply (SSA) ha estado disponible en general en Kubernetes desde el lanzamiento de v1.22 en agosto de 2021. Es una estrategia para la administración de recursos declarativa que mejora los cálculos de diferencias y advierte sobre conflictos de combinación al mover la lógica de la kubectl apply comando en el servidor.

Este artículo explicará cómo funciona SSA y por qué se prefiere al enfoque anterior de aplicación del lado del cliente (CSA). También aprenderá a habilitar SSA cuando realice cambios en los objetos de su clúster.

Índice de contenidos
  1. Comprender las actualizaciones declarativas
  2. Los problemas con la aplicación del lado del cliente
  3. Cómo funciona la aplicación del lado del servidor
  4. Cómo usar SSA hoy
  5. Comprobar si un objeto se gestiona con SSA
  6. Resumen

Comprender las actualizaciones declarativas

la kubectl apply El comando realiza actualizaciones declarativas de objetos. En lugar de indicarle a Kubernetes que modifique campos específicos, proporciona una representación completa del objeto como le gustaría que apareciera. El sistema calcula automáticamente las diferencias en comparación con el estado existente de su clúster. Luego llevará a cabo las acciones que transforman el estado en el estado deseado expresado por su archivo de manifiesto.

Aquí hay un manifiesto de Pod simple:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest

Correr kubectl apply con este manifiesto iniciará un nuevo Pod que ejecuta el nginx:latest imagen. La diferencia entre el estado actual del clúster y el deseado es clara: se ha creado un Pod, donde antes no lo había con el nginx nombre.

Luego, puede modificar el manifiesto cambiando una de las propiedades del pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:1.23

Esta vez la diferencia entre el estado existente y el deseado es menos sustancial. la kubectl apply el comando detectará la versión revisada image campo y actualice la configuración de su Pod en consecuencia.

Los problemas con la aplicación del lado del cliente

Diferenciar los cambios y resolver cualquier conflicto es la parte más importante de las actualizaciones declarativas. Este proceso se ejecuta dentro de Kubectl de forma predeterminada. El cliente es responsable de identificar el objeto existente en el servidor y comparar sus cambios.

la kubectl apply comando escribe un last-applied-configuration anotación en objetos para ayudar con este proceso. Permite la identificación de campos que existen en el objeto activo pero que se han eliminado del manifiesto entrante. El cliente entonces sabe que debe borrarlos del objeto para lograr el nuevo estado.

Este enfoque es problemático cuando hay varios agentes que actualizan el mismo objeto. Un solo objeto podría ser modificado tanto por Kubectl como por un controlador dedicado en su clúster, por ejemplo. La aplicación del lado del cliente no puede rastrear qué agente modificó un campo, ni puede comprender cuándo ocurre un conflicto. Simplemente compara su manifiesto local con el del objeto existente last-applied-configuration y se fusiona en cualquier cambio.

La aplicación del lado del cliente también está inherentemente ligada a Kubectl. Las herramientas de terceros que deseen realizar sus propias actualizaciones declarativas deben llamar a Kubectl o volver a crear el apply lógica desde cero. Ninguna de estas dos opciones es particularmente ideal.

Cómo funciona la aplicación del lado del servidor

El problema fundamental con CSA es que los manifiestos locales desactualizados nunca se detectan. Si otro aplicador cambia un objeto antes de ejecutar kubectl apply, sus revisiones locales antiguas pueden sobrescribir las nuevas correctas. Con SSA habilitado, se detectará el conflicto y se bloqueará la actualización. Es un sistema centralizado que exige que su estado local se mantenga actualizado.

SSA funciona agregando un mecanismo de plano de control que almacena información sobre cada campo en sus objetos. Reemplaza el last-applied-configuration anotación con una nueva metadata.managedFields campo. Cada campo en su objeto se rastrea dentro del managedFields.

A los campos se les asigna un "administrador de campos" que identifica al cliente que los posee. Si aplica un manifiesto con Kubectl, Kubectl será el administrador designado. El administrador de un campo también podría ser un controlador o una integración externa que actualice sus objetos.

Los administradores tienen prohibido actualizar los campos de los demás. No podrás cambiar un campo con kubectl apply si actualmente es propiedad de un controlador diferente. Hay tres estrategias disponibles para resolver estos conflictos de combinación:

  • Forzar sobrescribir el valor – En algunas situaciones, es posible que desee forzar la actualización. Esto cambiará su valor y transferirá la propiedad al nuevo administrador de campo. Está destinado principalmente a los controladores que necesitan conservar la gestión de los campos que han rellenado. Puede forzar manualmente una actualización configurando el --force-conflicts bandera en Kubectl.
  • No sobrescriba el valor – El aplicador puede eliminar el campo de su configuración local y luego repetir la solicitud. El campo conservará su valor existente. La eliminación del campo soluciona el conflicto al ceder la propiedad al administrador existente.
  • Comparte la gestión – El aplicador puede actualizar su valor local para que coincida con el valor existente en el servidor. Si repite la solicitud mientras aún reclama la propiedad, la SSA le permitirá compartir la administración con el administrador existente. Esto se debe a que el aplicador acepta el estado actual del campo pero ha indicado que puede querer administrarlo en el futuro.

Este enfoque es mucho más poderoso que el tradicional. kubectl apply. Evita las sobrescrituras accidentales, permite que los controladores reclamen de manera confiable la propiedad de los campos que controlan y es totalmente declarativo. SSA rastrea cómo los diferentes usuarios han cambiado campos individuales, en lugar de solo registrar el último estado completo del objeto. También significa que ahora puede usar aplicar dentro de cualquier herramienta, independientemente del idioma o kubectl disponibilidad binaria. Obtendrá los mismos resultados consistentes independientemente de cómo inicie la operación.

Cómo usar SSA hoy

Puede activar SSA configurando el --server-side marca cada vez que ejecutas Kubectl apply:

$ kubectl apply -f nginx.yaml --server-side
pod/nginx serverside-applied

La salida del comando cambia para resaltar que se ha utilizado SSA.

Inspeccionar el manifiesto YAML del objeto revelará los campos administrados:

$ kubectl get pod nginx -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2022-11-24T16:02:29Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:spec:
        f:containers:
          k:{"name":"nginx"}:
            .: {}
            f:image: {}
            f:name: {}
    manager: kubectl
    operation: Apply
    time: "2022-11-24T16:02:29Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:status:
        f:conditions:
          k:{"type":"ContainersReady"}:
            .: {}
            f:lastProbeTime: {}
            f:lastTransitionTime: {}
            f:status: {}
            f:type: {}
          k:{"type":"Initialized"}:
            .: {}
            f:lastProbeTime: {}
            f:lastTransitionTime: {}
            f:status: {}
            f:type: {}
          k:{"type":"Ready"}:
            .: {}
            f:lastProbeTime: {}
            f:lastTransitionTime: {}
            f:status: {}
            f:type: {}
        f:containerStatuses: {}
        f:hostIP: {}
        f:phase: {}
        f:podIP: {}
        f:podIPs:
          .: {}
          k:{"ip":"10.244.0.186"}:
            .: {}
            f:ip: {}
        f:startTime: {}
    manager: kubelet
    operation: Update
    subresource: status
    time: "2022-11-24T16:02:31Z"
...

Los campos están agrupados por el administrador que los posee. En este ejemplo, spec es administrado por Kubectl porque así fue como se creó el Pod. la status Sin embargo, Kubelet administra el campo porque el nodo que ejecuta el pod cambia el valor de ese campo durante el ciclo de vida del pod.

SSA también está listo para usar en controladores. Permite una semántica más potente y nuevos tipos de controladores, incluidos los que reconstruyen objetos. Este modelo maneja los cambios reconstruyendo primero los campos de un objeto desde cero a satisfacción del controlador y luego aplicando el resultado al servidor. Es un método más natural que establecer manualmente la secuencia de operaciones que producirán un cambio deseado.

Comprobar si un objeto se gestiona con SSA

Puede verificar si un objeto usa CSA o SSA recuperando su manifiesto YAML en Kubectl:

$ kubectl get pod nginx -o yaml

si ves un last-applied-configuration anotación, su objeto es administrado por CSA:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"containers":[{"image":"nginx:latest","name":"nginx"}]}}
  creationTimestamp: "2022-11-24T14:20:07Z"
  name: nginx
  namespace: default
  ...
...

SSA se ha utilizado para el objeto si metadata.managedFields aparece en su lugar:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2022-11-24T16:02:29Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:spec:
        f:containers:
          k:{"name":"nginx"}:
            .: {}
            f:image: {}
            f:name: {}
    manager: kubectl
    operation: Apply
    time: "2022-11-24T16:02:29Z"
    ...
  ...
...

Puede mover un objeto entre CSA y SSA simplemente agregando u omitiendo el --server-side marcar la próxima vez que corras kubectl apply. Kubernetes gestiona la conversión de last-applied-configuration dentro managedFields y viceversa.

Las actualizaciones a SSA pueden presentar conflictos si su manifiesto local difiere del objeto en el servidor. Esto ocurre cuando ha ejecutado un comando imperativo como kubectl scale o kubectl label desde su última operación de aplicación contra el objeto. Debe verificar que su manifiesto local coincida con precisión con el objeto en vivo antes de convertirlo a SSA.

Resumen

La aplicación del lado del servidor es un enfoque para la gestión declarativa de objetos donde el plano de control de Kubernetes realiza un seguimiento de los campos. Esto facilita la detección robusta de conflictos y estrategias de resolución flexibles. SSA aborda las limitaciones de la aplicación del lado del cliente que permite que los campos se sobrescriban involuntariamente sin ninguna advertencia.

Aunque SSA ahora está generalmente disponible, todavía necesita especificarlo manualmente cada vez que ejecuta kubectl apply. Vale la pena tener en cuenta que SSA es más útil en situaciones en las que varios procesos diferentes administran objetos, como operadores humanos con Kubectl y un controlador de bucle. No se beneficiará mucho de la SSA si usa exclusivamente kubectl apply para crear y actualizar objetos.

Se espera que una versión futura de Kubernetes elimine CSA, lo que convierte a SSA en la única opción predeterminada. la --server-side entonces la bandera se volverá redundante.

Descubre más contenido

Subir Change privacy settings