使用 Azure Kubernetes 舰队管理器进行群集资源放置以接管现有工作负载(预览版)

当多群集环境成熟时,多个群集上存在特定工作负荷是一种常见情况。 将群集添加到机群的一个原因是集中管理工作负荷,以提高跨多个群集的工作负荷的可见性和可管理性。 但是,将具有现有工作负荷的群集添加到机群可能会导致放置冲突,当机队管理器尝试将托管工作负荷放置在已添加的成员群集上时。

在本文中,我们将讨论如何使用 whenToTakeOverapplyStrategy 属性,在群集资源放置 (CRP) 中明确控制舰队管理器在执行放置时如何处理现有工作负载。

注释

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

重要

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

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

工作负载接管选项

工作负荷接管的起点是将工作负荷清单部署到 Fleet Manager 中心群集。 部署后,定义一个 CRP,该 CRP 使用属性 whenToTakeOver 指定显式接管行为。

whenToTakeOver 属性允许以下值:

  • Always:舰队管理器会立即从中心群集应用相应的工作负载,目标群集中托管字段的任何值的差异都会被覆盖。 对于没有明确whenToTakeOver设置的CRP,该行为为默认行为。

  • IfNoDiff:当机群管理器找到现有工作负荷时,队列管理器会检查配置差异,并且仅在找不到配置差异时应用中心群集工作负荷。

  • Never:机群管理器忽略现有工作负载,并且不应用中心群集工作负荷。 舰队管理器仍会标识匹配的工作负载并引发应用错误,使你能够安全地检查是否存在现有工作负载。

定义用于比较的字段

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

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

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

检查是否有冲突的工作负荷

若要检查 CRP 的现有工作负载,首先添加 applyStrategy 值为 whenToTakeOverNever,如下例所示。

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

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

kubectl apply -f web-2-crp.yaml

车队管理器尝试分配工作负荷,并在目标成员群集上找到匹配的工作负荷时返回一个failedPlacement响应。

可以使用以下命令确定哪些成员群集由于工作负荷冲突而失败放置。 jq 命令用于设置输出的格式。

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

由于现有工作负荷而无法放置的每个群集返回一个类似于以下示例的条目。

{
    "clusterName": "member-2",
    "failedPlacements": [
        {
            "condition": {
                "lastTransitionTime": "...",
                "message": "Failed to apply the manifest (error: no ownership of the object in the member cluster; takeover is needed)",
                "reason": "NotTakenOver",
                "status": "False",
                "type": "Applied"
            },
            "kind": "Namespace",
            "name": "web-2",
            "version": "v1"
        }
    ]
}

安全地接管匹配的工作负载

若要继续接管现有工作负荷,可以修改现有 CRP,更改为 whenToTakeOverIfNoDiff

机群管理器将中心群集工作负荷应用于目标群集上的现有工作负载,其中两个工作负荷上的托管字段之间没有差异。 忽略额外的字段。

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

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

kubectl apply -f web-2-crp.yaml

舰队管理器会尝试放置工作负载,覆盖具有匹配字段的目标成员群集。

放置仍可能失败,因此请检查是否有其他 failedPlacement 消息。 使用以下命令确定哪些成员群集失败。 jq 命令用于设置输出的格式。

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

由于配置差异而失败放置的每个群集返回类似于以下示例的条目。

{
    "clusterName": "member-2",
    "failedPlacements": [
        {
            "condition": {
                "lastTransitionTime": "...",
                "message": "Failed to apply the manifest (error: cannot take over object: configuration differences are found between the manifest object and the corresponding object in the member cluster)",
                "reason": "FailedToTakeOver",
                "status": "False",
                "type": "Applied"
            },
            "kind": "Namespace",
            "name": "work-2",
            "version": "v1"
        }
    ]
}

可以通过遵循偏移检测文档的 偏移群集 报表中详述的过程来查看偏移字段。

此时,您必须决定如何处理漂移:可以选择将成员群集的更改纳入中心群集的工作负载定义,或者选择通过将属性设置为whenToTakeOverAlways来覆盖成员群集的工作负载。

后续步骤