Declarar dependencias entre objetos de recursos

En esta guía se explica cómo funcionan las dependencias en Config Sync y cómo especificar las tuyas.

Config Sync detecta automáticamente las dependencias implícitas entre objetos específicos al sincronizarlos con el clúster. Por ejemplo, los objetos Namespace siempre se aplican antes que cualquier objeto de esos espacios de nombres, y un objeto CustomResourceDefinition (CRD) siempre se aplica antes que 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 eliminan después de los objetos de ese espacio de nombres y los CRDs se eliminan después de los recursos personalizados de ese tipo.

También puedes definir dependencias explícitas mediante la anotación depends-on. Por ejemplo, puede que quieras que tu StatefulSet de MySQL se inicie antes que tu Deployment de WordPress para que tu base de datos se aplique y esté lista antes de que se inicie WordPress.

Requisitos

  • Las APIs RootSync y RepoSync deben estar habilitadas. Si has instalado Config Sync manualmente con kubectl y no tienes habilitadas las APIs RootSync y RepoSync, debes migrar tu objeto ConfigManagement.

  • Limitación: Las dependencias deben estar en la misma fuente de información veraz que su elemento dependiente. Las dependencias deben gestionarse con el mismo objeto RootSync o RepoSync que sus elementos dependientes, lo que asegura que todos los recursos estén en el mismo ResourceGroup.

Aplicar grupo

Al sincronizar recursos con el clúster, Config Sync divide los recursos que tienen dependencias directas o indirectas en diferentes grupos de aplicación. Un grupo de aplicación solo consta de recursos que no tienen dependencias directas ni indirectas entre sí. El grupo de aplicación en el que los recursos no tengan ninguna dependencia se aplicará primero.

Activación y conciliación

Cuando se activa un objeto (ya sea aplicado o podado), su controlador puede tardar un tiempo en conciliarlo. Por ejemplo, cuando se aplica un Deployment, es posible que los pods subyacentes no estén listos de inmediato. Una vez que los pods subyacentes estén listos, se reconciliará el Deployment. En el caso de los distintos tipos de objetos, Config Sync comprueba diferentes tipos de condiciones para verificar si un objeto se ha conciliado. Puedes consultar más información en sigs.k8s.io/cli-utils.

Con la anotación depends-on, Config Sync no solo aplica los objetos en el orden que quieras, sino que también verifica que el objeto de dependencia se reconcilie antes de aplicar el objeto dependiente.

Si el objeto de dependencia no se reconcilia en el tiempo de espera de reconciliación predeterminado de 5 minutos, Config Sync no aplicará el objeto dependiente hasta el siguiente periodo de sincronización. Puedes anular el tiempo de espera de conciliación predeterminado configurando spec.override.reconcileTimeout.

Añadir la anotación depends-on a un objeto

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

En el ejemplo de WordPress, la anotación de Wordpress Deployment 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 Config Sync aplica los objetos, primero aplica la dependencia, el objeto wordpress-mysql StatefulSet. Una vez que se ha conciliado la dependencia, Config Sync aplica la dependencia, es decir, el wordpressDeployment.

Referencias de objetos

Las referencias de objetos usan la siguiente sintaxis:

  • En el caso de los objetos con espacio de nombres:

    GROUP/namespaces/NAMESPACE/KIND/NAME
    
  • En el caso de los objetos centrados en clústeres:

    GROUP/KIND/NAME
    

    Haz los cambios siguientes:

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

En el caso de los objetos del grupo principal, se usa una cadena 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.