忽略未指定的字段


本页介绍了 spec 字段的默认填充行为,以及如何将默认行为从 Merge 更改为建议的行为 Absent。如果您使用的是版本 1.114.0 及更高版本中添加的 CRD,本页内容可能不适用,因为这些 CRD 仅使用 Absent 行为。如需查看支持 Merge 的 CRD 列表,请参阅本页的支持 Merge 的 CRD 部分。

spec 字段填充行为

当 Config Connector 创建资源时,Kubernetes 资源规范中未指定的字段可能会有两种不同的默认填充行为:AbsentMerge

缺失

Absent推荐的行为。Config Connector 不会将任何未指定的字段填充到规范中。

对于在版本 1.114.0 及更高版本中添加的 CRD,默认填充行为为 Absent。这也是这些 CRD 支持的唯一填充行为。在这些资源 CR 中,cnrm.cloud.google.com/state-into-spec 注解的值为 absent

合并

1.114.0 及更高版本中添加的 CRD 中不支持 Merge 行为。成功进行一致性检查后,spec 字段会采用 API 中的值,除非这些值不可读。如需了解详情,请参阅在外部管理字段

对于 Config Connector 1.113.0 版及更低版本支持的 CRD,默认填充行为为 Merge。如需查看支持 Merge 的 CRD 的列表,请参阅本页的支持 Merge 的 CRD 部分。在这些资源 CR 中,cnrm.cloud.google.com/state-into-spec 注解的默认值为 merge。您还可以按照跳过将未指定的字段填充到规范中中的说明,将填充行为配置为 Absent

默认情况下,在这些资源 CR 中,未在原始 YAML 中指定的字段始终会显示在 CR 规范中。这意味着,当您运行 kubectl get <resource kind> <resource name> -oyaml 时,规范中的许多字段都不会出现在应用的 YAML 中。

例如,假设 CRD 架构允许您在规范中指定两个名为 foobar 的字段,而您应用的 YAML 文件中仅指定了 foo

spec:
  foo: "foo"

如果 YAML 成功应用且资源处于更新状态,您会注意到 CR 中会显示另一个名为 bar 的字段:

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

由于 Config Connector 和Google Cloud API 之间的交互非常复杂,因此您可能需要更改此默认行为,并跳过使用未指定的字段填充 Kubernetes 资源规范。

跳过将未指定的字段填充到规范中

您可以通过以下任一方式跳过为 Config Connector 1.113.0 版及更低版本支持的 CRD 将未指定字段填充到规范中:

  • 将集群级或命名空间级 stateIntoSpec 替换项配置为 Absent
  • 为资源指定 cnrm.cloud.google.com/state-into-spec 注解的值为 absent

配置集群级或命名空间级 stateIntoSpec 替换项

安装 Config Connector 或更新 Config Connector 安装时,您可以在 ConfigConnector CR 或 ConfigConnectorContext CR 中将集群级或命名空间级 stateIntoSpec 替换项配置为 Absent

spec:
  stateIntoSpec: Absent

这样一来,如果您未在新资源 YAML 中指定 cnrm.cloud.google.com/state-into-spec 注解,则 Absent 将成为在集群或命名空间中创建的任何新资源的默认 spec 字段填充行为。这意味着,Config Connector 将跳过将未指定的字段填充到这些资源的 Kubernetes 资源规范中。

stateIntoSpec 字段没有默认值。配置连接器将根据 cnrm.cloud.google.com/state-into-spec 注解的值确定 spec 字段的填充行为,并遵循以下逻辑来确定注解的值:

  1. 如果 cnrm.cloud.google.com/state-into-spec 注解已指定且有效,请直接使用其值。
  2. 如果未指定注解,请使用 ConfigConnectorContext CR 中 stateIntoSpec 字段的相应值。
  3. 如果 ConfigConnectorContext CR 不存在或 stateIntoSpec 字段未指定,请使用 ConfigConnector CR 中 stateIntoSpec 字段的相应值。
  4. 如果 ConfigConnector CR 不存在或未指定 stateIntoSpec 字段,请根据spec 字段填充行为中所述的 CRD 使用默认行为。

请注意,1.114.0 及更高版本中添加的唯一填充行为 CRD 是 Absent,无论 ConfigConnector CR 或 ConfigConnectorContext CR 中的 cnrm.cloud.google.com/state-into-spec 注解或 stateIntoSpec 字段如何。

如果您已创建资源,但想将 spec 字段填充行为更改为 Absent,则应执行以下操作:

  1. 确保 ConfigConnector CR 或 ConfigConnectorContext CR 中的集群级或命名空间级 stateIntoSpec 替换项为 Absent

  2. 放弃并获取资源。 确保用于获取的 YAML 配置包含 cnrm.cloud.google.com/state-into-spec 注解。

指定资源级 cnrm.cloud.google.com/state-into-spec 注解

创建 YAML 文件时,您可以将 cnrm.cloud.google.com/state-into-spec 注解的值指定为 absent。这样可以跳过将未指定的字段填充到 Kubernetes 资源规范中:

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

如果未指定,此注解的默认值为 merge,这意味着 Config Connector 会将所有未指定的字段填充到规范中。此注解不可变,这意味着您无法更新现有 Config Connector 资源的注解值。

