Ignorar campos não especificados


Esta página explica o comportamento de preenchimento padrão dos campos spec e como mudar o comportamento padrão de Merge para o comportamento recomendado Absent. Esta página pode não ser aplicável se você estiver usando um CRD adicionado na versão 1.114.0 e mais recentes, porque esses CRDs usam apenas o comportamento Absent. Para uma lista de CRDs com suporte a Merge, consulte a seção CRDs com suporte a Merge desta página.

Comportamentos de preenchimento de campos spec

Quando o Config Connector cria um recurso, os campos não especificados na especificação de recursos do Kubernetes podem ter dois comportamentos de preenchimento padrão diferentes: Absent e Merge.

Ausente

Absent é o comportamento recomendado. O Config Connector não preenche campos não especificados na especificação.

Para CRDs adicionados na versão 1.114.0 e mais recentes, o comportamento de preenchimento padrão é Absent. Esse também é o único comportamento de preenchimento com suporte a esses CRDs. O valor da anotação cnrm.cloud.google.com/state-into-spec é absent nessas CRs de recursos.

Mesclar

Merge é um comportamento sem suporte em CRDs adicionados na versão 1.114.0 e mais recentes. Os campos spec assumem valores da API após uma reconciliação bem-sucedida, a menos que não sejam legíveis. Confira mais detalhes em Gerenciar campos externamente.

Para CRDs com suporte na versão 1.113.0 e anteriores do Config Connector, o comportamento de preenchimento padrão é Merge. Para conferir uma lista de CRDs que oferecem suporte a Merge, consulte a seção CRDs com suporte a Merge desta página. O valor padrão da anotação cnrm.cloud.google.com/state-into-spec é merge nesses CRs de recursos. Também é possível configurar o comportamento de preenchimento para ser Absent seguindo as instruções em Ignorar o preenchimento de campos não especificados na especificação.

Por padrão, nesses CRs de recursos, os campos que não foram especificados no YAML original sempre aparecem na especificação do CR. Isso significa que, quando você executa kubectl get <resource kind> <resource name> -oyaml, muitos campos na especificação 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"

Outro campo chamado bar vai aparecer no CR se o YAML for aplicado com sucesso e o recurso estiver UpToDate:

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

Devido à complexidade da interação entre o conector de configuração e as APIsGoogle Cloud , talvez seja necessário mudar esse comportamento padrão e pular o preenchimento da especificação de recursos do Kubernetes com campos não especificados.

Ignorar o preenchimento de campos não especificados na especificação

É possível pular o preenchimento de campos não especificados na especificação para CRDs com suporte no Config Connector versão 1.113.0 e anteriores de duas maneiras:

  • Configure a substituição de stateIntoSpec no nível do cluster ou do namespace para ser Absent.
  • Especifique o valor da anotação cnrm.cloud.google.com/state-into-spec como absent para o recurso.

Configurar a substituição de stateIntoSpec no nível do cluster ou do namespace

Ao instalar o Config Connector ou atualizar a instalação dele, é possível configurar a substituição de stateIntoSpec no nível do cluster ou do namespace para ser Absent no CR ConfigConnector ou ConfigConnectorContext.

spec:
  stateIntoSpec: Absent

Isso faz com que Absent seja o comportamento de preenchimento de campos spec padrão para todos os novos recursos criados no cluster ou no namespace quando você não especifica a anotação cnrm.cloud.google.com/state-into-spec nos novos YAMLs de recursos. Isso significa que o Config Connector vai pular o preenchimento de campos não especificados na especificação de recursos do Kubernetes para esses recursos.

O campo stateIntoSpec não tem um valor padrão. O Config Connector vai determinar o comportamento de preenchimento dos campos spec com base no valor da anotação cnrm.cloud.google.com/state-into-spec e seguir a lógica abaixo para determinar o valor da anotação:

  1. Use o valor da anotação cnrm.cloud.google.com/state-into-spec diretamente se ela for especificada e válida.
  2. Se a anotação não for especificada, use o valor correspondente do campo stateIntoSpec no ConfigConnectorContext CR.
  3. Se o ConfigConnectorContext CR não existir ou se o campo stateIntoSpec não for especificado, use o valor correspondente do campo stateIntoSpec no ConfigConnector CR.
  4. Se o CR do ConfigConnector não existir ou o campo stateIntoSpec não estiver especificado, use o comportamento padrão com base no CRD descrito em campos spec preenchendo comportamentos.

