Declarar dependências entre objetos de recurso

Neste guia, você verá como as dependências funcionam no Config Sync e como especificar suas próprias dependências.

O Config Sync detecta automaticamente dependências implícitas entre objetos específicos ao sincronizá-los com o cluster. Por exemplo, os objetos de namespace sempre são aplicados antes de qualquer objeto nesses namespaces, e um objeto CustomResourceDefinition (CRD) é sempre aplicado antes da aplicação de qualquer recurso personalizado desse tipo. Da mesma forma, a ordem de exclusão é reversa para essas dependências implícitas: os namespaces são excluídos após os objetos nesse namespace, e os CRDs são excluídos após os recursos personalizados do tipo.

Também é possível definir dependências explícitas usando a anotação depends-on. Por exemplo, talvez você queira que o StatefulSet do MySQL seja iniciado antes da implantação do WordPress, para que o banco de dados seja aplicado e esteja pronto antes do início do WordPress.

Requisitos

  • As APIs RootSync e RepoSync precisam ser ativadas. Se você instalou o Config Sync manualmente usando kubectl e não tem as APIs RootSync e RepoSync ativadas, é necessário migrar o objeto ConfigManagement.

  • As dependências precisam estar na mesma fonte de verdade que as dependências e ser gerenciadas pelo mesmo objeto RootSync ou RepoSync.

Grupo de aplicação

Ao sincronizar recursos com o cluster, o Config Sync divide os recursos que têm dependências diretas ou indiretas em diferentes grupos de aplicação. Um grupo de aplicação consiste apenas em recursos sem dependências diretas ou indiretas uns dos outros. O grupo de apps em que os recursos não têm dependências será aplicado primeiro.

Atuação e reconciliação

Quando um objeto é atuado (aplicado ou removido), pode levar algum tempo para que ele seja reconciliado pelo respectivo controlador. Por exemplo, quando uma implantação é aplicada, os pods subjacentes podem não estar prontos imediatamente. Depois que os pods subjacentes estiverem prontos, a implantação será reconciliada. Para diferentes tipos de objetos, o Config Sync verifica diferentes tipos de condições para verificar se um objeto é reconciliado. Mais detalhes podem ser encontrados em sigs.k8s.io/cli-utils.

Com a anotação depends-on, o Config Sync não só aplica objetos na ordem que você quer, mas também verifica se o objeto de dependência é reconciliado antes de aplicar o objeto dependente.

Se o objeto dependente não reconciliar dentro do tempo limite de reconciliação padrão de cinco minutos, o Config Sync não aplicará o objeto dependente até o próximo período de sincronização. Para substituir o tempo limite padrão de reconciliação, defina spec.override.reconcileTimeout.

Adicionar a anotação depends-on a um objeto.

Para especificar uma dependência, adicione a anotação config.kubernetes.io/depends-on ao objeto dependente com um valor que faça referência aos objetos de dependência.

Para o exemplo do WordPress, a anotação no WordPress é semelhante a esta:

# 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

Quando o Config Sync aplica os objetos, ele primeiro aplica a dependência e o objeto StatefulSet wordpress-mysql. Quando a dependência for reconciliada, o Config Sync aplicará a dependência e a implantação wordpress.

Referências de objetos

As referências de objeto usam a seguinte sintaxe:

  • Para objetos com namespace:

    GROUP/namespaces/NAMESPACE/KIND/NAME
    
  • Para objetos com escopo de cluster:

    GROUP/KIND/NAME
    

    Substitua:

    • GROUP: o grupo do objeto de dependência.
    • NAMESPACE: o namespace do objeto de dependência com escopo do namespace.
    • KIND: o tipo do objeto de dependência. Esse campo diferencia maiúsculas de minúsculas. Por exemplo, use "Pod" em vez de "pod".
    • NAME: o nome do objeto de dependência.

Para objetos no grupo de núcleos, a string vazia é usada, por exemplo, /namespaces/test/Pod/pod-a.

Use , para separar várias referências de objeto, por exemplo, /namespaces/test/Pod/pod-a,/namespaces/test/Pod/pod-b.