Ignora i campi non specificati


Questo documento spiega come modificare i campi delle specifiche predefiniti per completare il comportamento utilizzando l'annotazione cnrm.cloud.google.com/state-into-spec e quando è necessario modificarlo.

Come spiegato in Gestisci i campi esternamente, quando Config Connector crea una risorsa su Google Cloud, i campi non specificati nelle specifiche assumono valori dall'API, a meno che non siano leggibili (ad esempio non disponibili utilizzando una richiesta HTTP GET).

Ciò significa che, per impostazione predefinita, i campi che non sono stati specificati nello YAML originale vengono sempre visualizzati nelle specifiche della risorsa Kubernetes. Ciò significa che quando esegui kubectl get <resource kind> <resource name> -oyaml, molti campi nelle specifiche della risorsa non sono presenti nel codice YAML applicato.

Ad esempio, supponiamo che lo schema CRD ti consenta di specificare due campi denominati foo e bar nelle specifiche, mentre per il file YAML applicato è specificato solo foo:

spec:
  foo: "foo"

Se il codice YAML viene applicato correttamente e la risorsa è UpToDate, nella risorsa Kubernetes viene visualizzato un altro campo denominato bar:

spec:
  foo: "foo"
  bar: "bar"

A causa della complessità dell'interazione tra Config Connector e le API Google Cloud, ti consigliamo di modificare questo comportamento predefinito e saltare il completamento della specifica delle risorse con campi non specificati.

Salta il completamento del completamento dei campi non specificati nelle specifiche

Durante la creazione del file YAML, puoi specificare il valore dell'annotazione cnrm.cloud.google.com/state-into-spec come absent. In questo modo viene saltato il completamento dei campi non specificati nelle specifiche delle risorse Kubernetes:

metadata:
  annotations:
    cnrm.cloud.google.com/state-into-spec: absent

Questa annotazione ha un valore predefinito di merge se non specificato, il che significa che Config Connector compila tutti i campi non specificati nelle specifiche. Questa annotazione è immutabile, il che significa che non puoi aggiornare il valore di annotazione di una risorsa Config Connector esistente.

Se hai già creato la risorsa, ma vuoi modificare il valore di questa annotazione per un comportamento di compilazione diverso, devi seguire questi passaggi:

  1. 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 elimini la risorsa Google Cloud sottostante.

  2. Eliminare la risorsa dal cluster Kubernetes.

  3. Aggiungi l'annotazione cnrm.cloud.google.com/state-into-spec: absent nel file YAML della risorsa.

  4. (Facoltativo) Rimuovi cnrm.cloud.google.com/deletion-policy: abandon da YAML.

  5. 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

Inoltre, supponiamo che tu abbia specificato le specifiche nel file YAML come:

spec:
  foo1: "foo1"
  bars:
  - br1: "1_br1"
  - br1: "2_br1"
  barz:
    bz1: "bz1"

Quindi, per impostazione predefinita, le specifiche compilate nella risorsa Kubernetes creata potrebbero essere:

spec:
  foo1: "foo1"
  foo2: "foo2"
  bars:
  - br1: "1_br1"
    br2: "1_br2"
  - br1: "2_br1"
    br2: "2_br2"
  barz:
    bz1: "bz1"
    bz2: "bz2"

Mentre 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 che è consigliabile impostare cnrm.cloud.google.com/state-into-spec: absent.

Gestisci esternamente i campi non specificati in un elenco

Config Connector tratta tutti i campi dell'elenco nelle specifiche della risorsa come campi atomici. Di conseguenza, per impostazione predefinita, la modifica apportata a un sottocampo dell'elenco dall'esterno di Config Connector verrà annullata da Config Connector. Tuttavia, puoi utilizzare questa annotazione per consentire a Config Connector di gestire i campi secondari nell'elenco. Per ulteriori informazioni, consulta Comportamento dei campi elenco nelle specifiche delle risorse.

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 differenza tra lo strumento di gestione della configurazione e Config Connector. Un esempio è l'errore KNV2005 spiegato nella guida alla risoluzione dei problemi. La causa principale di questi tipi di problemi è che:

  1. Config Connector completerà e memorizzerà i valori non specificati predefiniti nell'elenco nella specifica. spec.bars[0].br2 è un esempio.
  2. Sia gli strumenti di Config Management che gli strumenti di Config Connector trattano i campi dell'elenco come atomici, pertanto il valore spec.bars[0].br2 aggiunto viene trattato come una deviazione dagli strumenti di gestione della configurazione e verrà rimosso per correggere il valore drift.

Per risolvere questi problemi, puoi impostare cnrm.cloud.google.com/state-into-spec: absent in modo che Config Connector non aggiunga un campo non specificato spec.bars[0].br2 nella specifica.

Risolvere 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 nelle future riconciliazioni, Config Connector potrebbe inviare una richiesta PUT/PATCH all'API Google Cloud sottostante, con questi valori dei campi non specificati appresi dalla richiesta GET. Normalmente ciò non costituisce 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" può causare un errore del client 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 eseguire un esperimento con l'impostazione cnrm.cloud.google.com/state-into-spec: absent e verificare se gli errori durante la riconciliazione spariscono.

Quando evitare cnrm.cloud.google.com/state-into-spec: absent

Dovresti evitare di impostare cnrm.cloud.google.com/state-into-spec: absent se la soluzione dipende dai valori inseriti nei campi non specificati. Ad esempio, se utilizzi una risorsa ComputeAddress e hai bisogno del valore spec.address generato dal server, che potrebbe essere un campo non specificato nel codice YAML originale, non utilizzare questa annotazione perché salterà l'inserimento del valore di spec.address nella specifica delle risorse Kubernetes.

Stato in osservazione

Se devi impostare cnrm.cloud.google.com/state-into-spec: absent, ma la soluzione dipende dai valori compilati nei campi non specificati, verifica se questi campi esistono in status.observedState nello schema CRD. Se sono rappresentati in status.observedState, puoi impostare cnrm.cloud.google.com/state-into-spec: absent e accedere comunque ai valori dei campi non specificati dopo una riconciliazione riuscita.

Il campo status.observedState contiene lo stato in tempo reale dei campi osservati selezionati della risorsa che Config Connector ha osservato nell'ultima riconciliazione riuscita. I campi osservati vengono selezionati se sono dipendenze di casi d'uso comuni e sono campi spec calcolati. Puoi trovare i campi osservati negli schemi CRD.

Se non riesci a trovare i campi osservati che ti interessano, verifica se si tratta di un problema esistente o apri un nuovo problema nei tracker dei problemi pubblici.