Sdílet prostřednictvím


Bezpečné umístění prostředků pomocí objektových obálek

Objekty obálek jsou dvojicí vlastních prostředků Kubernetes definovaných Správcem flotily Azure Kubernetes, které uživatelům umožňují zabalit prostředky pro šíření do členských clusterů, aniž by to způsobilo nežádoucí vedlejší účinky na cluster centra.

Tato příručka obsahuje pokyny pro šíření sady prostředků z hlavního clusteru do připojených členských clusterů v rámci obalového objektu.

Obálkové objekty s CRD

Fleet teď podporuje dva typy obálek vlastních definic prostředků (CRD) pro šíření prostředků:

  • ClusterResourceEnvelope: Slouží k zabalení prostředků v rámci clustru pro umístění.
  • ResourceEnvelope: Slouží k zabalení prostředků s oborem názvů pro umístění.

Tyto CRDs poskytují strukturovanější způsob balení prostředků v rámci Kubernetes pro distribuci do členských clusterů, aniž by to způsobilo nežádoucí vedlejší účinky na řídicí cluster.

Příklad ClusterResourceEnvelope

Jedná se ClusterResourceEnvelope o prostředek s vymezeným clusterem, který může zabalit pouze jiné prostředky s oborem clusteru. Například:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourceEnvelope
metadata:
  name: example
data:
  "webhook.yaml":
    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    metadata:
      name: guard
    webhooks:
    - name: guard.example.com
      rules:
      - operations: ["CREATE"]
        apiGroups: ["*"]
        apiVersions: ["*"]
        resources: ["*"]
      clientConfig:
        service:
          name: guard
          namespace: ops
      admissionReviewVersions: ["v1"]
      sideEffects: None
      timeoutSeconds: 10
  "clusterrole.yaml":
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "list", "watch"]

Příklad ResourceEnvelope

Jedná se o prostředek v rámci názvového prostoru ResourceEnvelope, který může zabalit pouze prostředky v rámci názvového prostoru. Například:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourceEnvelope
metadata:
  name: example
  namespace: app
data:
  "cm.yaml":
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config
      namespace: app
    data:
      foo: bar
  "deploy.yaml":
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ingress
      namespace: app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: web
            image: nginx

Šíření zabalených objektů z centrálního clusteru do členských clusterů

Objekty obálky použijeme v cluster hubu a pak použijeme objekt ClusterResourcePlacement k propagaci těchto prostředků z hubu do členských clusterů.

Příklad specifikace ClusterResourcePlacement pro šíření ResourceEnvelope:

Tady je příklad ClusterResourcePlacement (CRP), který zajišťuje šíření ResourceEnvelope do členského clusteru. Mějte na paměti, že jelikož je ResourceEnvelope omezený na úroveň oboru názvů, musí CRP pouze vybrat obor názvů, který obsahuje objekt obálky:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp-with-envelope
spec:
  policy:
    clusterNames:
    - kind-cluster-1
    placementType: PickFixed
  resourceSelectors:
  - group: ""
    kind: Namespace
    name: app
    version: v1
  revisionHistoryLimit: 10
  strategy:
    type: RollingUpdate

Příklad specifikace CRP pro šíření ClusterResourceEnvelope:

Tady je příklad ClusterResourcePlacement (CRP), který propaguje ClusterResourceEnvelope do členského clusteru. Mějte na paměti, že protože má ClusterResourceEnvelope rozsah na úrovni clusteru, objekt ClusterResourcePlacement potřebuje vybrat pouze samotný objekt obálky:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp-with-cluster-envelope
spec:
  policy:
    clusterNames:
    - kind-cluster-1
    placementType: PickFixed
  resourceSelectors:
  - group: placement.kubernetes-fleet.io
    kind: ClusterResourceEnvelope
    name: example
    version: v1beta1
  revisionHistoryLimit: 10
  strategy:
    type: RollingUpdate

Příklad stavu CRP pro zdroje obálky:

ClusterResourcePlacement Pro ResourceEnvelope, který se propaguje, stav zahrnuje vybraný obor názvů a samotný objekt obálky, ale ne jednotlivé prostředky v rámci obálky. Stav vypadá takto:

status:
  selectedResources:
  - group: ""
    kind: Namespace
    name: app
    version: v1
  - group: placement.kubernetes-fleet.io
    kind: ResourceEnvelope
    name: example
    namespace: app
    version: v1beta1
  conditions:
  - lastTransitionTime: "2023-11-30T19:54:13Z"
    message: found all the clusters needed as specified by the scheduling policy
    observedGeneration: 2
    reason: SchedulingPolicyFulfilled
    status: "True"
    type: ClusterResourcePlacementScheduled
  - lastTransitionTime: "2023-11-30T19:54:18Z"
    message: All 1 cluster(s) are synchronized to the latest resources on the hub cluster
    observedGeneration: 2
    reason: SynchronizeSucceeded
    status: "True"
    type: ClusterResourcePlacementSynchronized
  - lastTransitionTime: "2023-11-30T19:54:18Z"
    message: Successfully applied resources to 1 member clusters
    observedGeneration: 2
    reason: ApplySucceeded
    status: "True"
    type: ClusterResourcePlacementApplied
  placementStatuses:
  - clusterName: kind-cluster-1
    conditions:
    - lastTransitionTime: "2023-11-30T19:54:13Z"
      message: 'Successfully scheduled resources for placement in kind-cluster-1:
        picked by scheduling policy'
      observedGeneration: 2
      reason: ScheduleSucceeded
      status: "True"
      type: ResourceScheduled
    - lastTransitionTime: "2023-11-30T19:54:18Z"
      message: Successfully Synchronized work(s) for placement
      observedGeneration: 2
      reason: WorkSynchronizeSucceeded
      status: "True"
      type: WorkSynchronized
    - lastTransitionTime: "2023-11-30T19:54:18Z"
      message: Successfully applied resources
      observedGeneration: 2
      reason: ApplySucceeded
      status: "True"
      type: ResourceApplied