As CRDs de comportamento de preenchimento adicionadas na versão 1.114.0 e posterior são Absent, independentemente da anotação cnrm.cloud.google.com/state-into-spec ou dos campos stateIntoSpec no CR do ConfigConnector ou no CR do ConfigConnectorContext.

Se você já tiver criado o recurso, mas quiser mudar o comportamento de preenchimento dos campos spec para Absent, faça o seguinte:

  1. Verifique se a substituição de stateIntoSpec no nível do cluster ou do namespace é Absent no CR do ConfigConnector ou do ConfigConnectorContext.

  2. Abandonar e adquirir o recurso. Verifique se a configuração YAML usada para aquisição não tem a anotação cnrm.cloud.google.com/state-into-spec.

Especificar a anotação cnrm.cloud.google.com/state-into-spec no nível do recurso

Ao criar o arquivo YAML, você pode 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, o que significa que não é possível atualizar o valor da anotação de um recurso do Config Connector.

Se você já criou o recurso, mas quer mudar o valor dessa anotação para um comportamento de preenchimento diferente, siga estas etapas:

  1. Edite e adicione a anotação cnrm.cloud.google.com/deletion-policy: abandon ao recurso do Kubernetes para garantir que a exclusão na próxima etapa não exclua o recurso Google Cloud .

  2. Exclua o recurso do cluster do Kubernetes.

  3. Adicione a anotação cnrm.cloud.google.com/state-into-spec: absent ao YAML do recurso.

  4. (Opcional) Remova cnrm.cloud.google.com/deletion-policy: abandon do YAML.

  5. Aplique o YAML atualizado.

Para explicar melhor a diferença introduzida por essa anotação, suponha que haja uma especificação com o seguinte esquema:

foo1: string
foo2: string
bars:
- bar:
    br1: string
    br2: string
barz:
  bz1: string
  bz2: string

Suponha também que você tenha especificado a especificação no YAML como:

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

Por padrão, a especificação preenchida no recurso Kubernetes criado pode 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 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

Na maioria dos casos, defina cnrm.cloud.google.com/state-into-spec: absent para receber o comportamento de preenchimento Absent para campos spec. Confira os cenários mais comuns que vão se beneficiar do comportamento de preenchimento de Absent.

Gerenciar campos não especificados em uma lista externamente

O Config Connector trata todos os campos de lista na especificação de recursos do Kubernetes como campos atômicos. Como resultado, por padrão, a mudança feita em um subcampo na lista fora do Config Connector será revertida por ele. No entanto, você pode usar essa anotação para permitir que o Config Connector desgerencie subcampos na lista. Para mais informações, consulte Comportamento de campos de lista na especificação de recursos.

Resolver conflitos entre 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 disputa entre a ferramenta de gerenciamento de configuração e o conector de configuração. Um exemplo é o erro KNV2005 explicado no guia de solução de problemas. A causa raiz desses tipos de problemas é porque:

  1. O Config Connector vai preencher e definir valores padrão não especificados na lista na especificação. spec.bars[0].br2 é um exemplo.
  2. As ferramentas de gerenciamento de configuração e o Config Connector tratam os campos de lista como atômico, portanto, o spec.bars[0].br2 adicionado é tratado como um deslocamento pelas ferramentas de gerenciamento de configuração e será removido para corrigir o drift.

Para resolver esses problemas, defina cnrm.cloud.google.com/state-into-spec: absent para que o conector de configuração 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 na API REST. Especificamente, 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 nenhuma mudança no estado do recurso REST.

