忽略未指定的字段
本页面介绍了 spec
字段的默认填充行为以及如何实现
将默认行为从 Merge
更改为建议的行为
Absent
。如果您使用
1.114.0 及更高版本,因为这些 CRD 仅使用 Absent
行为。对于
支持 Merge
的 CRD 列表,请参阅具有 Merge
的 CRD
支持部分。
spec
个字段填充行为
当 Config Connector 创建资源时,
Kubernetes 资源规范可能具有两种不同的默认填充行为:
Absent
和Merge
。
缺失
Absent
是推荐的行为。Config Connector 不会填充任何
向规范添加未指定的字段
对于版本 1.114.0 和
之后,
默认填充行为是 Absent
。这也是
这些 CRD 支持的行为。
“cnrm.cloud.google.com/state-into-spec
”注解在这些资源中处于“absent
”状态
预设回复。
合并
在 1.114.0 及更高版本中添加的 CRD 中不支持 Merge
行为。通过
在对账成功后,spec
字段会采用 API 中的值
除非无法读取如需了解详情,请参阅管理字段
外部。
对于 Config Connector 版本支持的 CRD
1.113.0
及更早版本,默认填充行为为 Merge
。有关
支持 Merge
,请参阅支持 Merge
的 CRD
部分。默认值
“cnrm.cloud.google.com/state-into-spec
”注解在这些资源中处于“merge
”状态
预设回复。您还可以将填充行为配置为 Absent
(遵循
跳过将未指定字段填充到
规范。
默认情况下,在这些资源预设回复中,
原始 YAML 始终出现在 CR 规范中。这意味着,当您运行
kubectl get <resource kind> <resource name> -oyaml
,规范中的许多字段
不包含在您应用的 YAML 中。
例如,假设 CRD 架构允许您指定两个名为 foo
和
bar
,而应用的 YAML 文件仅指定了 foo
:
spec:
foo: "foo"
应用了 YAML 后,您会在预设回复中发现另一个名为 bar
的字段
并且该资源
UpToDate:
spec:
foo: "foo"
bar: "bar"
由于 Config Connector 与 则您可能需要更改此默认行为并跳过 使用未指定的字段填充 Kubernetes 资源规范。
跳过将未指定的字段填充到规范中
对于 Config Connector 版本 1.113.0 和更早版本:
- 将集群级或命名空间级
stateIntoSpec
替换配置为Absent
。 - 将
cnrm.cloud.google.com/state-into-spec
注解的值指定为absent
(针对资源)。
配置集群级或命名空间级 stateIntoSpec
替换
安装 Config Connector 或更新 Config Connector 安装时,
您可以配置集群级或命名空间级 stateIntoSpec
替换
在 ConfigConnector CR 或 ConfigConnectorContext CR 中设置为 Absent
。
spec:
stateIntoSpec: Absent
这会使 Absent
成为任何新填充行为的默认 spec
字段
在集群或命名空间中创建的资源
新资源中的 cnrm.cloud.google.com/state-into-spec
注解
YAML这意味着 Config Connector 将跳过向
这些资源的 Kubernetes 资源规范
stateIntoSpec
字段没有默认值。Config Connector 将
确定用于填充行为的spec
字段,
cnrm.cloud.google.com/state-into-spec
注解,并且它遵循以下逻辑:
以确定注解的值:
- 使用
cnrm.cloud.google.com/state-into-spec
注解的值 。 - 如果未指定注解,则使用
ConfigConnectorContext CR 中的
stateIntoSpec
字段。 - ConfigConnectorContext CR 不存在或
stateIntoSpec
字段 未指定,请使用stateIntoSpec
ConfigConnector CR。 - 如果 ConfigConnector CR 不存在或
stateIntoSpec
字段为 未指定,请使用基于spec
中描述的 CRD 的默认行为 字段填充行为。
请注意,版本 1.114.0 和
以后再说
关注值是Absent
,无论cnrm.cloud.google.com/state-into-spec
如何
ConfigConnector CR 中的 stateIntoSpec
字段或
ConfigConnectorContext CR。
如果您已创建资源,但想更改 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 资源。
如果您已经创建了资源,但想更改此资源的值 注解,您必须按照以下步骤操作:
修改和添加注解
cnrm.cloud.google.com/deletion-policy: abandon
现有 Kubernetes 资源,以确保在下一步中删除不会 删除底层 Google Cloud 资源。从 Kubernetes 集群中删除资源。
将
cnrm.cloud.google.com/state-into-spec: absent
注解添加到 YAML 中 资源。(可选)从
cnrm.cloud.google.com/deletion-policy: abandon
YAML。应用更新后的 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
,则最终规范
将如下所示:
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
填充行为的影响。
在外部管理列表中的未指定字段
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 资源。
Kubernetes 资源中的 Config Connector 填充的未指定字段
是 GET 请求的结果。这意味着
对账
Config Connector 可以向底层 API 发送 PUT/PATCH 请求,
Google Cloud API,通过从 GET 请求获取的未指定字段值
请求。这通常不是问题
由于这些原因,Google Cloud API 会拒绝 PUT/PATCH 请求
未指定字段值。在同一个示例中,填充的 spec.barz.bz2
值为“bz2”可能会导致 HTTP 400 客户端错误或其他意外错误,
如果 API 实现违反了 GET/PUT 对称性原则,系统会返回该响应。
为避免出现此类问题
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
- AlloyDBInstance
- AlloyDBUser
- ApigeeEnvironment
- ApigeeOrganization
- ArtifactRegistryRepository
- BigQueryDataset
- BigQueryJob
- BigQueryTable
- BigtableAppProfile
- BigtableGCPolicy
- BigtableInstance
- BigtableTable
- BillingBudgetsBudget
- BinaryAuthorizationAttestor
- BinaryAuthorizationPolicy
- CertificateManagerCertificate
- CertificateManagerCertificateMap
- CertificateManagerCertificateMapEntry
- CertificateManagerDNSAuthorization
- CloudBuildTrigger
- CloudFunctionsFunction
- CloudIdentityGroup
- CloudIdentityMembership
- Cloud Scheduler 作业
- ComputeAddress
- ComputeBackendBucket
- ComputeBackendService
- ComputeDisk
- ComputeExternalVPNGateway
- ComputeFirewall
- ComputeFirewallPolicy
- ComputeFirewallPolicyAssociation
- ComputeFirewallPolicyRule
- 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
- GKEHubFeatureMembership
- 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
- MonitoringDashboard
- 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
- SQLInstance
- SQLSSLCert
- SQLUser
- SecretManagerSecret
- SecretManagerSecretVersion
- 服务
- ServiceDirectoryEndpoint
- ServiceDirectoryNamespace
- ServiceDirectoryService
- ServiceIdentity
- ServiceNetworkingConnection
- SourceRepoRepository
- SpannerDatabase
- SpannerInstance
- StorageBucket
- StorageBucketAccessControl
- StorageDefaultObjectAccessControl
- StorageNotification
- StorageTransferJob
- VPCAccessConnector
以下种类不支持从以下日期开始的 Merge
填充行为:
相应的版本:
种类名称 | 版本 |
---|---|
LoggingLogMetric | 1.118.1 |