Este documento explica como alterar os campos de especificação padrão que preenchem o comportamento
usando a anotação cnrm.cloud.google.com/state-into-spec
e quando é necessário
alterá-la.
Conforme explicado em Gerenciar campos externamente, quando o Config Connector cria um recurso no Google Cloud, os campos deixados não especificados na especificação assumem valores da API, a menos que não sejam legíveis (por exemplo, não estão disponíveis usando uma solicitação HTTP GET).
Isso significa, por padrão, que os campos que não foram
especificados no YAML original sempre aparecem na especificação do recurso do Kubernetes.
Isso significa que, quando você faz kubectl get <resource kind> <resource name> -oyaml
,
muitos campos na especificação do recurso não estão no
YAML aplicado.
Por exemplo, suponha que o esquema CRD permita especificar dois campos chamados foo
e bar
na especificação, enquanto o arquivo YAML aplicado tem apenas foo
especificado:
spec:
foo: "foo"
Você perceberá que outro campo chamado bar
aparece no recurso do Kubernetes se o YAML for aplicado com sucesso e o recurso estiver UpToDate:
spec:
foo: "foo"
bar: "bar"
Devido à complexidade da interação entre o Config Connector e as APIs do Google Cloud, é recomendável alterar esse comportamento padrão e pular o preenchimento da especificação de recurso com campos não especificados.
Pular o preenchimento de campos não especificados na especificação
Ao criar seu arquivo YAML, é possível especificar o valor da anotação
cnrm.cloud.google.com/state-into-spec
como absent
. Isso pula o preenchimento de campos não especificados na especificação de recursos do Kubernetes:
metadata:
annotations:
cnrm.cloud.google.com/state-into-spec: absent
Essa anotação tem um valor padrão de merge
se não for especificado, o que significa
que o Config Connector preenche todos os campos não especificados na
especificação. Essa anotação é imutável, ou seja, não é possível
atualizar o valor da anotação de um recurso existente do Config Connector.
Se você já tiver criado o recurso, mas quiser alterar o valor dessa anotação para um comportamento de preenchimento diferente, siga estas etapas:
Edite e adicione a anotação
cnrm.cloud.google.com/deletion-policy: abandon
ao recurso atual do Kubernetes para garantir que a exclusão na próxima etapa não exclua o recurso subjacente do Google Cloud.Excluir o recurso do cluster do Kubernetes.
Adicione a anotação
cnrm.cloud.google.com/state-into-spec: absent
ao YAML do recurso.Opcional: remova
cnrm.cloud.google.com/deletion-policy: abandon
do YAML.Aplique o YAML atualizado.
Para explicar melhor a diferença introduzida por essa anotação, suponha que há uma especificação com o esquema abaixo:
foo1: string
foo2: string
bars:
- bar:
br1: string
br2: string
barz:
bz1: string
bz2: string
Além disso, suponha que você tenha especificado a especificação no YAML como:
spec:
foo1: "foo1"
bars:
- br1: "1_br1"
- br1: "2_br1"
barz:
bz1: "bz1"
Assim, por padrão, a especificação preenchida no recurso do Kubernetes criado será:
spec:
foo1: "foo1"
foo2: "foo2"
bars:
- br1: "1_br1"
br2: "1_br2"
- br1: "2_br1"
br2: "2_br2"
barz:
bz1: "bz1"
bz2: "bz2"
Se você definir cnrm.cloud.google.com/state-into-spec: absent
, a especificação final no
recurso do Kubernetes criado será:
spec:
foo1: "foo1"
bars:
- br1: "1_br1"
- br1: "2_br1"
barz:
bz1: "bz1"
Quando usar cnrm.cloud.google.com/state-into-spec: absent
Existem alguns cenários comuns em que é recomendável definir cnrm.cloud.google.com/state-into-spec: absent
.
Gerenciar campos não especificados em uma lista externamente
O Config Connector trata todos os campos de lista nas especificações de recursos como campos atômicos. Como resultado, por padrão, a alteração feita em um subcampo na lista de fora do Config Connector será revertida pelo Config Connector. No entanto, é possível usar essa anotação para permitir que o Config Connector cancele o gerenciamento de subcampos na lista. Para mais informações, consulte Comportamento para campos de lista na especificação do recurso.
Resolver a luta entre as ferramentas de gerenciamento de configuração e o Config Connector
Se você estiver usando ferramentas de gerenciamento de configuração, como o Config Sync ou o Argo CD, poderá notar uma divergência entre a ferramenta de gerenciamento de configuração e o Config Connector. Um exemplo é o erro KNV2005, explicado no guia de solução de problemas. A causa raiz desses tipos de problemas é porque:
- O Config Connector preencherá e os valores não especificados na lista na especificação serão preenchidos. O
spec.bars[0].br2
é um exemplo. - As ferramentas de gerenciamento de configuração e o Config Connector tratam os campos de lista como atômicos. Assim, o
spec.bars[0].br2
adicionado é tratado como um desvio pelas ferramentas de gerenciamento de configuração e será removido para corrigir odrift
.
Para resolver esses problemas, defina cnrm.cloud.google.com/state-into-spec: absent
para que o Config Connector não adicione o campo spec.bars[0].br2
não especificado à
especificação.
Resolver problemas de simetria GET/PUT
A simetria GET/PUT se refere a um princípio de design da API REST. Especificamente, isso significa que, quando uma resposta GET é enviada como uma solicitação PUT para o mesmo URL, o resultado esperado é uma resposta HTTP 200 OK sem alteração no estado do recurso REST subjacente.
Os campos não especificados preenchidos pelo Config Connector na especificação do recurso são resultado de uma solicitação GET. Isso significa que, em reconciliações futuras, o Config Connector poderá enviar uma solicitação PUT/PATCH para a API do Google Cloud subjacente, com esses valores de campo não especificados aprendidos com a solicitação GET. Isso geralmente não é um problema, mas é possível que algumas APIs do Google Cloud recusem a solicitação PUT/PATCH devido a esses valores de campo não especificados. No mesmo exemplo, a spec.barz.bz2
preenchida com o valor "bz2" pode resultar em um erro de cliente HTTP 400 ou outras respostas inesperadas se a implementação da API violar o princípio de simetria GET/PUT.
Para evitar essa categoria de problemas, experimente definir cnrm.cloud.google.com/state-into-spec: absent
e verificar se os erros durante a reconciliação vão desaparecer.
Quando evitar cnrm.cloud.google.com/state-into-spec: absent
Evite definir cnrm.cloud.google.com/state-into-spec: absent
se sua
solução depender dos valores preenchidos em campos não especificados. Por
exemplo, se você estiver usando um recurso ComputeAddress
e precisar do valor spec.address
gerado pelo servidor, que
pode ser um campo não especificado no YAML original, não use
essa anotação, porque ela pulará o preenchimento do valor de spec.address
na
especificação de recursos do Kubernetes.