リソース伝達エラー: PlacementOverridden が False

概要

この記事では、Microsoft Azure Kubernetes Fleet Manager で配置 API を使用してリソースを伝達するときのオーバーライド エラーのトラブルシューティング方法について説明します。 この問題は、 ClusterResourcePlacementResourcePlacementの両方に適用され、それぞれに独自のカスタム リソース条件の種類が適用されます。

  • ClusterResourcePlacementOverridden ClusterResourcePlacement の場合
  • ResourcePlacementOverridden ResourcePlacement の場合

サンプル エラー メッセージ:

  - lastTransitionTime: "2024-05-07T23:32:40Z"
    message: Failed to override resources for 1 clusters, please check the `failedPlacements` status
    observedGeneration: 1
    reason: OverrideFailed
    status: "False"
    type: ClusterResourcePlacementOverridden

症状

Azure Kubernetes Fleet Manager で ClusterResourcePlacement または ResourcePlacement API オブジェクトを使用してリソースを伝達すると、デプロイは失敗します。 ClusterResourcePlacementOverridden (ClusterResourcePlacement の場合) または ResourcePlacementOverridden (ResourcePlacement の場合) の状態は、Falseとして表示されます。

詳細については、オーバーライド コントローラー ログ (ClusterResourceOverride と ResourceOverride のコントローラーを含む) を調べます。 フリート エージェント ログの表示の詳細については、「 Azure Kubernetes Fleet Manager でのエージェント ログの表示」を参照してください。

原因

この問題は、リソースの無効なフィールド パスを使用して ClusterResourceOverride または ResourceOverride が作成されるために発生する可能性があります。

ケース スタディ: ClusterResourcePlacement

次の例では、ClusterResourcePlacementが選択されたクラスターに伝達するクラスター ロールをsecret-readerがオーバーライドしようとしています。 ただし、 ClusterResourceOverride は、リソースの無効なパスを使用して作成されます。

ClusterRole

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRole","metadata":{"annotations":{},"name":"secret-reader"},"rules":[{"apiGroups":[""],"resources":["secrets"],"verbs":["get","watch","list"]}]}
creationTimestamp: "2024-05-14T15:36:48Z"
name: secret-reader
resourceVersion: "81334"
uid: 108e6312-3416-49be-aa3d-a665c5df58b4
rules:
- apiGroups:
  - ""
    resources:
  - secrets
    verbs:
  - get
  - watch
  - list

ClusterRoleがメンバー クラスターに伝達するsecret-readerClusterResourcePlacement

ClusterResourceOverride の仕様

spec:
  clusterResourceSelectors:
  - group: rbac.authorization.k8s.io
    kind: ClusterRole
    name: secret-reader
    version: v1
  policy:
    overrideRules:
    - clusterSelector:
        clusterSelectorTerms:
        - labelSelector:
            matchLabels:
              env: canary
      jsonPatchOverrides:
      - op: add
        path: /metadata/labels/new-label
        value: new-value

ClusterResourceOverrideは、ClusterRoleのラベルを持つクラスターに対して、新しいラベル (secret-reader) に値new-labelを追加することによって、new-valueenv: canaryをオーバーライドするために作成されます。

ClusterResourcePlacement の仕様

spec:
  resourceSelectors:
    - group: rbac.authorization.k8s.io
      kind: ClusterRole
      name: secret-reader
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 1
    affinity:
      clusterAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: canary
  strategy:
    type: RollingUpdate
    applyStrategy:
      allowCoOwnership: true

ClusterResourcePlacement の状態:

status:
  conditions:
  - lastTransitionTime: "2024-05-14T16:16:18Z"
    message: found all cluster needed as specified by the scheduling policy, found
      1 cluster(s)
    observedGeneration: 1
    reason: SchedulingPolicyFulfilled
    status: "True"
    type: ClusterResourcePlacementScheduled
  - lastTransitionTime: "2024-05-14T16:16:18Z"
    message: All 1 cluster(s) start rolling out the latest resource
    observedGeneration: 1
    reason: RolloutStarted
    status: "True"
    type: ClusterResourcePlacementRolloutStarted
  - lastTransitionTime: "2024-05-14T16:16:18Z"
    message: Failed to override resources in 1 cluster(s)
    observedGeneration: 1
    reason: OverriddenFailed
    status: "False"
    type: ClusterResourcePlacementOverridden
  observedResourceIndex: "0"
  placementStatuses:
  - applicableClusterResourceOverrides:
    - cro-1-0
    clusterName: kind-cluster-1
    conditions:
    - lastTransitionTime: "2024-05-14T16:16:18Z"
      message: 'Successfully scheduled resources for placement in kind-cluster-1 (affinity
        score: 0, topology spread score: 0): picked by scheduling policy'
      observedGeneration: 1
      reason: Scheduled
      status: "True"
      type: Scheduled
    - lastTransitionTime: "2024-05-14T16:16:18Z"
      message: Detected the new changes on the resources and started the rollout process
      observedGeneration: 1
      reason: RolloutStarted
      status: "True"
      type: RolloutStarted
    - lastTransitionTime: "2024-05-14T16:16:18Z"
      message: 'Failed to apply the override rules on the resources: add operation
        does not apply: doc is missing path: "/metadata/labels/new-label": missing
        value'
      observedGeneration: 1
      reason: OverriddenFailed
      status: "False"
      type: Overridden
  selectedResources:
  - group: rbac.authorization.k8s.io
    kind: ClusterRole
    name: secret-reader
    version: v1

ClusterResourcePlacementOverridden (ClusterResourcePlacement の場合) またはResourcePlacementOverridden (ResourcePlacement の場合) の条件がFalse場合は、placementStatusesセクションを確認して、エラーの正確な原因を確認します。

この例では、パス /metadata/labels/new-label とそれに対応する値がないため、オーバーライドに失敗したことを示すメッセージが表示されます。 クラスター ロール secret-readerの前の例に基づいて、パス /metadata/labels/ が存在しないことがわかります。 labels フィールドが存在しません。 そのため、新しいラベルを追加することはできません。

解決策

クラスター ロール secret-readerを正常にオーバーライドするには、次のコードに示すように、 ClusterResourceOverrideのパスと値を修正します。

jsonPatchOverrides:
  - op: add
    path: /metadata/labels
    value: 
      newlabel: new-value

このコードは、値がnewlabelされた新しいラベル new-valueを ClusterRole secret-readerに追加します。

一般的な注意事項

ResourcePlacement の場合、オーバーライド フローは同じですが、すべてのリソースが同じ名前空間に存在する点が異なります。 ResourceOverrideではなくClusterResourceOverrideを使用し、条件のResourcePlacementOverriddenを想定します。