如果您已创建资源,但想更改此注解的值以实现不同的填充行为,则必须按照以下步骤操作:

  1. 修改并向现有 Kubernetes 资源添加注解 cnrm.cloud.google.com/deletion-policy: abandon,以确保下一步中的删除操作不会删除底层 Google Cloud 资源。

  2. 从 Kubernetes 集群中删除资源。

  3. 将注解 cnrm.cloud.google.com/state-into-spec: absent 添加到资源的 YAML 中。

  4. (可选)从 YAML 中移除 cnrm.cloud.google.com/deletion-policy: abandon

  5. 应用更新后的 YAML。

为了进一步说明此注解引入的差异,假设有一个架构如下所示:

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

此外,假设您在 YAML 中指定了以下规范:

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

然后,默认情况下,创建的 Kubernetes 资源中填充的规范可能是:

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

如果您设置 cnrm.cloud.google.com/state-into-spec: absent,则创建的 Kubernetes 资源中的最终规范将为:

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

何时使用 cnrm.cloud.google.com/state-into-spec: absent

在大多数情况下,您需要设置 cnrm.cloud.google.com/state-into-spec: absent,以便为 spec 字段获取 Absent 填充行为。以下是最常见的受益于 Absent 填充行为的场景。

在外部管理列表中的未指定字段

Config Connector 会将 Kubernetes 资源规范中的所有列表字段视为原子字段。因此,默认情况下,Config Connector 会还原您在 Config Connector 之外对列表中的子字段所做的更改。不过,您可以使用此注解让 Config Connector 取消管理列表中的子字段。如需了解详情,请参阅资源规范中列表字段的行为

解决配置管理工具与 Config Connector 之间的争用问题

如果您使用的是 Config SyncArgo CD 等配置管理工具,可能会发现配置管理工具与 Config Connector 之间存在争用问题。例如,问题排查指南中介绍的 KNV2005 错误。导致此类问题的根本原因在于:

  1. Config Connector 会填充规范中列表中的未指定值,并将其设为默认值,spec.bars[0].br2 就是一个示例。
  2. 配置管理工具和 Config Connector 都将列表字段视为原子,因此添加的 spec.bars[0].br2 会被配置管理工具视为偏移,并会被移除以更正 drift

如需解决这些问题,您可以设置 cnrm.cloud.google.com/state-into-spec: absent,以便 Config Connector 不会将未指定的字段 spec.bars[0].br2 添加到规范中。

解决 GET/PUT 对称性问题

GET/PUT 对称性是指 REST API 中的一项设计原则。具体而言,这意味着,当 GET 响应作为 PUT 请求发送到同一网址时,预期结果为 HTTP 200 OK 响应,并且底层 REST 资源的状态不会发生变化。

Config Connector 在 Kubernetes 资源规范中填充的未指定字段是通过 GET 请求填充的。这意味着,在未来的对账中,Config Connector 可能会向底层Google Cloud API 发送 PUT/PATCH 请求,其中包含从 GET 请求中学习到的这些未指定字段值。这通常不是问题,但某些Google Cloud API 可能会因这些未指定的字段值而拒绝 PUT/PATCH 请求。在同一示例中,如果 API 实现违反了 GET/PUT 对称性原则,则填充值为“bz2”的 spec.barz.bz2 可能会导致 HTTP 400 客户端错误或其他意外响应。

为避免此类问题,您可以尝试设置 cnrm.cloud.google.com/state-into-spec: absent,并检查是否会消除在协调期间出现的错误。

观察到的状态

如果您需要设置 cnrm.cloud.google.com/state-into-spec: absent,但您的解决方案依赖于未指定字段中的填充值,请检查这些字段是否存在于 CRD 架构中的 status.observedState 下。如果这些字段在 status.observedState 下表示,则您可以设置 cnrm.cloud.google.com/state-into-spec: absent,并且在成功进行对账后仍可以访问未指定字段的值。

status.observedState 字段包含 Config Connector 在上次成功协调时观察到的资源的所选观察字段的实时状态。如果观察到的字段是常见用例的依赖项,并且是计算的 spec 字段,则会被选择。您可以在 CRD 架构中找到观察到的字段。

如果您找不到所需的观察字段,可以在公开问题跟踪器中检查现有问题或提交新问题。

支持 Merge 的类型

以下是支持 Merge 填充行为的所有 Config Connector 类型:

  • 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
  • Cloud Scheduler 作业
  • 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
  • Dataproc 集群
  • DataprocWorkflowTemplate
  • EdgeContainerCluster
  • EdgeContainerNodePool
  • EdgeContainerVpnConnection
  • EdgeNetworkNetwork
  • EdgeNetworkSubnet
  • EventarcTrigger
  • FilestoreBackup
  • FilestoreInstance
  • FirestoreIndex
  • 文件夹
  • 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
  • Memcache 实例
  • 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
  • 项目
  • PubSubLiteReservation
  • PubSubSchema
  • PubSubSubscription
  • PubSubTopic
  • RecaptchaEnterpriseKey
  • RedisInstance
  • ResourceManagerLien
  • ResourceManagerPolicy
  • RunJob
  • RunService
  • SQLDatabase
  • SQLSSLCert
  • SQLUser
  • SecretManagerSecret
  • SecretManagerSecretVersion
  • 服务
  • ServiceDirectoryEndpoint
  • ServiceDirectoryNamespace
  • ServiceDirectoryService
  • ServiceIdentity
  • ServiceNetworkingConnection
  • SourceRepoRepository
  • SpannerDatabase
  • SpannerInstance
  • StorageBucket
  • StorageBucketAccessControl
  • StorageDefaultObjectAccessControl
  • StorageNotification
  • StorageTransferJob
  • VPCAccessConnector

从相应版本开始,以下类型不支持 Merge 填充行为:

种类名称 版本
LoggingLogMetric 1.118.1