Os campos não especificados preenchidos pelo Config Connector na especificação de recursos do Kubernetes são 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 Google Cloud , com esses valores de campo não especificados aprendidos da solicitação GET. Isso geralmente não é um problema, mas é possível que algumas APIsGoogle Cloud rejeitem a solicitação PUT/PATCH devido a esses valores de campo não especificados. No mesmo exemplo, o spec.barz.bz2 preenchido com o valor "bz2" pode resultar em um erro HTTP 400 do cliente 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 desaparecem.

Estado observado

Se você precisar definir cnrm.cloud.google.com/state-into-spec: absent, mas sua solução depender dos valores preenchidos de campos não especificados, verifique se esses campos existem em status.observedState no esquema do CRD. Se eles forem representados em status.observedState, defina cnrm.cloud.google.com/state-into-spec: absent e ainda acesse os valores dos campos não especificados após uma reconciliação bem-sucedida.

O campo status.observedState contém o estado em tempo real dos campos selecionados e observados do recurso que o Config Connector observou na última reconciliação bem-sucedida. Os campos observados são selecionados se forem dependências de casos de uso comuns e forem campos spec calculados. É possível encontrar os campos observados nos esquemas de CRD.

Se você não encontrar os campos observados que quer, verifique se há um problema atual ou abra um novo problema nos Issue Trackers públicos.

Tipos com suporte a Merge

