Questo documento spiega come modificare i campi delle specifiche predefiniti compilando il comportamento
utilizzando l'annotazione cnrm.cloud.google.com/state-into-spec
e quando è necessario
modificarli.
Come spiegato in Gestire i campi esternamente, quando Config Connector crea una risorsa su Google Cloud, i campi non specificati nella specifica acquisiscono valori dall'API, a meno che non siano leggibili (ad esempio non sono disponibili utilizzando una richiesta GET HTTP).
Ciò significa che, per impostazione predefinita, i campi che non sono stati specificati nel file YAML originale vengono sempre visualizzati nella specifica della risorsa Kubernetes.
Ciò significa che quando esegui kubectl get <resource kind> <resource name> -oyaml
, molti campi nella specifica della risorsa non sono inclusi nella specifica YAML
Y applicata.
Supponiamo, ad esempio, che lo schema CRD consenta di specificare due campi denominati foo
e bar
nella specifica, mentre per il file YAML applicato sono specificati solo foo
:
spec:
foo: "foo"
Noterai che un altro campo denominato bar
compare nella risorsa Kubernetes se il file YAML è applicato correttamente e la risorsa è UpToDate:
spec:
foo: "foo"
bar: "bar"
A causa della complessità dell'interazione tra Config Connector e le API di Google Cloud, ti consigliamo di modificare questo comportamento predefinito e di saltare l'inserimento delle specifiche delle risorse con campi non specificati.
Salta l'inserimento dei campi non specificati nella specifica
Quando crei il file YAML, puoi specificare il valore dell'annotazione cnrm.cloud.google.com/state-into-spec
come absent
. Questa operazione salta
la compilazione dei campi non specificati nella specifica delle risorse Kubernetes:
metadata:
annotations:
cnrm.cloud.google.com/state-into-spec: absent
Se non specificato, il valore di questa annotazione è merge
, il che significa che Config Connector completa tutti i campi non specificati in specifiche. Questa annotazione è immutabile, il che significa che non puoi aggiornare il valore dell'annotazione di una risorsa del connettore di configurazione esistente.
Se hai già creato la risorsa, ma vuoi modificare il valore di questa annotazione per un comportamento di completamento diverso, segui questi passaggi:
Modifica e aggiungi l'annotazione
cnrm.cloud.google.com/deletion-policy: abandon
alla risorsa Kubernetes esistente per assicurarti che l'eliminazione nel passaggio successivo non eliminerà la risorsa Google Cloud sottostante.Elimina la risorsa dal cluster Kubernetes.
Aggiungere l'annotazione
cnrm.cloud.google.com/state-into-spec: absent
nel file YAML della risorsa.(Facoltativo) Rimuovi
cnrm.cloud.google.com/deletion-policy: abandon
dallo YAML.Applica il file YAML aggiornato.
Per spiegare ulteriormente la differenza introdotta da questa annotazione, supponiamo che esista una specifica con il seguente schema:
foo1: string
foo2: string
bars:
- bar:
br1: string
br2: string
barz:
bz1: string
bz2: string
Supponiamo inoltre di aver specificato le specifiche nel file YAML come:
spec:
foo1: "foo1"
bars:
- br1: "1_br1"
- br1: "2_br1"
barz:
bz1: "bz1"
Quindi, per impostazione predefinita, la specifica compilata nella risorsa Kubernetes creata potrebbe essere:
spec:
foo1: "foo1"
foo2: "foo2"
bars:
- br1: "1_br1"
br2: "1_br2"
- br1: "2_br1"
br2: "2_br2"
barz:
bz1: "bz1"
bz2: "bz2"
Se imposti cnrm.cloud.google.com/state-into-spec: absent
, la specifica finale nella risorsa Kubernetes creata sarà:
spec:
foo1: "foo1"
bars:
- br1: "1_br1"
- br1: "2_br1"
barz:
bz1: "bz1"
Quando utilizzare cnrm.cloud.google.com/state-into-spec: absent
Esistono alcuni scenari comuni in cui è consigliabile impostare cnrm.cloud.google.com/state-into-spec: absent
.
Gestire i campi non specificati in un elenco esternamente
Config Connector considera tutti i campi degli elenchi nelle specifiche della risorsa come campi atomici. Di conseguenza, per impostazione predefinita, la modifica apportata a un sottocampo nell'elenco esterno a Config Connector verrà annullata da Config Connector. Tuttavia, puoi utilizzare questa annotazione per consentire a Config Connector di gestire i sottocampi in elenco. Per ulteriori informazioni, consulta Comportamento per i campi dell'elenco nelle specifiche della risorsa.
Risolvi i conflitti tra gli strumenti di gestione della configurazione e Config Connector
Se utilizzi strumenti di gestione della configurazione come Config Sync o Argo CD, potresti notare una difficoltà tra lo strumento di gestione della configurazione e Config Connector. Un esempio è l'errore KNV2005 illustrato nella guida alla risoluzione dei problemi. La causa principale di questi tipi di problemi è che:
- Config Connector completerà e valori predefiniti non specificati nell'elenco delle specifiche, un esempio è
spec.bars[0].br2
. - Sia gli strumenti di gestione della configurazione sia Config Connector considerano i campi degli elenchi come atomici, pertanto il valore
spec.bars[0].br2
aggiunto viene considerato una deviazione dagli strumenti di gestione della configurazione e verrà rimosso per correggeredrift
.
Per risolvere questi problemi, puoi impostare cnrm.cloud.google.com/state-into-spec: absent
in modo che Config Connector non aggiunga il campo spec.bars[0].br2
non specificato nella specifica.
Risolvi i problemi di simmetria GET/PUT
La simmetria GET/PUT si riferisce a un principio di progettazione nell'API REST. Nello specifico, significa che, quando una risposta GET viene inviata come richiesta PUT allo stesso URL, il risultato previsto è una risposta HTTP 200 OK senza modifiche allo stato della risorsa REST sottostante.
I campi non specificati completati da Config Connector nella specifica della risorsa sono il risultato di una richiesta GET. Ciò significa che in riconciliazioni future, Config Connector potrebbe inviare una richiesta PUT/PATCH all'API Google Cloud sottostante, con questi valori dei campi non specificati appresi dalla richiesta GET. In genere, non è un problema, ma è possibile che alcune API Google Cloud rifiutino la richiesta PUT/PATCH a causa di questi valori dei campi non specificati. Nello stesso
esempio, il valore spec.barz.bz2
compilato con il valore "bz2" potrebbe causare un errore HTTP 400
o altre risposte impreviste se l'implementazione dell'API
viola il principio di simmetria GET/PUT.
Per evitare questa categoria di problemi, puoi provare a impostare l'cnrm.cloud.google.com/state-into-spec: absent
e verificare se gli errori durante la riconciliazione scompaiono.
Quando evitare cnrm.cloud.google.com/state-into-spec: absent
Dovresti evitare di impostare cnrm.cloud.google.com/state-into-spec: absent
se la tua soluzione dipende dai valori completati da campi non specificati. Ad esempio, se utilizzi una risorsa ComputeAddress e ti serve il valore spec.address
generato dal server, che potrebbe essere un campo non specificato nel file YAML originale, non dovresti utilizzare questa annotazione perché salterà il completamento del valore di spec.address
nella specifica della risorsa Kubernetes.