Ignorar campos não especificados
Nesta página, explicamos o comportamento padrão de preenchimento dos campos spec
e como mudar o comportamento padrão de Merge
para o 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 recente, porque esses CRDs usam apenas o comportamento Absent
. Para
uma lista de CRDs que oferecem suporte a Merge
, consulte a seção CRDs com suporte a Merge
desta página.
spec
comportamentos de preenchimento de campos
Quando o Config Connector cria um recurso, os campos não especificados na
especificação de recurso do Kubernetes podem ter dois comportamentos padrão de preenchimento diferentes:
Absent
e Merge
.
Ausente
Absent
é o comportamento recomendado. O Config Connector não vai preencher 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 compatível com esses CRDs. O valor da anotação
cnrm.cloud.google.com/state-into-spec
é absent
nesses CRs de
recurso.
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 conciliação bem-sucedida,
a menos que não sejam legíveis. Confira mais detalhes em Gerenciar campos externamente.
Para CRDs compatíveis com o Config Connector versão
1.113.0
e anteriores, o comportamento padrão de preenchimento é Merge
. Para conferir uma lista de CRDs que
são compatíveis com Merge
, consulte a seção CRDs com suporte a Merge
nesta 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 como 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 tenha apenas foo
especificado:
spec:
foo: "foo"
Você vai notar outro campo chamado bar
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 Config Connector 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 compatíveis com o Config Connector versão 1.113.0 e anteriores de uma das seguintes maneiras:
- Configure a substituição de
stateIntoSpec
no nível do cluster ou do namespace para serAbsent
. - Especifique o valor da anotação
cnrm.cloud.google.com/state-into-spec
comoabsent
para o recurso.
Configure a substituição de stateIntoSpec
no nível do cluster ou do namespace
Ao instalar ou atualizar o Config Connector, é possível configurar a substituição de stateIntoSpec
no nível do cluster ou do namespace para ser Absent
no CR do ConfigConnector ou no CR do ConfigConnectorContext.
spec:
stateIntoSpec: Absent
Isso faz com que Absent
seja o comportamento padrão de preenchimento de campos spec
para qualquer novo recurso criado no cluster ou no namespace quando você não especifica a anotação cnrm.cloud.google.com/state-into-spec
nos arquivos YAML de recursos novos. 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 determina o comportamento de preenchimento dos campos spec
com base no valor da anotação cnrm.cloud.google.com/state-into-spec
e segue a lógica abaixo para determinar o valor da anotação:
- Use o valor da anotação
cnrm.cloud.google.com/state-into-spec
diretamente se ele for especificado e válido. - Se a anotação não for especificada, use o valor correspondente do campo
stateIntoSpec
no CR ConfigConnectorContext. - Se o CR ConfigConnectorContext não existir ou o campo
stateIntoSpec
não for especificado, use o valor correspondente do campostateIntoSpec
no CR ConfigConnector. - Se o CR do ConfigConnector não existir ou o campo
stateIntoSpec
não for especificado, use o comportamento padrão com base no CRD descrito em Comportamentos de preenchimento de camposspec
.
Observe que o único comportamento de preenchimento de CRDs adicionado na versão 1.114.0 e
mais recente
é Absent
, independente da anotação cnrm.cloud.google.com/state-into-spec
ou dos campos stateIntoSpec
no CR do ConfigConnector ou
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:
Verifique se a substituição de
stateIntoSpec
no nível do cluster ou do namespace éAbsent
no CR do ConfigConnector ou no CR do ConfigConnectorContext.Abandone e adquira 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 evita
o preenchimento de campos não especificados na especificação de recursos do Kubernetes:
metadata:
annotations:
cnrm.cloud.google.com/state-into-spec: absent
Se não for especificado, o valor padrão dessa anotação será merge
, o que significa que o Config Connector vai preencher todos os campos não especificados em "spec". Essa anotação é imutável, ou seja, não é possível atualizar o valor de uma anotação de um recurso do Config Connector.
Se você já tiver criado o recurso, mas quiser mudar 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 do Kubernetes atual para garantir que a exclusão na próxima etapa não exclua o recurso Google Cloud subjacente.Exclua 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 haja uma especificação com o seguinte esquema:
foo1: string
foo2: string
bars:
- bar:
br1: string
br2: string
barz:
bz1: string
bz2: string
Também suponha que você especificou 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 do 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 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
Na maioria dos casos, convém definir 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 se beneficiam
do comportamento de preenchimento do 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 de fora do Config Connector será revertida por ele. No entanto, você pode usar essa anotação para permitir que o Config Connector pare de gerenciar subcampos na lista. Para mais informações, consulte Comportamento dos 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 Config Sync ou Argo CD, talvez note uma disputa 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 principal desses tipos de problemas é:
- O Config Connector vai preencher e definir como padrão valores não especificados na lista da
especificaçã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 uma deriva 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 não especificado
spec.bars[0].br2
à especificação.
Resolver problemas de simetria GET/PUT
A simetria GET/PUT se refere a um princípio de design na 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 mudança no estado do recurso REST subjacente.
Os campos não especificados preenchidos pelo Config Connector na especificação de recursos do Kubernetes 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 aGoogle Cloud API 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
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 de cliente HTTP 400 ou outras respostas inesperadas se a implementação da API violar o princípio de simetria GET/PUT.
Para evitar esse tipo de problema, teste definir cnrm.cloud.google.com/state-into-spec: absent
e verifique se os erros durante o processo de 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 CRD. Se eles forem representados em status.observedState
, você poderá definir cnrm.cloud.google.com/state-into-spec: absent
e ainda acessar os valores dos campos não especificados após uma conciliação bem-sucedida.
O campo status.observedState
contém o estado ativo 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
. É possível encontrar os campos observados nos esquemas de CRD.
Se você não encontrar os campos observados desejados, verifique se há um problema ou abra um novo nos issue trackers públicos .
Tipos com suporte a Merge
Estes são todos os tipos do 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 seguintes tipos não são compatíveis com o comportamento de preenchimento Merge
a partir da versão correspondente:
Nome do tipo | Versão |
---|---|
LoggingLogMetric | 1.118.1 |