Confira a seguir todos os tipos de Config Connector que oferecem suporte ao comportamento de preenchimento de Merge:

  • AccessContextManagerAccessLevel
  • AccessContextManagerAccessPolicy
  • AccessContextManagerServicePerimeter
  • AlloyDBBackup
  • AlloyDBCluster
  • AlloyDBUser
  • ApigeeEnvironment
  • ApigeeOrganization
  • ArtifactRegistryRepository
  • BigQueryDataset
  • BigQueryJob
  • BigQueryTable
  • BigtableAppProfile
  • BigtableGCPolicy
  • BigtableInstance
  • BigtableTable
  • BillingBudgetsBudget
  • BinaryAuthorizationAttestor
  • BinaryAuthorizationPolicy
  • CertificateManagerCertificate
  • CertificateManagerCertificateMap
  • CertificateManagerCertificateMapEntry
  • CloudBuildTrigger
  • CloudFunctionsFunction
  • CloudIdentityGroup
  • CloudIdentityMembership
  • CloudSchedulerJob
  • ComputeAddress
  • ComputeBackendBucket
  • ComputeBackendService
  • ComputeDisk
  • ComputeExternalVPNGateway
  • ComputeFirewall
  • ComputeFirewallPolicy
  • ComputeFirewallPolicyAssociation
  • ComputeForwardingRule
  • ComputeHTTPHealthCheck
  • ComputeHTTPSHealthCheck
  • ComputeHealthCheck
  • ComputeImage
  • ComputeInstance
  • ComputeInstanceGroup
  • ComputeInstanceGroupManager
  • ComputeInstanceTemplate
  • ComputeInterconnectAttachment
  • ComputeNetwork
  • ComputeNetworkEndpointGroup
  • ComputeNetworkFirewallPolicy
  • ComputeNetworkPeering
  • ComputeNodeGroup
  • ComputeNodeTemplate
  • ComputePacketMirroring
  • ComputeProjectMetadata
  • ComputeRegionNetworkEndpointGroup
  • ComputeReservation
  • ComputeResourcePolicy
  • ComputeRoute
  • ComputeRouter
  • ComputeRouterInterface
  • ComputeRouterNAT
  • ComputeRouterPeer
  • ComputeSSLCertificate
  • ComputeSSLPolicy
  • ComputeSecurityPolicy
  • ComputeServiceAttachment
  • ComputeSharedVPCHostProject
  • ComputeSharedVPCServiceProject
  • ComputeSnapshot
  • ComputeSubnetwork
  • ComputeTargetGRPCProxy
  • ComputeTargetHTTPProxy
  • ComputeTargetHTTPSProxy
  • ComputeTargetInstance
  • ComputeTargetPool
  • ComputeTargetSSLProxy
  • ComputeTargetTCPProxy
  • ComputeTargetVPNGateway
  • ComputeURLMap
  • ComputeVPNGateway
  • ComputeVPNTunnel
  • ConfigControllerInstance
  • ContainerAnalysisNote
  • ContainerAttachedCluster
  • ContainerCluster
  • ContainerNodePool
  • DLPDeidentifyTemplate
  • DLPInspectTemplate
  • DLPJobTrigger
  • DLPStoredInfoType
  • DNSManagedZone
  • DNSPolicy
  • DNSRecordSet
  • DataFusionInstance
  • DataflowFlexTemplateJob
  • DataflowJob
  • DataprocAutoscalingPolicy
  • DataprocCluster
  • DataprocWorkflowTemplate
  • EdgeContainerCluster
  • EdgeContainerNodePool
  • EdgeContainerVpnConnection
  • EdgeNetworkNetwork
  • EdgeNetworkSubnet
  • EventarcTrigger
  • FilestoreBackup
  • FilestoreInstance
  • FirestoreIndex
  • Pasta
  • GKEHubFeature
  • GKEHubMembership
  • IAMAccessBoundaryPolicy
  • IAMAuditConfig
  • IAMCustomRole
  • IAMPartialPolicy
  • IAMPolicy
  • IAMPolicyMember
  • IAMServiceAccount
  • IAMServiceAccountKey
  • IAMWorkforcePool
  • IAMWorkforcePoolProvider
  • IAMWorkloadIdentityPool
  • IAMWorkloadIdentityPoolProvider
  • IAPBrand
  • IAPIdentityAwareProxyClient
  • IdentityPlatformConfig
  • IdentityPlatformOAuthIDPConfig
  • IdentityPlatformTenant
  • IdentityPlatformTenantOAuthIDPConfig
  • KMSCryptoKey
  • KMSKeyRing
  • LoggingLogBucket
  • LoggingLogExclusion
  • LoggingLogSink
  • LoggingLogView
  • MemcacheInstance
  • MonitoringAlertPolicy
  • MonitoringGroup
  • MonitoringMetricDescriptor
  • MonitoringMonitoredProject
  • MonitoringNotificationChannel
  • MonitoringService
  • MonitoringServiceLevelObjective
  • MonitoringUptimeCheckConfig
  • NetworkConnectivityHub
  • NetworkConnectivitySpoke
  • NetworkSecurityAuthorizationPolicy
  • NetworkSecurityClientTLSPolicy
  • NetworkSecurityServerTLSPolicy
  • NetworkServicesEndpointPolicy
  • NetworkServicesGRPCRoute
  • NetworkServicesGateway
  • NetworkServicesHTTPRoute
  • NetworkServicesMesh
  • NetworkServicesTCPRoute
  • NetworkServicesTLSRoute
  • OSConfigGuestPolicy
  • OSConfigOSPolicyAssignment
  • PrivateCACAPool
  • PrivateCACertificate
  • PrivateCACertificateAuthority
  • PrivateCACertificateTemplate
  • Projeto
  • PubSubLiteReservation
  • PubSubSchema
  • PubSubSubscription
  • PubSubTopic
  • RecaptchaEnterpriseKey
  • RedisInstance
  • ResourceManagerLien
  • ResourceManagerPolicy
  • RunJob
  • RunService
  • SQLDatabase
  • SQLSSLCert
  • SQLUser
  • SecretManagerSecret
  • SecretManagerSecretVersion
  • Serviço
  • ServiceDirectoryEndpoint
  • ServiceDirectoryNamespace
  • ServiceDirectoryService
  • ServiceIdentity
  • ServiceNetworkingConnection
  • SourceRepoRepository
  • SpannerDatabase
  • SpannerInstance
  • StorageBucket
  • StorageBucketAccessControl
  • StorageDefaultObjectAccessControl
  • StorageNotification
  • StorageTransferJob
  • VPCAccessConnector

Os tipos a seguir não oferecem suporte ao comportamento de preenchimento Merge a partir da versão correspondente:

Nome do tipo Versão
LoggingLogMetric 1.118.1