Poznámka:

V části selectedResources konkrétně zobrazujeme propagovaný objekt obálky. Neuvádíme jednotlivě všechny zdroje obsažené v objektu obálky ve statusu.

Po kontrole selectedResources je patrné, že obor názvů app a ResourceEnvelope example byly úspěšně propagovány. Uživatelé mohou dále ověřit úspěšné šíření prostředků obsažených v objektu obálky tím, že zajistí, aby se oddíl failedPlacements v placementStatus pro cílový cluster nezobrazoval ve stavu.

Příklad stavu CRP s neúspěšným prostředkem ResourceEnvelope:

V následujícím příkladu, v části placementStatus pro kind-cluster-1, část failedPlacements poskytuje podrobnosti o prostředku, který se nepovedlo použít, spolu s informacemi o objektu obálky, který tento prostředek obsahoval.

status:
  conditions:
  - lastTransitionTime: "2023-12-06T00:09:53Z"
    message: found all the clusters needed as specified by the scheduling policy
    observedGeneration: 2
    reason: SchedulingPolicyFulfilled
    status: "True"
    type: ClusterResourcePlacementScheduled
  - lastTransitionTime: "2023-12-06T00:09:58Z"
    message: All 1 cluster(s) are synchronized to the latest resources on the hub cluster
    observedGeneration: 2
    reason: SynchronizeSucceeded
    status: "True"
    type: ClusterResourcePlacementSynchronized
  - lastTransitionTime: "2023-12-06T00:09:58Z"
    message: Failed to apply manifests to 1 clusters, please check the `failedPlacements` status
    observedGeneration: 2
    reason: ApplyFailed
    status: "False"
    type: ClusterResourcePlacementApplied
  placementStatuses:
  - clusterName: kind-cluster-1
    conditions:
    - lastTransitionTime: "2023-12-06T00:09:53Z"
      message: 'Successfully scheduled resources for placement in kind-cluster-1:
        picked by scheduling policy'
      observedGeneration: 2
      reason: ScheduleSucceeded
      status: "True"
      type: ResourceScheduled
    - lastTransitionTime: "2023-12-06T00:09:58Z"
      message: Successfully Synchronized work(s) for placement
      observedGeneration: 2
      reason: WorkSynchronizeSucceeded
      status: "True"
      type: WorkSynchronized
    - lastTransitionTime: "2023-12-06T00:09:58Z"
      message: Failed to apply manifests, please check the `failedPlacements` status
      observedGeneration: 2
      reason: ApplyFailed
      status: "False"
      type: ResourceApplied
    failedPlacements:
    - condition:
        lastTransitionTime: "2023-12-06T00:09:53Z"
        message: 'Failed to apply manifest: namespaces "app" not found'
        reason: AppliedManifestFailedReason
        status: "False"
        type: Applied
      envelope:
        name: example
        namespace: app
        type: ResourceEnvelope
      kind: Deployment
      name: ingress
      namespace: app
      version: apps/v1
  selectedResources:
  - kind: Namespace
    name: app
    version: v1
  - group: placement.kubernetes-fleet.io
    kind: ResourceEnvelope
    name: example
    namespace: app
    version: v1beta1

Stav CRP s neúspěšným zdrojem ClusterResourceEnvelope:

Podobně jako prostředky s oborem názvů můžou prostředky s oborem clusteru v rámci ClusterResourceEnvelope také selhat:

status:
  conditions:
  - lastTransitionTime: "2023-12-06T00:09:53Z"
    message: found all the clusters needed as specified by the scheduling policy
    observedGeneration: 2
    reason: SchedulingPolicyFulfilled
    status: "True"
    type: ClusterResourcePlacementScheduled
  - lastTransitionTime: "2023-12-06T00:09:58Z"
    message: Failed to apply manifests to 1 clusters, please check the `failedPlacements` status
    observedGeneration: 2
    reason: ApplyFailed
    status: "False"
    type: ClusterResourcePlacementApplied
  placementStatuses:
  - clusterName: kind-cluster-1
    conditions:
    - lastTransitionTime: "2023-12-06T00:09:58Z"
      message: Failed to apply manifests, please check the `failedPlacements` status
      observedGeneration: 2
      reason: ApplyFailed
      status: "False"
      type: ResourceApplied
    failedPlacements:
    - condition:
        lastTransitionTime: "2023-12-06T00:09:53Z"
        message: 'Failed to apply manifest: service "guard" not found in namespace "ops"'
        reason: AppliedManifestFailedReason
        status: "False"
        type: Applied
      envelope:
        name: example
        type: ClusterResourceEnvelope
      kind: ValidatingWebhookConfiguration
      name: guard
      group: admissionregistration.k8s.io
      version: v1
  selectedResources:
  - group: placement.kubernetes-fleet.io
    kind: ClusterResourceEnvelope
    name: example
    version: v1beta1