Declara dependencias entre objetos de recursos

En esta guía, se explica cómo funcionan las dependencias en el Sincronizador de configuración y cómo especificar tus propias dependencias.

El Sincronizador de configuración detecta de forma automática las dependencias implícitas entre objetos específicos cuando se sincronizan con el clúster. Por ejemplo, los objetos de espacio de nombres siempre se aplican antes que cualquier objeto de esos espacios de nombres, y se aplica un objeto CustomResourceDefinition (CRD) antes de que se aplique cualquier recurso personalizado de este tipo. Del mismo modo, el orden de eliminación es inverso para estas dependencias implícitas: los espacios de nombres se borran después de los objetos en ese espacio de nombres y las CRD se borran después de los recursos personalizados de ese tipo.

También puedes configurar dependencias explícitas con la anotación depends-on. Por ejemplo, es posible que desees que el StatefulSet de MySQL se inicie antes que la implementación de WordPress, para que la base de datos se aplique y esté lista antes de que se inicie WordPress.

Requisitos

  • Las API de RootSync y RepoSync deben estar habilitadas. Si instalaste el Sincronizador de configuración de forma manual con kubectl y no tienes las API de RootSync y RepoSync habilitadas, debes migrar tu objeto ConfigManagement.

  • Las dependencias deben estar en la misma fuente de información que las dependientes y deben administrarse por el mismo objeto RootSync o RepoSync.

Aplicar grupo

Cuando se sincronizan los recursos con el clúster, el Sincronizador de configuración divide los recursos que tienen dependencias directas o indirectas en diferentes grupos de aplicación. Un grupo de aplicación solo consiste en recursos sin dependencias directas o indirectas entre sí. Primero se aplicará el grupo de aplicación en el que los recursos no tienen ninguna dependencia.

Activación y conciliación

Cuando se activa un objeto (ya sea aplicado o reducido), el controlador puede tardar un tiempo en conciliar el objeto. Por ejemplo, cuando se aplica una implementación, es posible que los Pods subyacentes no estén listos de inmediato. Una vez que los Pods subyacentes están listos, la implementación se concilia. En el caso de diferentes tipos de objetos, el Sincronizador de configuración verifica diferentes tipos de condiciones para verificar si un objeto se concilia. Puedes encontrar más detalles en sigs.k8s.io/cli-utils.

Con la anotación depends-on, el Sincronizador de configuración no solo aplica objetos en el orden que deseas, sino que también verifica que el objeto de la dependencia se concilie antes de aplicar el objeto dependiente.

Si el objeto de dependencia no concilia el tiempo de espera de conciliación predeterminado de 5 minutos, el Sincronizador de configuración no aplicará el objeto dependiente hasta el próximo período de sincronización. Puedes anular el tiempo de espera de conciliación predeterminado si configuras spec.override.reconcileTimeout.

Agrega la anotación depends-on a un objeto

Para especificar una dependencia, agrega la anotación config.kubernetes.io/depends-on al objeto dependiente con un valor que haga referencia a los objetos de dependencia.

Para el ejemplo de WordPress, la anotación en la implementación de WordPress es similar a la siguiente:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  namespace: default
  labels:
    app: wordpress
  annotations:
    config.kubernetes.io/depends-on: apps/namespaces/default/StatefulSet/wordpress-mysql

Cuando el Sincronizador de configuración aplica los objetos, primero aplica la dependencia, el StatefulSet wordpress-mysql del objeto. Cuando se concilia la dependencia, el Sincronizador de configuración aplica el Deployment dependiente, wordpress.

Referencias de objetos

Las referencias de objetos usan la siguiente sintaxis:

  • Para objetos con espacio de nombres:

    GROUP/namespaces/NAMESPACE/KIND/NAME
    
  • En el caso de los objetos con permisos de clúster, haz lo siguiente:

    GROUP/KIND/NAME
    

    Reemplaza lo siguiente:

    • GROUP: Es el grupo del objeto de dependencia.
    • NAMESPACE: Es el espacio de nombres del objeto de dependencia con permiso de espacio de nombres.
    • KIND: Es el tipo de objeto de dependencia. En este campo, se distingue entre mayúsculas y minúsculas. Por ejemplo, usa “Pod“ en lugar de “pod”.
    • NAME: Es el nombre del objeto de dependencia.

En el caso de los objetos del grupo principal, se usa la string vacía, por ejemplo, /namespaces/test/Pod/pod-a.

Usa , para separar varias referencias de objetos, por ejemplo /namespaces/test/Pod/pod-a,/namespaces/test/Pod/pod-b.