使用 Azure Kubernetes 舰队管理器群集资源放置来检测并管理工作负荷偏移(预览版)

授权用户可以直接更改放置到成员群集的工作负荷上的字段。 这些更改会导致机群管理器工作负荷定义和放置的工作负荷之间存在 偏差 。 这些偏差可能会导致新部署发生时出现问题,这可能会导致应用程序中断。

在本文中,我们将了解如何使用群集资源放置 CRP applyStrategy 属性来确定 Fleet Manager 如何检测和处理这些偏移。

注释

如果不熟悉 Fleet Manager 的群集资源放置(CRP),请在阅读本文之前阅读 资源放置的概念概述

重要

Azure Kubernetes 舰队管理器预览功能可以通过自助服务方式选择性启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 客户支持部门会尽力为 Azure Kubernetes 舰队管理器预览功能提供部分支持。 因此,这些功能并不适合用于生产。

我们的数据平面预览通过 v1beta1 API 发布。 如果未看到预览对象,请检查是否在与 Fleet Manager 中心群集交互时请求 v1beta1 API。

检测机群之间的差异

本部分概述了群集资源放置 ReportDiff 应用模式,该模式可用于随时评估队列中放置工作负荷的配置状态。

ReportDiff使用模式时,Fleet Manager 会检查中心群集工作负荷定义与成员群集上相应放置的工作负荷之间的配置差异,并报告 CRP 状态中的结果。

在以下示例中,对于任何具有已放置命名空间的成员群集,Fleet Manager 会报告命名空间 web 的差异。

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp-reportdiff-sample
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      version: v1
      labelSelector:
        matchLabels:
          app: web
  policy:
    placementType: PickAll
  strategy:
    applyStrategy:
      type: ReportDiff 
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 100%
      unavailablePeriodSeconds: 1

将 CRP 应用到 Fleet Manager 中心群集。

kubectl apply -f crp-reportdiff-sample.yaml

有关偏移群集的报告

使用以下命令可以确定哪些群集具有配置偏移。 将 crp-reportdiff-sample 替换为你的 CRP 的名称。 jq 命令用于设置输出的格式。

kubectl get clusterresourceplacement.v1beta1.placement.kubernetes-fleet.io crp-reportdiff-sample -o jsonpath='{.status.placementStatuses}' \
    | jq '[.[] | select (.diffedPlacements != null)] | map({clusterName, diffedPlacements})'

该命令生成一个包含类似于以下代码片段的 JSON 的响应。 在这个例子中,可以看到有人已直接替换此集群上的所有者标签。

{
    "clusterName": "member-2",
    "diffedPlacements": [
        {
            "firstDiffedObservedTime": "2025-03-19T06:49:54Z",
            "kind": "Namespace",
            "name": "web",
            "observationTime": "2025-03-19T06:50:25Z",
            "observedDiffs": [
                {
                    "path": "/metadata/labels/owner",
                    "valueInHub": "simon",
                    "valueInMember": "chen"
                }
            ],
            "targetClusterObservedGeneration": 0,
            "version": "v1" 
        }
    ]
}

Fleet Manager 报告有关配置差异的以下信息:

  • clusterName:检测到差异的成员群集。
  • diffedPlacements:检测到的差异列表,其中包含以下详细信息:
    • group、、kindversionnamespacename:标识具有配置差异的资源的属性(并非所有属性都显示在示例中)。
    • observationTime:收集当前差异详细信息的时间。
    • firstDiffedObservedTime:首次观察到差异时(可能与observationTime不同)。
    • observedDiffs:差异详细信息,具体如下:
      • path:指向具有不同值的字段的 JSON 路径(RFC 6901):
      • valueInHub:从中心群集工作负荷定义(所需状态)中看到的 JSON 路径处的值。 如果此值不存在,则中心群集工作负荷定义中不存在该字段。
      • valueInMember:从成员群集工作负荷(当前状态)中看到的 JSON 路径上的值。 如果此值不存在,则成员群集上不存在该字段。
    • targetClusterObservedGeneration:生成成员群集工作负荷。

