Este guia ensina como funcionam as dependências na sincronização de configuração e como especificar as suas próprias dependências.
O Config Sync deteta automaticamente dependências implícitas entre objetos específicos quando os sincroniza com o cluster. Por exemplo, os objetos Namespace são sempre aplicados antes de quaisquer objetos nesses Namespaces, e um objeto CustomResourceDefinition (CRD) é sempre aplicado antes de qualquer recurso personalizado deste tipo ser aplicado. Da mesma forma, a ordem de eliminação é inversa para estas dependências implícitas: os espaços de nomes são eliminados após os objetos nesse espaço de nomes e os CRDs são eliminados após os recursos personalizados desse tipo.
Também pode definir dependências explícitas através da anotação depends-on
.
Por exemplo, pode querer que o seu StatefulSet do MySQL seja iniciado antes da implementação do Wordpress, para que a base de dados seja aplicada e esteja pronta antes do início do Wordpress.
Requisitos
As APIs RootSync e RepoSync têm de estar ativadas. Se instalou o Config Sync manualmente através do kubectl e não tem as APIs RootSync e RepoSync ativadas, tem de migrar o objeto ConfigManagement.
Limitação: as dependências têm de estar na mesma fonte de dados que o respetivo elemento dependente. As dependências têm de ser geridas pelo mesmo objeto RootSync ou RepoSync que as respetivas dependências, o que garante que todos os recursos estão no mesmo ResourceGroup.
Aplicar grupo
Quando sincroniza 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 entre si. O grupo de aplicação no qual os recursos não têm dependências é aplicado primeiro.
Acionamento e conciliação
Quando um objeto é acionado (aplicado ou removido), pode demorar algum tempo até que o objeto seja reconciliado pelo respetivo controlador. Por exemplo, quando uma implementação é aplicada, os pods subjacentes podem não estar prontos imediatamente. Depois de os pods subjacentes estarem prontos, a implementação é reconciliada. Para diferentes tipos de objetos, o Config Sync verifica diferentes tipos de condições para verificar se um objeto foi reconciliado. Pode encontrar mais detalhes em sigs.k8s.io/cli-utils
Com a anotação depends-on
, a sincronização de configuração não só aplica objetos na ordem pretendida, como também verifica se o objeto de dependência é reconciliado antes de aplicar o objeto dependente.
Se o objeto de dependência não for reconciliado dentro do limite de tempo de reconciliação predefinido de 5 minutos, o Config Sync não aplica o objeto dependente até ao período de sincronização seguinte. Pode substituir o limite de tempo de conciliação predefinido definindo spec.override.reconcileTimeout
.
Adicione a anotação depends-on
a um objeto
Para especificar uma dependência, adicione a anotação config.kubernetes.io/depends-on
no objeto dependente com um valor que faça referência aos objetos de dependência.
Para o exemplo do Wordpress, a anotação na implementação do Wordpress assemelha-se ao seguinte:
# 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 a sincronização de configuração aplica os objetos, aplica primeiro a dependência, o objeto wordpress-mysql
StatefulSet. Quando a dependência é reconciliada, o Config Sync aplica a implementação dependente, a wordpress
implementação.
Referências de objetos
As referências de objetos usam a seguinte sintaxe:
Para objetos com espaço de nomes:
GROUP/namespaces/NAMESPACE/KIND/NAME
Para objetos com âmbito de cluster:
GROUP/KIND/NAME
Substitua o seguinte:
GROUP
: o grupo do objeto de dependência.NAMESPACE
: o espaço de nomes do objeto de dependência com âmbito do espaço de nomes.KIND
: o tipo do objeto de dependência. Este campo é sensível a maiúsculas e minúsculas. Por exemplo, use "Pod" em vez de "pod".NAME
: o nome do objeto de dependência.
Para objetos no grupo principal, é usada a string vazia. Por exemplo, /namespaces/test/Pod/pod-a
.
Use ,
para separar várias referências de objetos, por exemplo
/namespaces/test/Pod/pod-a,/namespaces/test/Pod/pod-b
.