忽略未指定的字段
本页介绍了 spec
字段的默认填充行为,以及如何将默认行为从 Merge
更改为建议的行为 Absent
。如果您使用的是 1.114.0 及更高版本中添加的 CRD,则本页可能不适用,因为这些 CRD 仅使用 Absent
行为。如需查看支持 Merge
的 CRD 列表,请参阅本页面的 CRD with Merge
support 部分。
spec
个字段填充行为
当 Config Connector 创建资源时,Kubernetes 资源规范中未指定的字段可能具有两种不同的默认填充行为:Absent
和 Merge
。
缺失
Absent
是推荐的行为。Config Connector 不会将任何未指定的字段填充到规范中。
对于在版本 1.114.0 及更高版本中添加的 CRD,默认填充行为为 Absent
。这也是这些 CRD 支持的唯一填充行为。在这些资源 CR 中,cnrm.cloud.google.com/state-into-spec
注解的值为 absent
。
合并
Merge
是在 1.114.0 及更高版本中添加的 CRD 中不受支持的行为。成功完成协调后,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 架构允许您在规范中指定两个名为 foo
和 bar
的字段,而您应用的 YAML 文件仅指定了 foo
:
spec:
foo: "foo"
如果 YAML 应用成功且资源处于 UpToDate 状态,您会注意到 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 安装时,您可以将集群级或命名空间级 stateIntoSpec
替换配置为 ConfigConnector CR 或 ConfigConnectorContext CR 中的 Absent
。
spec:
stateIntoSpec: Absent
这样一来,当您未在新资源 YAML 中指定 cnrm.cloud.google.com/state-into-spec
注解时,Absent
会成为在集群或命名空间中创建的任何新资源的默认 spec
字段填充行为。这意味着,对于这些资源,Config Connector 将跳过将未指定的字段填充到 Kubernetes 资源规范中的操作。
stateIntoSpec
字段没有默认值。Config Connector 将根据 cnrm.cloud.google.com/state-into-spec
注解的值确定 spec
字段的填充行为,并遵循以下逻辑来确定注解的值:
- 如果指定了
cnrm.cloud.google.com/state-into-spec
注解且该注解有效,则直接使用其值。 - 如果未指定注解,请使用 ConfigConnectorContext CR 中
stateIntoSpec
字段的相应值。 - 如果 ConfigConnectorContext CR 不存在或未指定
stateIntoSpec
字段,请使用 ConfigConnector CR 中stateIntoSpec
字段的相应值。 - 如果 ConfigConnector CR 不存在或
stateIntoSpec
字段未指定,请根据spec
字段填充行为中所述的 CRD 使用默认行为。
请注意,1.114.0 版及更高版本中添加的唯一填充行为 CRD 遵循的是 Absent
,无论 ConfigConnector CR 或 ConfigConnectorContext CR 中是否存在 cnrm.cloud.google.com/state-into-spec
注解或 stateIntoSpec
字段。
如果您已创建资源,但想将 spec
字段填充行为更改为 Absent
,则应执行以下操作:
确保将集群级或命名空间级
stateIntoSpec
替换为 ConfigConnector CR 或 ConfigConnectorContext CR 中的Absent
。放弃并获取资源。 确保用于获取的 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 资源的注解值。
如果您已创建资源,但想更改此注解的值以实现不同的填充行为,则必须按照以下步骤操作:
修改现有 Kubernetes 资源并添加注解
cnrm.cloud.google.com/deletion-policy: abandon
,以确保下一步中的删除操作不会删除底层 Google Cloud 资源。从 Kubernetes 集群中删除资源。
将注解
cnrm.cloud.google.com/state-into-spec: absent
添加到资源的 YAML 中。(可选)从 YAML 中移除
cnrm.cloud.google.com/deletion-policy: abandon
。应用更新后的 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
设置为 Absent
,以获取 spec
字段的 Absent
填充行为。以下是最常见的场景,这些场景将受益于 Absent
填充行为。
在外部管理列表中的未指定字段
Config Connector 将 Kubernetes 资源规范中的所有列表字段视为原子字段。因此,默认情况下,您在 Config Connector 外部对列表中的子字段所做的更改会被 Config Connector 还原。不过,您可以使用此注解让 Config Connector 取消管理列表中的子字段。如需了解详情,请参阅资源规范中列表字段的行为。
解决配置管理工具与 Config Connector 之间的争夺问题
如果您使用的是 Config Sync 或 Argo CD 等配置管理工具,您可能会注意到配置管理工具与 Config Connector 之间存在冲突。例如,问题排查指南中说明的 KNV2005 错误。这些类型问题的根本原因在于:
- Config Connector 将填充并默认设置规范中列表内未指定的值,
spec.bars[0].br2
就是一个示例。 - 配置管理工具和 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
以下 kind 从相应版本开始不支持 Merge
填充行为:
实体种类名称 | 版本 |
---|---|
LoggingLogMetric | 1.118.1 |