使用 ReportDiff时要注意的重要项:

  • 舰队管理器仅报告在中心群集上具有相应清单的资源的差异。 例如,如果成员群集上存在命名空间范围的对象,但不存在于中心群集上,则 Fleet Manager 会忽略该对象,即使其所有者命名空间已选择放置。

  • 不会执行应用操作,如何处理任何已识别的配置差异由您决定。

  • 一旦舰队管理器检查完所有资源,差异报告即成功完成。 配置差异是否存在对报告成功状态的差异没有任何影响。

  • 在中心群集上应用资源更改时,对于 ReportDiff 模式的 CRP,一旦差异报告完成,就会立即将更改推出到所有成员群集(当推出策略设置为默认类型 RollingUpdate 时)。

在部署过程中处理偏移群集

使用 ReportDiff 报告整个舰队的偏移状态是一项时间点活动,因此始终有可能在检查和部署之间出现配置偏移的情况。

在本部分,我们讨论如何在群集资源放置 (CRP) 中使用 whenToApplyapplyStrategy 属性,以明确控制舰队管理器在执行放置操作时如何处理偏移工作负荷。

whenToApply 属性有两个选项:

  • Always:无论群集的偏移状态如何,Fleet Manager 都会定期将中心群集中的工作负荷定义应用到匹配的成员群集。 对于没有明确whenToApply设置的CRP,该行为为默认行为。

  • IfNotDrifted:舰队管理器定期检查偏移。 如果发现偏移,Fleet Manager 将停止应用中心群集工作负荷定义,并在 CRP 状态中报告。

注释

偏移的存在不会阻止舰队管理器推出更新的工作负荷版本。 如果在中心群集上编辑工作负荷定义,Fleet Manager 始终应用新的工作负荷定义。

定义用于比较的字段

可以用一个可选的 comparisonOptions 属性来微调 whenToApply 确定配置差异的方式。

  • partialComparison:仅中心群集工作负荷和目标群集工作负荷上存在的字段用于值比较。 忽略目标群集工作负荷中的任何额外未管理的字段。 对于没有明确comparisonOptions设置的CRP,该行为为默认行为。

  • fullComparison:舰队中心群集上的工作负荷定义的所有字段必须在所选成员群集中。 如果目标群集具有任何额外的未受管理字段,比较将失败。

在以下示例中,如果在任何字段(托管或非托管)中发现更改,则 CRP 将失败。

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp-deploy-drift-sample
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      version: v1
      labelSelector:
        matchLabels:
          app: web
  policy:
    placementType: PickAll
  strategy:
    applyStrategy:
      comparisonOption: FullComparison    
      whenToApply: IfNotDrifted
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 100%
      unavailablePeriodSeconds: 1                

下表汇总了放置行为,具体取决于所选值 whenToApplycomparisonOption 值。

whenToApply 设置 comparisonOption 设置 字段类型 结果
IfNotDrifted partialComparison 在成员群集上编辑托管字段(中心群集工作负荷定义)。 报告应用错误,加上偏移详细信息。
IfNotDrifted partialComparison 在成员群集上编辑/添加非托管字段(在中心群集工作负荷定义中不存在)。 更改被忽略,不予处理。
IfNotDrifted fullComparison 在成员群集上编辑/添加任何字段。 报告应用错误,加上偏移详细信息。
Always partialComparison 在成员群集上编辑托管字段(中心群集工作负荷定义)。 更改被覆盖。
Always partialComparison 在成员群集上编辑/添加非托管字段(在中心群集工作负荷定义中不存在)。 更改被忽略,不予处理。
Always fullComparison 在成员群集上编辑/添加任何字段。 托管字段会被覆盖;偏移详细信息在非托管字段上报告,但不被视为应用错误。

后续步骤