From 5c2ea441dc5a8217b740b1bd63e9a5fb42b331dd Mon Sep 17 00:00:00 2001 From: Britania Rodriguez Reyes Date: Wed, 30 Jul 2025 12:36:58 -0500 Subject: [PATCH] delete docs Signed-off-by: Britania Rodriguez Reyes --- docs/README.md | 17 - docs/api-references.md | 675 ----- .../ClusterResourcePlacement/README.md | 490 --- .../placement-concept-overview.jpg | Bin 288245 -> 0 bytes .../ClusterResourcePlacement/scheduling.jpg | Bin 24648 -> 0 bytes docs/concepts/Components/README.md | 19 - docs/concepts/Components/architecture.jpg | Bin 99710 -> 0 bytes .../EvictionAndDisruptionBudget/README.md | 71 - docs/concepts/MemberCluster/README.md | 78 - docs/concepts/Override/README.md | 328 --- .../README.md | 119 - docs/concepts/README.md | 32 - docs/concepts/SafeRollout/README.md | 231 -- docs/concepts/Scheduler/README.md | 113 - docs/concepts/Scheduling-Framework/README.md | 56 - .../scheduling-framework.jpg | Bin 71080 -> 0 bytes docs/concepts/StagedUpdateRun/README.md | 558 ---- docs/concepts/StagedUpdateRun/updaterun.jpg | Bin 206653 -> 0 bytes .../demos/ArgoCD/fleet-argocd-integration.jpg | Bin 349999 -> 0 bytes docs/demos/ArgoCD/fleet-argocd-integration.md | 669 ----- docs/demos/ArgoCD/manifests/argocd-crp.yaml | 52 - .../ArgoCD/manifests/argocd-install.yaml | 2623 ----------------- .../demos/ArgoCD/manifests/guestbook-app.yaml | 23 - .../manifests/guestbook-appproject.yaml | 13 - .../demos/ArgoCD/manifests/guestbook-crp.yaml | 22 - docs/demos/ArgoCD/manifests/guestbook-ro.yaml | 23 - .../ArgoCD/manifests/guestbook-updaterun.yaml | 8 - .../guestbook/member1/test-configmap.yaml | 7 - .../guestbook/member2/test-configmap.yaml | 7 - .../guestbook/member3/test-configmap.yaml | 7 - .../ArgoCD/manifests/teamA-strategy.yaml | 23 - docs/demos/README.md | 9 - docs/faq.md | 64 - docs/getting-started/README.md | 20 - docs/getting-started/kind.md | 250 -- docs/getting-started/on-prem.md | 235 -- docs/howtos/README.md | 65 - docs/howtos/affinities.md | 303 -- docs/howtos/cluster-resource-override.md | 374 --- docs/howtos/clusters.md | 290 -- docs/howtos/crp-status.md | 1 - docs/howtos/crp.md | 525 ---- docs/howtos/drift-detection.md | 317 -- docs/howtos/envelope-object.md | 229 -- .../eviction-placement-disruption-budget.md | 182 -- docs/howtos/property-based-scheduling.md | 267 -- docs/howtos/reportdiff.md | 178 -- docs/howtos/resource-override.md | 447 --- docs/howtos/taint-toleration.md | 324 -- docs/howtos/takeover.md | 368 --- docs/howtos/topology-spread-constraints.md | 232 -- docs/howtos/updaterun.md | 540 ---- docs/troubleshooting/README.md | 147 - .../clusterResourcePlacementApplied.md | 242 -- .../clusterResourcePlacementAvailable.md | 207 -- .../clusterResourcePlacementOverridden.md | 157 - .../clusterResourcePlacementRolloutStarted.md | 363 --- .../clusterResourcePlacementScheduled.md | 200 -- ...lusterResourcePlacementWorkSynchronized.md | 116 - docs/troubleshooting/updaterun.md | 198 -- .../Azure/JoinOnPremClustersToFleet.md | 131 - docs/tutorials/ClusterMigrationDR.md | 423 --- docs/tutorials/MigrationWithOverrideDR.md | 502 ---- docs/tutorials/README.md | 23 - .../tutorials/testfiles/crp-availability.yaml | 23 - .../tutorials/testfiles/nginx-deployment.yaml | 20 - docs/tutorials/testfiles/nginx-service.yaml | 13 - docs/tutorials/testfiles/ro-1.yaml | 23 - 68 files changed, 14272 deletions(-) delete mode 100644 docs/README.md delete mode 100644 docs/api-references.md delete mode 100644 docs/concepts/ClusterResourcePlacement/README.md delete mode 100644 docs/concepts/ClusterResourcePlacement/placement-concept-overview.jpg delete mode 100644 docs/concepts/ClusterResourcePlacement/scheduling.jpg delete mode 100644 docs/concepts/Components/README.md delete mode 100644 docs/concepts/Components/architecture.jpg delete mode 100644 docs/concepts/EvictionAndDisruptionBudget/README.md delete mode 100644 docs/concepts/MemberCluster/README.md delete mode 100644 docs/concepts/Override/README.md delete mode 100644 docs/concepts/PropertyProviderAndClusterProperties/README.md delete mode 100644 docs/concepts/README.md delete mode 100644 docs/concepts/SafeRollout/README.md delete mode 100644 docs/concepts/Scheduler/README.md delete mode 100644 docs/concepts/Scheduling-Framework/README.md delete mode 100644 docs/concepts/Scheduling-Framework/scheduling-framework.jpg delete mode 100644 docs/concepts/StagedUpdateRun/README.md delete mode 100644 docs/concepts/StagedUpdateRun/updaterun.jpg delete mode 100644 docs/demos/ArgoCD/fleet-argocd-integration.jpg delete mode 100644 docs/demos/ArgoCD/fleet-argocd-integration.md delete mode 100644 docs/demos/ArgoCD/manifests/argocd-crp.yaml delete mode 100644 docs/demos/ArgoCD/manifests/argocd-install.yaml delete mode 100644 docs/demos/ArgoCD/manifests/guestbook-app.yaml delete mode 100644 docs/demos/ArgoCD/manifests/guestbook-appproject.yaml delete mode 100644 docs/demos/ArgoCD/manifests/guestbook-crp.yaml delete mode 100644 docs/demos/ArgoCD/manifests/guestbook-ro.yaml delete mode 100644 docs/demos/ArgoCD/manifests/guestbook-updaterun.yaml delete mode 100644 docs/demos/ArgoCD/manifests/guestbook/member1/test-configmap.yaml delete mode 100644 docs/demos/ArgoCD/manifests/guestbook/member2/test-configmap.yaml delete mode 100644 docs/demos/ArgoCD/manifests/guestbook/member3/test-configmap.yaml delete mode 100644 docs/demos/ArgoCD/manifests/teamA-strategy.yaml delete mode 100644 docs/demos/README.md delete mode 100644 docs/faq.md delete mode 100644 docs/getting-started/README.md delete mode 100644 docs/getting-started/kind.md delete mode 100644 docs/getting-started/on-prem.md delete mode 100644 docs/howtos/README.md delete mode 100644 docs/howtos/affinities.md delete mode 100644 docs/howtos/cluster-resource-override.md delete mode 100644 docs/howtos/clusters.md delete mode 100644 docs/howtos/crp-status.md delete mode 100644 docs/howtos/crp.md delete mode 100644 docs/howtos/drift-detection.md delete mode 100644 docs/howtos/envelope-object.md delete mode 100644 docs/howtos/eviction-placement-disruption-budget.md delete mode 100644 docs/howtos/property-based-scheduling.md delete mode 100644 docs/howtos/reportdiff.md delete mode 100644 docs/howtos/resource-override.md delete mode 100644 docs/howtos/taint-toleration.md delete mode 100644 docs/howtos/takeover.md delete mode 100644 docs/howtos/topology-spread-constraints.md delete mode 100644 docs/howtos/updaterun.md delete mode 100644 docs/troubleshooting/README.md delete mode 100644 docs/troubleshooting/clusterResourcePlacementApplied.md delete mode 100644 docs/troubleshooting/clusterResourcePlacementAvailable.md delete mode 100644 docs/troubleshooting/clusterResourcePlacementOverridden.md delete mode 100644 docs/troubleshooting/clusterResourcePlacementRolloutStarted.md delete mode 100644 docs/troubleshooting/clusterResourcePlacementScheduled.md delete mode 100644 docs/troubleshooting/clusterResourcePlacementWorkSynchronized.md delete mode 100644 docs/troubleshooting/updaterun.md delete mode 100644 docs/tutorials/Azure/JoinOnPremClustersToFleet.md delete mode 100644 docs/tutorials/ClusterMigrationDR.md delete mode 100644 docs/tutorials/MigrationWithOverrideDR.md delete mode 100644 docs/tutorials/README.md delete mode 100644 docs/tutorials/testfiles/crp-availability.yaml delete mode 100644 docs/tutorials/testfiles/nginx-deployment.yaml delete mode 100644 docs/tutorials/testfiles/nginx-service.yaml delete mode 100644 docs/tutorials/testfiles/ro-1.yaml diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index f82250d44..000000000 --- a/docs/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Fleet Documentation - -Fleet is an open-source multi-cluster management solution developed by Microsoft Azure. -You can use Fleet to easily manage a number of different Kubernetes clusters, and orchestrate -workloads among them. - -To get started, see [Getting Started with Fleet](getting-started/README.md). - -You may also: - -* Learn more about Fleet in [Concepts](concepts/README.md). -* Perform specific tasks with the help of [How-To Guides](howtos/README.md). -* Follow the instructions to see how Fleet can integrate with your development/ops patterns in [Tutorials](tutorials/README.md). -* Discover how Fleet seamlessly integrates with widely-adopted tools like ArgoCD to enhance your multi-cluster application management capabilities in [Demos](demos/README.md). -* Read the [Fleet API Reference](api-references.md). -* Solve technical issues by following the [Troubleshooting Guides](troubleshooting/README.md) -* Find answers to some of the common questions on Fleet in [Fleet FAQ](faq.md). diff --git a/docs/api-references.md b/docs/api-references.md deleted file mode 100644 index 37373f8ba..000000000 --- a/docs/api-references.md +++ /dev/null @@ -1,675 +0,0 @@ -# API Reference - -## Packages -- [cluster.kubernetes-fleet.io/v1beta1](#clusterkubernetes-fleetiov1beta1) -- [placement.kubernetes-fleet.io/v1beta1](#placementkubernetes-fleetiov1beta1) - -## cluster.kubernetes-fleet.io/v1beta1 - -### Resource Types -- [MemberCluster](#membercluster) -- [MemberClusterList](#memberclusterlist) - -#### AgentStatus - -AgentStatus defines the observed status of the member agent of the given type. - -_Appears in:_ -- [MemberClusterStatus](#memberclusterstatus) - -| Field | Description | -| --- | --- | -| `type` _[AgentType](#agenttype)_ | Type of the member agent. | -| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#condition-v1-meta) array_ | Conditions is an array of current observed conditions for the member agent. | -| `lastReceivedHeartbeat` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#time-v1-meta)_ | Last time we received a heartbeat from the member agent. | - -#### AgentType - -_Underlying type:_ _string_ - -AgentType defines a type of agent/binary running in a member cluster. - -_Appears in:_ -- [AgentStatus](#agentstatus) - -#### MemberCluster - -MemberCluster is a resource created in the hub cluster to represent a member cluster within a fleet. - -_Appears in:_ -- [MemberClusterList](#memberclusterlist) - -| Field | Description | -| --- | --- | -| `apiVersion` _string_ | `cluster.kubernetes-fleet.io/v1beta1` -| `kind` _string_ | `MemberCluster` -| `kind` _string_ | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds | -| `apiVersion` _string_ | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | -| `spec` _[MemberClusterSpec](#memberclusterspec)_ | The desired state of MemberCluster. | -| `status` _[MemberClusterStatus](#memberclusterstatus)_ | The observed status of MemberCluster. | - -#### MemberClusterList - -MemberClusterList contains a list of MemberCluster. - -| Field | Description | -| --- | --- | -| `apiVersion` _string_ | `cluster.kubernetes-fleet.io/v1beta1` -| `kind` _string_ | `MemberClusterList` -| `kind` _string_ | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds | -| `apiVersion` _string_ | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources | -| `metadata` _[ListMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#listmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | -| `items` _[MemberCluster](#membercluster) array_ | | - -#### MemberClusterSpec - -MemberClusterSpec defines the desired state of MemberCluster. - -_Appears in:_ -- [MemberCluster](#membercluster) - -| Field | Description | -| --- | --- | -| `identity` _[Subject](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#subject-v1-rbac) | The identity used by the member cluster to access the hub cluster. The hub agents deployed on the hub cluster will automatically grant the minimal required permissions to this identity for the member agents deployed on the member cluster to access the hub cluster. | -| `heartbeatPeriodSeconds` _integer | How often (in seconds) for the member cluster to send a heartbeat to the hub cluster. Default: 60 seconds. Min: 1 second. Max: 10 minutes. | -| `taints` array [Taint](#taint) | An array of taints where each taint attached to the MemberCluster has that "effect" on any ClusterResourcePlacement that does not tolerate the taint. | - - -#### MemberClusterStatus - -MemberClusterStatus defines the observed status of MemberCluster. - -_Appears in:_ -- [MemberCluster](#membercluster) - -| Field | Description | -| --- | --- | -| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#condition-v1-meta) array_ | Conditions is an array of current observed conditions for the member cluster. | -| `resourceUsage` _[ResourceUsage](#resourceusage)_ | The current observed resource usage of the member cluster. It is copied from the corresponding InternalMemberCluster object. | -| `agentStatus` _[AgentStatus](#agentstatus) array_ | AgentStatus is an array of current observed status, each corresponding to one member agent running in the member cluster. | - -#### ResourceUsage - -ResourceUsage contains the observed resource usage of a member cluster. - -_Appears in:_ -- [MemberClusterStatus](#memberclusterstatus) - -| Field | Description | -| --- | --- | -| `capacity` _[ResourceList](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#resourcelist-v1-core)_ | Capacity represents the total resource capacity of all the nodes on a member cluster. | -| `allocatable` _[ResourceList](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#resourcelist-v1-core)_ | Allocatable represents the total resources of all the nodes on a member cluster that are available for scheduling. | -| `observationTime` _[Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#time-v1-meta)_ | When the resource usage is observed. | - -#### Taint - -A taint is a triple which when attached to the MemberCluster has that "effect" on any ClusterResourcePlacement that does not tolerate the taint. - -_Appears in:_ -- [MemberClusterSpec](#memberclusterspec) - -| Field | Description | -| --- | --- | -| `key` _string_ | The taint key to be applied to the MemberCluster. | -| `value` _string_ | The taint value to be applied to the MemberCluster. | -| `effect` _string_ | Effect is the effect of the taint on any ClusterResourcePlacement that does not tolerate the taint. | - -#### Effect - -_Underlying type:_ _string_ - -Effect is the effect of the taint on any ClusterResourcePlacement. - -_Appears in:_ -- [Taint](#taint) -- [Toleration](#toleration) - -## placement.kubernetes-fleet.io/v1beta1 - -### Resource Types -- [ClusterResourceBinding](#clusterresourcebinding) -- [ClusterResourcePlacement](#clusterresourceplacement) -- [ClusterResourceSnapshot](#clusterresourcesnapshot) -- [ClusterSchedulingPolicySnapshot](#clusterschedulingpolicysnapshot) -- [Work](#work) -- [WorkList](#worklist) - -#### Affinity - -Affinity is a group of cluster affinity scheduling rules. More to be added. - -_Appears in:_ -- [PlacementPolicy](#placementpolicy) - -| Field | Description | -| --- | --- | -| `clusterAffinity` _[ClusterAffinity](#clusteraffinity)_ | ClusterAffinity contains cluster affinity scheduling rules for the selected resources. | - -#### BindingState - -_Underlying type:_ _string_ - -BindingState is the state of the binding. - -_Appears in:_ -- [ResourceBindingSpec](#resourcebindingspec) - -#### ClusterDecision - -ClusterDecision represents a decision from a placement An empty ClusterDecision indicates it is not scheduled yet. - -_Appears in:_ -- [ResourceBindingSpec](#resourcebindingspec) -- [SchedulingPolicySnapshotStatus](#schedulingpolicysnapshotstatus) - -| Field | Description | -| --- | --- | -| `clusterName` _string_ | ClusterName is the name of the ManagedCluster. If it is not empty, its value should be unique cross all placement decisions for the Placement. | -| `selected` _boolean_ | Selected indicates if this cluster is selected by the scheduler. | -| `clusterScore` _[ClusterScore](#clusterscore)_ | ClusterScore represents the score of the cluster calculated by the scheduler. | -| `reason` _string_ | Reason represents the reason why the cluster is selected or not. | - -#### ClusterResourceBinding - -ClusterResourceBinding represents a scheduling decision that binds a group of resources to a cluster. It MUST have a label named `CRPTrackingLabel` that points to the cluster resource policy that creates it. - -_Appears in:_ -- [ClusterResourceBindingList](#clusterresourcebindinglist) - -| Field | Description | -| --- | --- | -| `apiVersion` _string_ | `placement.kubernetes-fleet.io/v1beta1` -| `kind` _string_ | `ClusterResourceBinding` -| `kind` _string_ | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds | -| `apiVersion` _string_ | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | -| `spec` _[ResourceBindingSpec](#resourcebindingspec)_ | The desired state of ClusterResourceBinding. | -| `status` _[ResourceBindingStatus](#resourcebindingstatus)_ | The observed status of ClusterResourceBinding. | - -#### ClusterResourcePlacement - -ClusterResourcePlacement is used to select cluster scoped resources, including built-in resources and custom resources, and placement them onto selected member clusters in a fleet. - If a namespace is selected, ALL the resources under the namespace are placed to the target clusters unless `allowed-propagating-apis` flag is configured on hub-agent. Note that you can't select the following resources: - reserved namespaces including: default, kube-* (reserved for Kubernetes system namespaces), fleet-* (reserved for fleet system namespaces). - reserved fleet resource types including: MemberCluster, InternalMemberCluster, ClusterResourcePlacement, ClusterSchedulingPolicySnapshot, ClusterResourceSnapshot, ClusterResourceBinding, etc. - `ClusterSchedulingPolicySnapshot` and `ClusterResourceSnapshot` objects are created when there are changes in the system to keep the history of the changes affecting a `ClusterResourcePlacement`. - -_Appears in:_ -- [ClusterResourcePlacementList](#clusterresourceplacementlist) - -| Field | Description | -| --- | --- | -| `apiVersion` _string_ | `placement.kubernetes-fleet.io/v1beta1` -| `kind` _string_ | `ClusterResourcePlacement` -| `kind` _string_ | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds | -| `apiVersion` _string_ | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | -| `spec` _[ClusterResourcePlacementSpec](#clusterresourceplacementspec)_ | The desired state of ClusterResourcePlacement. | -| `status` _[ClusterResourcePlacementStatus](#clusterresourceplacementstatus)_ | The observed status of ClusterResourcePlacement. | - -#### ClusterResourcePlacementSpec - -ClusterResourcePlacementSpec defines the desired state of ClusterResourcePlacement. - -_Appears in:_ -- [ClusterResourcePlacement](#clusterresourceplacement) - -| Field | Description | -| --- | --- | -| `resourceSelectors` _[ClusterResourceSelector](#clusterresourceselector) array_ | ResourceSelectors is an array of selectors used to select cluster scoped resources. The selectors are `ORed`. You can have 1-100 selectors. | -| `policy` _[PlacementPolicy](#placementpolicy)_ | Policy defines how to select member clusters to place the selected resources. If unspecified, all the joined member clusters are selected. | -| `strategy` _[RolloutStrategy](#rolloutstrategy)_ | The rollout strategy to use to replace existing placement with new ones. | -| `revisionHistoryLimit` _integer_ | The number of old ClusterSchedulingPolicySnapshot or ClusterResourceSnapshot resources to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10. | - -#### ClusterResourcePlacementStatus - -ClusterResourcePlacementStatus defines the observed state of the ClusterResourcePlacement object. - -_Appears in:_ -- [ClusterResourcePlacement](#clusterresourceplacement) - -| Field | Description | -| --- | --- | -| `selectedResources` _[ResourceIdentifier](#resourceidentifier) array_ | SelectedResources contains a list of resources selected by ResourceSelectors. | -| `observedResourceIndex` _string_ | Resource index logically represents the generation of the selected resources. We take a new snapshot of the selected resources whenever the selection or their content change. Each snapshot has a different resource index. One resource snapshot can contain multiple clusterResourceSnapshots CRs in order to store large amount of resources. To get clusterResourceSnapshot of a given resource index, use the following command: `kubectl get ClusterResourceSnapshot --selector=kubernetes-fleet.io/resource-index=$ObservedResourceIndex ` ObservedResourceIndex is the resource index that the conditions in the ClusterResourcePlacementStatus observe. For example, a condition of `ClusterResourcePlacementSynchronized` type is observing the synchronization status of the resource snapshot with the resource index $ObservedResourceIndex. | -| `placementStatuses` _[ResourcePlacementStatus](#resourceplacementstatus) array_ | PlacementStatuses contains a list of placement status on the clusters that are selected by PlacementPolicy. Each selected cluster according to the latest resource placement is guaranteed to have a corresponding placementStatuses. In the pickN case, there are N placement statuses where N = NumberOfClusters; Or in the pickFixed case, there are N placement statuses where N = ClusterNames. In these cases, some of them may not have assigned clusters when we cannot fill the required number of clusters. TODO, For pickAll type, considering providing unselected clusters info. | -| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#condition-v1-meta) array_ | Conditions is an array of current observed conditions for ClusterResourcePlacement. | - -#### ClusterResourceSelector - -ClusterResourceSelector is used to select cluster scoped resources as the target resources to be placed. If a namespace is selected, ALL the resources under the namespace are selected automatically. All the fields are `ANDed`. In other words, a resource must match all the fields to be selected. - -_Appears in:_ -- [ClusterResourcePlacementSpec](#clusterresourceplacementspec) - -| Field | Description | -| --- | --- | -| `group` _string_ | Group name of the cluster-scoped resource. Use an empty string to select resources under the core API group (e.g., namespaces). | -| `version` _string_ | Version of the cluster-scoped resource. | -| `kind` _string_ | Kind of the cluster-scoped resource. Note: When `Kind` is `namespace`, ALL the resources under the selected namespaces are selected. | -| `name` _string_ | Name of the cluster-scoped resource. | -| `labelSelector` _[LabelSelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#labelselector-v1-meta)_ | A label query over all the cluster-scoped resources. Resources matching the query are selected. Note that namespace-scoped resources can't be selected even if they match the query. | - -#### ClusterResourceSnapshot - -ClusterResourceSnapshot is used to store a snapshot of selected resources by a resource placement policy. Its spec is immutable. We may need to produce more than one resourceSnapshot for all the resources a ResourcePlacement selected to get around the 1MB size limit of k8s objects. We assign an ever-increasing index for each such group of resourceSnapshots. The naming convention of a clusterResourceSnapshot is {CRPName}-{resourceIndex}-{subindex} where the name of the first snapshot of a group has no subindex part so its name is {CRPName}-{resourceIndex}-snapshot. resourceIndex will begin with 0. Each snapshot MUST have the following labels: - `CRPTrackingLabel` which points to its owner CRP. - `ResourceIndexLabel` which is the index of the snapshot group. - `IsLatestSnapshotLabel` which indicates whether the snapshot is the latest one. - All the snapshots within the same index group must have the same ResourceIndexLabel. - The first snapshot of the index group MUST have the following annotations: - `NumberOfResourceSnapshotsAnnotation` to store the total number of resource snapshots in the index group. - `ResourceGroupHashAnnotation` whose value is the sha-256 hash of all the snapshots belong to the same snapshot index. - Each snapshot (excluding the first snapshot) MUST have the following annotations: - `SubindexOfResourceSnapshotAnnotation` to store the subindex of resource snapshot in the group. - -_Appears in:_ -- [ClusterResourceSnapshotList](#clusterresourcesnapshotlist) - -| Field | Description | -| --- | --- | -| `apiVersion` _string_ | `placement.kubernetes-fleet.io/v1beta1` -| `kind` _string_ | `ClusterResourceSnapshot` -| `kind` _string_ | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds | -| `apiVersion` _string_ | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | -| `spec` _[ResourceSnapshotSpec](#resourcesnapshotspec)_ | The desired state of ResourceSnapshot. | -| `status` _[ResourceSnapshotStatus](#resourcesnapshotstatus)_ | The observed status of ResourceSnapshot. | - -#### ClusterSchedulingPolicySnapshot - -ClusterSchedulingPolicySnapshot is used to store a snapshot of cluster placement policy. Its spec is immutable. The naming convention of a ClusterSchedulingPolicySnapshot is {CRPName}-{PolicySnapshotIndex}. PolicySnapshotIndex will begin with 0. Each snapshot must have the following labels: - `CRPTrackingLabel` which points to its owner CRP. - `PolicyIndexLabel` which is the index of the policy snapshot. - `IsLatestSnapshotLabel` which indicates whether the snapshot is the latest one. - -_Appears in:_ -- [ClusterSchedulingPolicySnapshotList](#clusterschedulingpolicysnapshotlist) - -| Field | Description | -| --- | --- | -| `apiVersion` _string_ | `placement.kubernetes-fleet.io/v1beta1` -| `kind` _string_ | `ClusterSchedulingPolicySnapshot` -| `kind` _string_ | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds | -| `apiVersion` _string_ | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | -| `spec` _[SchedulingPolicySnapshotSpec](#schedulingpolicysnapshotspec)_ | The desired state of SchedulingPolicySnapshot. | -| `status` _[SchedulingPolicySnapshotStatus](#schedulingpolicysnapshotstatus)_ | The observed status of SchedulingPolicySnapshot. | - -#### ClusterScore - -ClusterScore represents the score of the cluster calculated by the scheduler. - -_Appears in:_ -- [ClusterDecision](#clusterdecision) - -| Field | Description | -| --- | --- | -| `affinityScore` _integer_ | AffinityScore represents the affinity score of the cluster calculated by the last scheduling decision based on the preferred affinity selector. An affinity score may not present if the cluster does not meet the required affinity. | -| `priorityScore` _integer_ | TopologySpreadScore represents the priority score of the cluster calculated by the last scheduling decision based on the topology spread applied to the cluster. A priority score may not present if the cluster does not meet the topology spread. | - -#### ClusterSelector - -_Appears in:_ -- [ClusterAffinity](#clusteraffinity) - -| Field | Description | -| --- | --- | -| `clusterSelectorTerms` _[ClusterSelectorTerm](#clusterselectorterm) array_ | ClusterSelectorTerms is a list of cluster selector terms. The terms are `ORed`. | - -#### ClusterSelectorTerm - -ClusterSelectorTerm contains the requirements to select clusters. - -_Appears in:_ -- [ClusterSelector](#clusterselector) -- [PreferredClusterSelector](#preferredclusterselector) - -| Field | Description | -| --- | --- | -| `labelSelector` _[LabelSelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#labelselector-v1-meta)_ | LabelSelector is a label query over all the joined member clusters. Clusters matching the query are selected. | - -#### EnvelopeIdentifier - -EnvelopeIdentifier identifies the envelope object that contains the selected resource. - -_Appears in:_ -- [FailedResourcePlacement](#failedresourceplacement) -- [ResourceIdentifier](#resourceidentifier) - -| Field | Description | -| --- | --- | -| `name` _string_ | Name of the envelope object. | -| `namespace` _string_ | Namespace is the namespace of the envelope object. Empty if the envelope object is cluster scoped. | -| `type` _[EnvelopeType](#envelopetype)_ | Type of the envelope object. | - -#### EnvelopeType - -_Underlying type:_ _string_ - -EnvelopeType defines the type of the envelope object. - -_Appears in:_ -- [EnvelopeIdentifier](#envelopeidentifier) - -#### FailedResourcePlacement - -FailedResourcePlacement contains the failure details of a failed resource placement. - -_Appears in:_ -- [ResourcePlacementStatus](#resourceplacementstatus) - -| Field | Description | -| --- | --- | -| `group` _string_ | Group is the group name of the selected resource. | -| `version` _string_ | Version is the version of the selected resource. | -| `kind` _string_ | Kind represents the Kind of the selected resources. | -| `name` _string_ | Name of the target resource. | -| `namespace` _string_ | Namespace is the namespace of the resource. Empty if the resource is cluster scoped. | -| `envelope` _[EnvelopeIdentifier](#envelopeidentifier)_ | Envelope identifies the envelope object that contains this resource. | -| `condition` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#condition-v1-meta)_ | The failed condition status. | - -#### Manifest - -Manifest represents a resource to be deployed on spoke cluster. - -_Appears in:_ -- [WorkloadTemplate](#workloadtemplate) - -#### ManifestCondition - -ManifestCondition represents the conditions of the resources deployed on spoke cluster. - -_Appears in:_ -- [WorkStatus](#workstatus) - -| Field | Description | -| --- | --- | -| `identifier` _[WorkResourceIdentifier](#workresourceidentifier)_ | resourceId represents a identity of a resource linking to manifests in spec. | -| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#condition-v1-meta) array_ | Conditions represents the conditions of this resource on spoke cluster | - -#### PlacementPolicy - -PlacementPolicy contains the rules to select target member clusters to place the selected resources. Note that only clusters that are both joined and satisfying the rules will be selected. - You can only specify at most one of the two fields: ClusterNames and Affinity. If none is specified, all the joined clusters are selected. - -_Appears in:_ -- [ClusterResourcePlacementSpec](#clusterresourceplacementspec) -- [SchedulingPolicySnapshotSpec](#schedulingpolicysnapshotspec) - -| Field | Description | -| --- | --- | -| `placementType` _[PlacementType](#placementtype)_ | Type of placement. Can be "PickAll", "PickN" or "PickFixed". Default is PickAll. | -| `clusterNames` _string array_ | ClusterNames contains a list of names of MemberCluster to place the selected resources. Only valid if the placement type is "PickFixed" | -| `numberOfClusters` _integer_ | NumberOfClusters of placement. Only valid if the placement type is "PickN". | -| `affinity` _[Affinity](#affinity)_ | Affinity contains cluster affinity scheduling rules. Defines which member clusters to place the selected resources. Only valid if the placement type is "PickAll" or "PickN". | -| `topologySpreadConstraints` _[TopologySpreadConstraint](#topologyspreadconstraint) array_ | TopologySpreadConstraints describes how a group of resources ought to spread across multiple topology domains. Scheduler will schedule resources in a way which abides by the constraints. All topologySpreadConstraints are ANDed. Only valid if the placement type is "PickN". | -| `tolerations` [Toleration](#toleration) array | An array of tolerations where each toleration is used to tolerate one or more taints on the MemberCluster based on key, value, effect and operator. | - -#### PlacementType - -_Underlying type:_ _string_ - -PlacementType identifies the type of placement. - -_Appears in:_ -- [PlacementPolicy](#placementpolicy) - -#### PreferredClusterSelector - -_Appears in:_ -- [ClusterAffinity](#clusteraffinity) - -| Field | Description | -| --- | --- | -| `weight` _integer_ | Weight associated with matching the corresponding clusterSelectorTerm, in the range [-100, 100]. | -| `preference` _[ClusterSelectorTerm](#clusterselectorterm)_ | A cluster selector term, associated with the corresponding weight. | - -#### ResourceBindingSpec - -ResourceBindingSpec defines the desired state of ClusterResourceBinding. - -_Appears in:_ -- [ClusterResourceBinding](#clusterresourcebinding) - -| Field | Description | -| --- | --- | -| `state` _[BindingState](#bindingstate)_ | The desired state of the binding. Possible values: Scheduled, Bound, Unscheduled. | -| `resourceSnapshotName` _string_ | ResourceSnapshotName is the name of the resource snapshot that this resource binding points to. If the resources are divided into multiple snapshots because of the resource size limit, it points to the name of the leading snapshot of the index group. | -| `schedulingPolicySnapshotName` _string_ | SchedulingPolicySnapshotName is the name of the scheduling policy snapshot that this resource binding points to; more specifically, the scheduler creates this bindings in accordance with this scheduling policy snapshot. | -| `targetCluster` _string_ | TargetCluster is the name of the cluster that the scheduler assigns the resources to. | -| `clusterDecision` _[ClusterDecision](#clusterdecision)_ | ClusterDecision explains why the scheduler selected this cluster. | - -#### ResourceBindingStatus - -ResourceBindingStatus represents the current status of a ClusterResourceBinding. - -_Appears in:_ -- [ClusterResourceBinding](#clusterresourcebinding) - -| Field | Description | -| --- | --- | -| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#condition-v1-meta) array_ | Conditions is an array of current observed conditions for ClusterResourceBinding. | - -#### ResourceContent - -ResourceContent contains the content of a resource - -_Appears in:_ -- [ResourceSnapshotSpec](#resourcesnapshotspec) - -#### ResourceIdentifier - -ResourceIdentifier identifies one Kubernetes resource. - -_Appears in:_ -- [ClusterResourcePlacementStatus](#clusterresourceplacementstatus) -- [FailedResourcePlacement](#failedresourceplacement) - -| Field | Description | -| --- | --- | -| `group` _string_ | Group is the group name of the selected resource. | -| `version` _string_ | Version is the version of the selected resource. | -| `kind` _string_ | Kind represents the Kind of the selected resources. | -| `name` _string_ | Name of the target resource. | -| `namespace` _string_ | Namespace is the namespace of the resource. Empty if the resource is cluster scoped. | -| `envelope` _[EnvelopeIdentifier](#envelopeidentifier)_ | Envelope identifies the envelope object that contains this resource. | - -#### ResourcePlacementStatus - -ResourcePlacementStatus represents the placement status of selected resources for one target cluster. - -_Appears in:_ -- [ClusterResourcePlacementStatus](#clusterresourceplacementstatus) - -| Field | Description | -| --- | --- | -| `clusterName` _string_ | ClusterName is the name of the cluster this resource is assigned to. If it is not empty, its value should be unique cross all placement decisions for the Placement. | -| `failedPlacements` _[FailedResourcePlacement](#failedresourceplacement) array_ | FailedResourcePlacements is a list of all the resources failed to be placed to the given cluster. Note that we only include 100 failed resource placements even if there are more than 100. This field is only meaningful if the `ClusterName` is not empty. | -| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#condition-v1-meta) array_ | Conditions is an array of current observed conditions for ResourcePlacementStatus. | - -#### ResourceSnapshotSpec - -ResourceSnapshotSpec defines the desired state of ResourceSnapshot. - -_Appears in:_ -- [ClusterResourceSnapshot](#clusterresourcesnapshot) - -| Field | Description | -| --- | --- | -| `selectedResources` _[ResourceContent](#resourcecontent) array_ | SelectedResources contains a list of resources selected by ResourceSelectors. | - -#### ResourceSnapshotStatus - -_Appears in:_ -- [ClusterResourceSnapshot](#clusterresourcesnapshot) - -| Field | Description | -| --- | --- | -| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#condition-v1-meta) array_ | Conditions is an array of current observed conditions for ResourceSnapshot. | - - -#### RollingUpdateConfig - -RollingUpdateConfig contains the config to control the desired behavior of rolling update. - -_Appears in:_ -- [RolloutStrategy](#rolloutstrategy) - -| Field | Description | -| --- | --- | -| `maxUnavailable` _[IntOrString](#intorstring)_ | The maximum number of clusters that can be unavailable during the rolling update comparing to the desired number of clusters. The desired number equals to the `NumberOfClusters` field when the placement type is `PickN`. The desired number equals to the number of clusters scheduler selected when the placement type is `PickAll`. Value can be an absolute number (ex: 5) or a percentage of the desired number of clusters (ex: 10%). Absolute number is calculated from percentage by rounding up. We consider a resource unavailable when we either remove it from a cluster or in-place upgrade the resources content on the same cluster. This can not be 0 if MaxSurge is 0. Defaults to 25%. | -| `maxSurge` _[IntOrString](#intorstring)_ | The maximum number of clusters that can be scheduled above the desired number of clusters. The desired number equals to the `NumberOfClusters` field when the placement type is `PickN`. The desired number equals to the number of clusters scheduler selected when the placement type is `PickAll`. Value can be an absolute number (ex: 5) or a percentage of desire (ex: 10%). Absolute number is calculated from percentage by rounding up. This does not apply to the case that we do in-place upgrade of resources on the same cluster. This can not be 0 if MaxUnavailable is 0. Defaults to 25%. | -| `unavailablePeriodSeconds` _integer_ | UnavailablePeriodSeconds is used to config the time to wait between rolling out phases. A resource placement is considered available after `UnavailablePeriodSeconds` seconds has passed after the resources are applied to the target cluster successfully. Default is 60. | - -#### RolloutStrategy - -RolloutStrategy describes how to roll out a new change in selected resources to target clusters. - -_Appears in:_ -- [ClusterResourcePlacementSpec](#clusterresourceplacementspec) - -| Field | Description | -| --- | --- | -| `type` _[RolloutStrategyType](#rolloutstrategytype)_ | Type of rollout. The only supported type is "RollingUpdate". Default is "RollingUpdate". | -| `rollingUpdate` _[RollingUpdateConfig](#rollingupdateconfig)_ | Rolling update config params. Present only if RolloutStrategyType = RollingUpdate. | - -#### RolloutStrategyType - -_Underlying type:_ _string_ - -_Appears in:_ -- [RolloutStrategy](#rolloutstrategy) - -#### SchedulingPolicySnapshotSpec - -SchedulingPolicySnapshotSpec defines the desired state of SchedulingPolicySnapshot. - -_Appears in:_ -- [ClusterSchedulingPolicySnapshot](#clusterschedulingpolicysnapshot) - -| Field | Description | -| --- | --- | -| `policy` _[PlacementPolicy](#placementpolicy)_ | Policy defines how to select member clusters to place the selected resources. If unspecified, all the joined member clusters are selected. | -| `policyHash` _[byte](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#byte-v1-meta) array_ | PolicyHash is the sha-256 hash value of the Policy field. | - -#### SchedulingPolicySnapshotStatus - -SchedulingPolicySnapshotStatus defines the observed state of SchedulingPolicySnapshot. - -_Appears in:_ -- [ClusterSchedulingPolicySnapshot](#clusterschedulingpolicysnapshot) - -| Field | Description | -| --- | --- | -| `observedCRPGeneration` _integer_ | ObservedCRPGeneration is the generation of the CRP which the scheduler uses to perform the scheduling cycle and prepare the scheduling status. | -| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#condition-v1-meta) array_ | Conditions is an array of current observed conditions for SchedulingPolicySnapshot. | -| `targetClusters` _[ClusterDecision](#clusterdecision) array_ | ClusterDecisions contains a list of names of member clusters considered by the scheduler. Note that all the selected clusters must present in the list while not all the member clusters are guaranteed to be listed due to the size limit. We will try to add the clusters that can provide the most insight to the list first. | - -#### TopologySpreadConstraint - -TopologySpreadConstraint specifies how to spread resources among the given cluster topology. - -_Appears in:_ -- [PlacementPolicy](#placementpolicy) - -| Field | Description | -| --- | --- | -| `maxSkew` _integer_ | MaxSkew describes the degree to which resources may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of resource copies in the target topology and the global minimum. The global minimum is the minimum number of resource copies in a domain. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It's an optional field. Default value is 1 and 0 is not allowed. | -| `topologyKey` _string_ | TopologyKey is the key of cluster labels. Clusters that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of replicas of the resource into each bucket honor the `MaxSkew` value. It's a required field. | -| `whenUnsatisfiable` _[UnsatisfiableConstraintAction](#unsatisfiableconstraintaction)_ | WhenUnsatisfiable indicates how to deal with the resource if it doesn't satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the resource in any cluster, but giving higher precedence to topologies that would help reduce the skew. It's an optional field. | - -#### UnsatisfiableConstraintAction - -_Underlying type:_ _string_ - -UnsatisfiableConstraintAction defines the type of actions that can be taken if a constraint is not satisfied. - -_Appears in:_ -- [TopologySpreadConstraint](#topologyspreadconstraint) - -#### Toleration - -Toleration is used by ClusterResourcePlacement to tolerate any taint that matches the triple using the matching operator . - -_Appears in:_ -- [PlacementPolicy](#placementpolicy) - -| Field | Description | -| --- | --- | -| `key` _string_ | The key refers to the taint key that the toleration applies to. | -| `operator` _string_ | Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. | -| `value` _string_ | The value refers to the taint value that the toleration applies to. If the operator is Exists, the value should be empty. | -| `effect` _string_ | Effect is the effect of the taint on any ClusterResourcePlacement that does not tolerate the taint. | - -#### Work - -Work is the Schema for the works API. - -_Appears in:_ -- [WorkList](#worklist) - -| Field | Description | -| --- | --- | -| `apiVersion` _string_ | `placement.kubernetes-fleet.io/v1beta1` -| `kind` _string_ | `Work` -| `kind` _string_ | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds | -| `apiVersion` _string_ | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | -| `spec` _[WorkSpec](#workspec)_ | spec defines the workload of a work. | -| `status` _[WorkStatus](#workstatus)_ | status defines the status of each applied manifest on the spoke cluster. | - -#### WorkList - -WorkList contains a list of Work. - -| Field | Description | -| --- | --- | -| `apiVersion` _string_ | `placement.kubernetes-fleet.io/v1beta1` -| `kind` _string_ | `WorkList` -| `kind` _string_ | Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds | -| `apiVersion` _string_ | APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources | -| `metadata` _[ListMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#listmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | -| `items` _[Work](#work) array_ | List of works. | - -#### WorkResourceIdentifier - -WorkResourceIdentifier provides the identifiers needed to interact with any arbitrary object. Renamed original "ResourceIdentifier" so that it won't conflict with ResourceIdentifier defined in the clusterresourceplacement_types.go. - -_Appears in:_ -- [AppliedResourceMeta](#appliedresourcemeta) -- [ManifestCondition](#manifestcondition) - -| Field | Description | -| --- | --- | -| `ordinal` _integer_ | Ordinal represents an index in manifests list, so the condition can still be linked to a manifest even though manifest cannot be parsed successfully. | -| `group` _string_ | Group is the group of the resource. | -| `version` _string_ | Version is the version of the resource. | -| `kind` _string_ | Kind is the kind of the resource. | -| `resource` _string_ | Resource is the resource type of the resource | -| `namespace` _string_ | Namespace is the namespace of the resource, the resource is cluster scoped if the value is empty | -| `name` _string_ | Name is the name of the resource | - -#### WorkSpec - -WorkSpec defines the desired state of Work. - -_Appears in:_ -- [Work](#work) - -| Field | Description | -| --- | --- | -| `workload` _[WorkloadTemplate](#workloadtemplate)_ | Workload represents the manifest workload to be deployed on spoke cluster | - -#### WorkStatus - -WorkStatus defines the observed state of Work. - -_Appears in:_ -- [Work](#work) - -| Field | Description | -| --- | --- | -| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#condition-v1-meta) array_ | Conditions contains the different condition statuses for this work. Valid condition types are: 1. Applied represents workload in Work is applied successfully on the spoke cluster. 2. Progressing represents workload in Work in the transitioning from one state to another the on the spoke cluster. 3. Available represents workload in Work exists on the spoke cluster. 4. Degraded represents the current state of workload does not match the desired state for a certain period. | -| `manifestConditions` _[ManifestCondition](#manifestcondition) array_ | ManifestConditions represents the conditions of each resource in work deployed on spoke cluster. | - -#### WorkloadTemplate - -WorkloadTemplate represents the manifest workload to be deployed on spoke cluster - -_Appears in:_ -- [WorkSpec](#workspec) - -| Field | Description | -| --- | --- | -| `manifests` _[Manifest](#manifest) array_ | Manifests represents a list of kubernetes resources to be deployed on the spoke cluster. | diff --git a/docs/concepts/ClusterResourcePlacement/README.md b/docs/concepts/ClusterResourcePlacement/README.md deleted file mode 100644 index deeb25970..000000000 --- a/docs/concepts/ClusterResourcePlacement/README.md +++ /dev/null @@ -1,490 +0,0 @@ -# ClusterResourcePlacement - -## Overview - -`ClusterResourcePlacement` concept is used to dynamically select cluster scoped resources (especially namespaces and all -objects within it) and control how they are propagated to all or a subset of the member clusters. -A `ClusterResourcePlacement` mainly consists of three parts: -- **Resource selection**: select which cluster-scoped Kubernetes -resource objects need to be propagated from the hub cluster to selected member clusters. - - It supports the following forms of resource selection: - - Select resources by specifying just the . This selection propagates all resources with matching . - - Select resources by specifying the and name. This selection propagates only one resource that matches the and name. - - Select resources by specifying the and a set of labels using ClusterResourcePlacement -> LabelSelector. -This selection propagates all resources that match the and label specified. - - **Note:** When a namespace is selected, all the namespace-scoped objects under this namespace are propagated to the -selected member clusters along with this namespace. - -- **Placement policy**: limit propagation of selected resources to a specific subset of member clusters. - The following types of target cluster selection are supported: - - **PickAll (Default)**: select any member clusters with matching cluster `Affinity` scheduling rules. If the `Affinity` -is not specified, it will select all joined and healthy member clusters. - - **PickFixed**: select a fixed list of member clusters defined in the `ClusterNames`. - - **PickN**: select a `NumberOfClusters` of member clusters with optional matching cluster `Affinity` scheduling rules or topology spread constraints `TopologySpreadConstraints`. - -- **Rollout strategy**: how to propagate new changes to the selected member clusters. - -A simple `ClusterResourcePlacement` looks like this: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterResourcePlacement -metadata: - name: crp-1 -spec: - policy: - placementType: PickN - numberOfClusters: 2 - topologySpreadConstraints: - - maxSkew: 1 - topologyKey: "env" - whenUnsatisfiable: DoNotSchedule - resourceSelectors: - - group: "" - kind: Namespace - name: test-deployment - version: v1 - revisionHistoryLimit: 100 - strategy: - rollingUpdate: - maxSurge: 25% - maxUnavailable: 25% - unavailablePeriodSeconds: 5 - type: RollingUpdate -``` - -## When To Use `ClusterResourcePlacement` - -`ClusterResourcePlacement` is useful when you want for a general way of managing and running workloads across multiple clusters. -Some example scenarios include the following: -- As a platform operator, I want to place my cluster-scoped resources (especially namespaces and all objects within it) -to a cluster that resides in the us-east-1. -- As a platform operator, I want to spread my cluster-scoped resources (especially namespaces and all objects within it) -evenly across the different regions/zones. -- As a platform operator, I prefer to place my test resources into the staging AKS cluster. -- As a platform operator, I would like to separate the workloads for compliance or policy reasons. -- As a developer, I want to run my cluster-scoped resources (especially namespaces and all objects within it) on 3 clusters. -In addition, each time I update my workloads, the updates take place with zero downtime by rolling out to these three clusters incrementally. - -## Placement Workflow - -![](placement-concept-overview.jpg) - -The placement controller will create `ClusterSchedulingPolicySnapshot` and `ClusterResourceSnapshot` snapshots by watching -the `ClusterResourcePlacement` object. So that it can trigger the scheduling and resource rollout process whenever needed. - -The override controller will create the corresponding snapshots by watching the `ClusterResourceOverride` and `ResourceOverride` -which captures the snapshot of the overrides. - -The placement workflow will be divided into several stages: -1. Scheduling: multi-cluster scheduler makes the schedule decision by creating the `clusterResourceBinding` for a bundle -of resources based on the latest `ClusterSchedulingPolicySnapshot`generated by the `ClusterResourcePlacement`. -2. Rolling out resources: rollout controller applies the resources to the selected member clusters based on the rollout strategy. -3. Overriding: work generator applies the override rules defined by `ClusterResourceOverride` and `ResourceOverride` to -the selected resources on the target clusters. -4. Creating or updating works: work generator creates the work on the corresponding member cluster namespace. Each work -contains the (overridden) manifest workload to be deployed on the member clusters. -5. Applying resources on target clusters: apply work controller applies the manifest workload on the member clusters. -6. Checking resource availability: apply work controller checks the resource availability on the target clusters. - -## Resource Selection - -Resource selectors identify cluster-scoped objects to include based on standard Kubernetes identifiers - namely, the `group`, -`kind`, `version`, and `name` of the object. Namespace-scoped objects are included automatically when the namespace they -are part of is selected. The example `ClusterResourcePlacement` above would include the `test-deployment` namespace and -any objects that were created in that namespace. - -The clusterResourcePlacement controller creates the `ClusterResourceSnapshot` to store a snapshot of selected resources -selected by the placement. The `ClusterResourceSnapshot` spec is immutable. Each time when the selected resources are updated, -the clusterResourcePlacement controller will detect the resource changes and create a new `ClusterResourceSnapshot`. It implies -that resources can change independently of any modifications to the `ClusterResourceSnapshot`. In other words, resource -changes can occur without directly affecting the `ClusterResourceSnapshot` itself. - -The total amount of selected resources may exceed the 1MB limit for a single Kubernetes object. As a result, the controller -may produce more than one `ClusterResourceSnapshot`s for all the selected resources. - -`ClusterResourceSnapshot` sample: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterResourceSnapshot -metadata: - annotations: - kubernetes-fleet.io/number-of-enveloped-object: "0" - kubernetes-fleet.io/number-of-resource-snapshots: "1" - kubernetes-fleet.io/resource-hash: e0927e7d75c7f52542a6d4299855995018f4a6de46edf0f814cfaa6e806543f3 - creationTimestamp: "2023-11-10T08:23:38Z" - generation: 1 - labels: - kubernetes-fleet.io/is-latest-snapshot: "true" - kubernetes-fleet.io/parent-CRP: crp-1 - kubernetes-fleet.io/resource-index: "4" - name: crp-1-4-snapshot - ownerReferences: - - apiVersion: placement.kubernetes-fleet.io/v1 - blockOwnerDeletion: true - controller: true - kind: ClusterResourcePlacement - name: crp-1 - uid: 757f2d2c-682f-433f-b85c-265b74c3090b - resourceVersion: "1641940" - uid: d6e2108b-882b-4f6c-bb5e-c5ec5491dd20 -spec: - selectedResources: - - apiVersion: v1 - kind: Namespace - metadata: - labels: - kubernetes.io/metadata.name: test - name: test - spec: - finalizers: - - kubernetes - - apiVersion: v1 - data: - key1: value1 - key2: value2 - key3: value3 - kind: ConfigMap - metadata: - name: test-1 - namespace: test -``` - -## Placement Policy - -`ClusterResourcePlacement` supports three types of policy as mentioned above. `ClusterSchedulingPolicySnapshot` will be -generated whenever policy changes are made to the `ClusterResourcePlacement` that require a new scheduling. Similar to -`ClusterResourceSnapshot`, its spec is immutable. - -`ClusterSchedulingPolicySnapshot` sample: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterSchedulingPolicySnapshot -metadata: - annotations: - kubernetes-fleet.io/CRP-generation: "5" - kubernetes-fleet.io/number-of-clusters: "2" - creationTimestamp: "2023-11-06T10:22:56Z" - generation: 1 - labels: - kubernetes-fleet.io/is-latest-snapshot: "true" - kubernetes-fleet.io/parent-CRP: crp-1 - kubernetes-fleet.io/policy-index: "1" - name: crp-1-1 - ownerReferences: - - apiVersion: placement.kubernetes-fleet.io/v1 - blockOwnerDeletion: true - controller: true - kind: ClusterResourcePlacement - name: crp-1 - uid: 757f2d2c-682f-433f-b85c-265b74c3090b - resourceVersion: "1639412" - uid: 768606f2-aa5a-481a-aa12-6e01e6adbea2 -spec: - policy: - placementType: PickN - policyHash: NDc5ZjQwNWViNzgwOGNmYzU4MzY2YjI2NDg2ODBhM2E4MTVlZjkxNGZlNjc1NmFlOGRmMGQ2Zjc0ODg1NDE2YQ== -status: - conditions: - - lastTransitionTime: "2023-11-06T10:22:56Z" - message: found all the clusters needed as specified by the scheduling policy - observedGeneration: 1 - reason: SchedulingPolicyFulfilled - status: "True" - type: Scheduled - observedCRPGeneration: 5 - targetClusters: - - clusterName: aks-member-1 - clusterScore: - affinityScore: 0 - priorityScore: 0 - reason: picked by scheduling policy - selected: true - - clusterName: aks-member-2 - clusterScore: - affinityScore: 0 - priorityScore: 0 - reason: picked by scheduling policy - selected: true -``` - - -![](scheduling.jpg) - -In contrast to the original scheduler framework in Kubernetes, the multi-cluster scheduling process involves selecting a cluster for placement through a structured 5-step operation: -1. Batch & PostBatch -2. Filter -3. Score -4. Sort -5. Bind - -The _batch & postBatch_ step is to define the batch size according to the desired and current `ClusterResourceBinding`. -The postBatch is to adjust the batch size if needed. - -The _filter_ step finds the set of clusters where it's feasible to schedule the placement, for example, whether the cluster -is matching required `Affinity` scheduling rules specified in the `Policy`. It also filters out any clusters which are -leaving the fleet or no longer connected to the fleet, for example, its heartbeat has been stopped for a prolonged period of time. - -In the _score_ step (only applied to the pickN type), the scheduler assigns a score to each cluster that survived filtering. -Each cluster is given a topology spread score (how much a cluster would satisfy the topology spread -constraints specified by the user), and an affinity score (how much a cluster would satisfy the preferred affinity terms -specified by the user). - -In the _sort_ step (only applied to the pickN type), it sorts all eligible clusters by their scores, sorting first by topology -spread score and breaking ties based on the affinity score. - -The _bind_ step is to create/update/delete the `ClusterResourceBinding` based on the desired and current member cluster list. - -## Rollout Strategy -Update strategy determines how changes to the `ClusterWorkloadPlacement` will be rolled out across member clusters. -The only supported update strategy is `RollingUpdate` and it replaces the old placed resource using rolling update, i.e. -gradually create the new one while replace the old ones. - -## Placement status - -After a `ClusterResourcePlacement` is created, details on current status can be seen by performing a `kubectl describe crp `. -The status output will indicate both placement conditions and individual placement statuses on each member cluster that was selected. -The list of resources that are selected for placement will also be included in the describe output. - -Sample output: - -```yaml -Name: crp-1 -Namespace: -Labels: -Annotations: -API Version: placement.kubernetes-fleet.io/v1 -Kind: ClusterResourcePlacement -Metadata: - ... -Spec: - Policy: - Placement Type: PickAll - Resource Selectors: - Group: - Kind: Namespace - Name: application-1 - Version: v1 - Revision History Limit: 10 - Strategy: - Rolling Update: - Max Surge: 25% - Max Unavailable: 25% - Unavailable Period Seconds: 2 - Type: RollingUpdate -Status: - Conditions: - Last Transition Time: 2024-04-29T09:58:20Z - Message: found all the clusters needed as specified by the scheduling policy - Observed Generation: 1 - Reason: SchedulingPolicyFulfilled - Status: True - Type: ClusterResourcePlacementScheduled - Last Transition Time: 2024-04-29T09:58:20Z - Message: All 3 cluster(s) start rolling out the latest resource - Observed Generation: 1 - Reason: RolloutStarted - Status: True - Type: ClusterResourcePlacementRolloutStarted - Last Transition Time: 2024-04-29T09:58:20Z - Message: No override rules are configured for the selected resources - Observed Generation: 1 - Reason: NoOverrideSpecified - Status: True - Type: ClusterResourcePlacementOverridden - Last Transition Time: 2024-04-29T09:58:20Z - Message: Works(s) are succcesfully created or updated in the 3 target clusters' namespaces - Observed Generation: 1 - Reason: WorkSynchronized - Status: True - Type: ClusterResourcePlacementWorkSynchronized - Last Transition Time: 2024-04-29T09:58:20Z - Message: The selected resources are successfully applied to 3 clusters - Observed Generation: 1 - Reason: ApplySucceeded - Status: True - Type: ClusterResourcePlacementApplied - Last Transition Time: 2024-04-29T09:58:20Z - Message: The selected resources in 3 cluster are available now - Observed Generation: 1 - Reason: ResourceAvailable - Status: True - Type: ClusterResourcePlacementAvailable - Observed Resource Index: 0 - Placement Statuses: - Cluster Name: kind-cluster-1 - Conditions: - Last Transition Time: 2024-04-29T09:58:20Z - Message: Successfully scheduled resources for placement in kind-cluster-1 (affinity score: 0, topology spread score: 0): picked by scheduling policy - Observed Generation: 1 - Reason: Scheduled - Status: True - Type: Scheduled - Last Transition Time: 2024-04-29T09:58:20Z - Message: Detected the new changes on the resources and started the rollout process - Observed Generation: 1 - Reason: RolloutStarted - Status: True - Type: RolloutStarted - Last Transition Time: 2024-04-29T09:58:20Z - Message: No override rules are configured for the selected resources - Observed Generation: 1 - Reason: NoOverrideSpecified - Status: True - Type: Overridden - Last Transition Time: 2024-04-29T09:58:20Z - Message: All of the works are synchronized to the latest - Observed Generation: 1 - Reason: AllWorkSynced - Status: True - Type: WorkSynchronized - Last Transition Time: 2024-04-29T09:58:20Z - Message: All corresponding work objects are applied - Observed Generation: 1 - Reason: AllWorkHaveBeenApplied - Status: True - Type: Applied - Last Transition Time: 2024-04-29T09:58:20Z - Message: The availability of work object crp-1-work is not trackable - Observed Generation: 1 - Reason: WorkNotTrackable - Status: True - Type: Available - Cluster Name: kind-cluster-2 - Conditions: - Last Transition Time: 2024-04-29T09:58:20Z - Message: Successfully scheduled resources for placement in kind-cluster-2 (affinity score: 0, topology spread score: 0): picked by scheduling policy - Observed Generation: 1 - Reason: Scheduled - Status: True - Type: Scheduled - Last Transition Time: 2024-04-29T09:58:20Z - Message: Detected the new changes on the resources and started the rollout process - Observed Generation: 1 - Reason: RolloutStarted - Status: True - Type: RolloutStarted - Last Transition Time: 2024-04-29T09:58:20Z - Message: No override rules are configured for the selected resources - Observed Generation: 1 - Reason: NoOverrideSpecified - Status: True - Type: Overridden - Last Transition Time: 2024-04-29T09:58:20Z - Message: All of the works are synchronized to the latest - Observed Generation: 1 - Reason: AllWorkSynced - Status: True - Type: WorkSynchronized - Last Transition Time: 2024-04-29T09:58:20Z - Message: All corresponding work objects are applied - Observed Generation: 1 - Reason: AllWorkHaveBeenApplied - Status: True - Type: Applied - Last Transition Time: 2024-04-29T09:58:20Z - Message: The availability of work object crp-1-work is not trackable - Observed Generation: 1 - Reason: WorkNotTrackable - Status: True - Type: Available - Cluster Name: kind-cluster-3 - Conditions: - Last Transition Time: 2024-04-29T09:58:20Z - Message: Successfully scheduled resources for placement in kind-cluster-3 (affinity score: 0, topology spread score: 0): picked by scheduling policy - Observed Generation: 1 - Reason: Scheduled - Status: True - Type: Scheduled - Last Transition Time: 2024-04-29T09:58:20Z - Message: Detected the new changes on the resources and started the rollout process - Observed Generation: 1 - Reason: RolloutStarted - Status: True - Type: RolloutStarted - Last Transition Time: 2024-04-29T09:58:20Z - Message: No override rules are configured for the selected resources - Observed Generation: 1 - Reason: NoOverrideSpecified - Status: True - Type: Overridden - Last Transition Time: 2024-04-29T09:58:20Z - Message: All of the works are synchronized to the latest - Observed Generation: 1 - Reason: AllWorkSynced - Status: True - Type: WorkSynchronized - Last Transition Time: 2024-04-29T09:58:20Z - Message: All corresponding work objects are applied - Observed Generation: 1 - Reason: AllWorkHaveBeenApplied - Status: True - Type: Applied - Last Transition Time: 2024-04-29T09:58:20Z - Message: The availability of work object crp-1-work is not trackable - Observed Generation: 1 - Reason: WorkNotTrackable - Status: True - Type: Available - Selected Resources: - Kind: Namespace - Name: application-1 - Version: v1 - Kind: ConfigMap - Name: app-config-1 - Namespace: application-1 - Version: v1 -Events: - Type Reason Age From Message - ---- ------ ---- ---- ------- - Normal PlacementRolloutStarted 3m46s cluster-resource-placement-controller Started rolling out the latest resources - Normal PlacementOverriddenSucceeded 3m46s cluster-resource-placement-controller Placement has been successfully overridden - Normal PlacementWorkSynchronized 3m46s cluster-resource-placement-controller Work(s) have been created or updated successfully for the selected cluster(s) - Normal PlacementApplied 3m46s cluster-resource-placement-controller Resources have been applied to the selected cluster(s) - Normal PlacementRolloutCompleted 3m46s cluster-resource-placement-controller Resources are available in the selected clusters -``` - -## Tolerations - -Tolerations are a mechanism to allow the Fleet Scheduler to schedule resources to a `MemberCluster` that has taints specified on it. -We adopt the concept of [taints & tolerations](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) -introduced in Kubernetes to the multi-cluster use case. - -The `ClusterResourcePlacement` CR supports the specification of list of tolerations, which are applied to the `ClusterResourcePlacement` -object. Each Toleration object comprises the following fields: -- `key`: The key of the toleration. -- `value`: The value of the toleration. -- `effect`: The effect of the toleration, which can be `NoSchedule` for now. -- `operator`: The operator of the toleration, which can be `Exists` or `Equal`. - -Each toleration is used to tolerate one or more specific taints applied on the `MemberCluster`. Once all taints on a `MemberCluster` -are tolerated by tolerations on a `ClusterResourcePlacement`, resources can be propagated to the `MemberCluster` by the scheduler for that -`ClusterResourcePlacement` resource. - -Tolerations cannot be updated or removed from a `ClusterResourcePlacement`. If there is a need to update toleration a better approach is to -add another toleration. If we absolutely need to update or remove existing tolerations, the only option is to delete the existing `ClusterResourcePlacement` -and create a new object with the updated tolerations. - -For detailed instructions, please refer to this [document](../../howtos/taint-toleration.md). - -## Envelope Object - -The `ClusterResourcePlacement` leverages the fleet hub cluster as a staging environment for customer resources. These resources are then propagated to member clusters that are part of the fleet, based on the `ClusterResourcePlacement` spec. - -In essence, the objective is not to apply or create resources on the hub cluster for local use but to propagate these resources to other member clusters within the fleet. - -Certain resources, when created or applied on the hub cluster, may lead to unintended side effects. These include: - -- Validating/Mutating Webhook Configurations -- Cluster Role Bindings -- Resource Quotas -- Storage Classes -- Flow Schemas -- Priority Classes -- Ingress Classes -- Ingresses -- Network Policies - -To address this, we support the use of `ConfigMap` with a fleet-reserved annotation. This allows users to encapsulate resources that might have side effects on the hub cluster within the `ConfigMap`. For detailed instructions, please refer to this [document](../../howtos/envelope-object.md). \ No newline at end of file diff --git a/docs/concepts/ClusterResourcePlacement/placement-concept-overview.jpg b/docs/concepts/ClusterResourcePlacement/placement-concept-overview.jpg deleted file mode 100644 index 22afc90b646cc4094185546539182366e59f2e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288245 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 diff --git a/docs/concepts/ClusterResourcePlacement/scheduling.jpg b/docs/concepts/ClusterResourcePlacement/scheduling.jpg deleted file mode 100644 index ff4591a726c872411952d24c61a85c819cd161c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24648 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 diff --git a/docs/concepts/Components/README.md b/docs/concepts/Components/README.md deleted file mode 100644 index 4bf708de4..000000000 --- a/docs/concepts/Components/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Components - -This document provides an overview of the components required for a fully functional and operational Fleet setup. - -![](architecture.jpg) - -The fleet consists of the following components: -- fleet-hub-agent is a Kubernetes controller that creates and reconciles all the fleet related CRs in the hub cluster. -- fleet-member-agent is a Kubernetes controller that creates and reconciles all the fleet related CRs in the member cluster. -The fleet-member-agent is pulling the latest CRs from the hub cluster and consistently reconciles the member clusters to -the desired state. - -The fleet implements agent-based pull mode. So that the working pressure can be distributed to the member clusters, and it -helps to breach the bottleneck of scalability, by dividing the load into each member cluster. On the other hand, hub -cluster does not need to directly access to the member clusters. Fleet can support the member clusters which only have -the outbound network and no inbound network access. - -To allow multiple clusters to run securely, fleet will create a reserved namespace on the hub cluster to isolate the access permissions and -resources across multiple clusters. \ No newline at end of file diff --git a/docs/concepts/Components/architecture.jpg b/docs/concepts/Components/architecture.jpg deleted file mode 100644 index b20d89113288a09f8f34882f642da2263a316bf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99710 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

&N5w3T@O-}uH8wf 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

~YmddkIf&_HPxbiN2% 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 UNN4=KRzI)R|D}C^?(@h01^dL3Y5)KL diff --git a/docs/concepts/StagedUpdateRun/README.md b/docs/concepts/StagedUpdateRun/README.md deleted file mode 100644 index bebe17353..000000000 --- a/docs/concepts/StagedUpdateRun/README.md +++ /dev/null @@ -1,558 +0,0 @@ -# Staged Update Run Rollout - -While users rely on the `RollingUpdate` rollout strategy to safely roll out their workloads, -there is also a requirement for a staged rollout mechanism at the cluster level to enable more controlled and systematic continuous delivery (CD) across the fleet. -Introducing a staged update run feature would address this need by enabling gradual deployments, reducing risk, and ensuring greater reliability and consistency in workload updates across clusters. - -![](updaterun.jpg) - -## Overview - -We introduce two new Custom Resources, `ClusterStagedUpdateStrategy` and `ClusterStagedUpdateRun`. - -`ClusterStagedUpdateStrategy` defines a reusable orchestration pattern that organizes member clusters into distinct stages, controlling both the rollout sequence within each stage and incorporating post-stage validation tasks that must succeed before proceeding to subsequent stages. For brevity, we'll refer to `ClusterStagedUpdateStrategy` as _updateRun strategy_ throughout this document. - -`ClusterStagedUpdateRun` orchestrates resource deployment across clusters by executing a `ClusterStagedUpdateStrategy`. It requires three key inputs: the target `ClusterResourcePlacement` name, a resource snapshot index specifying the version to deploy, and the strategy name that defines the rollout rules. The term _updateRun_ will be used to represent `ClusterStagedUpdateRun` in this document. - -## Specify Rollout Strategy for ClusterResourcePlacement - -While `ClusterResourcePlacement` uses `RollingUpdate` as its default strategy, switching to staged updates requires setting the rollout strategy to `External`: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: example-placement -spec: - resourceSelectors: - - group: "" - kind: Namespace - name: test-namespace - version: v1 - policy: - placementType: PickAll - tolerations: - - key: gpu-workload - operator: Exists - strategy: - type: External # specify External here to use the stagedUpdateRun strategy. -``` - -## Deploy a ClusterStagedUpdateStrategy - -The `ClusterStagedUpdateStrategy` custom resource enables users to organize member clusters into stages and define their rollout sequence. This strategy is reusable across multiple updateRuns, with each updateRun creating an immutable snapshot of the strategy at startup. This ensures that modifications to the strategy do not impact any in-progress updateRun executions. - -An example `ClusterStagedUpdateStrategy` looks like below: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateStrategy -metadata: - name: example-strategy -spec: - stages: - - name: staging - labelSelector: - matchLabels: - environment: staging - afterStageTasks: - - type: TimedWait - waitTime: 1h - - name: canary - labelSelector: - matchLabels: - environment: canary - afterStageTasks: - - type: Approval - - name: production - labelSelector: - matchLabels: - environment: production - sortingLabelKey: order - afterStageTasks: - - type: Approval - - type: TimedWait - waitTime: 1h -``` - -`ClusterStagedUpdateStrategy` is cluster-scoped resource. Its spec contains a list of `stageConfig` entries defining the configuration for each stage. -Stages execute sequentially in the order specified. Each stage must have a unique name and uses a labelSelector to identify member clusters for update. In above example, we define 3 stages: `staging` selecting member clusters labeled with `environment: staging`, `canary` selecting member clusters labeled with `environment: canary` and `production` selecting member clusters labeled with `environment: production`. - -Each stage can optionally specify `sortingLabelKey` and `afterStageTasks`. `sortingLabelKey` is used to define a label whose integer value determines update sequence within a stage. With above example, assuming there are 3 clusters selected in the `production` (all 3 clusters have `environment: production` label), then the fleet admin can label them with `order: 1`, `order: 2`, and `order: 3` respectively to control the rollout sequence. Without `sortingLabelKey`, clusters are updated in alphabetical order by name. - -By default, the next stage begins immediately after the current stage completes. A user can control this cross-stage behavior by specifying the `afterStageTasks` in each stage. These tasks execute after all clusters in a stage update successfully. We currently support two types of tasks: `Approval` and `Timedwait`. Each stage can include one task of each type (maximum of two tasks). Both tasks must be satisfied before advancing to the next stage. - -`Timedwait` task requires a specified waitTime duration. The updateRun waits for the duration to pass before executing the next stage. For `Approval` task, the controller generates a `ClusterApprovalRequest` object automatically named as `-`. The name is also shown in the updateRun status. The `ClusterApprovalRequest` object is pretty simple: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterApprovalRequest -metadata: - name: example-run-canary - labels: - kubernetes-fleet.io/targetupdaterun: example-run - kubernetes-fleet.io/targetUpdatingStage: canary - kubernetes-fleet.io/isLatestUpdateRunApproval: "true" -spec: - parentStageRollout: example-run - targetStage: canary -``` - -The user then need to manually approve the task by patching its status: -```bash -kubectl patch clusterapprovalrequests example-run-canary --type='merge' -p '{"status":{"conditions":[{"type":"Approved","status":"True","reason":"lgtm","message":"lgtm","lastTransitionTime":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","observedGeneration":1}]}}' --subresource=status -``` -The updateRun will only continue to next stage after the `ClusterApprovalRequest` is approved. - -## Trigger rollout with ClusterStagedUpdateRun - -When using `External` rollout strategy, a `ClusterResourcePlacement` begins deployment only when triggered by a `ClusterStagedUpdateRun`. An example `ClusterStagedUpdateRun` is shown below: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateRun -metadata: - name: example-run -spec: - placementName: example-placement - resourceSnapshotIndex: "0" - stagedRolloutStrategyName: example-strategy -``` -This cluster-scoped resource requires three key parameters: the `placementName` specifying the target `ClusterResourcePlacement`, the `resourceSnapshotIndex` identifying which version of resources to deploy (learn how to find resourceSnapshotIndex [here](../../howtos/updaterun.md)), and the `stagedRolloutStrategyName` indicating the `ClusterStagedUpdateStrategy` to follow. - -An updateRun executes in two phases. During the initialization phase, the controller performs a one-time setup where it captures a snapshot of the updateRun strategy, collects scheduled and to-be-deleted `ClusterResourceBindings`, generates the cluster update sequence, and records all this information in the updateRun status. - -In the execution phase, the controller processes each stage sequentially, updates clusters within each stage one at a time, and enforces completion of after-stage tasks. It then executes a final delete stage to clean up resources from unscheduled clusters. The updateRun succeeds when all stages complete successfully. However, it will fail if any execution-affecting events occur, for example, the target ClusterResourcePlacement being deleted, and member cluster changes triggering new scheduling. In such cases, error details are recorded in the updateRun status. Remember that once initialized, an updateRun operates on its strategy snapshot, making it immune to subsequent strategy modifications. - -## Understand ClusterStagedUpdateRun status - -Let's take a deep look into the status of a completed `ClusterStagedUpdateRun`. It displays details about the rollout status for every clusters and stages. - -```bash -$ kubectl describe crsur run example-run -... -Status: - Conditions: - Last Transition Time: 2025-03-12T23:21:39Z - Message: ClusterStagedUpdateRun initialized successfully - Observed Generation: 1 - Reason: UpdateRunInitializedSuccessfully - Status: True - Type: Initialized - Last Transition Time: 2025-03-12T23:21:39Z - Message: - Observed Generation: 1 - Reason: UpdateRunStarted - Status: True - Type: Progressing - Last Transition Time: 2025-03-12T23:26:15Z - Message: - Observed Generation: 1 - Reason: UpdateRunSucceeded - Status: True - Type: Succeeded - Deletion Stage Status: - Clusters: - Conditions: - Last Transition Time: 2025-03-12T23:26:15Z - Message: - Observed Generation: 1 - Reason: StageUpdatingStarted - Status: True - Type: Progressing - Last Transition Time: 2025-03-12T23:26:15Z - Message: - Observed Generation: 1 - Reason: StageUpdatingSucceeded - Status: True - Type: Succeeded - End Time: 2025-03-12T23:26:15Z - Stage Name: kubernetes-fleet.io/deleteStage - Start Time: 2025-03-12T23:26:15Z - Policy Observed Cluster Count: 2 - Policy Snapshot Index Used: 0 - Staged Update Strategy Snapshot: - Stages: - After Stage Tasks: - Type: Approval - Wait Time: 0s - Type: TimedWait - Wait Time: 1m0s - Label Selector: - Match Labels: - Environment: staging - Name: staging - After Stage Tasks: - Type: Approval - Wait Time: 0s - Label Selector: - Match Labels: - Environment: canary - Name: canary - Sorting Label Key: name - After Stage Tasks: - Type: TimedWait - Wait Time: 1m0s - Type: Approval - Wait Time: 0s - Label Selector: - Match Labels: - Environment: production - Name: production - Sorting Label Key: order - Stages Status: - After Stage Task Status: - Approval Request Name: example-run-staging - Conditions: - Last Transition Time: 2025-03-12T23:21:54Z - Message: - Observed Generation: 1 - Reason: AfterStageTaskApprovalRequestCreated - Status: True - Type: ApprovalRequestCreated - Last Transition Time: 2025-03-12T23:22:55Z - Message: - Observed Generation: 1 - Reason: AfterStageTaskApprovalRequestApproved - Status: True - Type: ApprovalRequestApproved - Type: Approval - Conditions: - Last Transition Time: 2025-03-12T23:22:54Z - Message: - Observed Generation: 1 - Reason: AfterStageTaskWaitTimeElapsed - Status: True - Type: WaitTimeElapsed - Type: TimedWait - Clusters: - Cluster Name: member1 - Conditions: - Last Transition Time: 2025-03-12T23:21:39Z - Message: - Observed Generation: 1 - Reason: ClusterUpdatingStarted - Status: True - Type: Started - Last Transition Time: 2025-03-12T23:21:54Z - Message: - Observed Generation: 1 - Reason: ClusterUpdatingSucceeded - Status: True - Type: Succeeded - Conditions: - Last Transition Time: 2025-03-12T23:21:54Z - Message: - Observed Generation: 1 - Reason: StageUpdatingWaiting - Status: False - Type: Progressing - Last Transition Time: 2025-03-12T23:22:55Z - Message: - Observed Generation: 1 - Reason: StageUpdatingSucceeded - Status: True - Type: Succeeded - End Time: 2025-03-12T23:22:55Z - Stage Name: staging - Start Time: 2025-03-12T23:21:39Z - After Stage Task Status: - Approval Request Name: example-run-canary - Conditions: - Last Transition Time: 2025-03-12T23:23:10Z - Message: - Observed Generation: 1 - Reason: AfterStageTaskApprovalRequestCreated - Status: True - Type: ApprovalRequestCreated - Last Transition Time: 2025-03-12T23:25:15Z - Message: - Observed Generation: 1 - Reason: AfterStageTaskApprovalRequestApproved - Status: True - Type: ApprovalRequestApproved - Type: Approval - Clusters: - Cluster Name: member2 - Conditions: - Last Transition Time: 2025-03-12T23:22:55Z - Message: - Observed Generation: 1 - Reason: ClusterUpdatingStarted - Status: True - Type: Started - Last Transition Time: 2025-03-12T23:23:10Z - Message: - Observed Generation: 1 - Reason: ClusterUpdatingSucceeded - Status: True - Type: Succeeded - Conditions: - Last Transition Time: 2025-03-12T23:23:10Z - Message: - Observed Generation: 1 - Reason: StageUpdatingWaiting - Status: False - Type: Progressing - Last Transition Time: 2025-03-12T23:25:15Z - Message: - Observed Generation: 1 - Reason: StageUpdatingSucceeded - Status: True - Type: Succeeded - End Time: 2025-03-12T23:25:15Z - Stage Name: canary - Start Time: 2025-03-12T23:22:55Z - After Stage Task Status: - Conditions: - Last Transition Time: 2025-03-12T23:26:15Z - Message: - Observed Generation: 1 - Reason: AfterStageTaskWaitTimeElapsed - Status: True - Type: WaitTimeElapsed - Type: TimedWait - Approval Request Name: example-run-production - Conditions: - Last Transition Time: 2025-03-12T23:25:15Z - Message: - Observed Generation: 1 - Reason: AfterStageTaskApprovalRequestCreated - Status: True - Type: ApprovalRequestCreated - Last Transition Time: 2025-03-12T23:25:25Z - Message: - Observed Generation: 1 - Reason: AfterStageTaskApprovalRequestApproved - Status: True - Type: ApprovalRequestApproved - Type: Approval - Clusters: - Conditions: - Last Transition Time: 2025-03-12T23:25:15Z - Message: - Observed Generation: 1 - Reason: StageUpdatingWaiting - Status: False - Type: Progressing - Last Transition Time: 2025-03-12T23:26:15Z - Message: - Observed Generation: 1 - Reason: StageUpdatingSucceeded - Status: True - Type: Succeeded - End Time: 2025-03-12T23:26:15Z - Stage Name: production -Events: -``` - -### UpdateRun overall status - -At the very top, `Status.Conditions` gives the overall status of the updateRun. The execution an update run consists of two phases: initialization and execution. -During initialization, the controller performs a one-time setup where it captures a snapshot of the updateRun strategy, collects scheduled and to-be-deleted `ClusterResourceBindings`, -generates the cluster update sequence, and records all this information in the updateRun status. -The `UpdateRunInitializedSuccessfully` condition indicates the initialization is successful. - -After initialization, the controller starts executing the updateRun. The `UpdateRunStarted` condition indicates the execution has started. - -After all clusters are updated, all after-stage tasks are completed, and thus all stages are finished, the `UpdateRunSucceeded` condition is set to `True`, indicating the updateRun has succeeded. - -### Fields recorded in the updateRun status during initialization - -During initialization, the controller records the following fields in the updateRun status: -- `PolicySnapshotIndexUsed`: the index of the policy snapshot used for the updateRun, it should be the latest one. -- `PolicyObservedClusterCount`: the number of clusters selected by the scheduling policy. -- `StagedUpdateStrategySnapshot`: the snapshot of the updateRun strategy, which ensures any strategy changes will not affect executing updateRuns. - -### Stages and clusters status - -The `Stages Status` section displays the status of each stage and cluster. As shown in the strategy snapshot, the updateRun has three stages: `staging`, `canary`, and `production`. During initialization, the controller generates the rollout plan, classifies the scheduled clusters -into these three stages and dumps the plan into the updateRun status. As the execution progresses, the controller updates the status of each stage and cluster. Take the `staging` stage as an example, `member1` is included in this stage. `ClusterUpdatingStarted` condition indicates the cluster is being updated and `ClusterUpdatingSucceeded` condition shows the cluster is updated successfully. - -After all clusters are updated in a stage, the controller executes the specified after-stage tasks. Stage `staging` has two after-stage tasks: `Approval` and `TimedWait`. The `Approval` task requires the admin to manually approve a `ClusterApprovalRequest` generated by the controller. The name of the `ClusterApprovalRequest` is also included in the status, which is `example-run-staging`. `AfterStageTaskApprovalRequestCreated` condition indicates the approval request is created and `AfterStageTaskApprovalRequestApproved` condition indicates the approval request has been approved. The `TimedWait` task enforces a suspension of the rollout until the specified wait time has elapsed and in this case, the wait time is 1 minute. `AfterStageTaskWaitTimeElapsed` condition indicates the wait time has elapsed and the rollout can proceed to the next stage. - -Each stage also has its own conditions. When a stage starts, the `Progressing` condition is set to `True`. When all the cluster updates complete, the `Progressing` condition is set to `False` with reason `StageUpdatingWaiting` as shown above. It means the stage is waiting for -after-stage tasks to pass. -And thus the `lastTransitionTime` of the `Progressing` condition also serves as the start time of the wait in case there's a `TimedWait` task. When all after-stage tasks pass, the `Succeeded` condition is set to `True`. Each stage status also has `Start Time` and `End Time` fields, making it easier to read. - -There's also a `Deletion Stage Status` section, which displays the status of the deletion stage. The deletion stage is the last stage of the updateRun. It deletes resources from the unscheduled clusters. The status is pretty much the same as a normal update stage, except that there are no after-stage tasks. - -Note that all these conditions have `lastTransitionTime` set to the time when the controller updates the status. It can help debug and check -the progress of the updateRun. - -## Relationship between ClusterStagedUpdateRun and ClusterResourcePlacement - -A `ClusterStagedUpdateRun` serves as the trigger mechanism for rolling out a `ClusterResourcePlacement`. The key points of this relationship are: -* The `ClusterResourcePlacement` remains in a scheduled state without being deployed until a corresponding `ClusterStagedUpdateRun` is created. -* During rollout, the `ClusterResourcePlacement` status is continuously updated with detailed information from each target cluster. -* While a `ClusterStagedUpdateRun` only indicates whether updates have started and completed for each member cluster (as described in [previous section](#understand-clusterstagedupdaterun-status)), the `ClusterResourcePlacement` provides comprehensive details including: - * Success/failure of resource creation - * Application of overrides - * Specific error messages - -For example, below is the status of an in-progress `ClusterStagedUpdateRun`: -```bash -kubectl describe crsur example-run -Name: example-run -... -Status: - Conditions: - Last Transition Time: 2025-03-17T21:37:14Z - Message: ClusterStagedUpdateRun initialized successfully - Observed Generation: 1 - Reason: UpdateRunInitializedSuccessfully - Status: True - Type: Initialized - Last Transition Time: 2025-03-17T21:37:14Z - Message: - Observed Generation: 1 - Reason: UpdateRunStarted # updateRun started - Status: True - Type: Progressing -... - Stages Status: - After Stage Task Status: - Approval Request Name: example-run-staging - Conditions: - Last Transition Time: 2025-03-17T21:37:29Z - Message: - Observed Generation: 1 - Reason: AfterStageTaskApprovalRequestCreated - Status: True - Type: ApprovalRequestCreated - Type: Approval - Conditions: - Last Transition Time: 2025-03-17T21:38:29Z - Message: - Observed Generation: 1 - Reason: AfterStageTaskWaitTimeElapsed - Status: True - Type: WaitTimeElapsed - Type: TimedWait - Clusters: - Cluster Name: member1 - Conditions: - Last Transition Time: 2025-03-17T21:37:14Z - Message: - Observed Generation: 1 - Reason: ClusterUpdatingStarted - Status: True - Type: Started - Last Transition Time: 2025-03-17T21:37:29Z - Message: - Observed Generation: 1 - Reason: ClusterUpdatingSucceeded # member1 has updated successfully - Status: True - Type: Succeeded - Conditions: - Last Transition Time: 2025-03-17T21:37:29Z - Message: - Observed Generation: 1 - Reason: StageUpdatingWaiting # waiting for approval - Status: False - Type: Progressing - Stage Name: staging - Start Time: 2025-03-17T21:37:14Z - After Stage Task Status: - Approval Request Name: example-run-canary - Type: Approval - Clusters: - Cluster Name: member2 - Stage Name: canary - After Stage Task Status: - Type: TimedWait - Approval Request Name: example-run-production - Type: Approval - Clusters: - Stage Name: production -... -``` -In above status, member1 from stage `staging` has been updated successfully. The stage is waiting for approval to proceed to the next stage. And member2 from stage `canary` is not updated yet. - -Let's take a look at the status of the `ClusterResourcePlacement` `example-placement`: -```bash -kubectl describe crp example-placement -Name: example-placement -... -Status: - Conditions: - Last Transition Time: 2025-03-12T23:01:32Z - Message: found all cluster needed as specified by the scheduling policy, found 2 cluster(s) - Observed Generation: 1 - Reason: SchedulingPolicyFulfilled - Status: True - Type: ClusterResourcePlacementScheduled - Last Transition Time: 2025-03-13T07:35:25Z - Message: There are still 1 cluster(s) in the process of deciding whether to roll out the latest resources or not - Observed Generation: 1 - Reason: RolloutStartedUnknown - Status: Unknown - Type: ClusterResourcePlacementRolloutStarted - Observed Resource Index: 5 - Placement Statuses: - Cluster Name: member1 - Conditions: - Last Transition Time: 2025-03-12T23:01:32Z - Message: Successfully scheduled resources for placement in "member1" (affinity score: 0, topology spread score: 0): picked by scheduling policy - Observed Generation: 1 - Reason: Scheduled - Status: True - Type: Scheduled - Last Transition Time: 2025-03-17T21:37:14Z - Message: Detected the new changes on the resources and started the rollout process, resourceSnapshotIndex: 5, clusterStagedUpdateRun: example-run - Observed Generation: 1 - Reason: RolloutStarted - Status: True - Type: RolloutStarted - Last Transition Time: 2025-03-17T21:37:14Z - Message: No override rules are configured for the selected resources - Observed Generation: 1 - Reason: NoOverrideSpecified - Status: True - Type: Overridden - Last Transition Time: 2025-03-17T21:37:14Z - Message: All of the works are synchronized to the latest - Observed Generation: 1 - Reason: AllWorkSynced - Status: True - Type: WorkSynchronized - Last Transition Time: 2025-03-17T21:37:14Z - Message: All corresponding work objects are applied - Observed Generation: 1 - Reason: AllWorkHaveBeenApplied - Status: True - Type: Applied - Last Transition Time: 2025-03-17T21:37:14Z - Message: All corresponding work objects are available - Observed Generation: 1 - Reason: AllWorkAreAvailable # member1 is all good - Status: True - Type: Available - Cluster Name: member2 - Conditions: - Last Transition Time: 2025-03-12T23:01:32Z - Message: Successfully scheduled resources for placement in "member2" (affinity score: 0, topology spread score: 0): picked by scheduling policy - Observed Generation: 1 - Reason: Scheduled - Status: True - Type: Scheduled - Last Transition Time: 2025-03-13T07:35:25Z - Message: In the process of deciding whether to roll out the latest resources or not - Observed Generation: 1 - Reason: RolloutStartedUnknown # member2 is not updated yet - Status: Unknown - Type: RolloutStarted -... -``` -In the `Placement Statuses` section, we can see the status of each member cluster. For member1, the `RolloutStarted` condition is set to `True`, indicating the rollout has started. -In the condition message, we print the `ClusterStagedUpdateRun` name, which is `example-run`. This indicates the most recent cluster update is triggered by `example-run`. -It also displays the detailed update status: the works are synced and applied and are detected available. As a comparison, member2 is still in `Scheduled` state only. - -When troubleshooting a stalled updateRun, examining the `ClusterResourcePlacement` status offers valuable diagnostic information that can help identify the root cause. -For comprehensive troubleshooting steps, refer to the [troubleshooting guide](../../troubleshooting/updaterun.md). - -## Concurrent updateRuns - -Multiple concurrent `ClusterStagedUpdateRun`s can be created for the same `ClusterResourcePlacement`, allowing fleet administrators to pipeline the rollout of different resource versions. However, to maintain consistency across the fleet and prevent member clusters from running different resource versions simultaneously, we enforce a key constraint: all concurrent `ClusterStagedUpdateRun`s must use identical `ClusterStagedUpdateStrategy` settings. - -This strategy consistency requirement is validated during the initialization phase of each updateRun. This validation ensures predictable rollout behavior and prevents configuration drift across your cluster fleet, even when multiple updates are in progress. - -## Next Steps -* Learn how to [rollout and rollback CRP resources with Staged Update Run](../../howtos/updaterun.md) -* Learn how to [troubleshoot a Staged Update Run](../../troubleshooting/updaterun.md) diff --git a/docs/concepts/StagedUpdateRun/updaterun.jpg b/docs/concepts/StagedUpdateRun/updaterun.jpg deleted file mode 100644 index 3765afef0137caa0dd63bfcbc71396cb7ee200d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206653 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≀mP%49l;gPg9px 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℘fmhyDLRLG6ET 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%0AjC}DCUSrEFWY+ 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 RGX&s|lDxWH-g)y|{{y$Q=t=+p diff --git a/docs/demos/ArgoCD/fleet-argocd-integration.jpg b/docs/demos/ArgoCD/fleet-argocd-integration.jpg deleted file mode 100644 index f42cc27e2a284149532e8ae1180c49de2ef2ca41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349999 zcmeFZWmuG5)HX~FDWQNUZP0=uDIFpxB{3i|gh)#$DUFDTNC+a`JqSa`AYCfmISe5% zbPPE#@LuR0azF3;{P=!<90$Y2HP`ID_FCs&>s)JX2!5=lNKQ&mii3kg{!r<@CJqjv z7Y+{SGch4>CtHQ24hQFgnzg+A>39DUq&H7T`klox_ViDy+F8fmvgsJ_S+ePWG|4$^r~=1xMj zB5%kONz_U?miS3EoFRGtLH37^tFtLv<^fWiyV5)_sqb-ntB4!4F!Z-4zAvGUyp}D; z_=HpK{p%Z$HlZ52)k{NAW$#m7VBgo^Xy?C15&u)zdI zOe1$Pz^U^+SW$Fn=;AYqT`us;M(THHS7#;^RTs$XDILwvF8YV4)(FIDXUJofGtRkFS>)4EYY==ty5 z0$gr|ZtE{ja+i6iy0{Plg$oxLu}y(VI41Q(UTlnqO=Bf9ISS-{Xhi~2y|nku(R6rTPQ5eh z0yyjqc%x13hJNCkgeR=TZ~Uzya5NjVQQpFai+Ar(cY;D>NI3EH8^j)iD*WtHFR$Vf z$xvH?avH*?uUB0t3=ntRbq-ierTj|BLPc=xn&2D%E3Db?XlMPZSf97hk;q+-5WNX{ zs8~Wpk}k7wJ>=uvXXKiJ&lQ#x+&4(+blU*)Nt53y`qAA#I{)GHueUih+~Bg706CvXbBN^W+bVl~0s6RGYj% zsVwnu^`_MIy(p!d_>uVEgJ@J|qezw5GRZR$nbes)nfCn#CG=yTR^=$zb0XP(K79## zMRzEANP5V1h_4X!RADRqzSf&hW1pfwt$n)ugYA*XJU%$YMt(Pq{jpPSNN)5X;j-Q` zWSK`uNXSV@z5Iz#@wi<1qjGPX#UbY0TCEYCO5H_hP9D#oZtjM*be@j^mNxW3Y4+iO zrZuRHwoGi?dfa>5fc)*-C_;7l++vvw{S1w{_ibcif%XcEy*d3MDB7KX9pxP()%V%u z?7C5~d&Z^u=ywaMT|T^ThusUT3cL#D^=r!btRx56tqp96tjWq_tQ-cU3b60|`EOk@ zeCt;nTb%Ubb6{2^lihef#en6f^HiSY7RZ~@olZ#B`&~IW2DGINTbQM-kUa|jZuZ$RX>Ah^pvsa^8wJJ4H# z&xEc7)AjgG+!TiFcn(zKJvbhLV%Ug&N#}GUzlIuX;|AOGqb1pW+^S9;Ry_G ze90H3d3|(`SKj!&i6(KoWJgUKZ1->{vn&&yDe~R_yKQ6*duW27Lw_qxGtG-fPTX8V zTrP?>r$1A_uduu2RA)tJB4VEkm=Av<(<0AVP?Z!8l?s(!GZDKcdCyxHqv#`8{}!3j z*fAR0$1zPhOqNWB4V-Uc{upi*in7jDUx@Ft)RWS)E%hkDmhhB#wi>>OJ}_6a>i(Q4 zQr%ZA?nJa5iQZd?LJy$BmCD$vBLxOjvwPyFxLhJWE7e%IcRdlwP`}JKaZT~3*3T}G z*rsAV#5Dil!B%Q-Wf6RHtur%@$kMtivePETPTF&9HAkUQLAtYXk$9o3ODLhnYCYgp z;wyv28)$)rO5UO;MbBjSn<4_sLvll2(qRo(4Zmg|z*@hD7<|5RTd(S8pU5@jV2stL zZ;$Nxc8%ck2FC_ll}sJ%wp>#8TJ+Td(SU` zTfmWE5uKxgLP$n=wpCX~`A1uZ4!!xTdEbJBigmd_+t$y!gS+o{A<-A3yBKbXd>P*? z=B`=xaFN-a3Vpy3W9L=+uxjat#c3D0!H3FEcCSur4~`5BTk z4)i4zSQHGkJBJrYs7coSJZK0`r^a$*ad@hmCwUAC7p!$JJHB-3s>%nk-S~$thOrQ)4K5^ zFW+C+_iI~?>z2phZZ|`)h&@83X3Ry|ePwLz>%?teuH*UUq(C2b4oI6-)_^k?al(b}IRYY$ts269|_43o?E2=)z6?6w^cJy|`{ zJD-mWcaPfWDsEF?XHFG8k(qVtF(onhzI?vsn>LHag}&vx?K?={q*F|DLVqQpgDtWc zndF&re6kc2$MTScM|#ZL=8*B^a9!r4!SB=UIm#1K6PZ_K-wCFBl5l!8aZDPVZn%^z zdx<`w8j5qJ@;`k8w*1yOOCf`QoD;ql=qnyCT4fuKX6#;yoedhO1yi~lu zpCI%~#sB*n^!e=3(dZr+@PourNzVxf=Q7*bH||5to0~W|GB^+K%WAvht|Ev`Am)ed zTRE!n>5f>j;w>VR0^_h->3SqzV?$b z;AD8j!Q>qNC3|e{^h6DloapH(U_V?da#%M$<%zh3Zg@mQpY|JQ-ul2IKzJ0SnL^S_P+41@pwX_!l7Uys&n z_WG4?vl)Fe{6kWYSR8+K%9=Doit}sq8;cjRUHx_=yi7~&UMsWLrmPZ`Qgwq>RjrctU>#PT|9mOCVQb%Jw<2h2hTt}_9eLfcEe0z26xAkQJ z8>SF&cFO&|;@`&p_S`=*GIA5|K{zv$S`NC!7FK&%+kf)aV$zJY4j3Fbup~N@M8~WD z%;D?S1F__%`iWYCRSf)3?*kXg9L3&8dnQ}zKHJp!Fqnfi`19YB(UVXeWcGDUYySsQ zVv4CnMRz9qay2rVmYfsavAZK{PANx;-a8pA<%=o4QcUW_s*5y24g-X>&)7h(7)0zZ zz+8WR`#9swuJS1+CI@S6^E~safW_!!wUgcM@{qM}T_WpmlR?;IrU$?!t90jq%xaET zCnw7hQAjJb?7BW1a=Ri*P3-##I^{I86Ix1PsINb+SF@~fblBzKL+vCfA4C!QDrMcl zb#?UPaLyB5UAhmUWloFTtWS=b=;|6q<*mKjMem&f(7%x8+xm~BQing#_-nbE*NW^W zDmIIjFn-t-<5RfgPOtpTD;v4F>@y5km^8kQJ&fD5*qUv1-E1TxqP@H_0uzyZ*VEBa zdQJZAXrCgB-Pl;|#>F>K&)JO^a3AJ`qYrs_s$eN-V&8#0JREzpUn#ja+HBF2jF_}Q z2pdDX^AaRjw(GEa6WOo=1Bcr3iEe-V-?oV0!>irMDRBO{DDfX#z*S6uP0(1k%Ub1t z+*zGWuc{LLdJ;^{F%BTgTl{#lc@5ZZJvY|M`0&Eecf9b=^4zLh}Jc-cBnhFaHN3MVQe0C2L@dK1=O@xuo*kP;7nuW6ED|Ap`Crkpq`HNbUZ ze|N-~MVkSo4~%je59M~oLcO*iYI*M!5vrjq(o!?>dnF|$j`jG27l?BPOlLQIPd!6S z!<&+tDa3D~#@8C~Da!y40-|N(O*$$u?|44-^%c8ixn8Non4V>lIm_WU#U{sFPa^2$H%T1iJmwC zjw%>j+5={f=+Dcuv0k67ewY-AH?9zJIS#rOCca+v0sEEBrSHp!Gc)&QfQY?3cGl)+ z&*9a-o6dbcTK9E>MQ1F3*Sc5hd)mDvbziY;Th2f!Oa}C`FEGC>txBo5RWlxlz=N2{ zm|sIfu#yWV-G4OZHBEN1nk!3H_yjrQ_aqM5z1S^n%}<9ir?kQ@mZL^E@*=q05Xc z+cynVT?SM|K+&8hjDx%}$6g{>5`O8kVW?*EzR0wI<&OIr>odlTt@bxC(5k!xS)Sv98(yN5H^hlo`_7Fir z4~J?>?mjTS(Kr1d+8IMHi9uxq^xniA?kr}EuwYS&75h`3M8=Dx8oNTLz=wsNu#Fv! zfAq}2Uv|n*-I(&+AP@cjXE_k&=Hz{b@X%og2a>W@+j{Ligf#jugSbDhxAsDa>o0XZRy*0(BDi zmpjt~JoB^GCoJb;Ey@%RD$^G*5T!0P=Cd7@LO{9YP&M;*lY4g>J8lark1_J#y5L#1 z31GG^$#vXX7B#Co+^jFDv}+p9ESO)zCy6s85y(y|SOz=D=C|AF-StEsB`3XTySf+d zd)#bavsPguguQ&CD2?fxZmeNG;9k`jkSg~P+~m4->%!-y+me2}l!eW4HS9EZtZF)L z*LzhGwE#Ry^~xS9tr~7VP{j(b19rD`E~c+osG+tAAE|9Ro6tEph>h;npzNRMPxp_O zi{BGGH1gVN<)|omw&kb0MfK1`xQQeR&7KcP3_mE%Be!uttW4S zt*pF-5CV3vp5CRL6y|PSa13{?e!g>`%OTYx|42%%46x*u=^N?FZg)uaOY=^9=Q@o3 z_MCj{tq)(XO1Ky0P258Y5=J|GpBxFBWMER?pLtEjM-10Pw};n3U#nf~(5=S|nN+M7 z;0XzV7g0xnc;Bo7qdzO~V4WRY3Z$xrULv)LAn1k4sH!huJ8C+ zJU95*+saxTTRerh|Bz-|nvR(xtjLEjkK#~bcORa9D z+ygUOdxN1|Z?;o1vXo;mh^_a(9daevew&US)9Cp-pn6ATxw$aDBwox4F z6gs+hXpn^)(Tzj(lX1%mzvVu^U0$vMIoA7ejFNf$Mj+m^UdLpol&bRnwRz zJa7}6fN%uB5Mcw^s$^a?!iRi)J1&{fTYAgrT&OrWvutqO$ynUOf##S?5Uq+pz;`z$p_mSQLw zgl|;^)zv&&6B&cK`SN}JO<#Mj0-P@??VHqjBEx(=mFh;_p$%Qvh`g)ho81*&<2ngL zh*|c1mY=r%KH^ASibL9=q2aSE?$otXSCTPYiglmoe*3Y;h$DUC6w&2AM^4Pdv4>24 zu{bFy>9PH5U6*UF2$zvDmXpn(=~^hEAagiWDxK1y{4wS0U5@cV)r5@_UNPf2^!6DuZ6WNmJ4F4Ezx7h?km)k?FpX-UB(D%aLZ_`t5 z@M_)33fkK8KQq@0w{*(m@+9sb>8dFY!PuM7Pnb?iDQbvNtPXKz5x|?{@;vW>E@Coz zbdDvrXl12x`zy{^>FecmUW1C&J)tz%MetN^LUA{Rm-BNl?Na>EP#jcmkSQr1FCR$H zMTmWNTr$?D(ji?So;6HI&@B&!0=4ZG)G=+k*OIa^siYWSudkSF$47`6g&z41nqf?; z&W2FfCkLrF8de!Lvc{0C`DG9OI<9Zv(G1rn5{@^mYw zhsqkCfoJc@jKWr+gw72DVP+;7%##cs(4oWYZ+jtiyX36Qea zy4bA3xt#_H55_h1IVLPXbS~6D$wVBf`-k>_ zV5prs;6n&b^#OF8c9O?fr~;ttcW^XNIYg*F&o4c(ZGoDPsa-~jwGXpc6;#tqkGF}K z-B}NwgLv+ryq78q@1)?M6rJ|lL^F0fQ$z1+fuEH9;MCZ+z(};a+2z7Op!-|6xqGl_ z8UKtrsdUw7g$m$=|e7k_A_O2&PWefPcpQ~ zYrwLh(#o9?TbI6^huRmYuaoPt;#8ZSGj~@w3p+}IKt+ao@E-fQs1wnK2c7Mc+1pwJ zs89J}<0MwzQBq>q0g@NOk8vF|XPju`uTi*|$`T_RT;44ll%Nv4;$ zGa^6Dru=ynNCk~+wtw&>kiSf)CD|Ghn`zXKeP#)l6)MNvqkFZ!hx0K3%QPU{EnfZVtfSNykU<(jh{sZvY8Z4)8yI7lFKW)*uSa6x8*5_et(A76z!LNJ&am zNCng>)FcnO@T_|8^eG1PB*V$Hbz?|{yayJCeQ$4}f7?waRUCxsFAy)kclo^KaPgo` z!ITU;4A?$ag#n*LYDog!5$!&rIeG?#dLbBJ_wgwGcO#5Q{b5&80$csshR=RY5xqPj zIPd)fL_yxRd_ddEHFy&%IQW2HWrr04(E~EuDZ&d^s6K3^lSW#h5uOU|$lic`APM2m zz1|xzfABs4wdW&-!NC+%PLcL}zwNMAUREY($R;8plBhO9@(Pn3vvi-&;(a zHm!%s?Cf5|(ra=;?S}`;C_$cm>zjhz;SRy@3+N7g&mkXLcCI1~&_}o(y74Xd_{l-L zbUf799w5^ulk{sFKvnU=>rPZ%286oq1hX=89puzkNb9{haTOq&g527}wcvpfW96Bc zwu9h`+=O}y-Vsaw@f|ELeWy)aT?OqRXX5a_5E3$%c+crM(tDr0NvR-beanmPl?Mw_ zTS(zI?_-U|(>}=5OfkE0u7GUKO67f!7nJKUU9kS~7~i%_i|%pXW$#gF(2|XZNj_io z;0~2heK8E#9WD$$K~?U7Y1614;3JOgJJU^rn_lyqwGmM6VE5wbkfAZ~y=`7GwIF7z zd=J3aGPwc{l5ps9Uy41y(T0L3ZJfor#lW59RtT*vcNH zNg-c&XIe}n#>huH*eCHR>#YQS?OAkUJ|kh z^Zf>Mp_yC~I4e_(o>An~mEv|5U&9cUXpz3lEPE*C{JV<&fpXGFuLC;lhow>|-{7EE zj1l}Yh`#SAx1rs)5c@=adHFW|9xA>Ls4gYQv3Rc^kAzA49D9RzpOh)clXw$OOziAt z@%3o)W~HL%SWeyVut&F*aoxU6*+dy?mjRPRK0`^@`xupZ3W6;3jYnJuH53E)AB`~9 zc85(dc$3?F?;qDIvwxhc{>a&@@t@t_u=hz6QbS}J7dAF z!7)|_(mg~8Cz7z=^(E&@8J2wmE^>tTFzwRMfe!Z#}>4 zITo|)+W(NF^^K6e@9-DB>@AgaM7y=OkTH2?kz863-Ze-i6qG(AJ2&2ST7XXEH+xX@ z8jjRdcmNl1vCS^Jp)t_x8H%J{OIO`jL73!ea*Wd~aCz;>YBH=?(^_uE#L%zGF@AbgJ2WI-Qv`1trJxLdX3sL93Y z_n*l+<{e?atNYv~{*s>NPw8kg?W!dl}*WoLLu|1_tH;nH&?GEWq(A8~%>TUXA z%WrRuXXzQZrmkYx91uvy&&M zjCNMTWVo=a#8Mq=G%O{w;V|5N_RhD1=eL7J@BxMI|Ctm><4RMgmyPG}TIR8`V@$Ls zP-%;cK#d`mXghc>3)wUxDn_d7MW-^J0{08id3tkPSWLaXJ(oLe0WLGpY=j-IYhq{8 zq6`P>7>HSZ?YNA`vXtQlw)7iHGasev;ER}MmJ_Ns7q)007OW|E>~2C3R$SBX3EAw% zglSh$$xF0 z%W*#ZyVji<{QF(%JJq`@BKy#u*g7d~$&AehDK|huThZ)Yb}$>ZKnk1X%g&UVY(>N84Sy>V7fh#-L;38zX0xEdIyu%Bk%LsOUMaeMhH zqAFvb9S%d4y_R9QrHJ2v5+gOF)#f?aMQWvY7$giYY9c+y;RVC{5YVzMc#f{`H+fge zI%6Zd_k_>Iv|f1-4eOG~rchD!Yrn|IOAKPpR(I6i!uK@;TY!41D}(Y4gec$*%^Gw2 zA0i~Uo;)s(h>YbDok)bwlMh{iB7oXa-P`dA+2e$elNY7q|5FToq!UAI@d zV9QgRK#hl-nC3(UU<>n%a9xf>M>$7kBzE0R74qXBJ<1@pnG^pLQhrTWt7iffb!X=D z4em50N8GTGgD7AYYBbOrTD#DOc9Bq?`+tR{At0^FtHWnJUwrx{R)LJ3o}T-f9TO$z zWNMJA#L;SL1$2(A{BPW}wX*ebjE^E0?jhqk>J1B#(4h;;;zcJO<~OZ)m9 zNQtp)iAIt9Zt1}F{2Fo+8t*ZlGy1P!I1PH~%6n@-Kp7rWaSYfOK8UymFhbhOh%U2PmmzQeXL>^+@WD z=Whogvb_PRzS~Rzjo9XWNxO9Q09(nm^eX1_tMz|^3z7iZ zjARzu5!Z*`y8Two*@=W&Wtqls%GZ4L$J@+KTLe;)3py{a{rfg>B@-oMi>tmP!i+7e zutS!~m2~it72X>2y=8fa zC?`1$FOT@*fIs)iiZD}muoHlibvjfx5enh!5*+@mhdme)J0XN8MXX8u2~}TvV!5Dl z!I#(zz97(Sbk0`(_SBoFR=bdjL;RzNpde18H@bgF@Dy}br!#qwo{}X{upHFDu{X6% zan8KoIB~J~LYQzZx#SOU@5Ebw8^lkBo}}gUd4ZNzt9rKf(OK6$C|K+F{{9_Wp!OuQCC#r^olug}eVMyI)6U z&MFz`E;JrynPsUX%cAF6&P{_$0IWiI=J*gDu;hFk#8yf2ucrN{Sns&48`c0VmH_3U zo<&U77iSv+sU>F-QM!NDa`rf@8Y?wC?47vz)E^tE*9=61F$8*Wjk{bseLX8n{ls4V z^J*aQAvhg@Izf^z?a}`-4{y)|} zd%E|%UlTJ{_!{}YV&f8M-cIdp7YUSF>IJ5p;d7+;@04CH>N_l-UgU3IKKC)!X`aoY zasx5#LjXF{@(tJiRV1J^|7Qfp(l?{V-n#sGJJlAHUjHeY0xU%!1@WvO6F(U2l78vpV~oieA_ZhKAO^BJqBUn`m5jjj|)0~Oi5BtrasYS)HDbb6T8d} z7(e;=;oSJ2qp{uqrJp{|gmc_*xW@5s)a)e#X+q}Zrw7QSoel5)DOx7X5AKBSa-*C< zqJP)Z|5E-E2Nkwj64POT@XiMOEN}Pu&G4tffEd$G+?gaU!dn>Fz`<*e&*A^41&IYo zZvox^%vABph}VCyh+i`I>o^@-z8fOo?3uFwA3r7vx_{)Cy* z4gY&i3vVn-0q5)p7v})Bs#b#8Ux#e|nwOXOe*1>CsnF#=Z_C7!9FV4HCtv=*k=73~ zV#fi+aav~Q$ZQMA{r0Um5eK8m{`FVN(*u&-jG%KXS9-*Xp=`?(erA47#9$eyuXRWR z2U}&*U&l87wrCC6nJ!}EmVG(beJncvbV~ltbgY{X_r+Td|CIWiCePqda2ApATAuzn zp-gHG2w)8Zh@hYDe}cSM)?fRSQGI%#k>T6IpKtsv&foWBpfwikn==CM&P|sY+;HX* z1Rm~6(+s=`82Ixjoc~Rr4<6a@6ntI|ae{^JqzR^=nJa$}eKulm0PwI!Z`V)FKf(I9 zFaGNus}SA^U8UE&k6Q}JU)?RlN#fkl=buKsz$3eSOKC|6aGIY|0?t=s{+!xRM*Wh~ zP;4R)OqaA;%Fl18^AEyk0Im>SnH2K7pL>47zfYL2{y2^zz|VDxF9}M|(S4?KS-Hxm zuQyuIK4&6nY_ex`D0zB)!aXoZjcKY)Nbh&_^Pl1YVCT6Zsrv^@0l=E6(h$T?`q0Qo z<5FTf0}osz_2F2nlL^5%r(;lo{apN)&s=zm$#?FFf&*W@c@p<>L{uHX5vvmbg}aMJ zFS7pxh@Z>@GR~ieU1s?oOgJ(eZg2pn(U_>J=K6*jhx_iRU+Y!iSRL}OE#dkdYeE6c zd0qMsmf+f{)v1=lQ=t$+h~x36>4W16&zPyVm)+KR3iSazw?n)sPWJi zGD~kTxE678u*}kwB8W+S!41eG^A>>Mvr+On=Radd>LS@0Wd|Hl!WJDSL{XOzQLez^ z$o*5JA*!3wR)D#ViLL=_MMR&#+WSFfXN5~_O;?xoX8^15R)%?>buGuiN4zste!GQ> zWlZ_;U^?oNci6wd^bF!VGX4kendOq1-J_~+5>Q!H`pL1f5O57@h!!s3vz$U-y^+#P z{bk8AFtEJ~G{5|(;@AuIV>W!iqI0q{8_-OYP+;FldbXb1G@EJNtF_w!KUhvBwPDMI zVbE_z2Wiuh!20}MNq6iPU7!Cqm67=Xa3>9LPt&Unj@96cv*c$E_p2Y&hvo$3nZq)t z0(t7QwRk%SEYs!Cb?LWj=p^IWT z4oTImh)9S3MbKw~<7l%A?*BQ081YHQYjm!L%tE3jWt4*0sxnNJw!ovv|5iyr{cI==Z=<#rYDqooWa0{;QfIQKLW-H1E2 z_Ffq{^o+y%|0MA7cwr_IM?Vl$h=?pTvjbL}DstwgvTM4^&%3E4PAYGdd*hat*o&T3 z(ld|C%I%06oH5e`QWp#oK~ZFPYx_wc%1%2-3|koI9ox zDTSpLJ!fjmCIw)*oHY0KPgvsk(~uq%P70=qLaMViA2?bOP@%wh7@vGT!J#WXIl2fB zzB3+b6$R)hA@<214E#)z2D1A#FVTPXlTggK$iVD2blQ&`&(3?KfWafUfGrmHGUwNx z{Z~>}a!~I2!{&s@nVhnWbm3;0-+&@ORR;sJVcU9TB}KNBZBxHwy!!|!Yh~EeahwlT znL0A{s?2NMyyce7eRCk2W%|`Tk;?Jme&~V1)vc3?(=Qd2hS)O1cKH0&7j=m@@$xQh zf~8K5UO>A8=6>lrGX_|W2ZFMj@N51D{a}nQd0}b~^ z_$-c$U$x`1z5reKwSd^>moWMp@lq9Rrx{clVKt^_&$hx9Aktl-nEDTb%Wh8lCLB*v zvsaeUcZhL5Hb9#6)YT$>fJDAd|LUUK%6>!%Tdk*!{*72deX3@E(#x)o~L=ju|#P$kzkSH6|t zw{K)KnHN#){(7DwZ>12 z(G;Qd$s?at`|Xo(v87E;+yyFy;x&%)>{O^gJm-~RG6%7kv!vuE6~IpYn$B@?z!C`1 z@qr}KhNSa;VCT|Z|9)W|IL&8p(Bd6oX_3V4%wSV|r=|hkTLq*!alq3pcs`6NEy{7f zP}Vy^P~tfOa;gP1ekSxkFV7+ylzBqzEESRpCbcaX-gEPc=ZEiZ#F$5sZm({7KX?;U zQc%XVdG%fymnezuH@{&2YE@dP1Z5ylO@Dszp6l`^!WQ$w>-dN!<#Nz3U!(L9K;ir8 zd;iu5erf3;UcI}sxjURLsYq9}>;41?fXeGFcR~fZP}HyiM4QOinKzv9Tx~F!s!&qs{B{j%Hr(+^Wb7lqR|T-^f7s1QXx&P+7p6Vv{f&24 zfLH&swBL*DwZLuLuoj56b8YOZHyV4c{uSOjY(H)t&9|w+AbhiZz4~PsdAPH&>xR?H z>gW1fc1PWacu@1v#AYM5$*$r7w-@Oo|J_<45!a7xTppeXiu^ByrC1Ki^2FyJ`8_+H zU59RAer;Q6O*u}t5+*vxIzsN)Qv@9XxVU_Vix&){Bl1ZqvM=VcYSPgaOfFWjX0?o0VB*-$ z?ZutHvNkl-y4U~XddEw;dlv46U9Ro+-?>h{io+>E;(gisZl@cNBSgK9-YavvBGe|9 zY<0MYnFZ;bwY5wIF=>=Uj~LptEGY_vATF+!Md+zK8s^ywc&Ei^g@ zbTAawFWPxJ&%BK_U#a{w(Y4Q8tUJY3!6030+*xAI@MHBW;5ZJ7nqY%H;EW4yLn1+| zLY+ONMv4?2)_&jjNs~eF&E}sj_;E(saiAq4fwm^zbf7{#^&j(` zpJ1whhlKZ|-Cz-lxayW~#DmN3+SLaa`oAJpV(qgW>!|^l9B!oCHEd_@hPpO0;Z4LI zoxggeh7;>K+^{-5_Y*QqC-ZQO3Up=UKoKw9wKt@sY z>eO&%c*#L=-N2;Y{aIFRS>~N5kRc&E>pp%j3>?Y`KK}Az<`dqPK;0u%#;4R|gn~8s z_1(rS&O9TAPqN5G>e77SZ?%PwYQ%CG;6|nBnAf$BxnU^-3^NM`On!n}n;aKC! zO}d{+r;Xo*-7xQB4}bLzA}?Cmew$-4vPF9MG1&z(TO5(5p*%u#gniV*yU_y$Sdn3A zmHiboJx@gL>`m9uz4{fXv2*Y#WBKWYi8}N29-E0uVRVY^soq}7#QhZYt^pR72PvLS z&oVF^SJ(DnK>5K(yyE^p5%gCqMakiUXcuc7uhl`DSxUZqZTnnsyVO{sNFp|R5iVM@ z)9gt!Bwp8XoA+Iq(_AH_#3v}FY_=r(#}#R(4?k^+yzc4VSgKP|x&(JV8A&XMc^^a+_kqt2SaU?6(s=F! zgY?Nfy!;&f$yO)O5fXjE!3%6sHQgyIEQ4+*$q7g^Zdm1E>C=ab1jmxQu&pCZYX(n% zUfmB4xFLE+u`!%}M!lhz&G+JgGYOCQuOn6eP?AXMSfJVUk|EP-Z535|1HU`1lW1^O>)cCwjs!l}-JBe?5dy?F|(7-4Po4(l$S56!D`tGSuFjO!`}>kiN{ zYwdJQ&zvA5?lvox?XJ4P_c`1tM!REaZ3ZvY4#8`WE%+scb)x!||6FQUHVbxC@yeIJ?pXsdOQ zw&5Qf&-`G&g)jHu!%g@^=gMKaCbYmvT99Pe8rSOPIVO zy?mmg+Sqzn$yajKelh{(^&Hye49PDa*8VmQZfyP;d1fx|Pta}vOJK)-@V2MLdt@R}aD zdi1UPy*R3n`e0#9Aa@z4Ym?#el5loT&-kF_Jc!p=L={Ig6(}iFGOnxK=;ikxZeqb2 z9xChy6;6pQBwE?xrQGNK>kRonTUm*-7eaZ7C6qyYQJ0RH=B?yOi#BNIH~}CviW?(W z@P^=|%t-dCO*Y`v>ST|b3-02gVlz`$%~5c z7w0w&#UMt%W)`?nz3&V@UX{NQcMZg!Cgm3s( z7I91lCp^xIkebS$a`~!rwaGbswg$@bRceGauC3Ik)ZF&qbIlQIi^J%Pz(OUP98g2n5cxf*$=P_fq(8eK@yqZNaCYrT?+CVc`}i(gvTO|;fB7?db=i4{jp71 z4zQPq*y97X8k8>VNiahYrv}62B@25+g;g;R$HR%BsbZqj%I=f>y$VOCK)$*zS4v;% za*`X{w>~J61bfM^_Anvi)k{ zM_$~7RJ9U4m99OQPJLNc#x)*Rf|9^R$!Rf5zJ&0UTxnzI3;fOCVvxU$s_!E3~~yw4Qy4F?fPin zc@;@MKKLTw_3rM7?fOh(f_-Pa_x_dV(mqy!wbdmrj*~Jd7|m~gt(7F^6Sm7IZo}8i z{kflJhkRj%mq#Xm)tFe43-kY2?D9H}B%hz|1`F#w7mvbB zR8k&)09dfnO)6<4O0Z<`r`RBweG<-tz7#9Ekh%~NQ1P20rW!g`X<66j($CMAe}D`z zha_=pie#_HawKR-l+@d6GYZAZ(ap@z%`BFhqIy+Y^oqEmz)+}unf3Dohm>mIa1KYv z^Lcoi-%P!OJxSX;4Xd<>2ekJ|KhZcQp89h&F4&QH>ez8r4nW>z@CVhse5qAwH)fxb zBJupI_w#PiqYm^+fc^YnbfVmcl?@2vhd64<_KWtNOvovH$TG)TlB)PxVf)CN4N7N3 z^WmO`0l$W?yJs!iovU=L}+=_OiQJOI6OuH~Ct52bmv^$AjsH*8iXM|Wz zRH5%Mh$jQ#ejnfPiVnjY() z73Mv+uNtkVURU;gM{!L}#C{+EDJl`W0NbH?Qe-0Q{uI3^;>uCwIMd{q%r1CZ)Jzc) zH!>{Zw9rYS8@g@={K?~t7rO_{k41EfjB~Zm-H}4+c;fH>1@M39dds*d->z#|5Tqm& z5Tq3)1w=|Z1W~$XkQlmQ=pGsY$)UTOp<{@l1f{!k0O{_|XT0y{eeV1EU)TGE;p6!` z_j&AN@3q%niyIZ1W}k!30hgV8u4@z;gzX{VYKi)T{cn?uG>-Q(nE0&?R<)qplZ0RU zzcdAUv+O{L$lC@D=W{}xA2=Utnh}PL>#8>x$jD|Fpg8%Z(A|11-J$Y(he^AbT`07a zfS{mkj2k$ZN4p?c;;Nk2e~fQ@eme?29}O|kT9HV65VTXg`GKeHp;zhXWLO8rYS`Z# z6ms|5TR|@rFAMz;&h8kA=f42?S@^!@+vWQC(zlV;&xDq^9+UMU`D5OfeiMA$(-bb+ ziwbr(;lL+FRbN5Fpqn5*e?ToMU`ABiEWVKXy;HsC#TeHwDcE|$rJ?E`qjmo)_;If$ zq#JPk#$x+;&kwq5Y>H4~pA|5qm1=}#)GTuTqQs9#ACS>LsVO-yRsf9j57cJV#A{L7Mb zgo}B4HcyO?Ye`ALh9@ixo+*+sS7gi z{J``MnSthZ$Hu|Y6<)ew;hqxW-gsTp2!22ze=MHk&6I6cH#TU#iZ^@H|KO)&;$fO7 zP#Jh%UF)A;T59=KI`LYSSIm29@Y;<(Vs&ow>8w!hbNTb-mRuCFx-lcHK2UjZYaG1O zS^AryzO1jzo|Ku3fjhj*0adBbe8S^R^o!EW``9>(NjpE5?%F{;2G}Xw`gqO7B05!7 zbv@l#O4>MS<*uxk`%^kA6#W_Cps=~B=KbYZ&HBEoKNe5;!Ae4e%ZBI#=)r!9I&Btq zCJ##6y34Kf-;E}|7&Vepy>R%%v2QAReRG^>+g;ARFax?CY2HgrqQ5ISJS)jzn09pu zue*c5n^#ye)b@zMhT1#>8eIxC&<2al&2NGuP67xhA+1m+jhojeJ=b&2n08R#neL*% z=)RY88uGr}rJcyOM37N)3hxcBbGEqbREBt0#M012tA!0}zeR-T_yFg-z?KAg zg`T7BVubr_d9K>}mYVjm-;tCnIJtA=YHNc~u7)WwAtA>2q5d2jvOQ2*n}Mh9v9lqO z1}RUqT)aJ5uE3So@rU3yW&Hitp0*9bC)@FfXU|ca5{}3u zuIFr3tRS&7Z&5F12G^I%?OCcI;~}>$1>Q8%Y+h4~7UTt-zjhMSNOmetQ^PoIkKa90 z-p)I46@E)DCLVduw5y@3_VN~31&JpK`$|F!dn-`8?qoz;4a%GRwJ0*mg0%V6l~F8_ z?*L6AS9@`{5`Z5+R$iWFJDj+#;D5D8v{|Otg~cM!VKyNzsNhy7?~$j>JwF4^tAFVQ zdZ57fuYnCtWfbJ&_$@ygI|SE+GNmmvFv{hp6mmByCV9x<8l4sl0uEyjN~+qkscYS2 zEBB_A&Ef2)%0$FZt2b0qp70?v)i0!539`RPd;9$?;G9s_B(Xnr8uPs79US%ECPm+S zS6+2|Y@yXE4rue#o=_B}j1v9*`Nh-9SD&!z9~ev;^$IIxnC6wA$Y0uadGBpIp=LoI z$l4W}+S?c%LFaCU{{^T0#hirImjc$L%#WZ4*=ZB6j(s5ncm*+O!>+;yi{9hbDa>*W zTf28wS2v6^2N~Lip;NIKabmE;m%JalOynpm9P$b4eicC92dIqX4{ro*4B*0|_nqU! z`?TTx$pia!9(|VJB_AuwEx$rLdi%Z2BusXym&OC(_}qQeD~o(Id!4s#Qz6<@#<(g3 z3d@>|5#3yO=87@0kh-%j%L5VI*DGXKo>IC_HX?sIKV>^<|HKj!SvvHUhFt9Wr<#3y zj#Ovyf9_p+G&LRX^JVUGuPLsKmD)d3iWP5c8RB@_;&S15TQ7`@;%2Sxi;zW3onUNh z^I5^mLh7=sdTVVss>4%oLEU5DuI9R&`ttYHcR+_K#kSI~pm?T!KGJRBE4F7J_Yd-I z3(QqcTzC@BnO3)QhPz8MTY0wDHRDqzZ)Esd(ou!{)&atYm7H_@GnB%@A8P{>*=}rV zx(6e&XEpsYHnr8qDkFzP6mh02-dIzi65jmuf6W#CU!5;T7l2L)It#YJ;#U2$lHjrm z00kp2x9(=)cusxJ9c8^4&U-(>xpsCUD=;@RY{x(!2|`RVTz(Iqk@UOI{?wvrz3&Uy zrj~|=T6ycj`HuUvs$@to@(i(8%k%1*u5r=4o4*U|_)SG%Gi??*8Xgoj*2<@ZfalJi z7neG$9Mq@r)@K$BHcw*uLZN1_vj)o^vla&9K%55_?>Yj6+Iqup%xuTn?m^?KV^hL| zE}*UkbUL#8aV#_?W2ZDcFI@1iP6^6o^bAhJKrOF(y}rIZQ-1!L@Hojv+Ba+)W~rqd z`?ww?x4C^B6nSrfT#QmnV^5z}|H}*n4P#V&=?w7pPmesU=*LtO)VQ1i(?cq>{ENBb z&y`Wgnm+*ygEe2fw=K*3L8g{Gt&?)$N>mKClWP?r=)sQg+8y);c zWhm05{ZyK!U5|qLfU1?0lyNvfXg_*en}zsR`E`yDL%(Z#FnhgioehAnA>q131Gp2B zxt;ND3Z4q{meGbQ2jk@(A79T+bN4TPAnmHF}oA?Dy9AJC?_bv(yZDaL*HB5;~^5OE)tC>jYSN`Sm zUrF>%KMzG{S3f1@uO-2_f^6vC36HpGdtI$j^QY-Flp?&234<{+SQ+UBF+_UYD*uJILpQvGaZ0$SR6MAbwXtIh1wX=kX1xwxl)eko zNZL+EO_^%MGY6eQfk2>f3Ln`_{y<0VnA2K*NP03iq5Cq2JU!k7Vo4e~VBEO%j_grf zEU?~kPA{NL7IDOW$!rU1Hg3S(ax6Vpp0ch!r?G||qUKnag7e1^^o)4VZ~wx%LgDkT zeJO{M%*h^hja8>}@~5Q9tg(ko!MjPG6q|h%>3Ic%3Ru zfpHZm{02ug7o-K)!LZA%6$x5Ag!^1o-ftPuWwo?MK)6%e5S{v7%zpTRO%L)Fdd6zg zw||h{GgB}KW*riRkN4>JZZ0_L7oR59w$PNKQ7(z*2j4^@_wSi&- z0JONK=3aa0Ey(ifD#5(}WQ6m^q(6J8?A8xaw&ojn5eZld*MiJA`MsD`UfvXzD0b3Db(#- zw5)6#l#IB^_A6lBmvP_aQpR@NDXn|LScmFnDz^L7AJpEt4Yxe>U+g7;R=CVN76e`p zAsh0#Ouv~bYk+JXAdun#XQTtZ%Y(dPL4I#KwQ*eSYyhoR?F%hq`Lu~ZWF4Gl(a7`+ z-ZbwuIR!umG=f>@UHP}>w?S_JdkPgTHt}1te2vySy`VZLh??5mr5*jd**I$f?I46x z&RY(#rI@CdTK_XL`>+2TtAAnd&&{CKQ9qdlURS2wRZlK zYv*0D4J~8|L2orad~a^2gDZrK*Jrf`8vv@+&~GA28Cd(a{Z!H>f6)X8`9E2m{@IkO zN0o}06)1L~oEo1*urH0)VqAE4@Gz9O19ThF+ zago)Q6P7A-Tjf9EHmXU-htdbUTEH>)j7X(IAHcbcEMP-}o@Zg5z?PKhmvG20S$%!V z(GjKt_idxX_EU3FIdxcLEyvO}w>92p8KvoeqPAJ}A?q+e=_ zYt2Xr(G-iDN`}LJ9txYxt|d@Wy#w$>mOmPON_#F@a3|z>k0SNORFaBulr!O!X?TyM zX?=-$L9A7)9=K8ItmXDG4TcjSOvy_!dmKku+U{hW4@;-u>z4lj;GYdbk8!_9-m9X% zcy1(w3;*zH_vjp-eO#H*5x zc?Uk-JwO!iSPB-yN?{0gK*Hqy3d<(U=}(*lt&4uyanVQYR+8(dU;KxI>^!1d;i$x) zQi=J$C&&MNAc(Nv5Faab{0d^2Kp(&qqi}dVi_}xZ@ln}B&OslxVaw#`;VUt)e3n#v zN<45t@oo_e2Deb3Q7x{?iOc62bly34+E|$G(^%mdM_8oyTGVBLUd8*--Szx_5h#NA ziOQ3^611QL9o5f``$&o|CYhiecYU|0XOG}sC_bttp8@{AmI;3wDLRrbysJH{WmWB= zCfU-sl8@;?nFr|XW9W3Eok5*9nR(EkDV8q3Q{`Gq#xX_aYUApA)8)natZ^Y0+JMme zMeVWI0W>pZFh(yS%7HpWr)|Lk;D%|#{HcHPoR&#{xr5i?c>E9#l*~9_qJ~$JY~muzzLMk-mht)3EQ6=2h8n@M^H9)0WLPZTlQKabfewM z;nqU*4sB4%{;tXL#r^hls}v#g+!MOfp4i5(OEJtYAt(PBWud+-Yf`$^Eub|)d>}f- z1>>y8qt&kKqrOe_LD@qJ(rKV3wWlTKr|Yh!gKfTTgVI^2##*B-ch*G>W5B*oX@D?A zu{1zfoK$fhhh?*b^3BP3Z4PxpAgOK)x=K<2Q2!Q62%hq! zrFfAkQv+eu92dLKEu{$e)GAX^o&pa92s>Hp^1$KN9Bk@XJTCHWz(y3?$Ie%|nKfHk z*A~C+o`U!dweCZo^T~|`s5Cm{_?1hQQ*AMXk8fe5@xZ$JFRCKytz@fk8@GU(+i!V# ze-!+e4~wo8168LO{hY5s(5K3o;xKJ0Pe?c}U0-_c=))Znp2Lc$ z4fOq0(xNE3vw?^&c0rSK;Z19VWs#_nChXR@q~)=AK6$#Ck(tt1CS0unA>VI0#Q_xaDef+*EfJPxpVGn|FKje3o)m9y zpl3#nSq*f*1d6!Uob@onV99rnzK zJmp#H|G$%i|87!!WAQfmvdvKhLZ(dX>{Ff*(l~A~zT55N&9YsukehHZ#TSPYqW2Uj zJNNQ^o`1TiU_BQH!PsxY$Hf%fsol7 z$AxD_oHsaYHQcRq;5*;Y7aI^Lf73R;5N;G}}rR8q|h+SHo+1%NkDDAYcvU+w7&g=_t4J0hH!t8-$m3HWoNO3vg-D=U`)gdXZJJ z9+wy3?0a)k>VTq85Ks`ahboX9l+>c;{5It+s?Sp|`g=a@7QV#%J7z78z!0GodQ&^g zjDQZN0(n)}I`=dhor~k*0KCBS`t9`fWQ4M;+Dr~ETY#{;Jggy;vAAsBUY2hu8|w=7UlTqic(l{IW9U*l5N?~~4X-?0Mu zGk-3m9n!E;Rn}=dw6R}qC5)THUDgC#P`F%`_GWcw_y(%c@n&TrPqq!qIj8a86HrHS zNF9V{DF5xMt5KyB2}?pz)e6Ecp0zGY78GFh-M`{`rTF^Q`m141G}=d3Q%2}?o}Sw` z;x13bV2KU8F6Ee6(x<(3B*58YxCsY4dyS~B@DxMDkJ8K@d%`YHh@Di_-B#tqeJMW0 z^biB|CAs4>=l#l<_A5N??vpj$W{Um`u7oo7%JRE&o}0D2plJ+sYKJ>y=pG*9?n?}2 zFKSG-x?5xOerK;FZ)82Zo&B~)*7;8lWX|otQXpTqrMYBQ;bFnA;<|eX+Olw1(BXV3 zg30@a<6Qap;e}0Iv5hw}98CO%q>Z7RjiaiOM%NIwIa67j{S_}l^u3)PiLipHoaKBv zJ|%8xp=-eelZAN}D_;ORKMumqVdnF2KnkJhti4W%UDY=1U4d21UW0iQKAX0|EUH*s zsi&Y%*yL_4Xeomg=)8>R!vh=+5ZcAb zmQf<~O3Q9!L5;=@dL`M}vy=RD;{M0)P8X-p1p`?%lJaY%W!< zhrIW5?hQWy-^Cx(J-wRhOWBQWSfM1VZ3|RWiPkz0 zEu!ms#`En3Hhrl`6Ls~u3bs(Ta{I>86xaGaro`>`()kx5ZmifiSLXe@9KBF4%Zi{qfo6xD>z$@n*~o)1+CmVF#&fLh@SlGHQp z9_{@hTS3pry1UC>0vH~>!G(~7&3i14COX;NwfmOs)I4iz8nNz9YwjYb0Sm$m5LT3M zR;6Sj96iS{+J@e=OPX2~MFds9RQ__g^+xG zPLDR8+?p%tS`YBJRLn;Y@cv0FuribnAdQ$A+OEQKHh;9z=sZ`MGselS0y1|06U^o)PwW52mrnBZub!QX_rmNTH(Sg3_BX z>mhE`f(ca2<54cx*u|rOCOk6sn&ckFS(&MTnXtzuE|<9v4VlasS8Z1}UEhUguM}y$ z7}v>d%HGvh^$JkN&P_K1+LoqS;zLEN)cddR2To*bJ23clg~1u`caL^9&!Q4|gKP@I zXsMjLfPY{b9)eb%@2&Nry7^NYF@ec`Nit*~Fumt5B}sYUz;D{5W#@4*1p#9tIN^50 zi!|O&vLAQGXcI|@&&}GJyi39wcn2W8;FCD0!h}&m4TX#FT-^amX;y~M8cInht?|_l zopxY*1K}RZi>l$vIO_gtD*~Ow{AGc&>BSlLq#|0{{lw}ob1R*=y&^mR%<#NWJWVW> zzi`@ja&lr@m&Rwe-EOV!?kr0>V23Z%LT45OL>@l}Ia>xFe?E7Q?T89Iq9ekU{FHg(eO`4|Znb;ksUiU1W&D7P+<>2xC?jNIcqOL2eXg}{BngeS{n-(GpjMSZ= z2JbONaK>o(>g?vzr|D6$q%Lk?@R{|4zs%(9Dtt(Df3Q@1`nmNEK^l+Qk27lS?(6e` zDnv3xF~^+#*_z-l!0d-CS*1-?U1G8~9pI8-#)78l&#gDv#TLDl*&{a^pMX|z8uJX) z?v!d*^{njWg;i`?GFHPs=aGoconf@;`d{dki@pL)g3kYsi}pWnmYXBeYWh>R;rVPQ zUosYWC7O@7#+%j#>{T5uZ9Zqw$IEU#7s6J;1KtgL5znAgv$&arL)K5h$7*tqW@xzB z^=?%j`r?Pku{Q(|++3gCy-#)8(md4sn{_xfqy)trcY?8ry#&*1jKcCX$BoPW#h;{jhsed_!UVIm(r zReEUKm_!v$DOA9hS8>j2vXU`jcH-GNZe_A{T$Ri(8vCke&U8`V}f- z6@~8#_lulJnFhjK`PS*YDM(s4<6xB-Pxvk;(Q(I*HnYkJ6LQToR&$f6j zYr?)>%EG$%J(!~fR_wR4_3%lhk#SPJii)__>uw+p@ONW_ygevyDA9>S6a3ItOTUOx zI7SpU#0kFFy(s|{t}*ahy{oA-44lgpZ-i=1_>43+Sa)m|I^OZ_^sxFskTH5G*n zjsH3SW0`?(Qp93bw4-8ueJSo0cjz<|SoPg->M4p78{vdD7{dX^on&JxuFRNkeK*hU zCGn?cQ(vBNQc=V)_3qYpP5fIHSP^lrQP(=cI}*;PrUS4%u$njj%dlbSzZ_-EpEEjPAA8l^*A1oWV@BD9h@6*h>@{PB zRZ)}joTE6MUQ_w7oD5yp$T+}wfbY;__QR`D>2qfgj3+?y&lBpz>4s_+^2UNn1mjVJ z<8P~}I4z~yYD-c~bvT^8B6v`)$?d)RjagxNEoX{O3{f zrk2lX2Y6s#eSFL^S6e!cYTpn1YHD@W=b%RC5^s#;O&S-P*nJgkT5h!eby*&DT9I^_ zj~Kn0(owqajO*Q+(qNSI`b)B7rX^*}a2EY!JW>Ppcs}9JVi$9Z4zyHPL_Z!CLTns* z<_Kq%7Bp*i-Vs>7N33{ zCuu2k?{X2`nBw0l#1a4Ks5M_NiCDkfndG%8XT#?ec79O)!_UfeoE5itQ1Oc2`Np^! zd|S3ZmoHCY&^H;IJn1>_#NlF)tI}gLwxAB!jE&u|p%!G32bE$9SHJD1sjA}6S6F2d zpH{V@NXRdhzoAvGY5#1cYoP&`N6t#s9SHsm5Vn)gQe3107{Twpd69X}Z{)D~Dps^K zUSkw^Da9!F_a+0-=RlTc>T_Zr=SEoN~;*Svd$Lgw&)H`f?wvV5M7Nh^lNM z@(*5x?%zcKO2E6dhbVawE&vfMyFxflgraU^9gm>KX8!2&$NliZ7Cl$*n_lLz-DwT^ zl}&Az>lWv8s7_7$GK*GogLzo|%0>iSTARcsOO0DT?Ypy$3DD^-u86e~JW?;aYWWY@o8K4)~yC?pdImR|hAioAYEP@t$EB z1yeziotKFBJPBm6U-^7UigH(!!=@H2RVg0W{u*?XzVc*-Cu5dz8s7Of#MyiUS}^sO zE;*H6TaF(bW_;>@Vlu|b*Jq!l2nT78AC!`G}DT0i|`PZbDj^L+QXxK>|upd z*NrgSS$C0{xDH-}9fQ77`!@A#FtX_y#=>{5&^ir5aQabLSo+~+8hv^O7#!b;*5o)g z7c!BDhtJ+V?1HddwL2!7qk+wu6Y-&|3t%hl&BW*KU3y<$5z&2*CeoC^XNwiXUc!(- z&kCS@&)dPBVnONG*4cbv-BV>;tm&!#AY7eXFjD|BSJym)h?XxlZ8h%}y9=nW)w^A(7lOMHL!hYth<>Sf^u#yoplbZ`OY+H2J2lt(5QCg;zN-hocVDVc=!tco9nwZWzXwv5!0>E(plx~Hd&u9U^orfb<6STA&&jur~EC)*G zEEgJrokuxDWoE*|3R2U|n-w=68~d@iQp!~ra9#OjAKO7}84H*~`&DsYamEa0Z0Wvo-*iKr0wsR0rB2Yqkkw?a9UFo z%sXag&AeQufJZ10+jE2co?gDJP<-7>08;eu*UN(hNH_k@fQ6)TKA*ro=Y($Ton?N5? zQgi&qY`L9zT+*qnn5dFAZtDLOtt@}JpruA1*D=cfYkK{tc1R%;@Hfse1rN<*PKck0 zJi)Z>8!}ewQ37y|f6=F&p6`mqg&ss*j5YBRZY51kuVrM74MuhKC>3Tb2ct`an$~6W zZ7{wc9)*X;{)dSE4Ktg>Pp!y{c*nxWzw2_L>$M#wPKM``vNq3kTAoTmBMQ*qg!7G8 zh6s6CZLTY>h;jj?^TbMbcA;gJQOe7f*)J`0OZaF^?hDP=kJq;4i#?ST_Ze->+}7Px z&k{3U*=_;T?F8aFj3KdOW;k#&@Ut(m)FN^G_L3|h1iT`~e)MRM#g+AE6DR0L5<=we-M+ZLr+#l>;=)30No2wQY^lWfCDO_EX zZ1fvTX=DrU`(uoqp^;C?x7Q*+Z+rD!7WYo$#lRfOHJ*!~~C;re@X; znuOPqLOnF^3F$m`g@SuV&;aM*8xX5Kw^w9Iyx-c5~^P0Tgp*bf!lZ7qm(_F=b^^t6z zD_~uUGa{HK?WpnO$(B)_uwM?du(pD?+p%ZwoNi%vKuwLLfW@(%eMNTeWM_M!D#L5J zDy*fgY2o>_#q~lbWmf=Bz+~(Vl3|*3Z|AVi``leR*!Zdj3L5c^J<27!+si9*-|Y+! zhDT?Aa5uSTT(#%#`GcLqX?Q(mQzjffRvS8|=AyD-fPoOK3R8{2S5j>B%#iW`2b-=6Blh|l;~Y@CAT+N1Ua-n&%%;M)3>!Kn65yRwjVV` zt!RQJJet??# z2d!0_DXN0K(e#}|?|GsS6Jr%7E)%8Yng~UNrr(^PHf=$SA=S}006?L4fL{`efJ9{| zT{t$B?_uK|k5-7-4iSVc4Zt;5uG^|pq)y{?`N!mZ_}HY;xudM6dva4sPr(AWMiR?VHO~Resrl>CNpxXiyUK0 z3Pee-7!CFlOHjEq`(U`%8wW;D_l!&vbQ#5AOwFt+P|Q$3dH1z6%QR*PrtLFg5};g` z_8p>d{=@aOgombTtUrm?Ge-3mIun#D$cLW%oiq4l+NALSDC;X#(r*=qn;2(5A5mbV{Qkl%j5v1SWv+NBX{AFz27s3rlF`gkb1q7aOMId6Y0SJu^)3 z9kQIq{jC~zksgPdwtw63AvSv%G1G=Wjl_(U26;AyouO6nq(B4hx?&=h%A25cA%iJf zDcrWuvE8*2r>8rGC;A2P;Waws4E-Df)!z@PB*t?!W`4&h&kIaen1%%m&cmj~ zUu^To!ukH$%Bp10B4#CDKBdHth_!%TQ%Wj;r*wPU0+*1mZg5UeSylB@Up!mRNRG6u zN7i`@`G`!_Kd77fA$fVZguF9OwD#pr6?hBy`TjQ=T_sS=sojmIq{C1hXs~pD|orx(QnSH|xF*es)D_P}3fgJ{6_=~A&_QNEbZ;>Kk@Y>p0 zTO-Owa@O6owUaAO`0~;Am-AxXyAbw<)#vW_R~v$(HAd|Jb~6tLVkf5TyMME4`4y)w zJ3)yM<#(pWuvJXluMnF~WJwbP!d5V{@R!kpanQlxkH$mammZt%9L?Da6}qF`?3$v5 zK}b(6t>yWNE@wkFhWpCY7`p-H zMj~}CX7ZcZ{>Y0PTB<{y*tJ0{h5KjRtv=+r1F!PO^1Ke>BTiX3;}9KR({mAuFV4lU zhx158qM~lsVbv%{N#$0ryHoQNs?d<_mtA3DVZ1N7hQ;Mx_y5`amY_R?zkg`mu=XNe z#F<&-!?5hzvww6nzShBy(yjRLQ?8Ib@TdmouQx%D_6g@1f2=)zy!E)9A@ZhE4cAxi zX>O@^b*!eJ*cf)=1xQv+B$SVAIJZqWnWiGmLg?;vOvmud(G;L42nu0;Uy?SiXHiw40QoR1|Xk}mb1fA2|tf8I|6G4l{1=0+-Mjlmq`H2|=gHU!1%j z`7W%cqX%Xa%qS+vOZLYqWDrfTC{7|;Zn#+dm_ZOrlk2Y`t)gL1nmFON#aj{xlPA)7?83;7Vn`1$X{;K8fj!Hx9$nLQ6ILWgV&Q}lFAB$!7 zJr^-4p@5RsEe8V&^?pPY9@3!)POTHhR^OE znNSG2_dUgNte$^E(Kz}968S2AfA$ety%U6KsuYM9TW{sR#RI`c6+iVh{t0B9;+g!| z^$j#OB#*l)?5ai1knY7m-E9R<{pWV|J|Ak?bALAtP+b%xQx&}=aaj$HwOzF%Ng4^_ zf0NI1nKz#}0iOZ|eU?(PB`_hb_a5WKW8Z z<$tbUDE}7z_+gYu|5(wLhB1o1N9k~;`<=8ERY!R87rS3ws$2PSYE>T3;@DD#%GOdz zAbMD5hIyltBO6Nc9hdo)7 zm!aVAGdanfTA{K|-XFqXOfl)WvBY^*v28E208fpMtLl>aQw6y*B){S)(m~K0>eDJJRBT~#_b?Y=`c~lXg#phm$-xkF3SDaF=1R$ z{w%oP2`c&q2H+uookF$DAqFVH>DaV1@KC(Nzjf=Ix!BWu^HTaFUpb7hl4^lp#NhrA zSypd>?o%TQKd~58hO>={6ST$Dg{7n1fQOZ(sV96**;RMmVPDQaz>k>e=##TwOU%S+ zIkxG@3~BtbvxR+=ijh3(N)-<#R>&RRbdU1Yo%WH$!O1DqxnsHt%dmf!#=@do-Clb7 zCsC;Ez4P8=cbSKLK zmbVJd{RIJzwd~R}&*MilYbk)~vT&9Co@7b|gh*=F?zvBKA@eyNv z{m3c6YOwD0Ph_rTY2;6PC%KHyc>-L6iTkG+A_@{4Vu2a}5p! zk-`j2(bmt`IO zdaakPRhI2GBK=qHe@@F%wR*(7R$wolh$yzOWV)KyMFC?+u+qAR3TSZ9EhpJnV~hrw z^@6)xgU{>hGedwPHh&ts%wkof1WTVr+zN!nRy;(T^dQknx+2_xn zJB}W#pv*87rB)MVsF39QyN4b4E|%Vxzi2m64v`m1yCu4<>9tlf*~P^xtq*rLP=}iy zAGF7t$9)_Hj2Rx$D8)tD6kc#Pq3CUea=YpM?UmzE2N`QLj_ad@wZ4S8M&JgjCKmbY zG;)gaQwF8^N1{wb8VkK2?zufKZ38yIb;wRyzs&KDf1t^}lTu44$1EEpn%_92;<3Re z-z>g0<7(kAWM2`lnBLUz!1c>eEM-By@ITQvfwJpXGumRtbE}%SR+3qB_kWd z<7g67*Y)JNyWJ2~ha?091kl)dI-U_ZAH0YYmh3=NsiIz&)aEHUKB`1+u1*Vw`2V@< zHjC&W7M-l4tn>3jcSkLaZ1%F2=VsiW7JR>;Juhp1ru64)&+dzTQ=w9ewGOuIlE~3> zFrDe6--$XgbvZVU%@grWlaiUwj=otE%w2m%k`9CaPH4nzDPLfYEx znT;QWK|!=$i42PAavUv}*>HB`qaDcYQP%|Xmo!u;6v#$u!E>9b4uh|%y^AA>ZSAI@ zFIQ3SM2R!wjV?Bt)h6N6=^}0@MeeOwRfUlPc^b}hl+AK^S!h{U(~!uGTysVKn1Y}@ zSy2v<1iaV+0y&h3$2b@I*y}-1KC#TtyK^d2|Jec|v3>Pogcux?ccTWJiAlfKk)V|x zi!M&0|9@HlXh~z=mLOwkda_-y=YC@EpAFl2$YE-}zp)8#$=v1)rU~;6@(XTE6cn}uDJCsR!opUr|*UfZ$--b&^-x>T_@OQ8h0kJT6$m~(e{FMb@c z*Ds+HR&_0q{lJZsnC*Ae)=nJ+cA*ZQ&NE(J?>jiwRu(IGiSRwxx#MX|lYEuwe7#-B znhwhPJ9?X4t2RvJa_MmuYX!>ogc)(vNl7|_AvKJ00zV@n`5}Y5KlRgS<=WhTw8yd3 zWh2dH`}I!Y0a?w%SjPQofgYowohWbbN)ejr{hGZ5Rc%d z2l5CxNb0W#2c^O}(CN887vWq&9%?tN{zG3PZ#etOMUoHOC=YzGXfpX0J;wb01T&^9S+{web9GN|4>vZUtFRda$&uug1=1? z`Q9~$@Z|?dC(Gy$>(^qENxd%`ud%}aD9EP(JC~?vv02s2#-+BgUtINb4V`wMI6tSQ zEnkQA9j=H`ssZn3g)inmg_3aqC&Z7%W-t=0E-M<>lPyV}edpg;TT}iVIH$|N;;$yr zVjbF~swfPI5?$AhfR={(Sk>0Cw;(HB#@JrWBa${Kpo6*T!w&I=7h-yj>t=n( zyz-kmdO9>RmB04kJfuXzuJ11kb0VsaQQt?+3-l!?5?TXOik~Tm>3P7}?=YD{aQQbr zE`kzbfO}-9CDWS_P(@|CGywigy0F=>i{Q+sIp!jmM_Hu@64~^u7@M{+C=2nd`&owA zGvOUSsbi znTzh18VVmrR9ru5Q451KsrNj52^!ybhq;B5Tz{q z7JEMJfM;CR{y=xusm27)Esh)`BukdmU;%nU)}wonCDM@V$F5h%#orM3KE7jA51;tqSn~x z=NtOq_bZr{?f1mQIvqgaVPTkpxJD$u=EMZt^gTl0=p8;Mrhg}|?*za?FG-}~KEV#@ z!0BJl5&dXSV;`~hf$rSkvJ;Nai^0RkKboEd7s~Uk{gWgaW~HJ}^rC0R9;@b<6edG) zcZZd~Hk$s4t};h)naX#peMbrzIG!W4Dh>f{JlJ$IA)qkwnMUrH zso7+%aP9=}4syp<7~!xhoQ2wD602}T=Ll*S=T#eZTS?pgY^g%&5Q$HWyx`T>=sX}e zeP}K`XF2>$9M5jd#(E*O>A$ElG%kc-eT^KDdFH?w8#*Wy{G5I%Ut1c}YVJr22Z_jF zT$X&dvC8eWMpOHT05am*FUkA@U*)$sAbtKlqwop-hiRP(%lSTaMi3`FX);kg>{cIZ zN~2C|0y?!6MZt1*riU3y3a8@b?@Y{l-Trh>h>^tf1QDxKDfp}P=9NFk1~loN2yP)N z@DX?hr^z*cT@a$LkcaZ49S2CP-Q8QR>*j)C5XgSy8Al!Pi4J^1Q@QtZo+sJ4CK9_N z;jg9X(}Jj1imu8ry!2<%o@?hs#S45s!El_7Tm0=iE4Bw&00|oe>5u*Kyx23N=K(U4 zBT}GzY{(Jv@x~_q6MJ-z9IA+J#j!C4&c^#E>lst^t4fJ%zGyHk-8{l`8#pw|4eNR1 zRkzflReCL+bF*`TJ8-#tm2MH@}zrd9^u=DC%mw8JPVJHe;XI)Vt?yy}vBVi=2Ku1H$u>h55aWjqqo#_JA}8Cf{g)3U z@WjCbeF|QM+(uLk5o#wbeug(RS*=!qI8$~Y^SrER)s~1@Vh0V%2DMEIVt+*@%|5Ld zKgx#eUFRSn3pmUVKZO5`wAp**h>8U14C9jrPil0ouoyo{my-~^b6UpdDL+w2ApiSs znK%7(o~GIFS*(yxOOrACUSF?~)}uGQMpmKTDwK#>BQ^@h2MK5tZe69wB$XbZgVb#n z&y+*r%MIBAp)erCAl<>MA}t9r-8sT)<{?wS!#T)iK6sTC*Z~&`-uw*|PQwQEQen9Q z;v`ADirf(UC=@vkB3dG*XTctBB^ec;U$Ve$uCUfXB#FgFw;%uVCVUVQsiWf!EK$>V z28X0kz^YwqB3}#h&~yy3X+^anEUtURd~oUa&rI4OjM`lt?~x)2HVS~JBDZX%xGT|! zUK|5wXZ8lcG1n0|u7vdedQX~&AxpN!wjY{^&p~!nDqoB$Mmq>m8}voaEG_ce7W-lL$K*7=(X^_{k94sdo4SXnxAS=6 zcg?|@ku5&M+Lzl|1r0@=pM1z(BQ=PPokX*AE7k{$y<3d`l5pgMJ3TYU zWOY{_0e{eh^W<IF(+dCl z=^#T?x1nojGxaNJ^TdjnJfwG{Wu8k|!$aD|ga5ME8UK@30asr>2p!n+Rm6pSAw3Hs zhdgFE8x|2~LUCffO*hkeBM-~Ns*EzIqL8l}6{uHPU6o$})vnJ!FVr4?DFWSUk8nDH z;*;v#Gt;R4rX?rAr$)Lq6rvotUCN5{;+irH|AcX+T5tB{Mrh(0)whV1xl>0p=F_6R z+;|~1TZNAQm3 z5S-$>8RI~3ay^CZ6I}&=ze|%zz9Ra@2PFhvLqS6#GcU{Y?O|5}QYcr@>yX}Mn)Uqd z=Aqrjdfx9?o-YDEWO&v+DSPekbc?Kj#}$>X?0JRwNbql>-8}!`jH9CDLvR=y*#N!R zD-raFIKX)Jw=51OJf_`nF1uM2KuwnQ`>%gOS@#0Tf;+xpnGJI~t#Kx89Xx3ZyzjMG<%zJv7R$(QY1smM8>GimEtBu6K1cJ3%HOIaBT9O_c zE#5MsClC}utqhP`Tjy}CTMnw5E!}F$U|${OMM7htrvV`-ipM z(?@x#6+^zOAT799RgjF@pc3be3JK701|d+K4zGIbk+&JuI*+!A@nHevDFr3J`tbgb_7 z=)f6?HPF~gbl&x#FGCkRYWV>Uo>s~Q_*Jz8QZaWNQapnL%GdG`BFbTqK2L2AM$fM~ zYbnEjiKP}pm-$Yp`kntX>b1zZVYWL|s>+_{tl|BG<2Et!0Z24V=|t zn+Gj6Mw-A$Jq_FH;4UL0)7a4ccCS-R4;knNPH5MR%3F2l0rinWV?!2O0l@}1hi?xX z8pl-G;q^|j2EJDk#d95x+tE_MYN(THltpFPe=%!x=oJ!($n2T>bdN9$ndM^ny0KiJ zG1s@xRZhjEqIq5Dnyt=K(P8%`$G!b+o^_hC=$2^EB4oG6^T7=bGv$);y#8f^fuztE zQc!UBs?ew>&VnVO9Kb%fmpn4EJj8}fh5=C+t7X*_c$M=BdUyNcV+!?N&q`Z|(@DM| zn2NR5XnK#fLBufz47BCnVnnhDKW?4o6O#2hQfqWz_bWuZ_RZTy|CX6<*%n;VA|fCa zZ{Lcl4x&x?1P)w~b9$sECVtPzC{Ibj8_Ji*q^&fdFD{u27r6q8moFJZcdltOoi~E` zdBJg&me03GQAEF0;MccX44o5JK;Sy)3XX7|et&xr+DCe@19t>!(4wNE5PD#O2p#kt zDBh1zZ`_pG`U`w+AhcF3It}FvaXxiw|5xNz*8}7hHOvZ1(;|jWcpPN$7X`m_f`O(G zUdA11;yjA8$V9ve=)aMu5Rk3VS!@=n^1)~gLlvOOfPB6pB4%W_5%AHae3M7)t85MR zbOR2st*9S!6SoS!YVt;S+ni6gdT=z)2KPGjsj2SaaLS{cRk&b*>n4T6(M++m?IsFo zgCb?Dc~3?JR7mrR9jL<%41}vy70ZwW_R~#H=XZ7g^_VSjq3g;6H>w)y7nm-O5W4Z&yhakf2R#3}REdO3M#yzO;=RDn>Q@JZITe9)BhthaANVVZq=h$hx zU3RR=@g+;Da1`pL%=PKvYbp^1C1chLvJsa8sOZ-8DWW~p3BM&%ywFE+E9*mft&Vay zF~M}s+B|7qK2+FWW+IqTA3icaVc2qI)`L;PSre_z-KHkcR{Um6pU$<=J<>^~qs7KXB+-f0oR7NNgZpC;&0&y(<_pI%0<6{ueBiPzeJS>eR zcm}R$`2K7afhyFB%+DV@JkS@w*ZdW!`hgtiO-)HzIGv|uF8p59*w}~@2#twQB8At+ z*$S|S?O(~u>s^tffIs=gVG*Y++65jw0IMgEn-E+n zJWwMc?{W>uHFxOZ@QY)v{bBcQ{t-B?H{(25s-mn-gYno7?qG8G59+ImQdUtp0)rK` ztDjS?|89Y%FwlQvmDw!ToWZLk^0_KQ=VX0gGcCUhNk|M#5%xR^`#&$gY=jfLdBLFp z_3{J2h$asm;JA4I9_7J*>};k_j2zf-%)X*lm)Wn=MmvfjVbzI1G$}eR5FB_)xA9xy zq7g=VX0z8SL1-lo@N9XfXqWePc>m8(0$x7zMIx|q?uATCdj@aFz=Vd=QDlMY=G*4< z%d&@^ma+MlSR{nySw+LPbl5|BI9#4dM1!O66B`rexnz3s%TA53X9H*(S?=_MV$9`e zynGL~jOn$mgy{`h*W~W&f@o4acKvKY%9hvxHX2U8#Hbr8%?_l*zaB7(bG+z)LD9C} zf(BfkBzwRX#p$$*YohJB+MuAOK-KKIWC~lnr{g{!e|WyfMoc{_njw{oG3?`6f%$`# z&Ij`L-fwv_7=TZ3qxb=H9E!(luCsFEe>gZelFh6$0IR`7fuqp1E$jmL+jhDM#ywBt z4xKnpsc`H^Z98!`inv9S!DxW*iv|H*$`It#sK)f7qNzDKH4*q_kyD?o3DD)&k?mLf zU#}#^e5q)w6np59MajCrBrR$;gU^N9ZmBMCa{@K0qNi0ft%=hySdP^ocD_tPnEmhK8R~~(Fl;lI1mY6$Q-~zGwew!#pPa1fJM^4{ST<` zl(8I`3=phI)+@td z(GnR%;zbqYrOx?g$(t*!&gLk9tjujK>kUz#*ihhlONqfRys8E}8ci15h28 zjyy#RsVE5Y+=-1{u&O}+in4tLZT)D{Ch#gsM9Zvf@E_$f&xF!2prXTMlKZhSS zGk;R5dg{zJNQQqV<@J}0yc4q>f8BCz2dI8VJXd&E^!_)o@y9JWXVoGtQr!3pkLFQ} z^rN`)w$Cmw-atjg8GIlxuyw%0CsgLWi7`m!lXvU|RzL0mOQmj$#3aRjgXMoAkCstU zuC#qagkFIc3bcN*E+JPx+bn(p)AzX4M!KvvHh0R{$z#Q`nB50klCCX!#6maxzNLD# zeU*iZpnK1_tvBqe=iZTeH8lkCY zgBS6jWBt+@YHQ;I^&D!cr1Xn2Z!*B&QSsf4u~|Fh2d%F*bS~%Tf7OV8RNP+wNTz-* zW;Puk!>6c`-v7;3 zG{h~;o=y!F`}~|O%oQpNvglzw`yw5=RoXwu2(7+bRUicCp?MIW{Xm5xMQEE{yWaY9 z-!@$a>zT-E&#fo~--G7vQJ9mT%i(;rBdWq;W|JhgMh_844M~P)TtLa!qQIDXfQx}m zBTpE+<$m&~f&iV!E#@m879d}?z|$waZ?Fa=%>g^DkB+~JtK@5hs%F0-JO2cydDR$3 z;d7TCu?|I7U_t6U;Oxsn9jU9Prs{Y2N$q^w8_vBRsaZ(1+3ibc*`tBu_`dpm2-o)L zxPR#83QCcJ9Q**)&Zy@h)UT&%tJ`OnEhqukUa(Euy5TuW=*svI@~&9m}N#6?pSFasYh=Su) z%KCpHAQ5y+Oo-&uUX}U%Fumm1VzJh*c}+9IeWiH?!+kVN%phrxlCNT}UF_v`RSE1n zK5h|5{asnqv*tDF^HyLSkYt$tGIRncHjsbx3jf_$D7$?lXP~LVXFe4PmTDn>dmt*; zS1(3QVFhjVr|OuP`(GS-V^;o8Er}74m8JSZGo%C&-L}wgmzDUyOGT)_Tc^;5Xx=st7rrv;0AZZ7mk_bS z9ono&nl?`)r@C5RY6EnRGVcIXzK08UmS{K>Bo{?1XW`KcjwsYS{K^R-jj=cGexj%# z#QY^*bo+IaW}ZSFD@lrrnj$O#$CfYLO(TY(^i!J6AgN|ID8Y1kG8ZGu6j-z3~PL&cO-(_dZu6)IA1VZfw z?fQS}y$H}OPf1ssmWSUUOnY9|GCMm7pWnOojvWPE(V zuOvjA+95NIr^|vY`Gw(-`JqWs##~2x9TZ%<^%%c8wW9mduIWf@OcH6jc0x_2epQ4I z7m{H$mITJpW^MStPUy4|J20V+L}c=;_ybgEH>~+p$5xS*9JGF7CT-vqgSCz4DLn}# zW0G}cWx4gxw~D?HPhGAE655c~*LDQYJn@YFBg0$-)!`xqT8}?mI<}i_BJ@9a|DLAG zI#!p?t1zAG@>{Y&iaj>ri5>m-{T4LD2YOwyQ0tm=bX4J{flc{54mxcu^TGH}ZFVUX z7d?2AT#Y2j7c|nmew;7r(?}b#tuyxnD!4*6cKoF5+_ydh?((<{M&FQggTr;wF7an< zpvmP&kF$P93?X*MWlu{poLrPo@O~Ih;$I9kbZBZV!4q%1M0^W(yxKqa`D;97ZJbf@qBDSVEncF{Gm=J9xb} zbn=r0GbCNu%UDhAm%M925?{kqzIiA0acTO=2s257uj782&3P>$}G8+yban6X#r2%fC+Kytfm_jaFuF^3T9tQVU&wRI|eE~4g-<53< zzto@L*@dUG&Mfo~FM4I4!K)?n^#6JJ`C6^2q$1Hj1E&IA$+R*<@2L-b^bQhPR%^>d zWI&uJDj-tg6!gQpQ<$*-d-N!@a2}N16pt{twynFO*Ay<|`L*t(0FRoH`XTeHlv1Ss z!#ocCXEkh{zj#S(K}2$oxFO!p? zW42R)+8z;(Co>+UyCsaoo0=ezuOY$SRDY)Y-7oeTYbi>3X2PZLX&8+1;Dgvz+nNmb}0Yv3XA|$pr zQP@wr)R|(M)2h)IlB|lN?6|5ZmiC?MB| zNvdYonm88Uz>?fi!BkfUip!a84ND=Q3~;ANpv=NIY%-Diz#%`)-!rm>c&X^PXz-!P zl$xeLks8-^&Z#&2my*{VZ6>QOwF@?SO{g$S+ ziJa_yArv?iUXANbkh8@)u2EXpjvYx*uvHs9iRz83U5e|B((wuhn$(2^gCl_NGB1u5 zl4&PCFw-19pdn71$gF^`^!_Uf)U^j+(MJn*@?^BwaCtlyzmZ? zM9aSVkukqFyPy2tg~^er>%eQUDxCdqMbCdqt>LljVAG%{!;o&zG7bkLvYD># zLE<*2MDpZJ0q^<+Iw@(JHdGB@=5wvJ*B=rxUQM`gysK%> zHG%%VR`szSb_{prTfvtTpH}MvlNgPVtNl)*>Wc`EGpv&?Yo#FWn_IHKX{=lk_BL97 zPGhNpvUjniNbO5OL0P7u&??ZH=VpImd1dY-ZXG;Ot3vMk8YD%J@ZYdrpF6mSigP+RxvqpG-5n3&jC$ru9b64Z7-0?UYcMktWEeiLa zeEal9?-uK4x=I^=uA@;{kfF)jGPs%FuzwycWQ^yT{kQ=kHQ8_QcleD~lbEfdo#hFS zb*Jif*6)ssz>92gLz&f~9y10o)s7U;x`>Z0q%h$lmiU<;Z79|kMf)#_(cPa0 z;%LZY|FW|V*tsQ1Gg_H{I+96j!f>W1J|SUa`nG670Mk?U7141nxU~& z-z?&+i<)dc2M*7vE0uQ79(2c1a)iwWFu$O^4Syww_?>SR?5Ad@1lZ189)I^U#^eRl zAeATBhl7k|)URl&B4A0ThUBO7L1pFb^1QkfYiWkz5obJyA_cBWFR^|hlZlXgW}s>C z^^i&{RI6PUTwf^yjA3|x+A_l!D6$#`WUrVAoHMd|z)U=NmT>ijzQoQ27xd5Y>4YeDY&kLH@UGm@r`8)W#^1mt&TuQAK*g{ui+MoH^0{$eik`$O2Coqln@tJ4p*ec;_kMc_%nHE=FV^sT_pyD zs`70ANCqBVOZ60$7qZw+sj)s!Ws7Y=rB3~gHYjGvNa3jFfy>JQzt3`i^w?Gnu|TRa z>1OwwYkpi3_rHtR9jQIP-4RGo&V;Mv7OgM5SzMqUw54t6y#f3>_9<}$U@NM(*6uZu z!TzaP&$hF;zH;w&?HG*@FK0htNJ1u)gk-8;X7x34AEZXiH9Y%MwUL<*34knagaPr2 zxNm6}pkiQ}A^;d4ZS3Jxs5Rn_gH=Jt7CV#*xzFIDF})9^LrYE{$F3t7v`NEh9t&jkX3)v{TBgCXc^)4l7)&ekYcv>w^7k~1}X zL12M-pc)^;;V(G@dgrePCht61mjdd7a?@JX&M~O*%Az%Xi3Thmr*83hvT}0948TiZ zS|mI15W=0)2Q%mjifN-cJ*Q(+>v*xSR+1;)?+sVG;ms#r&<~P`h$wUGcFW?3(M>j9 z?tzy_K}7NGWF~+Mzw(bQ)^~5XA$ae{#&E%PsA5@gmapEZ&FkNG1#V5sXE=zPF&>2% z-(0l6L~^Y;p3xe8@VOW)Ox_vaZiyx?CTHhY@|-&!W?$e2KZ%cob@mo7WH$7lUNT#3@T7?>AY93ME?zVuP_mmmn%J+>dW+e9ZmWrN{Uv{F8-8rGYh^qjOgP0`_Q4$(+e7DJw`J=U zS_MJ0JJPuKJMk!Q6aktNcaDBDtx~LiUucO=6|BpKIj5Y#=yb{@+IcdyjI9h?H&7zA z_`+QAeiYEuJNtgY=!GR^#*^zSkUjOmoBD0FISly4#RN~`-N5hEAqCjlQF4pOVBT$5 zu={LMW1%*vm<`&+7=^bhRttA)m^KOAI{u5R6!@xlN^(ZNj^6Vy24_VC{1d!aPtf0V zwVZr}reaSsz!XTF?S}nk`)YQ3c7Jimrw$-@d^-mHO?lpbHd%8r`sbG!4rUJNrE|i5 z@IyKsLbRDzB*Z>^k%sJhEC)gojp{u^i*|T&hXOhFJ|CZ>>!dj6$n}5unD&lufJon_ zm5+W@9i_4VaIZ^(3A4G*9b}meF5PfweldUfAV?6RL48Ab3mNH$7+L;2V$M}26JwZW z(j#=Ft~~+$rwt&fXf69o*)*S*oPWdtycA2^J#l#X^{m_=lWO6QC$NWauvhraVQ z_C*0M1YiG63p@;x>FzPO^{7Prj-J3}P@QYD=Osh-c>#sU=a5;wmpGB{PvNMbyGyI* z>c<=d16}ktmzYYpbk`YEGuG1TDS@Jue576rJ3^WgbSdkmSQn`m55N<-ED`>jBOi zsD*LI!l5r$`(ES9NfRI3Rl=2CBW{jn7?^n)tDByFaFM7chO07KQcX*s{~l6yj@Oiy zkyE87O~b196g43)44KQ9?vGfp zuGtbNe%P7x;QBHCwE&wt&Ah)^Z~T^|;YX94eT$leD9V!|GqfM@0-o>xA^uzyDS9>` zM+$_-W6~YS{A=NvAhdKEa9SnF2)SM6pF9VzFcvUMP;Sw=s)rvzW*6L+4FW8)hRedB zbJxpdwqNVnxR5-37^P`5+}G^N-NQed-w0OPseVN^3I;Vbdb;o?^Q0I&p68Cf;g5>w zuJseX2eXGw&!4*6N02%R_r*L?L~L!xtJS}7%;rt;x$N?drs|-rpBf~${?vbam$1Ql z&hS#0wy9DLypwh{33sJtkUIzL$(Pg$@WQU~w4Ic9+rqo6D6?zmUg*lGysQMevnmvm25tL1?ej9bG@7XI2-< z!VT@PW~vTd{h>&i2jS#-FNY zADq|y-V3A`2U6P>%WcWUi>1ocWiIfS(}CE*6zzGy&rsV#<45&A&4XO4F*P?CW)r#l zM1QAL%{($qr~pDg9LBBrG~qm3Hyp*@KQ^0*Gwkr zzswPfmP7Ahs}g#WPoO%&eGV1tV{-`Uj^KWkjzlMIM|QmY z2;h$q*)dC%V;KB-uD4FL96ZgvTT_3YeYEio(hd*Kr46{>4$x$age^ublJg=|L$1Ma zvt}1seVuvZFOL(>^~KTSt;lKOb^3kv3TRIf$+MiXT$pJs69!Vvg|J)%Y5V#1Q^nw) zoD829rT_&Kc*tV7Sur@XESI3ESan;$0K=9_ zQ(?&U=hNAK?nk?PB!BPKS?i-)6fo*6{{@zPK> z>^ORyDTafSs;Z;ii%7hk4j9*=g(sy6s3DI-ONn)aJE#pEpi3Uqv);Piyn-u)`fe&&i zI%XZkuyf0@QNa=9yO6SR(bk|h#Qd&9;vjYsyRPK-XPQo2K7U#ElhuRH(iBN=(FhCm zYnGnP-QsvBNq!g~^9x=d^`(x?dY$pK?P^crx!L^Cchv6zLsG3?&?$?=UkFA+XAl+4 z{z$vi@ifYFu>}SXoqW0`qe91p<^H9oCA@3#QG5DGqoe&H~?MC$$^G1eal=N>1RjdB8f;_g~ zZAL|Y_|^HAsGW&8F$>*3^@B~O0?(M&sNrKUDb! z%~bvXb@xi-wXDiN6-wM6b_!>^vjnP!S`RgG#-SABs93P}nk5N!kVI7f9n!Cm=Q`r> z=+}+D=xFx z{X#SiQ2iSMVy^sWF5-<%Y@5QJ4}_5nL}nU*%W@luuY8a)(Q?J7Bw8VSJKEMVMtkWz zf1gTnPOsGC1W${*p5~ZH25r0yv^{w@m*~-4zIwA6D{|S?^F# z%U|LL$Ngfh!R&j^3Yi6qO!T43j6t~ApHmmUQWmDKnyimK;$;MWnP$%tt`vI$E0ewo zJ?)i6`(SG-CjzG1}G zBmc8MY)=AL6dSh@jG||Y$zukGdQds8H`fo#zSfxy*rmCB+GjbEbLT6T%4qh{n38L> zFFIiM>h8sQNB9<#?n}vy_N+T7y4kfn{T5%$X9G}`_;@|%^WG1#5R70K%y`9wOI+M3 zqyY2rB$E@K?>#G*_;O}Ak$%<1rGNk{tmeD`ohf;5kGmIo?kT)Kgu5V>gEuvyLH+UbL(U8fhtf%n{hB$cOX)(^;W`TM-iBoi~M%q5Qkd2b<-Ot+Zg>*XP;;ugpq4v~XiyY+0E57BIr$qNLz z^u06!+3$L0D$Ow0(#b68F4PPSmkm13vQeXu;A?kS$Vfz;KNl9s!|nTRCrk~JYGp4D z?+Y*sR=L<0SLy5CM{@j~{mF;T1o#LlN-=nVt#a|B37g4cBfssvhtR-eDj+GO1rf#X8dMRri z78y9isS9X{_U6AJ7otg}q41o#*Mf4Kz!9D!Uy1@q1%PttJ-Ie(k*WkdX${cA?S z#>&Y!5RJ^W`f9Eh8E7-c?!u2K8$-_oMb~Skbqy9P=`z@K#`hK_7#9aESOE%Y@wwkv zZn(6&UFzv!uL^O5|A9C`NSqFzd+G6GtY~r-aqCSl0n6ToSVF>gUX^^hxL|6S=j{8{ z4>`N9A()7;bd;gp#LbpU7WW5rhPi5e(ghn`akYW-PkCpeBJUa83@6`Mk}XYx4q*=c z&*w(K!MZ5fRZ(j7yBE;|FM(ff=&KAa>6w>wb#(sJUgY(cPpmG>tLm*o*FIzRkKLcP zX4AJ`z5&fMyLiL9*MC~7k+QjW(&{pDQcY)Lz#}0Q_6D@MZqChwx1J1=N1&7-ie!x_vrbpx1ps4f07pA`6J`7WJ%5I{H!~sjY9xOo;deJ zrIn8sCbYRm316jQ3#6-cWNGQ?iOUH4Mf)dVOEQ-RT)o~>RW29nFf9<4UHPVirG4Pd z!m^M)HgPap8sCP7Nh~gWC}>;rH{U?$2f25M;+m3hiRU0iyq+J!u1;Lp^j_C3LO`|+VYQptDSOE#eUdWs~$o_2@HU-wxca)jQ7rq zy}cLMn3(6KDIH(ONniDa@;e_C-%9SRC@1d~Va;y7J&x0C$WQveY0Q6iGT5)z9?C>9 z;Tk$qIo1<3vWv*Set!5+nh#vJpVKVAdtU1?_JnksH|zyVfFhOFeqD~ z=P}2145JKf_ABL*iv(NE==HW${X#^_`J&uoHfOu*mY_27=b2{Fub|-!zy%$B6>ZUt zWY%gPFnw6_#P0{djfkpE>n~kdPc8xHEv1R=zGXBS6Ej26iG{v`Mm;?OoBJ9Dr!7n_ba%=O=mGOrlF<|g1w#G+`yQ} zR@Ron84H+$hDXH)$fMK9hCmxXcG5G{6tI|g%Tb0Qmkbn9Au7n1rnuM_to*XBVCEH> zhjZ3i-l38-MwBSJE106C&VS;8rABj`p7|nUd2{UMdR#9KiLdRX%?y_;^{N-_|GMAS zRujw+&H>zW48cqh!aur0%Y)`bC|_fSZ=&CVGK&WhxHuTrG93I%?k}PtF5+;#3hK0C z7fJJIcJp|+<19X(X7)n2#0yCAa1(#U4?xMR4aj{a@@q9AKiffBef#1CjVs%Q<#Pk; zomgD<-4rHz9edI5VfT@2QkOG3=i@w=h|^!_&Un#mk@(GqAdCOIMt=0N-ST2)Hx)Xi zyg#PK>K>8l+soO8)|Euw+HVFvKrGKDafl|PyUqY2IXZw$uWqDp9(zf4fpGMm`&p2i zUZ1Ag1Xg$t30I3B5VelCh{Nu4TWmn|#NlU6yyeflH3qF7)cKW~uZY3ak?|)3wVu_W z$n+C$5aaNsCld#+{8*0oDw9NPO>peZ&5|Epir~7gD@a zaNtTLU6T|}Pft9(dmEd=Kq1SZmO$jLa0IzBiTAg+p6VAQQ_uhai=d4>ddE{STpG3P zoX3T+$cab*abQQd+h@JwkIBjQ*wVq&9N%~1fdcI=pNxvAhnZOeq5K(7gFjB4Wzumb zN=j<-I7G9Rl#BX&sBq`p&2DBkg3H!jO-4 zFmBQx704?MZlv=+)fyV8Q$X2lfjjYRPY|t^%yS3b*!VjN0&3wn>^0K-ZT1*l95$cj zfVaxh-yIpu#E4L%zMlGkxr{UG00_6&-I{e>~{dEGcH$t zqO3~jBPnp0!bkU22uHe$L#0e1S2ZfaQVp@U%l}E(6256=zK@jiIsUVd4!I8}CRoAz z|EsqS&*3eNC9#BlLmmCm4RZ4s>zH}IyStFKu^w;!ot?%r-xu%mQ#)kRkP;ophihB1 z9JnWT8d#C2-KY#laQu+77bxGa7P{7+ z8A{iuJQ~dH7E|L=L)k}6I@(skt$5i&a*zGoyY$p3+C$g6-u$bU?Y71C3$E(qW5aUL9x$+y$e);q@Jan;+LS+=4$RjAo$O0$oqjC4d1%NLotf+VqQy z16w-=f@0!6ajMK~P0uJ_N6jQj?7dsNb&pJ^= zDe-4q-!uwAp#s&eCXws1ZB{bI&ZAAMPtSnA_9+A|!sRFNW(8wuRt+>e139<%CwI)7 zzVkdcG${93$y(G_U=m01>AIj}MM}W^oW?v40b}6xi=UVl9bRAVIMFa%HDnNLqF%ul zHQZSjmRFhS{?aUG#Jh`)+!w=dVINxRlGmG^6%|o=x0&x_vrT^E&c_~OVVziW$kuUGtPwq0-gM)b4kaQf``O6>NVey*h9U5Hg)}#i|HMJs~b_tP(^$oG92J1WR zr%;O~NlVtg3H*^Q)*|At_!~H`>d2c5(g;<8WDv?D_@NBRlAv4?cq=;fDCo{}x3v;) z3FqK=P)AT06U^D)rH;8c8F3+%+(QV=B%PIk!Rl-#bC$~hAw z^U>o$N*=K`>4q{Esf(=s!q48MqLFuI7c2-T=Nptd9@TM*kjI_|R#o;lL(lacsE7h> z+MGDSmeD@%pS$-Z8~^^Pe$ufbt;CdZ5_;kw=b%$5pXKC^^|ROWA6KxFnm3jnvoCwU z0bhtng4+Z^j2}O!D-Al7M^BeVqJ~DTE0D|09_*=4wwJ$UI|=Ne$4a@=`bDTk$u(Ub zQvF28W$W^u5@7f_n;hVk^^-~Gn?;Tnbu5X{FYi0!P=%08MJH$99Pp8gcD*r--Eu>y zzW33Wl~xylY4%TuAEQhk_s!hy(%0(5m?>-fi9QxivmCo+=NI zQHxVg!KYpr6`pw@XmNJw!lv!{P$S9xEI`rXYnix!LcK7( zfH61D1U>Zbkt^>_k}A4j?fs=H69QGj@hB1%sX~U|IIAq0I3_equ3mYPv}xdDEan|f zwlH4)Zsc8%L?N>xOPl}dWPRck^BRWyQN0yF&DK2NAeMJk@a~uYWz36O&-(s#nhQxO z)6=S@>ExFFs`p>tpE#}pnp^Y2e5*S3#maaOFzlsbABV%anxcs_$G^Jqvi16S^cHCBk-$eQ3oMc=%!dS|d6W`)` z?w?PZ40|E@@8(p>J#qoqT9S{dE;0EH4eZaaH4J)d~`{AqA{czB!wfnTYNqT_I$I&QP^%_cJcR^f-@{4B)s&KVkk z9<$`X%*OJ7l%Jewzz!@y5IyDjh>081pQ*CBF(NujXPFy_X}X<0zS-PD(7jbRQ9%bT zeBJC*I+$f!mYgjmnnhsVlP3@?mimINs#W`O+QaEFd(iX)ht*L}eQ+0cTZw#s5|3J% z`WC-7BF*t!g)nCdkgX;jkrBcxDzkLAoD-CtVsIQclsqh5#u>-J#cGC5EWF7JK%J5! zB>F#Wy=73G+txLTH0~A%?ixHeG>y9j*AO7MySuvvclY4#1a}P{+}-`_?6+>!Is4rI zUDZ|3T5H-EbBxVpTgJiKC*xzTxncbv!)>y=xF$UQsD{g?ikipn z21C*jp2&|Q1l`c_(C@3${X|0@j?9-HFS;>v;0+tUZj7l6)I=bv1Z@KFMN{ibRVWG# zgR72SD}ZNbYqAbMdLx7zXnXXb~H|P+4O{`bAy%;pUY|9V(J4O^M13jY<+jm zRdhrI1+7;s$ww_28q`y{e0QqypF*U@P^>rV5$9MX@tz+S5lrZ52@y%0w_%%Hz!WID z?`R8*3p^O`^qYq7hOn_iB&C_x1F@R_{g~<*pvWiRmk?6i9$4`>N!^9PZXL;{>d88q!9DUnn^43y6^Qur|bwHRl%_+ zF$Hc%+|?B?ff4FP4PtA#*xZtA-7oZuVR5>sAUY%gFs#DbP6S>#_h}K3-*$ z{-J@&-(A1NqAUG?3~`KBO3|EhQEK(0b8rnP01RgWlBY+L%*~z(N9lGfq43mH)E_2e%Wx43W(0qyTq=KX zstTn9dx-YBPPEIneWQwNXjh{S0$m^z%%pD<6n=4Z42%_U{>i)Prbyz)mMz&&Qr?-R zcO1w)ocP~U2Y{cN1Vo_kA^FFyYN{U!<$X-hj<$ea*E(T>)vVRqX(Go@3`CtPYzih0 zEcan*TA2TQuX-9Njw*cjozX#4oVE>uWR9@E7_%B`b9R$nR^4ivmf@vGg>*dFv%^nK z45C26z~Iwg`m&=6pv`qOKNjEl&%mSNb9WK}@;jeM-|#QQ?5D3(Wkcuh7j!HvRDRa{ z*4$KsqEi{SJSs}MBGVOY!tXfq^7OllcCYLQ@t4pCfqnu@jK(6h1KE(QJ_fi>1#^?P z?r1k3dPEiQumt)?vUcVGN7+f@bo|VpF^=)!Ki?Bu{dDK=Fvi!x4E2LggEq6jBKK7@vyj?oYR6mnLBm(_ z?=HbIj-Q)0E^RGbf<~tUs{reH_03?yxgsm~o=uj`xRsHD(u0OR_?M;<0Fa|--3V2B zSj@qJ?Q-2dIuXB$?6+^AWU*rlDl#qQ=x@PDJn(0$3aBRiQaNyl zC^I2-cgsv*?UnEz+qpdkQUA9Zd@Kb#Wtk`F34Swyf{P}|j1q{REUa9b<_obE^>QL| zKl9#sL$Unxye05Uo{!h{E%X(o2>81K{4RwdYSPB;q+cT(uSJ?lDnz`P=rCNy_HR5fr*4M^9K#P+(yuk?dz0zX zR27!O$P_hUAs}%*p({h?bGyJATb$>lMQ4WL{@4 zlQSkv?WqB{_cld(p38h@Zl|?lsMH<*+`(8_sQq!CkRRh3IE#IL108`PEA!>m3&RBy zp_bcx{VvYurgTf{nT#wUObs6?d)Xyog-5HS6dIKyLjWwyzrl@$`r#r*}I|u|y;;bh!vzxqPlnU^=~q6s1v2D+<hV*s)*L z?<30plv<@^`f87%+D&smM}wBHKstA4y)AW))nE9q(s1^7V&ExH`;s>kh_Jx5_wBv0Kmq_Q;UMv+_wezf}5nCQFr1ReW;% z{H-_SR19&{t&R5Hwy2{=G@6P1~{WqUQ|mL*l)J;`z%-FKsG zb#Zu-Yvqs!JNkbMPl1;px{buTE6)CEXizyT1b>BRYKvHJcp&V;7y0g85@{7oBMDs3k%k&@&}z!=zo`rT-nW8PGh6?2`_0`7xsf?zHPMS&z5A? zD2oob};SMG9^out@?=VOd_)jKOE%LKGs>L zmV$Xk|GAnG+XipiWc}pP*nc^^=8?o*C+akr#$kb3KGXpIt*vz;a zRTOlB|Jk3pV&pnJg#X|9XaEZG(OTdGt%-A_s8h^p-xyf)2z*4{zsb;}gUxgr#V zGVd~$WukP82dr&B{v$o@rz7kOBcS`-s5JSeONd58sC-R1aQ^L^9A$TbqC(;yHOBM- zooIZD6O+8K!OtoJMM9ORNMf3E+dkW3h?)EYD41sS%HO5rxdAh353<~%MneDnzWqU{ zq!3Nk%VTJohx|PI#87!>!yO*v?BIu#^Msr6$9 zd^06uG|bdW0yS0P$L_1jFbGbjq&#OYV%k8GZ{nO zWK<@2fPqmN=#96VF@8G$CCr222(nFrE5>=csBsluQ+fmGoyPZ#W2H5(++L^C)sc%gMmqnL?zIsR8c9Io!eks)C2E;otMR$pE9JQkH|RP> z+8DW>5j(Fxz2m(*Xz-am70H?;u}nw$nD8Sc0;07h^fTZkX{dM!^(%xbx;i4ivM`t3JQ+Ly;a^;G5|&?1RZf`L zj->us`SW{`$VtwF6clUaOF1~q)su&dCMuYaV+M!2feDHwPfeHRoy3T3OWo&EEc)*x$zq40 zQD=-|=3;$it9rI>qI6&2ZS!OPlUzq!{ohJG^|uD3I(p88_-bv%VufVCE2T(f!&ft3{3a=V4ucy$a>PhdjW=08+^NzQRa1b} zOntCROk_pakxMDj*&_hc(LBe_sIO1}sn!3AkbmQ4z8Lsk=8MTM{|(Ajq!(K~x6(ZU zkJxT9TSLSs)gMP?r%YXG+Q6EaX(0Iw5T$dYPle_ux zXj6E-m%+a0kO&D5FQkGP@Sh0_Cm5?0ZLXzi#e0nmNz6OGt76~PhSwBFSPBV>r9SvU z!5W434fji_Q``mzARsl;7Dh&0d*u72+&96`@_4Zkh_ob3nfJ>WJ7b>*2p;K=gc(9> zf?<=3=CF2Pc>M(-90K)DRb~$$F-my6_&1}DuOZ^n(2>0|bGds3F*DC9`WuQ^)?PRT67bf_zb-y#54~GNHOxqO&mHW; z?gxGWY<_t+e??HYqq-SF^jM328ZT&yyO;ErOX%gF^FMyYMt(e0-d_{NUC0zvnXkWg z;W|??LgQT?*?#lBCOHWIPQvoEwxOahdG02yYa`g2>M2iBX=EVzkI;`_9QwrqBQ+uX zPb`#>Qrt4){xdTkv2WCVw$Y9*bc-fuJV>SY{Y*!{AGm|~QUPB+$-l$j^%@|$)F%WD z;}MKJApd|Jrd1JEy!qq*{wvkM@yUMddj?vQmGpGJPE)E@?pO~Zi4ECpBZvKa5u3a{ z!&Rmo)6$5^m&u+E>{CndbRgDJtZ=8Kgq*M3M2Q&tittvhMOT1~CcHx$Fk)99LnC z3~OnpyYqirJ_N+$K_+UL{5;-#z&(>2U(`|*#W-W1o;%?dkMX#Jx|%TLYAr*2XB{VS zf^C#Nk*d1JfIM|&Ic;U7yx(irp<*`q8Rr(bT4CPro8ixW!^mHCD` z-*4?OwPn7(L)gO~{eXw|_2qb<4o}L_?z1qB)CUq%Af7r_)tYnWs?`pWHIG3-9QO>q z0>m$zk^d_R0>~ho#n?abuDMjIaAq`WRL)trC^2WlaZr0Eb~Qi-t$v_X%1&(~VX8c4 z@E>kwp~@MvbC7N5bW4*4Gr4u?+$)0Zi({5qQ9_+c8=oxCKr?Pp-RRX*bBmNhM#_V- zTK`!c{eAm=WTYE4AtEL(qoQlH{94;3@aZx*dj{5dH0WY%Sc}&xfk@*Iwu#ks07ekz9ZIOYEp zteofv4Rwg{LXMcoJ5tpV2qdvIVI+MO#I?3389m@Zku|JNuRumaPV5RQ?U%FPmRbHO z>D&&ilRZa26UK)ff&{s1q(VT;Ol#C&fp7hPO}0SjDL3%4)J~HHT}zsPN^S7%Z$R8Rp;?2CufIyJn<{Hu0EHO7S5l zAS#4&YEaEPMXHFCcZ}6@Y=KYm!rr0f|F)3uaG*|5$B%Ak)y>1|*+T6jnrOv;(#{lT z-`3QWb4LtHboiY?>P$&qL&O=~CMnvuXjfEj#z%c5MOQd!jKbWwb~SA-uG4trgV-bI zJVZzDHJMqn*ZlcEA-o`>I~avvt2OqwfSs*uYs7>;P3DOuC7(@|3U*@L%30Au7H93H zapdGM@D@%_q&=)NC}4KuvGZKn>RVLHZ^`#X<&7dP)Z21G zMyUbo(L`o#BYcrS=e2B~i5K!1E7 zGAbwI)%u}SB+RY26Y4Y}! zz|`(knVeIj2fQhMIum8dNYid?4Q~mg&|a8ZlXaD&S)Se#nFHtHkS4)+jsBidth{8j zk~nYiL@tf&-_O{mR;w~No%XFIXXNzP(kB@=aY@7gzg6+>tv`5zC(?{@_;8zshRN2` zLaQA@R)&`!z7*UVMf$QzrpGOoJ>B9c*T=05r-l+uNqyLD93Ov_JxYaw*ZuQc6K8>{8MXD$mueTEOBf25_EP5U)Ufua^q*OdqHN%f8Uhkr9J*l1m+Qsr!EOJ>myV1ZB9=wFlxyU) z%y%%!mQ(UxzGLutP7}KGJ$PJn0E&U<43nhBRquVbbKOkqAWZ&_bIn$xo|P@N$8z;& zgrd5miTuf|rU_af&&hnM=ly`ZG3&xzeM|$6Fy`z-NLkd02hjfXmS9YeYciq_MGh*J#!5xrz?ZBxB zEoNM@w%W|vAlJe<<#@Jihw&YRkUV_V`C_G1$xHL*7WUPFyB=%={zZ2e%6+sw!gRNO zmsdLzt${fAivlZ7EB8P@>D_V-*MT6(v-@i6k-}LKAMrc2*K6(j4$s`w+N4)@m6rEz zj_5E}TQ-ZkE{_+C+fwGtMw39r)!X^wJL?chJ|>O-x2{Kf&=UZQ|8H6>?PvpARjYVF zpIZHv3eiHPcX1*Pp{XLoh0{izuJn1`@&zO5Q_n8I1>GASUXKOMfQ2~Ozdf)aAScnU z{PWvtaA;AsURd0jn%ct@DI&>SQ>{$XH2x4dUkm|is*{*k{)!t@=sXtkjSHG8+CJI` zi;}MR0%|rW%oa294PDLj{|Tf<*pMY2XRXIf`3g$+c#5(k0I&wrr}mV4mnR=B+&Y=2 zS?)X3tUC$(z=1N4)h{y<(yiOp{SVeT&fOxmK`wQ@`bvt1#&dPVY&+7px9V zcS7_2k)s$O(7BJGmb(V}>V2c;;6(9C<6ZeanEy3OJ6UN6;g8dPoy&}x^HsUK{cMP6ZG#!04ZRQDP=IaFi; zpsNiV>f%GXWcojb(h($pY-t$IR=09eKjG$Gq<(VITA=%{`Ox1A=%WO<`}r91`JA_X zb9@m4Rj?cp1kv+4Vhi35cbvX^Z1M~%!jYR#K6)9AdOadCI^n4i0WYu+>8VDKJJSa1 z|F&iN<|LM5i)$Wndlqy6(M zAKH^z{dK`%T24hBnCx8ZA&e)P=IkSpadfDlP5gOT4R^7Ott5{{u>XRUU}3r+Fuhlm zqFwDyEmpoXp1Y*wu60;0E5G>;KxVoEdYu)U+1-*mMZNctRQX61UcRFi#I>NsiiM;f zsq(y?dp!%d&?mbL`SNwHym_Z9d83t|sOjB0Y!jD>U;Ty8uZSU$fcse6SC<5~l$cZz zE2A%n37_m1WON0*dF@}Y8Ik+ejNYNi?dF4!)qyOq*#5o3d9?KW5*pw6~FO#pgB zo{xfh;aEMXeJe{CioiV|b+`0@H9~2}$bhvTTm1jT0C*^#AaJK=f8@NgYP9NnA8Lf= zKh`&nZ@Hc*c2l%GyS;FU>)dts*(Q-@S@4ekyAcsbsn1WTH)v;zBva1yNcy`Q2H~Ge zXfnlCTXR<6CKe}hXYm@a@-Vcu{bY&v+Vvtd~#GLNE>nYz!o z;t_w8m~2j4V8ysXHwzo zOKzviKC|wNDs^R5-iSYLeDSp~Q+du5Mm}<2Fw= z=ZvI&l*5S0EH<@m{d^PQl+?B-P20?@5uIdy8&lUTsfXg>ZXZEZt0XwZr8XaDMzuvA z*X?DQfCX{-SG$~t7m;z)xe`3kEMM!CzW#-?VzuFYCBc^5k6Qa^&W$W_Go$obdb1w5 zDxWzgnpzRDArpQxVSk^Y!HZIdp;E)&!mqPDKFXZ{0c=w32G(jlc+{?bwsGnCDh0a= zt2z4&C$L?KOPeA)at&{>e(CxG1cK#a*n!QXCI4#b!T-Dup8@u}bL;eZ8?8KlLu$(+`&j7v_E6hSh z^W~vP2Nz9v7fRtWcPjgfycBg3y$Xe53<1GMaj1sHI`lR;Kk??aSLlpS-a2;D5!mvyL6a(T;d*mw&zq#0@9E}J$2CiL7M?f zqe`F&JaF-PK9tm`$a&&@vI?80?Xq+0I6O=KF zyAcs${T z@I{W>TZS&)(UHuUSrFTh7b$>izlB;ILWv&BLEdN-+eH&5u3`^=?`=%Vaof93ZHBY- zI8Cz_v6SN{Up`Iez|JrY=RBop@hZ0vvJZyNShZKBjDmD5)U8@AOB`C7R%zX%wl8!V zFHVnIsr)>(1YVKzv*Zb_`GmVR9J@LTxF&g4B(secE$^)!TI`~@d5m4`Xq(NK;LN`L z@=ViWi(11`D`{mYV&Yo1Jfv`O93TJ(2+9tRB@Y~)e0Kjh(zV-Fw1Y&c!a%k^fo}55 zSw&^Ns#%SKmQRe8shz>bKgmZe=R3`}YtwZX|G{LeNg=MFMw0jTKDfWNB&Y81hzp#U zS2l4;x4A4Te^Vk;O-!DeDU2|iSp8^ZqHfk2RRcw>`Kcn!u9+Wu=YCF4((;LtRdG&( z=;h6dsCl0FTQ3c~e`r{`3JPNmEuyFp-lZ$GvbyY@##+Uvtp+py-~=O~id@LE-JCK2 z>YtELjxP^V%k^gL*#spW9SP){p-u&t zv3~sj-3OKh`0mW~l)nQhpxZ*%j8%;HuLH!Y?6JEZRT5*WUvBirH-`*n*PH69PYT*3 z1(R7WSV4I;4-`Y~TahtSvu)Wb1hdVYaLt1pLs=`}{(q#suvxae@(A>X90q~S#!kP7 zX|UQ2eD0QWgxMIC`Ot0!p&9pEN>k|Mjr2V%GiLf(q01AL4sOI>&u#^$`m~?c0$)d$ z7727SO$EOd#5MmI{h-DeI+{MX7%CL7sKegoJ6nyUl4c%G<&?+RS=}rzi@WD`Zg!yl z075WQD}Pxq?aNmd?RL@MWd=$Wi+Q}34qeS+6VYm$J?H(rE&0(UoW3&45eBd5ETFLPEq zpTPB#VT3O=h~;R#1MXlKB^`Sh12sftj7T7z1&hdU0D>da{LAgCHLj|v>P&ngQc0CH zXNwN2@Yho2RL>f2p6Hk;gp86izm8%zB8@t^?LTiRWy&=p~vWAd($Ga%iHF?FUQdz$}v?zPewwlX< zXW^}_t)`0;9V%Vtq^c@EW=B+uXZ>Lua1e@;@=B}7ux_vEqW_|S2ZhN7teb2#cPh`J zJ~&0oT1Wp)-1%o@#)5z@sd8TdCMsiAX#Ge*0sPTIx>P*#JmL%f0==DxojBWI^2VOY zQ}>m}d7Fo8Y8=g5%}SiaOrW9&dQo{99c{O2^gQp}&N5#8=bLpn7S{)*a=bXCNgnxeOYUWhQoY2Q0| zo%fu)(A4j!JV7eRr}JHlHvxw^^mNE`&FP-DysZA#qi<8YPGU1L_j?S8@MOe4Mxr@Q$0|ve&1)9$8fw}6=tI@ zsZ%jbU1$Y6)zTMrw9S`jE2+rI6lWOg#3X6}t&%X{jvt|!@dGChIb@=W#)+aFx6i96 zvfCs#E0J=lo+e$qW#T{^K1Xfz&j`__PPb(-Whv6lF2;SYPkjSlXDPIa^I9sZERN0C z;RWZ)%QH->n9RT(9-asQWB}@^^Ll1lZgt{H;2Fn83_{*A{8{RYjS$i&>nd8(`9?~_ z>lnCd&84c6INknOhx537?N*ws3RGM(4UjI`RN;F)OGcYYD}q*;SWNp3xd!E8P3rZ) ziVS=b>~ngKn>ZL(kX7815kAC`!r9Q-7J5uh4zoIIn>rx(M1T+3FYkqDR|zC%{U z+Jm+)j~&LUTk~A!ZCyFS%h_RFoIde)ui#psl1>Nm+Yo7MuRh-H+FKS(vy{`VLn!wp+BBt zrm(#uYHw;NA5^T-L|rSCPnkHTH_tW6 zUIVQ(o)$J(B+tIUIB4i#D+5vH)vgB7Ajv!j&^$hB{^j2MhX+y06#QR%P9N;Ma-1ut z8Zi2OmZ@#*eg$l!*i}2XMG5##$_pH_tqU*^PM^O~sp-RJfasrGz2a$I&e?ZdMqSP| zLIpw8e4ogu3C>!*#_ss}&SQRR9$pUZUywMQboib9K-uQZWf-;={_?B$^RmsMq(g_0 z>%o9xYrDmv2ewpzN2aNTafZ;><_9&LZL{ITUtzzF@I^^=VBf5_t4+V%_Ch)_8K|P` z3I!IDdNA z&9i=3%yc3eH`u~4-hWqb(z$_YeLZiYV?z?9|1^?b!onxG7UL?WG5T(MLQ+RwI;1U} zT!Yklf7$WnEL#QXk>YQ@iUR4becEk2jpAyYMu=9zf(M}NO4B<`QzC@Mz?b{*dbpSH zE=w26I=0CX-Ts7vWA$>!;2Nadf}F+*wMQl?^2DZMhhKq)L6-m+yv7VmWK6p-i#2aB z)jBBTL>ds~Fc&O+B!KZ4Hzz>y@xGbq>7yyl3M+!|!cCv&6K|rU&X9jQp=aD{1{N!? zwJ+^}+R1A&#K5|u866yKe<7~_yac3N7!YxWoR!i`KfeX=@X1%&gFQDfus=PDLqsLD z(x7sKi9W$X-LlIXvOAM3a*=tC%lMg+2BHA)XtqG1qEnoxgfMy_ku3C@jS%6d^MH9T zq`{`B33SkJ7{W6CmyoqNhKTrXy>T#|Ug?{$irW!#z>V$H2+FBQd*QxRX9en|M)v6)nDD%A_iynDjUW+>u$Cv2#}Y`PO=NwtohMI@^;BTQ`;9CG@6+1|H%kX6pjqJ;cw#id{e_DdG8VlQFEnVm zH%%q2K*gox(HC7a1Jp@5ds&}XI;;{=p1)QqbO~^=Ppwy|>QMUyC5%i4S8j)ia$H@W zlAa=Pz_ChCjSnW9rGL?|>P-CWN4En3rMLq~rLAG-spIH&tX z?uR~{+scd12M-YF-m*^9?5$UGr>SMg{SO3|TC2^0m&PXaE(R7$IFA7oyxYZDFu$(y zebUHBCVc^7E>(5)sa_Zdv*mialisLpC>W?6`<5ZLU{=pBsZDcHWa#g7R3-oZwEo=% zVju<=kUgcynQ#3x?A3r}8tq4VCX}Z^KX=9V9rC#NlCvKEUu-em;6`Z5$my69|FZ>8 zcSmEs)u1C=sRJ0t#3z+t*yMl};ZMx9G&`Ni4W|_BgV&d-<@;Ugo~f&uyt!`3v;=f{ zGbs(x?GsW>qMJn|AsVGoeg*sVfjdn%Kwia;9};KfL1|T0!S$%L8Sda6kLv+#CbwO< zaBd1G_0n{1wqIGWR}pLFj6$(5p`HDP484hx8`dDKh4tY%W%hL6@T}61B zjvRzapQUz@@2zlf3O{@7Ii~TsP`h=o?vf7`vJ9fsuACa-^wQu+4z^dJ0}WAIkZHkz z??2}tlri0kfl^ljlw2h+_|PBR~Rxg`#bu6XkKMmm&4!=xs{2n-+(XQdQhW?!X56rLDT`PN#? zcg#ei)jx%7daQ%{er%hnw#-HSa0<|fL#i5@ znZ%+qryiR2kgtE3_b~X@FZ_z}Y)}U!v_7*WvQWYx&Y4PM(eTrLNT$jbL5y$J=-k7m z_L7vNqjC<%?n^>p?2B5mIgDJqnX7{WJql)N$&f^yv3y~RgYlQ|-!;da2=@8#Bxo2s z2tB*US2UK7+@O>_~C?%%WS0%_( z{g1(h*Mb4%($x%L7%3#Xeu5ZE@uRCQ5a)g8R;2ppahd!TkCzlmiu_6e?9ioju`2UN zmcF&YCbXf1$QumMYM#y8w)3**gQ^zLfy3)Cj~S2E7Mvy1SV0Ca#QCIfSo0NCe9NAp z{$$Q=lt1d=yJ1RGNFi`d6mxyiYaIBqA=+G!YI$Ksvg6~0wc1Of)6%p`Dk~Gh@SOX8 z=#z@uHZT3s`euXHl6pXg+Bhw1!Iz|z0xF~3wsY4J!*;^Hh_%fh_@vl{9^$_Ve=0aL z7O0RS@4$L!q{?9+_h=K*mF!H&Cr?BOZE6e?gR^aH;C1~KUGDiPM!A1Yj^VVOT5jnA zuS0_(0r>4rerouPMn=}?M%KJA&lZ=c;fE6Yr3-9C$ntQX3EX`T>+pjlrB99uy>YJz z@!&Do{{59o1Yvm0dScV3s!m}j+hnr&w@Cc@n$wkp^@Xz2tX;EdWeHTpRI-f=2;>IuMnWm zCgTypeepfN)gOoD#1lHtNFlbw6oc^czbpzl=ByvNS%n0DF)Ofj0)5U+P2CJlf5GIX zA&u#%TJ*ldRU#NEeDTfaY!D=vIvTfY`A1neqnEulvl zcrhHYLYaUKxPpe1n_7KewtZRXOIw3s2c<%bp-$h@lJzKpgmtC7+_qgw6o2bl=K#d~Et9T_Gga6O{X2DzBN?;IoTe z1miF_6XaLsj8pjA5YVo1d!Zx+J*-9V15g9L=+N)oTr?HJ!9{ zOtu|a8=4pJ9(%yGDGDJ4t-7oZ@ukVIp7Lsh=6+#75okq+`xWYU)0`u^{~%eMYXXgus!6qnK>NG=9+#$2BGY!3WKy2c;!5V6f`X zG{f)lbiuLho7NJ#nVy}P^kEVjCorQwp!`dWAjspMXs7Xm)~T*MM?+BF5$i@IzZBAD z0u7gR5gq&vIn+aL)i4p6qx~i7a0WOScSl037vFd!QQv+>0COft*wn$^wJe($zO@nz z8lR`3gX9`j1VkVaac$txh$-cOhdfbShxz-t`vU9N)7P+*y(yE(|!W z5l+ruz^w;0hp!4I0M8H11{9e*^Z2pOT|eEu4cgWNgP>rleRSKzZG`Hq`b^9-_2bx? z&lJs~o{T)f`APULHk7dU?%XNf;&3p>Q12$RKJrjT7MCRpUK0C@O->T z8YkHLGlfe>MI+$`SFUS1K@^9!>K~l5VHZo}+X94jTx<-{P6d{vB;<*xx!T-46Pgl= zeg}8~FtjvF_{C&Ixx}S48-YnGLoyO6ZKXKVtzAIHpmT^9>>S7=Oa4 zSfB%O?$8+@Pl~W3wQ^iqv<#q4TUU*?aJ-sHtHx>~zsCy5grArntH(APv7?#zErt znixeE1cMU^C239=afe-+Vg=JJH9ZsNnqlG7O~xa_RL{VOksedCtIQrkzibuHd}nam zdFdV1ZCwDw+j~@!*)Lh%ZK_TQ%GpK5bBd?e-WQ*b@5RCHYvd$w@HwL!H$s?OG#_sY zCqzM@a`Vqi0US|5WhS&IpL3z|#1a^JZAv(oMsS@J8e^l*7hix`#~WT-CRqgPwiFJ7 zZJi>M3xX2KOwE*qQiZdeg?{!WwQt0v+1G|H%0GD?lbXC!7f9Sw&%B>Jptsg#8M4K| z5GJ29)=0M`&boaWW2XF|7HT=f@w5DCvDiEk`&6CdUlQdoDLRZ>&ySI~&vXBu7Jwx8 zpI6v->}trgAVG?TpuTTn`T&iVTC>>?Wg9-BAa_$X_*-n&KIvp8Aa-ugi;SumMoa3& zWgP=|EQ2$FL`RKQl1E)%rS6>V9~P%fZs|h8MUzH8(WD@0>oVmL z?j_3~i?(x_%uh}869mNOmR03ukM|Unf|5TeIa3WD!(0Zi)@XH=hv4J$l@t$>XxsF< zHX{T4>s=HC+ytz7t%ilK+yw|n2ZfyfOouREa0*%Jhui-t879;9iTxHop#>JWqwg%3 zCZ|UE_0J$c64UQl@3mnWTdtytE4f<7JBgm{-B+Q4FYQ?No@1VJ65um5hf@=@!W-CX%)eU$j3q!&ipCmVJa|CSpQ1g`{n@t= z%;q7fv2cHc$c2VMJ0d43P)MvMz?c6>IjHXdOJrbZP#kNx1zIz7x@c?}m$z2CbN#)R z9--PWQN&4aYMwLFNKFlb+HsK3=$MsZN+95jCDlFQJx%?qN9l{NZ}0qxFwmWi$O1>C>0fvDDXs0qraH0AO6&>?5dnyuUZ2sva2g)e}qL5 zf!$dmi59@vb8Hhlvc!$=P8^B2n}@~sEpUG$0uo$`VCQtM#~hM{K)7T-)ccTN-lJIU ztLS%l?Mm-~+0*s@_KXmiNbLoZ?m1o2NGG(!(1QU}!&t3)J_T}0|X>k~qTx|xs)*jZ*EvG{$l9*8F$7Ow>ReiQ@H4z&3f#{Uf zn;t_;Dtg*^MC|AXReXYae~;$a;#frb@}Y?;O&lUjMsk@+;yhcL1Rhp7^yZYh@YVya zC?*3TG^<1UoPpQ?^9-T1Lqz2uin1YUS(thhi7he{n^^L36zr3;g1lu2%@)C!UqV75 zF<~Smw=B0ic1tCVMe(R4Jm3BVxTT`FHZ-{?N=OvvF4QbphX0v1i9}q@d8uJHMs;?9 z!yGbipc5`BC`eJO(h_fInBS{XmY0dFnj^*PrQv8VXe4DhM8}If>6uLtzL9NB_Wz`T zo?;9CC&XbZW?ys*&N|q->qd}fb@{tc0k5GlGZ|rK^ z$ei*;QpAyvO*!uD4nJ9`6wrqNP!ui5*oB(Zit<%4;B^9ciOv-mhsn`Hs){u2AG6n^ z3p@S0%8jw(QQktUq<5$)e3EE;)RvUOCIv~qQ%Ww}b#^xUdcza-)b0V5s70T{xf^4G zP>F$3E5C8HO!$-;WP@$hNc^D7f__`22lZy$NK|0&ImQ}7;;@oA2x+1*UOIj>iYXft zRqR%lB{T6O_m~n%96T~+TUuKa<)p5!XS{$tfL5)%0hD{-^Gr-CsXb*N^O{PyByy`L zkX&MyM|m66)%-*p6fd{1C@CtDt)%I_49Vl?LK@TR*l)_Gwh zmZF{K#pk)zI_@hF_L7T9b)>P(;7vz$&|M@|YCNL6B9YK;fFXF_$}sOrsvph)eUu3* zbhBu~=G^C$>k62z+e~A1o~9!EQlS6R8&8Or* zM3fUY!o+PRf?mo`A#_%U^)E;W``F)Er)B9_!7e<=myeBH7r-fLBO9FBBc~m@ed~*u z+GpqVc1)`jyLuZA-e zslIFQ&dK+POFI-GmyCRGEBpHu*dd#w)Oxa0F>uWr9Mmyfy!l_X4|qA z&VYTGa7qvt8dKs?8`XTn3~xjNNz}&t(Z!mA&aYNb`=b!LBpM{GPJbwvkNE+QniNVa zhz+|YHjGMSe*4eEXEkR9*eB|d0(jR<__mM$0-kLQ1i}Sd-d%;X{L0^ z8^rhcJWXDnBg{A2cYQ;1xy zN+c*Z+j#O&YINrc5wenWv|MV`2*wWxaD1U_?!uNK_LK8iiLd^|aSaQJ&bY)GD@E#R z8GaE)f^wAY4}~^ZTBGc{-%C!Ec8EH)BC~SHE_?B^as%61)*7aU^JG@WCo6VGE0hXt zADV7&Nf2$eeWf@#_scQwjPQsyOInHA0UI)Z;QN>0*F$xv#<>)F4_? z0*}gvy)bd?H)eIfCGk%2y?W!6Nl{jT!ZqQ#(z3V{KMf5Qh|C&euM-i;t72>O&Z|F8 z4`-;-ABse*mlY>&V)91wm!d)KCn79NE~lIRLTxZ(8c9fBn8LUCPyGt?CzVyOn*R!8 z#9wU&4D=}@F3!k{b$DSNgQrM{H0*s!DC1thNUEn&b!3PI*J`(C4-L&%OFDT(JF+gj z7qxk59rHr?EESRukd{CQxW1S!tCaqIduLFeJWzb#XIXF(T{z`8 zOrd?01(pGuf+D6cHlZ!Fzymb|!f)goZCdgAIcx59k*N%6&7)%JgyV$4{KA0=6L^5m#m9e_;b_)X;BjE68mi zIXIfG@eR3;YU3tYw`j#9sTNd^_rr2f;n}>R?^=pvDwr3SM8L7{OB4v9YlFQ$>kmgo)But8U?)r`O%fKfiozYc+yE%&0De_F!9h0MZEK`_Q zYW1exXw4x!&bdW?D!WCA^D?&DV)O7s8OfNEonVH)IsA?!E%yH->np?RXp**(L-61U z?oJ@M%YmT5-JRg>5Zv9}-5r7lcX!v|65RDWWcS_OJl}Qoj{`G3(^J;fU0rwW{s0(1 zZf@CMSwph0HOS@7Ghy-=;0x#TKV?ZrE(;CsjpY$%syErmFS>hfP+P9Gaz3nD5s*__ z2QZbb_ML|z+}aW*KEU7>C2-@j#fq?Vw~|+4H*_d>7_s%k*v152(ooX`;OO-*%Ki?A zne>7axI^#~WCVB*hI+lo0sv>-qO8mmr)K<0bRca%huOdV(keX^V8G348~+Hi&6TXH zbnlfm$f_Iv`^D}RgXsbRh1==66@;SSaVz!AgMPx~e};9BFB-myA}X{B86(^NvY{lS z<=L%Ildm7>MNV{mJ5i0p!6%}|(hzo%5BYT`_F%mDNzg!V6gw?E5*F$+8p2RV3_Vsh zOuApbPY>88Bn0%f7$LGke`#v{L~ww7cMPtkCaAuYGs$R%W~r+rX>fsLsa)P<1y5j6 zZLNBEEd5hfB2mV0aedwt^t+Kpf@)nxYwhTGk0ZADXJith9u;FLt&5 z#F%8VQeRIuU?c~s*7&PKvK$Rn8)%81zB;R@ES-&bq)owx_RSC@wiqYAjuDdOha=qV z>}ZZaW+E&u+xT+!d&+W|ig<1YRLX*)UoBnR=nBBHfnVpysg!tVJ6ebPn~G$Al7PUH zJ<(woNj}5;iEzCm_99s3ob&6s#0rYs-X@38&p+uzi*j1Afi736_Iaz+ZHSIgyH>EI&INe#hq!bN2 zgT8Ul)*E}Cm;;QEzl**W>uRizBsHQB$bX0(ImMQ}LV(CK*g=4>=AcaAhIr`oBj8cW zbR#KFCV=spux=XY9KtLTwg#3%G{$;ZW6zR(euPSdjecixCNteE-9 zFPq>wd-cnfxwECp)1Xq~#$mDHe#vD+aYG`Y%-VK&oLiR2wsU0KQR=Tmvw>h@HGx84 znS;B53nN3-x;VDkO0q#+=A?OfZe_^y?Fs#+Bf<1zADp9t zhJ5`xv#8utg2o%A-LaDa5katZ9+ispQ6q{$3~+10KGDCzF^zE`-&aDQf%MIK=iQG{ zZ^(YoCV!|(QnwriISZ~k-B40_buCxDDpTQvsu5lGbmE-sXq>Iki!(PJId4tF&U*($ zQT!-I>t)BKUmSJ2VZ91$M%XkFxL+srp~QOqlBNfboOF2UTrH*@ml{s9Y#rEUntw|y z#l?S^J}CSwH-s;=ZOtbGO@)gkt#fo<^PQ(}>FBceM0}k`=GNylyz-QHGs6ooJ$Zf3 zpu&!zRIBb(&0MVHT#2WB5xyKNkIU3t^K@6H%av;KBDWEj;#>AAp#s=yZ<1}#_pDPj z2aNkeJIa%65$h#hUAOY)3!x9hui9+-)eyBc&|90EVG3GYGO`y3i7lVoHT2hhJ zIOcOfkTYv*#d?Qc8r~)STTm{)bWZxa4l{#H;bRO;E&Mr~n_bzJq`5#&LG>~#pHLDN z+&lehzbssVOtn$SHrS)dio=vy1fW3C6|rab5u$t83LIU z0pQyL=6CQuy<>t%w;k>ai<%nncsxrTHenE7DljZiUZD>uin0txQ%d?~dyJc^j@F3s>lgz@w8@25nV6;Ih~FGsFD&q%41S1%lTXNOw`3;# zgz7L!nwiNMj0X|7+p*Gp(L6glJ6As{-NP+g&-?6K@auVCuq1W(ckEuDZ;{kJ^8{+; zVD1c3fY>HaZgk^wkyhpt`nfMSkv*aWY4WR$<3<|aPKrsuK!qm3QU1<-RfKSIV*8#=y5#b7r>CkM!t7HN z%3Fcp4q7wyy0zN-eXcrxxJgUmcMr-j$3OH5JcGTs~GsndVdBG+q9W(HSetjWfQNi!t(SZYLy zqHhy$H0uKd$BPl*(AWUufMk&Ah|NDP9b{#}OAX=JrA-{!`M%0#K#OL2{E#+(Uj+Wq zREgYmA~JoJoBs0FoJTV)8Y$-8vwxQ?T+J^^^!IWi-`Qg2(@oowoNCMfRBs-QgQI2M z{iWe_SMOypHr;vBf&js;OHuH*duhF=jHA!VsXHhXQnvzk5^3M5Xixxh!l29@sxRb- zpvo;w3!t-dpMz86gpdcU09Soc+^}iuw>C8+9;?j`Sn7utJHrRzY-=(vlbTN?$a8aZ zr|@U zc<)^)n3$|29huo0rlPz1jhE{+?UTl%MOC61i^Fmr1>7<#DqskBhTK!8O^n#gaJK?r z@r52J+02#bwvzY=t?$&%ffH+91J#|9%cARvvh&y?b6yL<(L%C9AI|fsk*bCp!Ds@r z2;r(2MaJbbr)TAxK-Svk=L_M?@)Zf^Ki?C>EzQ!&d2%mU5; zm+4Q-sm2S9uUmZ2$yd`ShEvd&38xjsYd@bV_%H{3F~0fiPYxsv61T3A2E+*qkLmk+ zaYrR%<(;dNQD=_mB#-~}ItJs|G(z1zi`K6*+tVtkmWhM7| zdLfKukQD-3Oq$>?!;9jx9u6?;nU%G%o@rG{?V`dXwB~3rf($WJF7c= z?wJJ#R~tit8B+BX27o+}sq%?vX8KaVwJw0yr;`v(U!=Gx-#-G6i{GK_E}21}x+UIM zjp{MrG~3|U0(lMBG_Obnl^2mbm?5HhdW2ASdo4)|r?+srmc+kU#+lffhEXO82+ZB|-TG%=XQ z9okIsb2*1?a_WfeelBHU(l3(t2;V?ni-f^ujL@l$tZ#4fKAF_jK9k+-nrjO*p6Cs$U97HF0=NR`-k&ACXPXkaVu^@icF$%(!>UK9C#GlK>?A*4rI zEcLEIwJGU-0f2NJJOUu|*?ctSRGZAH+yHJ}ZU;`n5q_g|_m(Q+NxNs;5Y z3EdwCGLm8_3Jy0r6;d&YW)gR~Ym0dwFMf%S{1BFc?3Rj9uhZ|hbiAGe+8r5AKHb|D z7Zjwxe(L!=wC16hV=BAS6zwZvvAjwo$1kEP_%|QYt%}R zsq|A&_Z{khIpGd;ZI7$(ELLP|_HOEl2IIYIezla7l(ALDymhJ4R`EKCV*@K9c^SQrn?HwHD z3DMsz=PIxowj#ublWQvA*@a(CHG7`XiXJr`xVUm#USK%Kg|aoKe`zJ05Tl&8h)oAS z{31IuGt*V=-h5!tO{Mn36l*kv$2Uz%q-HfwLppZBm{QPj=qwtUw^*N?7T^u*?R5|T ztwb705(ccMHOK*}A~$z5aNoz@Di>$X&3!5tilYO6#Bz8I+Gr{kOGxNh2vU;Yb+N3P z&^LGgYYGg6i?`PrCbp$7_2&=7ppgEQV28vV`iBn%i|RKisk1zoLVCAh_-3`K;gh#9 zYU0o7im`kt$NZn23Fc0Fcb_(eMeEnB-6iH2!yQ=Xk$j*7#?@*|SX1@&aLwzF<^zh{ zYJ%&p%27J3?4DD;Xq6b)>*?67o*M8SL8G6!K!phs(Kl(K`1|vwaF}tT;mUH_?_<(f zLO=#3XCoi1&wDZU4_S_Ig8~myJKypZG&Dr%5@VYe6>-~M9UUEI&CIwQ=&`1H4+vv{ zK|gb^ISD1?$W#MTK3+_+1>sAsHEO)4*0C*Y9O$>B`Bj$)=gv!>uVFg+8!z4dP=P6( zdr|Or*_^j2v`9@sHE?BYX~{H&hoYc(I;Y{30CJKH%szn} znyD;DRni!+Fr`s4w#(?N5D%?$MtF5tN&VO%p#@b^lo-j6FZ?$vBdYWtm&0_~G* z3Z@|^0BMAD+d6-;CnwCtpqPbagE|G1N5FSZ%J0JZ!G{^Cmdz&2s}c{a`dIx&>{a{^ z#t<;4?S_hBstkH3-DO{~N+O!t@|Xg>upT>IS*)xhF`AebxT6B+F|-I$1bYlyJ<1Vh zg)gAICyAp(Z@jD}_Flcr!*14L-L&|z!1BQ&6zzrwp0MV$<>k;oAiwDG@jD7VqysZc z)G0hi?ESeM!q7-~-(vdsNH@J5+09vT&?x;CG&Q9#FuqYE%0Ufb_3ZHDC57a7S6f1O zM}@d--9l3$BT(h!7q$d)wlo)4S0}42b54=F)02y)naCGX`V@M_3rmsfM(u4vn&KeK zN)^WLjprecBb}_!_h%%_Cx;yxb`{D~Ibf^g+m#g05_(QJ5mWhdM`@}s(Wf!!W6#b= zWyAGh=$j&VeJPNf;W;3o_LF|V{EFlQ)FRIE+>W@~qWSzWQ9t(Ny+ic)0gjClk)v-x zW?j*lVuT9cM;d3`=TtYmPAMWc+jH{4G{z7hC*J@QC(3~YGNut=1dafZKbnv{n4zGL z2C8Rc=OomBjwRk;**%JX+I!)_jVmCRKnPTxl3#AD;kbLOkH3sUnzozr-EY#1@Na|A zij>x+w=fOQeloGN)aRC>yp|3MCX#&c+V6ZY8civHAumed#*ZY9b6w=Yy(yQWz{!hL zUG+Up70^54N?GFg-rgsd8aVR-v^amw?0Z(j2E@?>DYkr0zM7pH%zkOHz_J2PZ?Q*VzO5-q%k~q zyd2my6gGDDS4=65w4S!zaB6nbXr|r*4-zYn=2}=mK`^nX*)l<}Nib+=f-*hM$#s;p zv;~W}p1XI!v2{k$KZ)tGQi}BwEqKX=v$VWJM9{EP0Q?lJNZ#jYwr${C->bR3Bm83u^laesba|Ny^F}-i; z&Q|z3*~X!lK`BC@RY|)G5h0dFH5)HMJeo(BFKC*R+mA!p1D6jv?)Y~06%L6qu!`KW zVlMP07bOszVz8J(6Ykl@A9b}?NdU}kE_WH{Vgy+u9DKDl8;bWgtP=nQ+BXLi*fkBkUL!T^Mu zFhlwvs8v`-`-;3!rQ4k(iS04@gX2!bumTiD2C-n{!=4sr7H4myoy!Ab?cGCeHc9KJU$oeocWJvxNhi=2%9-#rux+&QRqAZM$DaVsW>6!Y|@dw-N5Wyw* zJeoy=!k2^vARTP;>zD|7&z-t;pQV8I&1VrZPjD($_UWvr5d&QD7?`9BM9qWN(1{1q<;Ozhq((VDq@m-?L#N;u#D z4NphTRa#!>pZnAUPhk1o6PH+%+=yR?9k79oh64$@$Yoe|qdx?xEf4#?pJcW=v#vI>-Bf+8=()hMk}!A*4h9>*!*#92 z&%9^PdO`VRq_=h{QTesq5%sb6^nCgA^LWoO2spW#n3WqMWo6O;X)Nf}cbo}XKo1Qb zyvPE*x-$=+l$ua*MXQpSPC&vDpql7ntXDHDQW16KE0xW3oes*aMqLMTXSS zkF_1dT8_n9Mae9Z z5{aFX08@5?991#_F1DWUl@2#1=+?cU4?86B5G?rZH#?k@z63pXg8NWKQV&KGWmu|_WZ2daDNs6n#U~#=J zGeO!tHu|{(r=4xem#h_p8&s+#S~!~~T&M`L&EIMl%0cIJO+y#+QwzB(KFx*#*@1uX zqmCInhF&yF;Yy7U;>fyx#jy)Fy9*{QFyI7bKsUU`zf>J~T--+U4;xh!d~V+n-!;ws zx|Q*KyrVr)fwo*cy)H#o7R70Ivv{?+qa4#ccdE88`Y8L*<;zye06cDWSQB#ld~^Up zpUMOI$qKwDvqJEn3(S<eUh$5)x8YHrEPe2O7Y-EQt$q_{)=a~8Y*v6C78H5!@{LY0DfzY_LAK)U_QSDtIT`B7q znK4a2x)n0v(fPy?QUxIf8JdbCn#MbQ2|3A9cKrjqX=k6r$#pZ~eV#M{zF~ufD|a~6 zZd?WbtS@wcJ-6sRUlLu;`EMrSyB;SRWss4K8ip}9Tj1QC{;qc_f3-J?G%z9Us>~J=Ekr zlx6uWH9uf*?snmfX^VgopU2Z!jGOZdX9sSZ9`rXclf_6kluo{nuW*p6D*hYmYTVP< zL7DuaLm_u^VVX$v%jD(n!jmld--wOO2ms0En;hXOpaLId=AC|gbEw_m#@%HmX8hFt~?!2CwownSs7V6tE9bW6N zKLc#{V|o)Op%Z`dMW`@Ri|NS`(qn(bjfKEe-EJh&@xX*XnHZT*&cMyMYB}qIXIlN8 z^_>4}j5c$I$Cr+^p9v%>+*IXkQ?_nPj6D20GcZZPc;#0NPKI=Bd*ZGag!H(Bkmy;5 z{H+=G?R)~sIf&A|p#nm=3>R3LitH87r;>e!OuXIJI@78vaS>s*=Fh>8b=GYRxJC;0#q}YV+ zoxd`6?j}bT@lM?*gJcKgh7F(-_gZmJk~yL7Il4d^p4N+87=*gTj;fQH!}_! z3gh*u4>H7_W8^T@w>;2TYSBEG2ek$J7IU5p+Y!^m?iYxolAll9mjF$r#_ z+Kdhet!BnQrR&bzN4Bqj5V?uNP?~yNw}&d%VUZ?_<@~a!yzWRtBXN=s=Q!=yccplI zv8i15d;h4!^&7u!g@u|VgIm@RzeHxPgcM7)tABgK#8b$Mo>qg`!odBM20_CkC2<%TDxG5lwBi44k3x!m`!$vbtIJK%M)V69={?=qp*Ss4R zi88~rwDS?}>&ml@rTy|x$w&Jb&INzv9B)C!Sf2R|cbWeUuhp~2kf#-qj>Gc5QSYVY|8oX>;dn_#*2)<)}??lqMuw= zvw9HQm?iWtjUl-q@HmRuf&uEzdb}N2K%f8t1tZ z1(EzDK7tT1I}h1hmrgF*p*y?~gpNA5?Ke0MbGNFR2p=W!Hqt5-kS*5;G!%#dJGzD$7u}m_l zc*=}*{I)@gEZ6Kp60S;G_A&R?&4lv{Ra)1<#YAUY0zMc!S?)T7GY42^I!guagEv9? zwy-88rzv5%d!D_T67!M99iL(_kta*swsSHrmR^y8;##rz-pDQU&B>a%CO+U^9q9|# zMxG%Bi4yw$W0pe4<~oV$OYf^=pdG8o9EFz#OClJp+`xLRnMb_k9`$$cR1o!8DVaSQ z&gX^a-s%dB?KsoX*R9Uo3gOMqw%Sx8612Wv?RtXXqwUwmRT(bX(a7HNlxfSD+t=qd&JlAJwI4ZgpaF{?g1ZPx=u6$~_zn zNUdfvs>nyGY>de$_4Gc`-9cN)wBTqJE4HfOI?`sG3p^}39gi-6+!asJWXas3UBwM- zsyG8{dBh1m=3o7I%U1|PK-uqc(e=8&%j~Z$@6@*UeY>ugbkPCB?jR*sndX=EXxR%z zXXs+OP7duBJGWsCUGWtrJ8+=_*)@!(nX49NVoJh=>*E(buFUa>K>t;^kZ?Rda1uf} zRJkusPA|8o2uCArMknb_>FuL?wtA1?M`3Pf6T=U_Qm9vh20zFeW(2-pf+n^ zqD@_hYa3&eItL7Ry2+sd0vj7IhdsqFn*#^P`hKtQ|4_fv*gDOM+u<~i#2D_=R^@4! zZse;)(}PN1d0_63SHFgvHCPHcxY%7#UinNm9_A*uhJ9CWC-z)&e{4OG^#E=w61luW zAyOv=qlVmei22bD6KM()OQn!K{8F*G^O{*?iBh$?xx~V-9gp z3JYv<8(fE}DQ?hyk*->3>=8X@u#N3_)!gEoi}&JhCo=4<;on7EGD{r9KzSZ^fD!*1 z(_EGvVW@2z>tUv*rqyWa7;STIcZkkl&+fIUnShDYmVO@LxX!3f~8RLI1;$SRse{U1$3hgaMittm0lY>5sK1Vvr=UbnF!YJvcs# zD0A&GRKyD-czfxG8sOnLP?O#)V06lf2_eA{1l2;mpDfC?%x`v-KY0l{AW2&gjvrF8 z9be=M4;Q`e^J2q;|CH7sgx!*MBE9(9jn!XR$MMB9*_m%mp(O8B$4B)WO|#Fqjc{7A z5^vS`kt7#u(>I%Og;JTuWB>H=*i0k$Q_H+A!i-TdL|kk6eFB0?!TL(oitoik{bSlmLDC((89J?g207c3N?IzQND zDKWo%_<3!WX{kR?GbaHtNpg1kw9$p+=c-*whT)eZf$EaO#uPm-*hygnEGr>dU)viM;iwFDJRdHerS37puu?m9LGgW9@q5XT@O*ZmMdRN5f3Rj_2HGx;;*U3DxGL zk8-Lc&4d*wa_W~`6WXRafT}Xv_!V1mwok(!-5ht-%QmpXs*3!fgfvdR;k-Xf?o0kJITMX-6S68x6YU z*x(B$#$O(MG>leImtec(6!pFH^;c`U8_$@CanWF-z+g$?!Gqovo9^g`@@!y5fW?^3 z@g&iNabaxHK_PfqthCzLFskyREJPZRA|G4T=nRu>VJ;S)!2pfVj23hC1f73el*qt# z#IQucQ!ke*7G1jzmnLoV5R`7oe7w+~jdY%0ZdTod=778gPoS&+5!!&elJEbEarC=8 zWj|iZeE?Hc<*diMi{_kfzcKk-=_WonU?^ucv(9ir{FG+ST)soj+CU>1GxrBDMs!S$ zM#d8uxow3#Dx>WI4(QQn@^h*yRI2Et+n9+*-sx}V6w5m*qaE|EI^&W=P;2xm|eI@&(Y#J)Tg>1p>F+QiMPF5UAPPqPhncK?uf~Rbr+_wF>$?$IW;%V`7(7bJa2nLPe z4~$f32Psufs8oSsvuTo@R1tiuT^_ZB1vzElnrnbP)F#=&r{bwA z2uKv>Og;R@ajVg#Vl|rm)KvU9I+f>IAKPHL?5bMp60dGKJXU_f>m=$0vW2QJ3m{wI zB?g5;iYty+DI`;(dP_R|j4H-wk0PhJW~}L2cJG>@j!FnJ1>moM4LJ!ut{;G2JF;kQ zb=B?dBu6bgO_Y5Zo zLp#*sxhax>YP+Zn;Zdm|3%lt_wt@EW_|Y7e%k(lEc)N5=1{N9xrwpJM%R2yBqtwy* z3vQtVz1}#nKCNx{nHhi~knX^?`ludJ2{&leRxfmG=SX!OyTP{aImu=n3Pu0y^Ed~C z-7&8cjrJ&yA27>gvsvh(H!kveq6eAU8s5n*6u)8v66Gi*vNAfN?*TN21~=#~zq|i7 zMmZk>z`!*G8u;-s2 z)?h&BpDfZJe1Hi36!ab0al`U=aVCM?@>u#~=!XB5OMLUi)Z%B3$LuGkoazQ-I0w;Mk>bXE=RlKQd`{+tl^xkCWA}< zwwDz1T(>ZN?B9D4=1UNMvlYo9OAmghjTC!hqAZ{l#6)7)el>Ef=UX^7V>aAq>NK-o zEPcP0#Oh8@e?2HG@CxE_pC7nWvqP_@rDo&aD!%c3GytumDahB<67>tQ%f!@hmZ0Xr zDYIn|LVN}H#n*nsMcqEUL^$3imo2PzIq*0U5VxDa3d#QBHcY`NNQ#TdNIO1#ROu9e82!cwHGIuYD{3a8Ny=ePv(=hPr z;n76}(V$Nf{v)E@KBzjQDgQCt@5&3b)rCjzCR z&djSoZqbr5YV%hMB^z!_v;^?=!V04hlV6+(%4xL!?`NL`xNJ- znc5uslsQGcXfgJ>G=)Db78~nz zIm@qpb;zr>`O;v0twAAP9$%;7dk8(?lK$>6yT$*piJC$=dfra^8YQp}xLSg^{Y3Y1 zXwyS)JZ4}?PF^cx1Q;4 zRwPb9+7kstMX4%xo1hJ%esh|0@OPbrG@DFTvaPw2hUR!UZ)~>u$jT`{9=8GqI^nyJ z^w69$Rg|5COz(YNO`g#{X(o_>q`?8gTM$1iR6x39obFK?0;Gz;M8Hl8hLuHXSOWy` z#!H`|4au#K()Li99~|D_7;^Qi=(OMVv^?)_l9q969o&X=q^n=5(XQAAO)@S72}y_F zXPWu@j{Hc4`&HKHKl=W|(dWUY1r8__@B|VoOefu&oHot1wZJNy-;?vpg)8nb3QnF5 zEsQ|KgT9z^#~KF4PE z1Omuf-@{oZFGgt$=1(*u;A@vK%s!ybUSXfI#&9mpTG3XfJqFn1*4N5t6ER+!OfNSP zc+k_m3}HL=Gjk0syNUMid`-0b)DpoWfQAadR*@sp$?o&BWh{GbX5kR1$8#_L#CozP z#kns?Q+Q@6CLdWKx7*f*X~}i+YOt4)USs^MSFDy@vQ;BBY%TsqxS< zVJ-g{=xdn$ZnJ%kwrL7t*)uVKL%kRTsm>=i)@F3IS+kv!z-C{eXOfzh56uWUnqHAqb7+Rcp>zm7SpJcCeb*08TC+;}e4 zRju^SaM##Hmi*}F-o+omYi*KR!``Y{d|u%+O=ABlL^d)y2>p?^4&A|B)+GWcpQ9iv zl*Zjd14q7?Ba1a{C5i0uzHCtfsp-!;F^(9FL9iE8@b^wuE-ec+5`0MyX=$4G-85U} zGC*Y@&sN}-!Q-@1&P8I$35LPB7z{8>K)>Y`Xg=>s@$R8$apMNyxA2_A0!xr# zMCf6A1*Cf8WSj*bFUjNTRTBVz2I>y8@z_#e{OmaW;Ik@s2AhCB91RBRC!u4$#*TGy z1TWPZyDZf>-JfDSchR2yV5(e9K%XEvfOr9c8pP=RZue!T4zxyD-TCvlDIYLFKoIvs zEkyn?5%NFdl6^Hm%Y3q+Y$H-AU%9@XB=!>@7dRP zBoY|Pc2!-9HrD_Wa|~tZOGq>rp&l3w@pFz%7{V7*$$;Cyc8_!1Hzx+vNFl)=`RfE# zZ@nO)G7TDW7NAi@RfhQ>pHMk^L4)gLm_r0%Cf#T%B`7nYkZ1TiZ>mai8|F1v|FP`@Gzy5F-)I5m-Z=aG0}@~ZAob38woZ8|Tu z+SyHAN8|mGR#8}>hBr%aI^lzXk&$>A07Kgv{wN^8OgbW5?$$O(jrCPJ0|1M|zbFC+;d9hSf1zbCVb~80W!(|+Xh8C9+yey)=)!;WvWos6{vPW;uQtN1gOnhP*r9= zCT!z6$E}yXI&3R?j9-$%lA?K|sa;vOFb%;Z{CQSX1>h{#0CalC-;W@O*I7vKJXb)v z-QyXqsn8b#ehKkfB>EP%S*B9j-^EXzP3=CfOQJgRe@Bok(eYxDgJeM#0u7ZZ7;V%- z8bt)4PAvWOI{$3g^wOxFXJ5>CQuMu^SCf;~_!QqR5D*g&{BD=2G+450Uuk<^GPopp z6Z)nuIRao1kbbePt*ruGNZ3{W1l+yvi2BW3a`qIqy=Atg_xasTXZ8C_JMVwRfCeS_ zT0~vZ9=(0EptG}u=R|saq4r4BUmh^*N+@K8?kcP!^ip%uyvK|tls6dCa6Jl z;4pm72S}KY#Vo7y7L>GG(8z*eGD7$*h*m8J#;dtoiZlc;yqHd$k&68zwEtG7f2mX+ zG5FJ5@V1i_bDu;f1va`WG>B0$fT4Igil1uf9~4wS5PKUC%e3gx9!wWFF**dhgO-RO z!-gW`&EG%`wgUoDw;fkfD9jh}*fCSZe7;XxgIbTBe^Vt2c;SjqIXL+Ct^eD+6$rBg0&iHR0g>5X0-KfObv7|N z;@}(pSM)%?t4TH-b^@R$a}H(+V>0B=g8lF--{#c+X+iMdm5tG2b3Cj%-&fGx%^6oH z{^u&8_X64(#SQ7SuQ9rto+nZj)L)$myL31pm{3GcZ@D>)OYG z6KC$Ypwq{+AYZ2*OV{(i#QsBdH<$&!vZ!bYIy5&S%uaCnnv>#l;0+y*rjAUTQ9)TKhj#_`e@V8NW`!9}fg}{L4?i zAa_Mh8@%YMJyELqyot^QtjtKnX}S*IB>sBBbRo+Vq9L_}*Sa_y(`IrHTE{x3Ti}hy z&8BJ8<>^L|$7<92l8S;FpP!NOe z@crA<@7`~mS{YNr@(lUNR$20lUDJB%i{W{iPLi_lrSu-(vn!I^Kp|&plbDbtM#a98{#k>vO z%^drG#LycVRzi!FrH4i(4a5~ph^mun&$^OtU+L#-!W#Jvh`?3VcJLdKeN%liKQ>!3t{X#VZ{$xE%P&p*K z>ec%oVh^XQr~Kw{|6iL*@(SVN6nyq5>p!T;--xAS8npR~55N@UEC=ah3OUb>L)IJG znt!T{3K}KW(K{8s|B>=P+!GW4mdg&WNc_;l`oG`z){hVa zM&?Y+UsaDlj8GV`#A=L_o1*$ZmdQ_~!)&!1lWEgtTk-#-``;69vIwCb2wsAM;541@mjiLj9+@=(|FPrTDC3=|GeDhu(j+I0$ ziY@y;9!rYM1p%^7{Ru4purB~HuQ?umA3cV@X$Fo81N8Ed2BYVe{CgP4d=Paf!31XY zf`9)%Dg!`ym$%nytMJ#GqZk3ktFesoy%GQ57%2ld9IqHR$1(O_JT`y;Uv4fmo3H3v z;7O)G!X^3ZY80>zR^}|2Rd!C~@3$i}gI798OG!yh%-0b9-325cKyc8zpguMJvy%}- zy#rE8frE4!h1cj`CKcpTA%gmtFva7-{PnoJ51i+Q(|9cUL@HU`#GOA>MeOwf<4=rmW_PhZM{J;0U(a#MQ zbbDLt;@`ZA0vduM2eDX}BeH)n7by3p+;S3-T>ltEApd3;=xXud-AE33ikppnxv@@TSE5x&Fk1{MZ~6 zBcP5ikDJK0T>q(g@^~m!h@|dl89S|(aeTA)Vs#q3bM$dIj!b_01npwDF?mJI45Bj9 zQ@kycSAh5ah{WY`r6EsYP|k!$>wN^sMA*S@@9sVzynvMQienf2Z(_d@_6}gYiN?#N z1=^R05;zKGH}8%4D~^y9$(zHW1WT)F9|yIWoDA3OQklC}j3sXV0Z@jsw>`6Eru z;iZyUJ$GFZ(2Ia9MN~9EXO+qESjFj>ZN=KRWgPFH`uyh0f^;X1$PDD#h=N0y)tA}0 z-gmES_qR4&&W$8CP_$8is=j@y0pa8~JZzt?Hq3LZwXk^}#SZ!=p{O)i{B)zg|ANJ0 zRd>wviW&>IwEC;*GwL)!{ns~HtbQZ*0+S*9Uz`QmEFmwtRYtQm4mH#P6$r9CKc<`2 zM_MX9D7~EoMcX5z`x6shwv#4M`4CM4Hrr*VQ|r{VUDbt#$9JKTjQK;2-?|r7n{ATK zSwE0~woOsSc0lK$M>E$+aq7z)`qZ=S6SkRoKb`2Wx0$sp7bwHnGody@p4SNXV#_ti zr2}q!Bthmbj}ctumiuyq=>*w$bt`A%AIbm*D;N$2m06T+AOsrxphT8nu-pHm>#d`r zez&M`Qc7R|83gH6QV>Z=Ns&+xMmnWia_Evy0VM?qX@(rSTR^&o?rw(W{owuH`@Z-7 z)^9EUV98oAJaNuGd+&3e7A#Lhxr_2|!>qU3uX?c13t#TQC4|{qa>u9;oj^ZWd>X@E-1_~j*6{d^2GB)5Vbe$EwWNpwOXZaoLTV~k zRN48T_m2){tH;;!tnARq2ywV_Nf+RczXo>D?fw?HISvs0PlRqyL(!@2NaNPJ-#0Wg zCWWsKP?%F<3ENA423%nha3nG>`%O)+XqWR0P@i6`>{ftp6cWSVM$OkdmaFn3+9HDe zp9rV>X8mb7mu@_a%}*$ajh?fesqD9|cKA4d)!HxjXCP-cIVC~ER-0}l;V$)uZs|wh z0;w?rd#aWua+dnv8Iv~tKFVcJ8S33v&4qKdGMrZjJe$YU-+9g_)_?LX;hOZ;IayD0 z1;JS|EBvLeo`rd02H={oo{u*6JIsFQVK_J2NgF1rbvQQvLs>XeH2@9my27~@*oM-8 zKlEuF3r0?~I4d0FZPairjeXIdUTk>ukSPJc_fI2HilCtk?f-*IfMgW~?BD_XkQMmY zkBQE$rpd~jM_6;uhRVI7OH93<#3$sdJuO8*nw&hNe|hrsBwD&fIT21H%59@&KF1$n?#-QPuCuuz znrp}cYRb)Y(%9!KBonN)nZx+l!4Ud*4jrYkw|5Q{E-@CX1wkJjE%eS>ZMnb{J`-E{ zD!z|X#kHR)#>Y*znvVBQ4G(w(v1?Y#C49TWLEft=*=04RQ8v>YpJ1@B`1b`;o-E29 zVn=G5I{5+ee{z!?z#Bb1mr7)@1eo&R=w?CdtL`nu0+X++7M8cQm_&G@*@cfq0eql$ z;AXy4PzD|3OdryCsx|rE6glU|6VK6Nn&@N==WI~vip5tj85CfI5Rf@{1SQ6Q$7k`-`|L(f(qR)To&#!b-Km@{jz#@)7KaG*e$4ij zeKRSQWNguPwr0%M6N=o87nH%6Y=q`gzRwN(%JE^`R&ZY)qwLOe;OV~kGmRYW3`ecP zssae-Y?UUrb}Q_l1?}cEU7KtB^`mkCJgWYR+Vnyz47xr_nKwuXakyq|iZ~anahxDn zxB6(rK@wKsG@*WB-6C+|G{;rej95;tw*8#s+x!_RPxz+pvS{{`DWJjcQ6AdTAOmbZ z`B1^RUj2bANi!^Zo{yx&#Of5;(`Aq?Kh>-CBkI5nQ!93^@uea?CeY<~c1L?QqY0+jTJhkJOu7BQZgYKKsb zoyeK1mz&4LkM`z2%cXX3h%t%2D1u>J+Mh)!v4h!#_zPyW2Xu&!X;5f|Fe|>&lJWzbYe)_6OEdwGgUR zSI>p{-U#>&26T{kg5k3=g{d+xfu8Sz>illn`OvutMvylzlkjB1I0M(DCH(VcDEU!_eY(IP z_S4`Y)h0~_!OBx}2gxw%K+gF_y@TWR2c;?ogCX3<-th)&a}Cee=>-elv7~Dw(rv@< zvA}Kopqq&J?>sT^+9kHAUjKQm91Lr}JZH^wJYV;TxmHOfZ;8{7?s_h3|y6oZlp`Swqj2Muf>hq>?PX&x_b6kO)E$PBB|!JtEo@d_cuTd^4i7byE}^=;{Od! zz}JWLfTE?FHAR49{L~llVe~ENJ?NWP$bn-tetV@|sy|cxT2Jt-d2jDR#aTc5aB@(& z`-I86Cb1=(V!EcUzF6dpd2?>ZjDK)$%CbYjS9)-nfrbPwQa-|NR7vvI-D-uTxKgT( zA|gATJPud%R@=mS>K*O*Bv@37oeuj@MN-j;b&bp8s;*eGBk5>ZkV}3uw#9qJ+f=F| zQAGVYkl*8Nb3LDVuSCR|4!Vzr%r2FPq|8(p#d+{v7=5pF$SHhj)6$#3$^uYtam+Fs zPd;zdyl+wV_$lsmAsi(jMUwb7_Fmc{es~=ZsF?lNGR&(ti&^wb|~ccF7)0HA3sOUtY7e)L$r+?me?EoQyKn?+X?op4dH&Obw?TbdO+WD2ZYLl){>#hY;OP9ipjjC&f-!@f0U0il_ z8g9A>7W98VIv9-V4Y)A!JUSKcnk-*^<{o;lRtVge2r1&_P6#W&lj_i>NY_Kvo-?J^&2V=p4}H3 zubNwrQdtnIB;J^Qe*D(llJPn03MZu;-mD3I!}JoiT4UCm!P;?P<=DswA-ST$X@`A{ z3-Fr{;eUujCy)I@h77|*O!~ei3Vqn>S$c_=a$7iC@urbG;X{KK@@S?>46GR4<$Y~S z$42z~0?<40kR2anuM7TE7DPO+fDYQY46Kv;uB_T~DWpxMnSpn>gmygEDS}0+J?sm9 zG)|P|_n_xq%M$#W{-xqMM*^SFz1w9%o>b1-eg%@{8?7R0^lhWgul))dZHk5z{ql|Hl!rDXyBG5`&~L>h?$B- zhhuL3h3ERMp2rI=$hwPCwarf$=vl+BCO6o@c;g&)$3qX=c^kaJC3-7s2DwiD&N9!16zZ+d zAMs#;j0d)P|A;i0&QrV4BxtqdMCE#JF`Q{z7&@kU9E1$4zV2*f7rVZxEEj7l1;kJb z()>Ebhw10O<%CF^i6p^22XRw=LSZp?_AhoNEvx$dg%qNzu7H*U(z|D5xNNIr{+kpK zM|<;Qfm>6g?Jp@M<%^=t?fLRlwK}Ju-*ERvWIrCNT(5O+iKc|gDf91NZ88}9R+ct6 zb*ZxuCg7_kDm(TWn4W)C#so7b+3Xy8-`k~A7WTR*kap;G+6%@Xc zY!b%dUZrWX5(;ncaqkEwPNF?Sm`Ob^+8*riwnzxMQ=OTeNNq|`IwXREur>p|xcV$* zDxfD7vRTz8sYhd@Tqis(1&49>ekL%*HWewf0)-u_d$sKJ(M;-@@D2AJ|J9%U+t*^E zI|G7Jz6DYB!yMI)%C{-;?C)F~5t0%+%{S9D$6ihfOVnSs>mu=|g@NX`PEShWfb7>1 zr{9^w6;#QW4f~a<3R(uz&R;!64g|RDE)`Gu$7y_SK$t7wHOJ3(&}cIi2bB05=rekg&ablX)P5Iil@n*UPupoVM->=(A(l-$7G ze}&CHSK98hiOH|j^>TlY4-YS(AnH2ty4)gRo7t*+|Mg0YDvfjRSI!RyLlqt)4oIP$ z@XK6Uu-xEyZk;-X<}Zzck+-zx0Fr8qA?tQuPTJ$g;5hj~jr|enjr_qz-P|#%cx9B- z9JlTsZrhtyS?+VA54-i;{X_qwXw>}5Y#~{hp(^Ydd4^Op` zn@+Q|beRzKyLGq$I9fYx z4LLZ-H|UNfQ|2wxufCU=WkP!!)9r}It?#z4>g##VK2%e}#rU_(-Au2w93&FMRyID( zQif4i6N?FFvy)juIV@?!q-Rxw=P}ZfbgzI6Z`otKY*_TShry^Pu>Q!T9AgiAS8c>Y zcM@kGXb~yfRoxTS<`bP+|L8UWLG$DnxtsIJ9$|?K>LKf7Ep+KBkJxT`u`%7x)Ja7g zEboK(niKf?efWU(SKWI`EPhR@cv`^wN5=)P`rV!A-n_%E>_q}tVVo46 zo^LL)C`QsUJ+r1)WpE{v{*5tlO?zkDbpM>>Er1^_$?TD`kGC`1!jqqR!@LlZ;{)5? z^-Ra=0}g|QGi92^=Lfh`wT@xiIRpK?!oeTQJ(hVi4kWbc6|dOoK7ComC9waP8AEHM ze>kJ-I^j+S_ON0v1#M^P-0%%-8hnaDD8ZetujhAF2fWgiZdRL<`aK4edBQG)k$7aK z-)e^$oM}Y|OB}tM@UMa$S_YM;Ebo!PUF6-JV=2oJWGueZ|}zddsH{U3J52s_~H+@Vu{QCyzZ6Q=@M{**dwh(0ZnIhgwATEzHk z7p*Qxq}ep^07t?5#*>{yTD;EVZ2jT}Ovx-AGJ74~-UT`;A(8@@^AAdpT4fdJE<6~3MGAQSw1HA$PeYDJu0euvc||5 z4%?E@1l(S1JoGkXh?Z`soKi=-^Ep=|d{BoZ zjNpjt9{k~wWAU!QCuv7qto_w~Gu6CdfJeP5k>7hTN&|h{UrVg+9Vl%5Bq0~K*O`Y~ zeP@#1n>}fP-RjB`-P0P<0E4*;s!*s|(%MFO_H&Gvv`rZz`>PHn;YM*<1K=z^o0*NY zC}S4D@TM^-j-b;Km^T48CsKqxwtY|b>06jkJn)P{jLHLgNx?SJXiV(hNtF#?<@aQnbcz{^J^0B z)S$W|MdFgHYjQWP?@V=jwoQ>}xplTTrl%KuVYwzxWAxE*UiP-Qd>`j`9CJM(DE)yS z{o2aNrk)&)QTEY{A1rbex3@)yo_&KhpZ><0eMyKsMtUTv$TAg4uqEl&><5>Odx+$B z&~q&OZbxm6INHQNvMcFIb%hAz_JH*#zB@Qyc7^7u88%6NXmtpz?rvWbsx{|d58Pfj z`{N}x>9pC{-v+MXov*_zf8VK?rn%pozgfJzAKfAI*~{{J=4jo|gPZuF!B~aYmAl~2 zvCTOPS3vv$VcugtG%5A}QCI+l=)Rc)^_4Eb%7eZ&gO`_nCwC6sDRK@xVZ$1;UN!F5 z1*-7T{H3~X-E7GZ9~Fy;DuoY-C<=KFnT=wQnmIkay z+NGy}!XWZ_aXzgm`$s)}`*$!aY1v8NtGrwE;X{Q;+aB-@RIKi#*D4s zg6|Y2u377qcP+5|Wc}!(lXQ{0KXN!mB8r9|kU`Z+ zK{);vgqBYAVv=J9X3+RYZKR%SG?kV;I7sPM<+56=>zPK%q`xHVD?{)8HPT2@$UDR3 z5gC<~s+AH+n;D7^=1*PD;5uMy2s>Al=SPq#9**CRL4*)lXvm83kr=Vudo-OoXVQ{y zu~s_SPReEd*jGj*kP5SyLhYLOLQY%8>1(3@6~VHoP-{Oc)ID4Ek)svF-kH_{l~UO> zkG^~y@BqTFke&HDqPKDtHbR5kbQNLSQ~uDG{V47C{>+7TdYOPvsn0nZNK?NEb(?5Z ztPA2rJ2lQ*$vW;Z;M6awO)a);F8j?+336vWmuBnv!eZ_*4Qw5S0sP9XlZ5BTYq74f zZnm=@p^7tjg~@Bh-z~>jBc(&qzL^yU@lrv4=I!;KWUEpdbcztIDHXlBSZ-g9x;}_T z9PfJaY^3_iSdnjz21{Suexgj`e6=Gv>$J9hRwOKL($3SqF8nSQG`nJqXvmTCj~HNcz0e3jv$;*eQCSZ~V;M(7xv9x`>Q% z!I~}}UA}Zf!ocAX{>9!+f{i9~wU^gVwzFo>`8ZP%2K4X+A7>({oHSvPSwsj|mU$Yi z7l*&H(6JQZ6ibx#P(xVa8&EW=wOnGMVHb|u*-D1{D^yI&JRh};{=#i0R5Bvom9H4( zglE5Zt9r+#m~W~ONi@TIQ)!mD*UNmI)_jGs|7Bf9gdx$}wdR`FG)q;C-I{iCv_x|d zo5{3xLVo~6*pqC`#`( zUP7BkU!Jt=H}2C!_lefO^_ruB=6*Gy!%#ZA-Z(vT4uPSd8#&Dc2`#1(B#1pW>fj+= z=x3@zLUi z*gJC#TB27wFD}lPqfBP1tYH>Gr~lENv$#<;&$A9!9LyM_<oN$l*v^fftsgpUYB%_v`ouV$vh*4wFNAPzwO% zT07rHDiz&=mydI$*rBYJW^xvXBC3AQ8V}C0J&#N=l0&tej-x0b3U@syU@Nf9X*sj60y_JqzwL{6;aE%;y! zHhxa76?%>dcy`@dH(Tn_oyaL2`E{S;eOH9@3%_r|WK_<+GvIHpE1uW{pk#G)wmvx2 z08N;L60z4-3aD#N^piOZ2%l*8@Nt`NJ>l2+@>rrH*=EbD+`h{t4z|&ICvlwv^La-H zd!zo+t-ZbI*+BO6rS-)gLIsJdV0BnU`kTA(m+szOZ8(oQFk9CL)(+<#x!pM33bIzo zl_*XYfn?@^_*9R=Ado)zSk6cYXBe7;Wxmme7&hWBg_7bahG z?`zOZxP!VznJ9ZD_1#+_ZI2RnzKLj_wI}3ulf``z{sNah91cJp7IodEQwz+ZaB0v{R}S-x|3d78Ux)x z?{nUg3!X3dXIsxyz0X(6Q=3V2bb9=eH zJd0WNAG1mH(!J~99HZ=tF}e`Lir*@`pX6?gbu7koz(bSoo2#I!VN(^6F>gXt6L+)b zLOiPNd7r~TOWC5~at+-_0A@l_NUFU2crn0-n<+&P(ps`q~lk zFT-}W#uYk}kLz@aKO+dgjtPiXvR-hix6xy((+1;U#B?bUrX2n7;6KLdVbzkLpm0%( z$*GbtQzhysE~q488rXg%r}-_=$=1(xWD=X*Ho|kPUoxDbz8)v+P=m%Z6-u#JYx4r{ zu9W(F^(S9(0W)L6)pN%#%%Q!MD$j7zPOt`cEzkl(74{HLI}&j5YCPD<_dS&(jYR24 z#W>LSwKcvZP_q@xMj1xmk5|!~nn z`LX2vU9|b=VHiI^#%_&(_XgPrnnv9&j3HQeqG#amHd60rgdR){p1LUok!P$GPLZ^rR7g6{zBr7V;CbWk4yo?ZtUv%hBk!yBZtfm=ewh zyJeGN?d@Z=jO&K$ypL~?qhD72<=a-w7_hMnbDXrz*Dk~zxteUHxa+)=_Ggzw>;Zar zZsc#{i4UMg)BAKO7%4SZ#r{$+YJM-UhA;c4Ih_1Oiu9d0SU%zje?p5tmO@t~6@wX* zSE9{q?T6aWoAg>$Rx!vq=pYOps<)jtHmsrNx$5jXmhUm~dk^Pts{tUi-D_F;`Ms1{mcq}8mAP1O%%;d z2P%(eI>YVy++l|;%<$B<$JM*jbS#e-TaxuL{Sx`<*1DOlFxhQ&;a#A2ImzdIMr)BV zGGkBV0a#7;tRjO7lBl0?v-~W*cZJEjmz6~0)Bc>udzgobU^BKg)!TXDWa(pZupG!s zpF>UC@7r<%nO_LmO3_3b6rx`=Q#%0n>pKJExjtOnmN1e&9!wG(F6xOv?F&p^g#3zs zdT9~dz9Bb$`Vnkd*M2r(tg}+{ zS(o8X^E8&=K6*VFNV!i56i~A5T2U4 zQToT5&d0cUAR7LdFTjrtQ>8A_e4eV+^i2rfWFKBf5bpp6hOL?l(%#ktT3h;{Vc z>HHjl8zDa|?u(IsH627_+?!l5;+i=hDWDwM@-o#04ziWhXX-dran&FArMPe9?bRr7 z)=1eY%|l6;-$s+Nsmql`^-=jueXO=g_3Xa6!EoL~YTLd+m080zdjxmQ}X75FQC!Duvq#MIN0tDRm;7KeH@Td+H4FOID4DrNRFak<7<>w zcyA&Xm-Tc7(ev*1ld~DyFb*X@iR?G=JVcmX|MBR7=zM?Sh#GZ8MwGJE-`jI_F$nVK z-+bb_63*!#tJcow|M-HxXx60T5hL3_#&TaqMie~st1B^Z#&!yq%2 zO4_sjM8H<3Tco6r)Cgm^-$sx%8Vo%2b5;*9VGi9}gv>}xJcsB}T2S-6Zv6IhhVtuv zxu5M!F^Jus{{$TCeRN+amsCG*j~7KshiUluIpGyQW8DS7+(NISYDXxk6MtS6aEB7> zj|YV5PB$lwUc4Zf7eOMH6IE**R~7_DBEeKX>OfG z>Ej}txO*71KIe>f9|JKxv1upgfMZ@}HC2Y9A+^to_(C_9r^>SQMmBYoeZ4&D$j29@_@wtV?>F_iDU`&;`f>^b>2M(rW5`5}!3I`h$lch)Y21?fEj{ zRGCQ_RGz0+e5TakHOx@?>TGwltdG;tkT`<;MJLP(c&UYD*51v9*p1NbinxE7tMOd2 z@oG;vw-+dr`!3egY5KSP^8rV!&Jpm+j3AO>Z*VzEO!xLU{qB(iH<_9V(IY>Bt1%5d z!Qxx`U(5^H8I3Fk9qw!2O?#!ubXMAXk2JXFCepocYm72Zfg{j2*8sgCT^9UDHx6b4 zfO9)3{}Tq^71}?wHcz^;XHG~*45u@GCb=Zq=6Ehv9Ih{kWt*h>8%8#YNZu0saw@%UXZ(I{Sh5^vk(O}Cdjsq}dEJWAR(Q87Hl{J_BIh}lsl09mcK7uvW z1lg+RCP?evug{2kJ*3j$*-SMAzBD%*rE zv`7m>^0GUIVRo6A=?(k}HZ4KPgh-BKQFcxiXQyiqrr{JGi8O8y*h*uuxZ4cO!46`28+); zuwET$5)F6TW~toS#1;K$Qf@d${p9`v1EYd`z70sBZ7KoVu_@X{|Kii{XfTJS+~)9w z7^xm~_vOXL&!{ZmbRQk{an&smfW={u$di5VJFVi{t$azlQtXG^ul_SKzCqWE5K28 z0Vk!qZ$0zH&NK%eJFR5{A|Ww5F_&gVH!Ob&ZvWHh6y3#AH>10u`(AnrB-7nsU)geN z|KW?B0e%zQuuSUlCyg1-=fCQg!>Lm%S7|Xu30ng`_V|dj%@9({rbaqPk+jx<~cDC?pa^VGL zy729LxFf|D)ZzB}!sfV((lNZwc3(f-xooC%5a>z$mlJtO9>|!l%*#25<%rR?9G;GI zv)uDAglT7`>{D6{4>GM+n`;O*ck}*~!+J0uaMDu~k6O=syI#Gk$~9m6oZm zuK7LA?bcV*N}XxnEC?Y6SwEZef$I-PMTrZ)-@}|PrYD_WFrko}AG<*2K7TbusDP!Y zAA}Kxc|tTUmyy+<%rBfkYe$}q116IGC~j7hSp|yu!;k$!nyG;%ly$jZ_@Eg*wf6Lt z_C?+TxGkg zIQwPyZ;chC<{s@HPgZweQ?`+Q9mfg-2TKFHL(3?!BhlJg$IqctJ1U6DjhPt`DxyiC z&R({!kbowsq-#Fcm!Ra_0C{8K>}6P4K7n$R zU)&l#XaMS0x-gM2GA`$(;7N}~NmdBI-G;&sUW3*ELqK5(yFv{+j$wr0nGe@YEQ`;` z?a@Klb?jO&BM*Eo?FqeZPA4KCqZU*O@4?%w!Ri!qkT*lMSoa>i`!2jChCMb&O&;8+ zj&9U(Jp0{Dprv>!7NX7qh9$8BAOOdXAF4`%9l46_zgn)Oq*b)>(%^}-!>vmMPP7sy z5)ICN3jB(o&-#l$aWbD93Y(YdJYCYxa-`^mz89lYY@Ta#p3w?5){FSGo; zJ@nXrT3LujrXU&VI z)gv{%7V?kJ0FsD9L{#DF#h%kzg6YFQNsH|$5_ zY}2;?zPQ?N%C?~&fjp-;b?hIrl&=5R&>^~booU~?`wmqmTKVeria8d-9m z3T-B05w#_cPGhdaCh_;G#LEB{^6DB#G-l4<`H8DCZCZ5dA3|*M(x+vC zB42$Mf+iNf(ClH0ojJwqCnC zQ0PU=Oh4rpmEivkbDRIGFLnqAWKvyY=-Y_OTwGN)%^VO*o|@i?NO}KcYMtJ-`*$j8 zWfD)cS&UtFVg%T#(R{4p;PU|YP-W&iz}6o994-C!)Sz|xQyU{l8Lg^P=GBaeRtO8q zVOw&kIG&3ZHcv?cmfdL%j{3tSTJ2_@2YzA9?d{F<{NOrRDdpRv2}1S&BVY2c_M{z5 zldB#N>=(XEmim-Q0NsZ+ZRvLf1cb@mAENETmjE)+(QwkFp2`1EQ2Rxe(mp^fU#&-k z0B9okg#GZ>1lyU<2i^|qI>O*5BnmJr>#49^U4!KY$(IkC0 zKLHi~d5`j_z>qbp^2&KKg#>o{Zy1hLYij_0v=5amtehtlxBx&ADe z97Z6kn`Cyy6b6+|HjCJB zltKoZ+RYrv26tf0J3@a8@>NFi)e}$RIf7SFaIs)(-#|n5g@IJziI6~a4HM@Y$p{F` z0`V5`SYp+{3RcJ$C#67KQjfxiJ8+>dRLLx zg7E0qzbVV%!bH3&qFON`qJc?*Tx4{9f0U-|!>!+^ z_BuDX0P0{o94zN4V?;G3jqR%+hs#}cI^$5u>Tc{)>fsJIZ9D~FENT0vw68)!evaAV=W=ja)s(x0Cw#5KTV<j$ zO%u`Vhs`I;=hsa>A=(P4b+A?dk%jG*8s(?yadp` z6l+K^i9;;+5Y=frM_tt7H16A6>4(3mg9AWf@n{zPlO7d&+6&Nj~|r^iQp+^akYrDFS{7VrM?9`r7KN{~j zhY&pU40OLps(EbsueC}Q%ZBD+R{W+_9ihN=k%odwMX#UFzabx21EoaUDf{AI;?rS) z9cQX-UD!+S;UwJK|K+2jL4oCm65iJQp})}Wt7%!y3pwjq=&B_CXg7I@gbLssTX!Lc zj)NJpap>`;BRcQ%2F6bXu7=SF(xAa7_0glNlxK8OGhkJLuKyHC%;I?IQiCWnEI_A? zPxEWGbPOewWT5z$`*^=YQ+Y;RZM47+J^zut!E`3c5B^9rkM2A0;iN^7-ESIao!8(U z84kCTT6l}$fe$LWhu_f8hlPClA5bKS)H&|!eKRXEr~%lI$S=dl;3LU^+pK&`$5-YV zzZG9BYP$~1m8R2it)uz7TaCTiZBAegOgItVE=3$h*kKhO7XX3{0C7QNI^3uRRRYy! zbs-3USv}FNDi9ak)u4`Q!}LkEW@_DU>dQ-#rJv2j7|Zf&#&zA2?DP<})2*>SqQ#2& zs+S)bk)Xoj`d3yktldRXfdwD*EUjvrV#osp0z{nL5FE>(#t9J1u7XAO>yINDQ1B^u zyX`~F!bHqm04iuwpvT!Vcb(4$@vAP+^i+<&x!v>sP?~oFowE_hQKxdBkRE?L4?gVvHQ9?INn%X;t{s%+_L4+{D2T zfW}oRf5WX&-ws>GU>fAEi{k^!gp#IP&4o^Ud*dBx)vqEOKm0K=abt1$;J10XX$}L6 zV(6umTC7x?216t|A$v{hzr8B*FCcRTU@KEQFtor4tu-Fz@(IeuBB z+L=G_eXvjURiae{zmL|*CCB7Y*Asa5)?}gC*S!~J{5~;?)uJ^YD?to|_)LJnJKLun zPZ&tmVICI5Ulj={)*lc(UqEL$Bc5vmReN7 zsyRyBbBj<<4xoE5-bXd>>dh}=i*8(WC3+;dqwD``9%3ZMWqrbaK`IQoge}sR>~}@U z{;7>)=ugJ$0eLnlrkt2;2blD?L9DhC*N<9+?o{HKbj-FfwzxIa7G4#H`fa z`*ceXTUJBcK5*t1zz!<_+4LEMg4DaB&;>6nH-v-*7x9@?13Uq+KVzFCnbKh?p755f zp`Tx>r?Z4QCB@nS#TU^k>GdP<7}%l;bhhM+<8@&zcnI58W6%{3JS}Wo1e?qr-~g&$ z@Iee0b=f%c3V0E@Aj;=n4PvLZs9Qeb{sKZnZ(Z+xVJ1%;b!CA2 zm|6l2?Va39x)2w2%(3^2zqv~o30up~q>^f(dmVJn*6H|fid+Stv57;|BjUu5Kq^C6 zoO9Ho*#{$bJtL}T0r$)Sv8=cl+YmbLN=WjTx0WBtE|xgXCkdT>1u@g#)*WZQ(8ZQ3 z_417efnh{s7?}^!ss?*{><#^z-~9R&c)oGMSf+U(8lcbZxb~JMSQrea3#Jcxm&mD; zaxN;(;VwJweyJVtm=~a^0vSSEwsIx>A9N6Ke%Q|dGy$Q#O9H_akcJeib7>CB;~OB+ zM`Avldy=HzkzKsCU;`?~_`alo(mD&!jQhN}w^cyxau!hZPggh4i=K^c%6&fxIu5(J zat6I`&zap5lx(Py>-fU_oRaPS%sodGMU@xclcVGOQw zenr2|cn4Gue`zvCy5`5C@;pR9Kw?Z1zq+)RCVNhlEQub=Qmbe67Y-9EqHsg&4GEyn_KvC0Cjcyh354GdR z2qYw03D{#CV4#6cbHKt+uFhZG0pHgj1KpHpL_X&cgRd2@->MNKa)f~hn058g(F553 zJQk#{Btxw^gw8(Lo>1`mUBS^c>-;NY_C~77vL@< zfl8$Q!=BfaH20s;2c^*c#8D+gW#`@h{(L!cBPoL!;4e_4l52}J&gP%jMA!;7?8|5l|-=aM_{&NEXX{}Yy)EPQ{ZmPEv4n? zO#o!Oj*AL976GGo;)8$Wnb;Vh{4-7=Jqy8z4e-%C{S_a@as4AKDV=fFgx^p~oa~sW z$+soc2t%-=AaL@&-F-bUBP(-bc`y^pDB}a+)8{6{z;YT7TR9fqFQ=4#vk&UAB%j5j+kp2gBF$!3UReoIUwlmAc;3~-?h!D*g0 zy$m&vOy;jkhCGzcJU3F6zZM0TFeuX0Up6iT2IOL&4t9_&%SdTDO-{5Op>blx3APAv zj=TrhUmcii7lH5dsX!XfbXT2fgNImSwoEs|1V27RDLt*mVR~+Z5ZIh3N&mb%{UL~e ziejV@&`PdG2ltVp0{3klz`tk%4BGPwi?Lp+Q$I{Rv&H4%e|p!&d5C`mD)S8BUP+uB3pqhR7ASPkos>50eG+A z$yV8Pfp)WV4E^`Np8+!=>={rBXtMOd3r<78<0$JYQeTZh@=Fgyg7Dn}sclt1PLZb4 z2yhJAF7_{R<8%jLF=J+_Aiuf4XR3=;vwlC78}7wQrv#j&b6TWgx{tEE%v`+}0m zdo#V@)>&;%x)KcIM!0L9c-vf+xW{Lv9UH5Db$G3Vs9le)k5Pu$+2QLc-<6u^&K03 zBH6g}4_Pj6M(VcS_-DaxX|E|KmITP{Hf!iwaFOM0^QIE44YIHO+FKbxCTKm>{%pN% zCQkBiQRX#~2R-3#Yft5AGcZ2;eyGOTefT6%KM-(Tj!A<(dKRLD=3Yq?`M{SO zWNA+TS><=lTj_K{T~ECOT&5~QG2u}9!B@n=DJX@|6OqtqwZe${Pvg-$7$^Jn15HTB zS5sGmxBt#8v}o7K;NZ7Msq5O9X(Tt1U^s>&Jup{mOwFhLLX9*V=vQ~wIB>sTRXIAe zIcbr)?Q^3b=|;61|4&hYSBEU1jYi+V$5J#9yh&ubmwh&=#Pxb8N36I##(5)qq{`OX z_G_BQsAL-NU8tvy(SV0-0bx;8(hv%jw-`1ZKU|YC*XE<`E)PXvVBwbt&z>ZHw;RpUs!o+_{YKQ&|+` z7i5}*pvOB3q0he+* zpd&(|C@7STOsTQy_KT|W^9e?aq33Bv4})HpCH8#Q1)8*V9x0q%1>W4>3SWKf^DCuC zznu=B{%n2yYMQk;Ldp?$9hxt~d?j3f+|Rpl!FNkaXWb@yvJ{E zirlFH7FPjy`bk*yENMzxCQn+>P+~)Opq6N9_SP+&ck8IGGoQ){!S$6 z)w#>7B;Jo2Sr|K4LvykXm&w@MV7c?;f_dRmub7=yLQERd>GQuCFN+M-8}HQ__F*;= zn5>2Qrmd4}sfE}`5Mcz@Q~NzsGW~S=$b;pezC#%&n7S}U;l@ez2&n*N7yb=F7#k20Xz4`jv@-b6o+dsr|mMALw z!Tsnp5WloE1yl{P<9k)5(oTKl4vh4Chf#Xq2YrZxOy}g>dU-Cn;%WF;@5hexr>{e~ zW+y`T?vJI{%~$@+qD5u#W+cs~zivcO(qZ>C#k?11v}`ip_CEpaZz$+~gm&H#us?S0 zRb)v6Y3m*s;H(&rkz)q1qI|mb{m2mUuh;?fCjn)XKa1&42tR(U?X%zsMrj01Aqg8F zy2agOPdfkr8 zKw?<$h~@g6t?M4v#*iG`KF)Xw5*(45@EKIUfkq7KTw~*}(nU!j(|7-C+=)0V5iqs! z#Ppd^NMHaKkf_#GF1NgQ&i1C9p^(_y3dag z12NeTuw6bnWy1bHY+VIZl-;_9VSoW?EPCh?q&tT0Pz0pAML@b60cn)(l~5C{Dp0hOh)r zbJ6jIZ|>j4GJl|`8>o8A_i!WVsXNWpQ8C4%Ts|dDJD3BZ@V_th9mf6QPpl=m3UUjc ze}!_8BQWFhar%;e{>e=5V8x##BD5MHBJpC$-G^|7!}pV6he$lBPhIt;672u;NJqe> z#JMTbrC}TH!^K+#nXxjh)Gn{o{@hH_;pc_Q?>%25wDsoFa%9g-UFWFx(Ddyo>oUyMsJ-#BMtnPz-UrMenzID7uab3xfHtG>E<+3#@WKul`qA#v_>k)FltM zOL~L#s=0uA_3{N`>boCbraghZRZ?OF4;#ELl^_UoY!#S2uV_A_(0$@hN35T95lccy zeUkU0atNp=5QiaxLK2^o=JDTF({q*}8kvWOH2vqm#c@h6m`c}EV(M_;TSkKOvyXzEb2-PK^%G$>!kBa_Q-xtAC>cG6%v!+xo7J$1bDAI%#pqG}_ z!v={SRG(<-6|G+Xq%Ifyz*_}b?n6IF&Nv{seS#(a`4SmmeApSp2@&+ik~UhDck&Jz zG;UY$|4ZNhQMiy$uX||WrK6fDJEBg4kHS&m`>4lVwNb&+sXy2?GIgRX_YDBCjV~dB z{w&%fpMkq6-BxGrvq*KHfVaM0HpQ?J8A;aDupjmoE6gM5N7N)yEtt3geTBNLdhb9 zZzS3C^WSmeyVtMjb;psU25FDHOMNAi%WORQe(yTuGQ3N6wZH7&750z90gT`4IQ3>g z6&Ok3e;mOVaSSen;?js?F6*{3yna1|qLNxzY8T0$;u#V34e|Dw4hYE9pPEG+ySZ5( z0VS+tKnym*I$Kr`)sdD}dG9}m%Uod{J&2$7hK#}^rqXyDvOn$#E}fc}R|DkkB*NFK z??6{KmcILPaq5_=#Yy0pYVcz8o0lcJ5A$0J$@}=pEB-t|oUs2K_QvuB1_;hP5-=|J zFLqfbVFkK6tIXl(Vn++}kS_q`3{s~1)~S}CA-~-Q2H{X8)-E1f*{)7k z82txN1p0Zo438Y1MUE@aS3Pz6*CZ+ktR-x0tt3$WEGuewjp*|OY4Bz=WKrOVixtJG z2>ay_HR~Zl7!MyXm2+gsYJAyU&|j6lM4AHLzA9LN$wPt6#OIF%|Ca{36Lg(|hbr4w zVV1sn{A0OIlt(6}Qs&ik37VYN*Z)#R=@2R|ryt5p<(Z)$gc^+aL_eg-hpcHT`_(I> zCwq(q9|sOS<@z``PMmzc891Oc~*fZz1!!Cquo_@Mj+TzqZqR}4$s zh9+q*y1yH|1^-z@@qa%Y!5OsV@6bsu*@rcO7Eq9Ge| z{mxReQr2Q)lix#tqG%YFHS50d%|+xVe0t!m1VQz9tt6QI|2$7I=m@rA8}*3l`^{Y7 z%}Gh28*{S1k&O|8-4Co0L7DZxoO3rrm6n`_z6M$4Sw;ZGNSjfb4JUD=_9O2B}< z6N^|1{nuGa8Un{CwLURXM+*vu4MQL!xIJ!(IQ&8)d5F)v14-dRd6cG6Nca6gJx@dIB3(t~%%U6}CpqU7I=S$_P2 zDBG`#Iz8YfM-M84wd7T$J-F$Yq0Z*Mz*gKReq9_KCiP#h_xMb*+(L$^IABpJyDG~^ zMtuePC>kC;?WN02P5s#}w$dc_4RVYhh;K+W63^%b zWgu_NjboQXGt0=ZNFcI_90O!FMwPWgHiElNuL4bz&>(S#oVnozhH*az-~4m$@M0~W zz09w!N{1i!PVo|?-#qX%AYSQRC^0U&&SSN1GlD!kH6Y^vK|BStHJ=eFv0+=AUy4>( z?aTbX>$w8dUTb0>!G2^Pa%`-OZnmY34>%2J6LyKX&-hiqtC;ZTo4B49Ipi25pp5{e z#;K@@OU)~+iJ1Q)%%ctpv;w#>=qzPe5zI$BsjjGCK_P_Q&9}ixpa;Vmp@6Kc8fDuh zg^IOMa2zK+Z>uQVH+TOp>HCYtuf(B+ehOI=k*fseL`}fDehBbb{7tTx)oiXw`$A(9 zLB!N_=|sD>d~A)Cm6uomtrs*oi+JTjvvt|cF@^eXu~=`CG!awnbH%-bi|(S zA7?)d1s-LF^+Ekn>5zqb5sdf>h_(2#^^ja`jr?UCfEH>3-G>phVYFeBfS|yfHFR&e zM2>58Zfq2c==oN|fy?Hl^-y2KQ5TRvev#>`W-7pf{Gq|WKUy&1Dc$athY=pxn;j&d zfxKp8e!l#&!C843dv{{=;Td3tnJj17e2l}vkg%2C6xjajEE1v7$nYcPQhs<1O}7Lr zucNP|vTijcO9ON>?EguXIxN62)Jg1779ca)?+b^OZ%Y~x*KNd z*nuy=k5W_kHLQXZ(!ra)ahMNPo(2N!vWERP!o_2?MaXk1$l2-*My`v2I- zKirB10rmnS&AbM_!D0uOt}V`gqbK?TmGI*y+loB>W5CE1NkCW^^(ej*l^X6n+s>~^ zk2VsmZqTVys$6|YU3Od#`!3;w5D7OgQLaCxXN5zv%Kjm`9U%Bf8}Uq_iC|0g_75Aj zpuo;5+&6;>^E{NVL!rcE4b_It3`#K@U2X)?IG) zjTfsS;e|RM4Fb6@vm;lM+O%fpp*3Eln`cF7PFl7^HUD@r4X70gSZ^j8GdzG^5c)rm z=9&u+2jVPRw#1s8aA|31(a?a-YS zFyChA+PX$jO|_ff&X`q&$NoXY2vb01N1M{;pS}U}1;U^i$RX9Gvt)NcoI)|kD<6*{ zl6x&*;&AJJ&Y>4uBjm-yEmv~o5*+rT30urU zIOu|Pm%sx@Mk@cYHwyemcr_cmqF+grfPGO~iqd~8KyN2806REoaRZ#Q{00nN_ck!jjgSr^4rh#G zepMKWBnHL9@`~}Mz3NOl?*Ej)E{pWaE^JW@sx2i+J%dYML|pUj+3Ckm@`tWM!T|L9 zFBL2K^ilVH{Wk7Q17a43^Lfje(M=c=>u{a0Hu`w16eOUXA?oW%zD45?ACtH)=WW-F zuQqC%L@yv-@(hAkFW;7{4v+j3Ew2&*V!P^&Xnz+B3&Cc(KhvdQnxNu1F*1d^eERfB z-?%}iE8WHv!ZpQQIjgRYeIx*qXCN`H%M&CyEYV;I8O~d_#;$h7;aUgDOmhiccF; z-hpw@;Wy=ND-={sJP5h8obx)`7)SIJLjV7P0Z;&d3zyHv zkLf{g#9O4!(p<5{g>-$OqT#AZY#P3!f~3H;9(r0mxTC1SUQa-S$qzIjy@mv*Pw+Ao z89rXo)@K=NY@E=3IfP>tW2Gljhpsis6MX+5Od#jub84QA9n*oB9}y#V5ivvxc0n_O zo7st?R3kj?pT}(}jvYt|UiQ9oWuk(Nw+QlGFcZDHNk7_mv~ zoI%&7$x@Y%YU=a~tWmh$8Qu*uDT!7GPR*eWY>6)NTRVN@?}SO2zV9mHPa4&-=YHwd z+zP7eEN}=9Ay`6O6>E@qPG}Hw$QsBT>y+r*FJ|Bg-YBFy8VXz;QLs44oYq(__R!XP zdSytMs#eM4U_pQ}EskbN5@xKw*tG?Z$BfrL{SdEr=s4ff@jki~Art*?9NR$&2z$q` z^6j)|-doUR@iWOGGQuEU5CkT6_l)EzUs?2$)ktZo>ucGs)5rwk<5+P-x( zE96_ER2)GsNyTOL$rk;uBZcHN`YbpNPB z3W`UKv|hfG74-~0PV33%81z~177;&^9FB0^0?}}2scc73^PaI+V{d9atyjcM??!m%6YRM?-t^3& zW(H9pkhkBUyi}%`jo}cfGqL#{KUG-RaLP>z#_CC}z~D*Ekh=?v3F&9n)<3<+E)fmN z`-L#ye(p}EJ;^k>_S9!nhoq#UKKNV2%jCqiX~`jtIaP3DFznT#P>DWHu}%E6v^s>2 z&(jZFf6?)d*NyagNVr76L6%+6?FJr94lKYv z-FOtQ6SBhdC~*}M>DGCLYuQEme*QF_EL1xK3YABJ9tBz;3Z$Mhk|{9;v;!&Rrh3%d z&fvT4<@`ce(#FRRgOeo2;v+kZXC1nFRefn#*0|HCy||J+ z1n=6_B>_EzLky3_a~1eJ0*gP6YxGJ~WR6<9%GE2{O%<{!?hO?AjFouaTg;XlJ*hu> zqT_kbzT(RQbY_<<)pZfZsS8{&W~&RNXQHf7`=wwx@c1V{or(q0OD4YK@T40QumghJ z;tGiyVqvumV;i zgQ11JOf!P;4o5I<3dT2Z5f<+_E5KzqKY}$Vt@8+}VERy~It=QWL{T0AiyXg*bYvVx zJJ%xad)9IpX#LswbYmpmBxQSQZ$yGbj^E`h4d_7%m@L+^NOlEE0k?r#aZKmvFFNgA z-nJEJlcH5_XkI&#NTVCqok8xB?yBSPNhv_I!P`#)PBcOa2?d_QFT4XzI5ifT_EP#6g3=me$o6sk5>(oOlsc0Wlk-1bFK=MPW1 zD~pA=8XR@s~| zl*Z*^#-wO1p4B8E^hn6p>9Y3{T7Yn`^cplYs4kMzg7XY^w)OGcC4KA>oksXUAn<-B zS=V# zN^)V0EBLlzmCcW;v;}}iZ2?Z=JxZU*G*l>56}wdh;~>LF2v})d7aI-A8K1ZGyS^H; z`b1d#p5tR$lOm^;p9LDar9?Alnnx`MDjG50H1QyLIG=trf6s@J48#SOT|l4NTNH$t z-cCPji))!DOK*MJMcP$KyZ83TPJF6mIWpDUgTsPp!u>e2^hJlAQKjvpkMIHvyIGD$ ziIM;Xl3)qp|I12vcR|ze1ww@sb^#kC+A==u?e)ER*|>Q?jd~F*H+Z~j(~cd-?^>;6 zR1)pJG3d&^vQcCAhyV0MTk`fev40TOu@ThbzMET1?dM{(c z9UGY61x`|&u>IRZMi&AwQb1ac{ZsFkk=$7uKXLF<+8#AN8WX45cZr4!Jp-Q^{s zR`-c=f4**vCpA7EuT+yue!1bT)>2v9h(u$RUIMgjdg4y8u_!G}6<~tKU@t7b7-!DO zGoc8+UD)q`zoO7%gf0SR#w^xC4~a9xbjU!$5e3VfjZXxqZWOKs@&OR!<@F-|lyBYw zdBY*WRK}#rqgGA(2-ameN!lE$MD>^H>&{#7y|igW%ylqj>-r5eEzB**#xb?ZeR%!L;KUPWL&sT7NTYP7gBm?_( zw0o9|#vn7{LYc?jhcL?f?L~ zMG;p75=s~STCZ9A_gISiDWxsnLxFdJAz;0nu?M5?@Qml9Fr;>Y8%yK{emVh!ysN0F zAV3h2v==(l^t?ZJNCpb*14c(j_tr$^SZzD$C? z0+>IU0NOvHSr|amwm=}JqX$+>d2?4;FX*vx+k8;KA&HQdC54XM&Up~cZzA}yOs+ziwofpP`1 zKgOhBZ^_~0q}lgl#$&zYwf`tQByxbMebdK+gJE`9UV_BTzurs(S;ZBz81ZDbbb#$V26R{VP_*d$LGl zOv9>4>@$f+tt;X{CE143C29xvV)5plXiA^v2on7ohv^(Uw47CM&Y@jm$NJcN>FOmcRe8V3L+JH$798~NKK@a`e?+I*eT z$+Z73JOYFWkO1GxN2r(FNH(1V@-iCDEO5A$eC%Y8Nk4SE>vfIdVn)$(fuh^2vAvm! z?FzHhStnAf{XzS8<;~NKWBWa?%txsG7Z-1kn)pxA8$Pg5i9QkS@y1>dkBAaFcBPDa za4n7b%LW8K1L;qqFX0|76fz&iI87Ze4|M9EdN~vB+<5JA18sL^z>I-nWfG@lc-|kX zCE7rzCb+MXKr+6vlI>QL3pX@gfvX$4pjvjH*f!R=uq*SP>N%+4^4*(6wr3I)lleOz z$h=zsP=AI~RFjZWk?*CuBlmA@p!foGgI>UBr|%{YNy$6awi;#}eTk{lUNG`y%g+k0q55^yNpX&Fk=aM>w1p<&_kVt^U)LMI+Mc&UH_p|+SBDO+Rjh*po z|EU1gL#LG6C6}8^WDC>Lk*2MUG2}@NZ6Ju#8v+L*zEboJ!0fN5U5V~j^&Qj##vBtN+hiY=8Qe^mx_Mq+HtvIq)ecgy4csLsPAEc1W&Q_ zBF~54i&dATdVRa@K+L2XlT%%Mr;0t4ipw(2#!iE8C42-<00)w|!S0|m*CH_&@1c#2 zF|UUNOG0J3GXc5o^@ppJ*mYgv!nTP*IWArxKlKd=9b@~R^n{X_%NiPr&mIiSQZP~G z-Oh^M0+H<^?dw;pz?3@M&Cw|xPs>=52i74z5ulZw)_!}G@+;%+t6gQ= zkD(J;`L?57Qc4ZoJ(F1yShc6$I?pEVEXVVWP~9(jz~-YJ#G zmb3I&+OAVxT3!Trls-Ezel0t4=lxUoL((+kg~l2x9ynoT0=M>%f%@ zPFZvHAGm|D1hA{@$3gj|TM# zjhmH-+Z@kRBA?b+PvGDbOp6s|uA5Tq(B*)@54N$3Vt6lPe^Xf_achV_;BjO^>~sC9 z`cC7VWtJ^`ewl3g6RSZ+rz>5a*6uju0vPB33i9@fvzG~(*?RRi<|PXP-ZWBlD%+B? zh?vqv(@VPT6?2fjJdr3SSR{w3ldoiZ7~AVPrU2EkLG{TaKL0Jyo4>!NjLVUcOzF|r z&p!57G_p(>`f|Trbn*au{@7itzg|kau`@{aC%ZAjIJc9*@ROpC%!wuzi7LN`PEk30 zRR+|VA<1*O{*yrx(uo_p4&RhnSJooEx0(JpGmvYpm-!ffXV;+Okn!K4EaC_<9Um9K z{rPecf%FTd+ z!i(b>_U-s6WkXZ$w0?~jh`8aX9{bgWu|HrlpE{hrxI6BdJ;@cca1j3Er&mX}}_Aii`Lr!>fc|O`9Wiaul+Mqft@QL0QA zLtGqXGmm|Frdd9qdkW3ml`MD78xW``i8k)nxlA=zeH(=nCC) zUSI#*KH1Fil?(FSih(hASA#f~CZRC{yqCk1Z7j1|nrrRIncermlt zTu%}e&am2H8mRA#jtQ6gsrLrgJ$a|eIur!NDbqc`CvmmcrrN~rJe~xW)9S)TvRBYb zi$rN9&s4d6joV7=9QTHx6enA;dtl@dPqmfM{v2D4Z8ZVD08w4I6XucD`t#*n)0v!w zcPek>kS}`E#=qu#>||2_3eCYlSmgCW3%&q;#%H*|6i@d?#wXhnK8LR< zhS;Y7XmKMUPSEhvftdHJ`wm(hc6|0)LmO2V+6Lt*!Z(sjuLsnvD6#3U$-n!(R%xSl zdp~L3yIp~7JddMht@#9Q0I<$z@K`8E1x8THEk@~?)nS?l@EgJYLhZs_&_%Q$(NOJa@Nw4xNHK)k<7!wjAy%F3P%jfXse!3 zU1Zo|?8^rT2lKx*&6&U7!BHF7U^>$KZ~7g*ivRG6GQU%=TeN*pU~#$yYR zs|wk0(w*WMXPHRdnl78mT^TErTVr$kNp~@Ncka*TCO~<%n zOwU&Kl)`a=Txvbb*hYV+0tL`Q1&4Ejd=2e=x7#gRq-RFyh998OR0X)5bQFnZ-(7@8 zffGT-wkCH60>)ZZ(tNclJQROffnYB{B%T*V0b7#+x_EbB#q`iCqo22Q)M!F?IO*59fc*>(}p?2lmB zRyeQq8%0*de*dfZr8X1rX)@d#^=cpwf! z!3@etV++y?>={SE=7&0iP|C-_|i+M!AnOZw~ z@}58)-q?$l^H13m36OYe<)^=7mTjQSr!50!Yjk&KY|;EhGIFpi8EJf__^MQ2wZ`!qDU;U-q;=g!$@Csy5~GCCj9iV%(LcJUAxET2Ag z`xQ<2#ZIkVv~`w&lI^=|y%tH3Kes@JZmYV^>?^w=3z_X`lA39?_+n2Qkh6LfvH+jD6xe!4t zZ*14u4d5Ycm1nw4nbQ+mN@gm{UcqFxdNEZ-8gwk9KF}Wwh%PF3U#5#-Y%Rx@AP2+B zfgp>Bp(^n#GMSUO!tmCcbX!B_smW-dVq)wF9@}uy6Y8$pjFYpNMDgYm`SZKIZ$~J^ z1!*$E4c%xvHQk~jW5F;tDBS56z)_tOsErcpL&m6SB3|YcaldkM|7PbF4EsdBJboa> z!6wU)3WQ2VfQB|c6UOm6@s}0mmsiE_X1IwNTFC-~3*t1b&Fy;vgJtN=er@QxTr4Q7 zsNg4Z-44(qyxJ#XzV^q>NhQc@a6A1d^;WM;fmNJEh%DZ4=#UD%TDErOE_G2`=x~o3 z`n+_8mDCNE55c3@*L0J$;-POyBt!~fRcFt=r9v+oy4;!nN#%wrV;(-lXiDL5kY5?j z=x$d{a!f(3n^L3`&T*DFhIF+r>G`V<{R}O!h!w#NUGHuozEXXVYv}4DYbzm9o1k%F zPO8)8zCkRJX=2P12?FEawlOb;KMT5vbW%1u>)knOvH8j4jZM7DH~S;VWC32ZACN{) z=g%|ACu2Dtky;ftT-h3hho6`7XfB8L`L8PiaB)dx3MMN22x>&zPK`vw@O$jQ*I=sf z`W9lQN;e#4H=tWMh>Iav2?wgE`6dZmf%Y+YPTFC34_)xBn7wsd+p_w^TXeCOaY89^ zGI(_Xs53>Jlce@510Y5B!9lT{+JPQ4kn&}QEkWv{C25-VmFewKYy0+)Dv_jW*+%~h znVLCY&4C0yh(-0yA_9X3Tc*6_{r${4mBY+f0d1>qovGDDO8aa$u5|g^OC*J5r^K}% zYUM7{4u%R)_ieT2a%Z-wVQSo36 z=I?pm@`|V}T*gs-mUGmMYc`@9tHj{#AcZT&Rg-fA-;+|Q2Xce90a>gJd~OuF$; zvTF-x2MOBFlUC3#W(>^X;@44sw*6M1#FfV(PHgshIO<}#Ipw9_zG`UBNMd03ds`4g z%a&jA<8|U`mt$^j34s_im%^*IcBeOW>(iu)dcUCz6MVue99bQXsLki?cky^>>9*%) z_eIBz4!5Lseb>m-RELTODX}l+I$iN|7F`_Wa=X=RsqF>J$o*laM4pN-Zo1K%7xpWr zD^vWeD_2sx8z)2D>Fxcf$7pY9Q+o!<7{&l^dvO;`Fs4ZG)*C_p-h`7+L))$Cv&n zZG)U1F5l$wZIHCs4^HCN;(HLhVulbj4$5-k(2N&woEhvt3V@04S8Z<07A`-eWIwy# zj8e@*`TYg(a{%7dF;!w69t8Zk)A^1mrPO-jk;Mq&f>DoDG`I%8P63pu`>%ygTw;s+282*k~9p ziRklI8~Rn5{H({$-ko5v-(|W#jkFBQ3r?*+F25wDLtP_T4#<1u%%}az+*lCSP`amj zhOccOqq3jEvvNEx^~}M=oSTpT<;aP*RE;R>?#5mEuWkQnL9Q$1(Pfb|7c2JrB;M2j zM?7h>0r!RwcglGs`qLOS>YsGdYhin>E&gfw`4=;{j;Us=o5e#z$BFCDsXWPqu3!ar zW{aQjr)&##JYAMW;QWM3eW-PcI^r7kFV@iwyyifhLuV1#ZkD()(4-Gsg4 zOBFRggf4WDvFvYrOMKapdhO05UBE;=Pu62mift=8h+}ANF1*WeouVNtYi;@cB3bLSEy;WIGMH z={<-#3jWCtf@r=H@-hKFUO>XU;v>`>hq)&_N;F9$V{khMkF#vp9D#`a%BlXL)WSE# zSWG#zB=)OumA`@zCr-Q1l`uX0p|`P|y8sr2pxSDZ@Nc4>XV}nIX?mIM6V=zhNC;iG zV+=eM)?7&vULA2brAX6UrP)RaV5NvXA%PH$q|y$5QCSiIvnjs-Q5!pEJE|2RtgPJ| zw}-u)^=9Ww7&GU{yP%6^y7m{y*s#9fCN~~NayZ3ieiBFMjaNm=KRc`=_+IYI)cDmB z_et6yo5_s)ms+pXw6|1DFghuMEk}l1un!8W8XOos`brD4WFc3k zQ-?{?g{_5|x--lRbP5l%4aT8dTat&o~7?uK;3WOM48a~I#pR(OGXv!h`q!bv#s zg#Y4I;l|AGqsm`rHF%O5s3wtt< z1TiIa^zU=jw{Fk6=tiLOd% z_Yzmzd}F|;8`slsxK;Pa?Hn}^*V4M*@k@M+O>LyuiEEz}mQ-_;h>y0R0oG0i16;WT z_-Ew4vW9{R*j$o8e>I>tIp2J?s^DvIuykHpsh@Ok-}lChQ8I^h>f*b}Z_^#<>zJU~ zLfR$2gtGW|5dwIY8cMep+bZ+<%IGNIC>rb@Xq|-3QX5((PUVL3O3HKqr4r?D?Ie6QTDJ-26% zrxca0W8M!9(@mqj6n5#WKL2{Qv7IC5)}K)^0)rnT6K zKHqQKzi>%=2;D>@Gi8>7NDvUbUy}sRaKo;3h5x&ZINbt&XKwuY%zTj_W}D}<)mTVF zx6HH9%s{x5++NuoKLYdXd&;s(tL7Jx)ZhpyG%4aY`R~SRy&>~Qm-xs>M|0#p>qs2g z6Hnn)!LXiXrGX#m(lS43f9P`lvZT*iXz2SMEJcC^+#YNHaNit0c8hh2{G%4Oy=;Ij zaB}M*IO02)@Tnf<_qxb)%~fwO9W6ud=qT!J(vz`Gs8@p0=l<&PJOd5$#F5~)YOLSY zD)1RdE3w1jFL!`g><3Q)m&3`XU?64{8lG~_1)|%dkao~Bsbm}x()z4UwSY4d9*)|Y zVb3m>lREknM_S>0-vMJ>hSI_-@Tl3qC6vSuX4I6BI@xF}!QNGqC>Kh}x>DiLP4~md ze37kOU8CV*d@td0_Z_A=DHaM&rV6!9jJIPy;NX}?3SfQm4iqw_`B*+jXvytwDt+d3 zE4TKNB{2@Oz@lS~kgA`!;S*TvB$nF)jJy+0FzJ23V^wMtuos9;WZAaa z*U9^;4Y{LVtouACR#4l@9(l~{=-X+c64EsO>sPty%5|M*3&BKej`pO#m{3j&qHjm? zWNRUMW%}-+Gu3ZCgdMb@@S8E=DsF$sK=Vm>Ba1}DTwWok-mk5><~g`y{X3O$-_1_} z!-7rD!wzHLs8tT*l78jG$Ek5NALB9KSoB<1ZOsqQX5J{uA2OS5JQv6Kpn$2xH!px_ znX)@bD5+2}L<)|3d+WvSJ`a*@)^a!ZtdEf5X7$Sq^}$K~=2LjV{*sVCgSE+Sm+OXI z=ShwO&J7ZGHt7jO^vnD)_KRljI$VP0)0LZKvco4jeeATG4I+bIE}{s@G2TtS8k?>> zBW0eojS{{rA&{|D`@S2XReNN<$Jh9N$?gv02R~4@Z%w8+U_71gl-Zq9{%N+ZBCh(w zfJu}|_=FhlV%%rPJ8dfMeAt24y51+GCAiH#b4#VFUZlG3DS9~zL7;1KrSu^o5tvjPsIfv`edEgx4~Zdzea zSGtmm2``aCP_>!BKvvtR@Xlmc%^GjY26kB4^O)yX?9nOe2G!lKSwoPGzOf6wZ<{u3 zV@Es@X7i9uk3lu;87=PZ?JYZw?0i8Q)6s+MKxO>)c^R!2tG}KxUe-t#5a&;xaoJ-A z2V9!VSS>o!xR>iD{?ed!+$1)iX~a9*fvp*)r z`76Vmh2SCVr8kgv0ttg>c_F7N>l!4x(3Vt=?JAV(1HK1uzTe6p!Z3s?zhwn2YK?8* zMBnzM6Sd!IcG(YXA3LgCM~b{n<2ATU977)NSgGQ4(6lpD*cr5SJNU6{#$X{JG}n!$ zRw!pX0^|c_Cy`j(_v4K4=elS!D@->W>z)V1%I;ZmqH7A?w6C1qa3*f~hfmH@=&BM& z2ON=M(SGW_UW_&d&{EbR@g95~|2x|L=iZcC_-fXv)=t$q zgssMOy%6YS}A8qpIBg zevYqQ_|%T2tG4+SlPwkEBfroGc{N+_CrvMnBA`|M%*x<5n0B0u@>_4jN4A`98rLlyKfaZ}rqjvpHn4V`v%7 zBsW{fIV-}sll%^j4^V0(&(P$Y5{?YvejvfYbU zuvKt9mnGTqa(&qS1%^HUZ&#}C9_Lea9vw0oRG$Y;22%RM4n$t&YV;7tNm<=7CUP(d zRqKy2(lHj~cxb6B={!`*72KK#1VY_l7atgDDhS059GOb(qRcH3!~sp4p1Rq!k%N&)!Ho?8kpI%w^<$R+H%{3ml%U^ zt<*6qE+#9Ton4hythPVBu7Q+YW7bQ+1iKT}<-#_7Tj>V7X(5TdIkiEqJFxOOuxFb> z^rm!Xr#t7$esI-<3l@$+<;{fqgyX0eRr{p+71=45wq7L3^OryF-hY{@qZqBdEJZ@R z0L5noaQ{fozW!Rn8(#hGLv9pH>e!m6$9d&rdgW@yGh1NaRm1t()eWC?U!$9PWvu^b zrJ{nO4uynyi2BK5vofy~2hZR_m49#her2(4la2;wlYP@t8DSQih5Q(!s}e>uV;Ac) zVO+?k2&5HV0TcK@h%&{}(>+Ob{jZLw#u1#(Cx)U98j^jid?|ixPNc*c)KeM&vlET-rRTiI3 z4Ri3|KYYnzVC|YsYJZ4e^9%EmIs&_BBaP)ZY8+{b1?D=+GM#==#%q1E3R{DSqA@IK z$|4dxN6dfzR-hR36rXviyZqr~0kQi$lsjwCKyjLFGv`52zZ4E-obv8;kG7x`k}}VL z`0oAt4`$fyvIPBA%B<}OseCGdh>_(#6cl9&O*=Z2l)l(Xo0W&ZohH1Y6GU1oQV{mVX6nuYyEq8tJ zTi7Q{YZqgjae$hl&!kOK*p*!8WR)R6C0b*;FMqGVu`s zDCYHYLSEVJUY~{OPPzg~dg{~=M&1p)TDvfvj_QgsugciTKK)h}f_&Q3II3w9CKI=` zH|yVY%}-&bz>OTK!@wmfcVHS86{YW>Rulm;NpD4+Ky+42`vI4zn3tP!@aSRKNj~_j zLoy%&&ed*i65Ha*^$_#v)+6KA%jds!uE+4aYmUD4)}+nWQx$0MV?oXBlm9^+xQcHk1WAg~tf1p9hA$uV%_@U)b*^n3>%H zlf*|)X9Y5m4c`w5&5ubh*6VOL>kJ=kve&>vH2F5#kjAAK>FD-8%+E@wPva>F*L0D_ zyH)+_<27c~nT*EtzcIN3VwRO51KA4>*cP- zm&Nq>FH4&w&pSV`&?E;~FVJ^sY45tsR9dhu2&}0TpkVQKqw@tE`rDt4t16tx-=M1q z?2xctf$Kl)Q4SVsh6~{=Tpp8rXTRmDw_IiTK$chi8r?*!a7F>xUqC){#LE3wd&4_%!rJ=uLvgyJh)X-Z=E`Jz4E)V?qp*lj3h&0g&^5UIc|H6 zLN*n=yBK68w(t&t3QTVq>y1JUxUd?=TWX522|_sw^|;K9fheP`(~jk`)irX^UVbT@ zlpF@q0W5;hdp<2WBGt6D<=x#O8`*2(*geMS^GoLTMPnUJ^yLa8!iiHeWOkiczXz`9t&}G*ScLc+eGA zR@L+HgN%VEO`$5?j@3F#R(mao7aM%dyz)Gs&*J&b9wsQv!nV!}hxK|>(wqjXsas3D z)8tD9xFvXJo87N2=4bY^siP?(fluZqPw?^PZjk7KSggrf7Sno{Nz8qQ`>c(ee(YkP zwg|zy>rT1H(Os(yAWzFc{|+UXOO^X6sq z6Eio`uF>D+=_)vKEFB~|TSDL){&FRWT0^ZfU^zFBlwf&euG8e<}a<*K6c7FHPzi4RMqb^U$A&>&UuB@wyZ0Gs1!x+z23 z!cY(%7<1_P^~cA={^tJZ_35!aXn8-^271i|>;CcfYwr0JhbnpKkpOU5GpQ%>Y?mX9 z_cgNLd7rv|`O6ecm=)EHgqY$Vu=JQDtG0mAN6B=~azAqCHan8S1H8FthB%KyP=t?M!SrPMiVCX-k6hvIJ>fJ5?74bGAXtUD zyq1AZ>VRJUrJ%C%wQ)@*u|{{tZm|fJ`gR1_7JshQ;T$&v{^%Sk*|#{8GvJs=vNhoL z8oS50kQAQdwDfdq+1rHx_5o~E+`nI)EZ&NHY6BJ4xb~@D5hjWTC2%|gKQFApW)PRZ z>pKsZKEaa$^EZ z@zFW_`z2`ki?LTKwMke&9-AAkQ{L5kefwJVX4=T7$`@6DZ8!0}U2yvUzFqPg*nUIU zWc6gOKGtfL{?h&G?{0FVg})mwl^f^yAUNwa-F{O1ndn)S(UPAm>ym0Zi{}}AfMJ#E z$=@o{{v4TNqbuopdt7YfBN6(Hd+jQZq?;j-w3U9YK(zDA*ZC=Op=2K9r#K00XuV5{ z76`xZ$F@k&*F;>8Cy%v$g4JxX`@;dZf^rK7`+4>nUDB7=+diB3?7FNtVsRax#611= zhA}!vahgyAUklsFB+vFYpQ`E~%@QGs$FrH(rF(G@2yKb!X?OoGyMFH_=C7Uhzly!f z$2t7&l1TJqmWnBPou(#E=G%A^x%AYI?@=`hoc(6ASUENSiq@0gQ2A@7JvYe$eKeo> z-$$Gf94sKqz7fm;GWoEi1l39V5ei9n{OqdvK|?ZA)Ylw`gc0O` z^C5njytSYjz{vv>UNat3{-JRF1VN>(3D)!fGT;<<8J$7X^#n%u$4S*OY9%_V@4q8( zo#iB+E_K&5X1? z%c+qDHSep1(7)N7sJ$KBGw&MJVr@v995JcZiz(tfb68{P+vIkidps}!+T;F1CYW%y z)Bgz>@t7csgiv81{p;(c*D^a2cPdI+3!}I<%J!w0?G+j6z zxK*qO^n7D`*Eq4L-Wm+2C$k^_#i6 zU*4`lMvLaK0Nt|p>ZTNW9tpE%juT3 znM1n=$@|pR>P=SIljF;zgq%ZrW z^!b|>0Hwmbl2A_>ty}A}h~iYTTcTPY4fWX{R}J@3IknOO9uV!>R@!(3-Sd}qopuNC z+^6t$BJm{I7MrT*MD9fr)ys+jh5$o@BI1V{l^ols^XCG?1%eFepv?wOX{I{EPJB$# z>dE$Kw4;y0f1*Bt<9|WG4EalG*lIoPII|%$c3Ax=21j^B@EkkV5q>#US;>pSmYqka z`!1aLv^B6}j#|K`u7k_Ld}k8Hg;eebn0*vT_O6?J>h#oGG5PdwO1Co+>1j?3P2D-I=yA)GbtT+S7~?cb1Ga6b6%w_dMsr(n`59<&Q1g*ov$Nu+?+3w zc)b~0NyCKw_2Yp_MoB@^V(IUkCP&MJ@E^NPz6-|TaRbKh^q{QZE~`ff$7!Pm=OU}- z>fvm-v#l!dwC&|irdXgcMTWCBBz9~4sv<8amWRPUsiJ=>ee;s$g08t{-42#V1hf6~ zHZjzCw*jHp_E^XX>|LWb=9bbb`B;X-GdOGOh4*E)%jqf={se5vY6d7&fbf^@jHQRK1sB$vi9;h-}(CHTq4PrRWqO^cLtl_;_PHy8I&Fsfx%~4N>U0wie z$()hcSio#X(n?P#gU&;SXw(U6{u&8A8U~k*+3=ntHpj>q5*b;)w573j%CVw?v}yXx zBN*d1X29c1>(+gy|IA{~vCCmxdub^0CfCH?H6O^_D9$>c6zOL@ZZ5E)M0fmo!;$eG z`1IR*x1&i!r7VUQURBaZ*PS-smT^0e%n$RT~(oqzDAsoM~y@1Esyr42B z=$uJLUBlgZ3vHEgQE#&zcm@zaF6GU>lx@mRFrGY%@K1Gem)bsf?Lxm~rSa9+|Cz(|5?j`Qz@Xn8Ww> ztMq1COR@`?5o}Y7)@sIoN<)#ifcxUtc)r#zV(wQ`EpvvB+wZ%7`%gCwPZ?DK$pJy2 z+S9oF+F$WGP$(bisk@VqwyWvzBfei9zOx^b@anl)(t340n6pHdX=@R3)`-j%bEAO@ z#tjymCpp_+16V_Wt*w!AdWiZB+JEX-+k~>9-WKh7`~t;bQJ$dDX;wN@{!`V=)hg2~ z+g#4C&F*zlKI}bzHwWJ;cz{PS&j*!Biaw7<~xy) zo-$#zG6j)piIW=oeL*ePkKnTu&?*8__Ii>QtBgz)MbSH*ZhlE}4X;}w7!)fIe{i)f zu_lIav6Xd9E-Tc?*9-ASkK?$x&W@a(W5{LW;fe*>;6mC09{X*D?q1 zO8BLd$t=Q~D7;Z++ZCDsyS_O-2om2XfkJ1h+fSa*0j4_Y*3h%9fRMW2-6L8Kq>@Zd9}JC-wu)zE|BH`Voa{L4X( zDN+DUoa&NjPd+5!a!B2=G+pX*X?_$4+y=LG#d0P$H32`bxP0xZc>hx>BZ9hT?`@@+ zX?Z*LHlR+k57zl4FLJ8!)xdC}_Oj!jv?F5UQamRN-eo7%jqp8?13)pV7z&fE%2P+a zJxhS|+g)IIU;Ai0o-5=!?W97jGRvXxB{FbUG8`!*PUO8PU(MgvW zbKfvM=>niL6*Vm#c{b^aaKDKFV?DO1%>7ca(6djg!+`o&xi#yR)L=*D>$NQGR*@$~FSY(6RN) z?9|v5-<0&9dZ3tz;a!S^JLD;N-U)Y&c>p?ciygTvHTYPs`el$2IpAzP6$91L^hhd| z_2bz6JGW-ZTSVE%ZHkIitpT}`XR9On&6(d1c5d845~PRDoR;z*=klGUFB$Z434>eU zoy;A5{XeORosTr=EQyq;HW(?M-sKrdqV;H7U9&?2-St!iP=6ydk^+yYGO?$XXgfou zSiNjwl#PK{1Uq1>T4xUU?^r!WPWIA&<&aj8Yq_5gWuz)A*1jPV0*5Cpve?uM1lAmt zt946P-4Z;+vt&S3uIbFb)s)qAUV!V{*!1YDP{eGs#1=4F5hOocwau=Zmf6d2-hM^p zcpf$b4^k{76ler5cAAm+CISJBL1q$ggq5aEr>9T={vQS{vu@{957h2_zFIZ>Y2 zBSO`ADdPJLHGf2V%E#%3d7!tFwE8+it*i>z%RK>?*H4VZHD&KC28^_!@^eAwWx^2H(c!U54g*kxq6htt zNCRXYzkbl-r2bb?A5O5vppp~{bq}()UHKMu5B@mBcq2i!CLIjGVUZ%l%@|zDeTmf& zze}LB8RqdIZZpRDbQP8G*b$I%hqgkj^ST<$b_#pDmP#Hc**yw3E7&+by8k&NdWZ|j z(%OA&lgq)ThZ+VAVdo9qJ~SW(1q!|4deqfo_KJ|s`&v<(wiyjwxo;5FkaF1=0*koK zm~xSOKeYU{iBaY5cQHCSS)vMPo+08efvU=uc5wjzm#q)J24VmPfd4shX=iNDn@rUJ z9hQ)L+-FpE(EqMpTo)@hcWARZswus=(4&V{bh)ez*IXr;^1eKL4g(Pfv=2JV{PH?v zJNylyvQpMBe?N!NQj2aKO6EjshW-Z)>B_y9LT7)#Betc#v6I09U?yh9LpUTSmqDxE_qsc$Jb-uJBINqJ_PmW{P@E9EO z{iH}>-76=d(A8lEJfrfB)I|)S&;|FDA=Al4(%9OJFa9mWvag)M&4h4wPP+y8eK=$F zip+x>TsC7malQ-S4&mXq)cs_fpAKtGne8`AFK?|Z&d${8T_du+S}w#N_c0o}g$6Bd zD~v@A@g*t?ZN*2|uhJ}BKXiB{YJ$mu+vbbmUcwYKhP|3`K$`<7;H;V3ps<^3HJ15( zJKO5YJTu=y6SMgTNa;e*1bz%@lb7ZIwExWeW{a=#HNX}o;>zBQb!N+qxoG_pOy_Ru zDz3GqC?WoV@#W9lZd+VzhYh_RL=ET)F&{5?KR0g@U6}xCy9TrjX!{(8E(Iw zH_`YyZ@q0jTnEec@~n}5?5WmIw?jas)1&#A)}=nR%{c&es=d;T*X10T@K7{;z03J z2vgcA7D*|3Uv?Y@iY5e_d217DjXR4(_<4FLJ~sv(v&x^2zD)GI*uheAfa%ikTUsH? z6e(lsYuY8(yzmK0$WUx*OFT1)yo;mlF!4h0f5OJC?5?z5%~F&E0N^$c3rgxfaV!g* za@Q7+3!y*~#3q0XEQ&d1-j`kp`!C-`bW$IG?T~17G*>%#Fto#1t)IR}w;4!SIPq|L zfd6j5HJ(1xrZK8YcA)xI{+a@J&*u!483Nm4deH!Ftx|UgS<5SS@m*qlj#b&V@K<__ zwzQLsE0Vz31?w=8q`lk^blRVKC|w~K>lJdYBnetF2WS>t2vzU{2*c)p^bX22|0GcQ z-yIYE#h^Ekz&*Lqrk5l5cqw+h(xOo_vE{Nh9!}{V*~Qxl6)Wds#nI~jLk;58G=vo;3yGpbEs2>E!rL3E)KK8Oip`&5R!%->6P&amsYx3`QPNE{~^1a^*1s(QV>0 z7dAwZ5GX+{ou1@bll(DL#P&d`m04Zht&+CxIx^6ltU06aAA$ulLEUYv%ya>e=${pl zFFd>;Mm#_YV@&nH9|#IAd#n!`9SGi-_P4r1Fx~jNTh;quvlg@q!bV? z)|qozdchOspEJ6}+HRtHP8lq1jC}vVME~(3*a3BX<_WZ1ijj{K`H|1|7zyy0Q32cu zd2ZB~9%KxNrF1- z$QerBon_#!q1-`Rus=g#c;%T`D!1Rj_&RL3swqeKwV=eAVP>OF9fvp;-bJA}#`N*h zW?G-rk;P5GjPQ}yp~JTkPkN$m6DHd-6a%fHPJNRKH_s^B&%eyP`C|CNwBX0Bh<#4F z40}Rs8zuS${51k8bJQA472Mr1RclQZFjrzcz(%q$7}o#F$|+j zK?XM7_n7q;uucPE)vk+psl1uCzq~tY-COX8#p=?R|IgPRtNNUM^#_(%fl=Wz5O`f= z>)HXw^KGrew2R@A-=`R4bGb?#%%$k-*q6b^d)}>yZO`y-?spj}1YA8v9dpTg#gNdGnijl`UY0oTf>`E=FBW$=SN^*Vq-NI>3nz-NQlP ziiW=Nn9LEv-t%=u#=0Ncal)*JFRf}#OH)t@>DF1|t2kLhGOm*(z;2S!KtRVC66Th~ z7{vj^0)`k2mg>xsc6A!o6b-t6K&~~g{w|v}nBRZRT(Y~7mU%7CnR6W-v?dXU?X?zlgZk089})#*Z|+J6ZdIYlARljh zu}pp+sJID4Yfk7)lmb{`S#Xjq+?rRnSL$ zKb_l&1>UHBxeac{!|{0Y#Hg;|`WR5#gaHGi1d%Tq%lc!rJ+@ZsW9@W#&Kzq_s8p?2 zxV4FAdB%YXIGarHdFLl`!~I)zLXkZJ3RAEm^GWw_oqo_yk&>^ptM?NkPikKs#9!g< zJTYy7O$;`7yeuLCeq$xjHa8tK0&bLC9fg^T@oRTUp=5i-fWzeSfA* zp!F;Por21y-d`SX+^$4Ikw&aM+*dqKkP_6uUSX@6d2{o8D^{7hB!xA{^ZJV|xU+=R~*3|Gg=`X5w=HtN&pKY)M?J z&6*pXzU*N}3R&}62X5O4&B3KQr4WFyZP!v;Qz;?f-n!)elGx!i@h@2%6Gm;r5yp}8 z+X^+cl_>b-@?Scy;oHpWjJXez*FXMv!8fbTtYcnlVv$~uU0rW5!Hxhbyl6idXNu|y zA=J6_^LUR-NUIhfJW`SriMDSKz>hEr)bU_t0mki(tZWR6{Qo=(8m0 zgb|E%pi7*$>ka7{;uvSSaYus^4uGO1y-JNyL2VP z@j|)P#O3j)%nnukJ)_%GpFG|jUp#ALc(m*4IPe1Oo2=~(Kg-D0TO^?XwfZI9xbDix8#EmSrxXvc?COy9%Eb&(C{d6t}IJBN{;XO!Ks<-}-_YRN3i_7I-FM9(l z6n9?cO&Tf{O!2?^=P81l8#pppCrlAZQTR!81jE9JbBi*t(fFMq&AqrpQXZxtNSn;V z!$PwDo)3K)GT=JK6Ra^$OgHhB(RVSua|<{~!U-zx&)KKUk}`BFPw5+C`vj3*K8$5j+`#Z$;AA8P~zK1s^`nD*Sgzs{5-rZr{MFI8Vxzs0@(DgHk_o5 zGe)!F+Vg049->$C%}C933JL#=Da2M+mH@(1me1n@V;;$61X*;)*H{#MzgibDjy{HC zugG7t#}2;kUwv5Q%A|b7WWk(|-k%o?N@f$^m1weaJ zl1WV0;DK9t2`-@PACT&pc#ncouE8lp-dqQxM~TFSM;ctfyBmeU}S}& zODb5ay{%mt@b(`^9xuo*j`wjhqZL~V{p{N8tm z6W3Ye^>*Q-kdO5w{g@oQo){A-BJAJsK^WBU9~%C@v7d$0+p z(N5!DiAcTE>)YB9@mrK5u_ntrTP8Hq<-^%7-7+K5_-|V+W0)&ym4mY!q(p^RaLZ>d ztBtO6pObwAi5v7VQzIQhK&>>-GUJcu`Z_ZH}p8^Sba9~WwkZ66lJ{xSyR9;X} zc8y2^zh?fzVC3@MTuXgZr8?rz*yrjX93kbH)}Msed|3i^cZ|QTE?sb0L9Nqhp8i6^0s}fY>rFgcW^B2FF70pbEB-P4?sepTVx)Ij|OQm64 z&f;kB4x|EKJ+5GDvOf!Ww35Y+Avq>G$T_v)Jt{*s!ad}fo1sn{GXT+#6}C-0NE-T?`#ze#7p_ISi%mH7y&il% z1{aCt;wV>YxwfXn>HRpLBk8iCkK79k0qm_exuZ{YT43pdjJhugVy%nMR{=W;F8<_* zLZm?^)YYuoM$$jptNu$z5P?HLu&?Nk`K+5m z-jRfw++CkLf@yt&0)w+s)+dIPb<{O@v15lWBOj=Im*=n@@ zALR(};5MKAPFf`OCF$$smHkJGC*MItm74F?J*q4QjVVdy`tV5E+S~^0VPCh5!S@;Y zbW?V^3*fFAa_^HJbv*^q_^yf-jaYxv(uf}OqVP}FH?SY4__p%U_=)s#^+QYk+oH#s z&}w z1T;meaiB4G=ydyMD)SN$xI=b)yliv))bV;BzdFKOX5PT3i%u_iOdg+9RTS$3gZn2- z>EC%zw=Gbj&wSz@`yAI0NW5(X-dvN5dp%{gN**sbDO0@P|0bu@)+8-0#EiRIB#Nze zA)9_v?prC_o8n6%o06RuMShF0rcBpEyoJ{Otlb4lKD9EcgA_!->@3W6PHXb4Q`7P1 zl5vf!<$sZI<@Z)D&p71*ATEUlh7o4);5hV^q51nDQ23};$(?Toa?Qk%&&l2W4b9;p z;mqo&=G>^HP3t-E!x{^qgq#4^-MCXVia1EUDOM|ufi6ea`EXPKnip4V#NfRxE;i5fl7**baC*`>KGln5 zDwTR@Ae0sH@5N#0)2(T*X%gjM-S)s=Nj3#bCRPm5lZMx{Mme<`U;JNu8k0Rn(psj9 zq+07MtL^ZYfX$dE4h#9oRj@%_D*b$1CKq!Ne;XP)n!M;JN;YrJCd*yJBZhSH`ECeM zU)Z1n%SB>pIaDX}f$%eAvR9$lHl>4yGeqyq7r)(h;md?he! zSpIL4L~Si9ktKDK0O0l7&HY)vBs*ct<=*G1m+PLcZpx#~^yKM$@Va_TPizeSX%A{; zr6J?Hh=BtsRJWBOsFGNb!0vpDOhp(nIE9>#5c7NPs*s5+mnu`5a!RqRj9-zG=MrXTC_ldV-WHZj~pNbGAo?=Sj{&+~t|i=w<27s@Qq z@fM7UlQ_-5!Z=fpobaTJI`e9!;4*5Cya$Cz&tt`jzJ6n!071uc|78(N~Sg$Ur(D4Fm$!EcmV=FP|+RgqadT5&v!j zELe4wBy66qW}>Z2k%bsZ9!lvo|3DXH75Cs2y77*6y(xEn3RhGj_Jp9hE>JeTr#tSb z`e&}GES|A_kCBG@7Ww@4w6zXl_ve7A$1^ksY_~;A(XE5vb+glCxVMGzwu`eWyjyib zI0CE&;e4r4#z?voIH&TIk0*!Kiu}KSChX~a@0_QjToX8^3ma^nf=m7vLIg_s`6U|8 zKbtm^WV-H;l-C2;WzSU_k`>XHmOy8f=eK;yhb`Ceh-9vx>#AD3-_sR~AaMc97n>qg zoRbCMoYMvMYJ?U>(}6#G20+Nvt<2ACxk(F|Llj%nC6MPza1;5tFQ!YJ&#@Njj6y16 z3sBM*^9=-nG*>3SlS3+C*Yt34w(cibolq}^;E*ZA?&YJWOX1hFZFW(_8C?5kYlpe< zpPayFOsy2nEN9Dg_UcL45Nu{^dQBLo-E$kqFQ|22xyH9epH6>}ppc_`waIpOBb`pR zh_|3=mZhjD1R9$1)lo#D#UI2GjWh-9I))3qx+RgN(h>}zX#0m!0`gW!8Z^d zDe@T{^p?*LoZ~KYTHChy(d$o4X^L{Vr)3LeIy70n>I%Oe{3bL7u~HV}esR?qNc`-2 zHe%>va?H|e`{;M@*w2{s37T%scknPAqDk*y$??^@DEiMsG`9aX6J$X6dG-sr`I@Gr z$y6#)oJ5A4AkyR(Q%Hsx2>$$FVH8UmjbL z?Z44K2~ePMd^7oiFZ-46C-L({MWBT5=-HE)NhWGvc27NpLjS?*H9~9)qc3u#- zAr04wgTf5eAS__;N&hPP8(J+>E_Frf!|mIl3+`(Q^;R20XfxV$Bv&Q=FW&_^9pOd` zruQ{(EJDao{=h)6>|#|#qt2whUf#pg%?&`=YlWukd9|d zMpyGI$MNvp>yctLfo?Uy8|eoS272|eHGe<hs!Cb(6AgHo&AZyzzX;@UrV( z01;0%jxu`}y8P6>m^ggU+*yuk1H?RRc#Yz;UPV>&AKv0cVphLxE~mdq9#yQHe6K;4 z$c_wgHD8TS09+P(vly+wRYw~zb!@vHZVgDp6qHNy!`FVfhPd`iUY4|+4i#gSR$2=F zvEiu2kH&c)YDtUAX7&s#tXsS6rgi5Qeu!#A)M-(@4nZAW77p#2Tx2YF2g?)fOyI8< zxB$+~S}B&sX|knUFo_A?$ANB*_K6MAxD>f>AZlFFXhnXF<0`;7MEte0rFJCCf3w>)g8<^+kSoEv%kBVS<7F->@z-p1w?p6;Yj0jD6wz*7b(S_5tKv3>g6|8V2|nFVP0) zk!!b;dURlZN_Kw0pMOgIVdPsxSk7iAfMeY^n6`)S47@r#!>`Jp?CESE<{-hne?Ko4 z>Rc6*W;cq;IRC2MioVcbB8RRPaD*VJwhRf?+afPLMQ-0l1L<4D@zsx4u_uAEpy}+qr{ob0z;B7y7$-5$-gpgCwsCDh4wP zOm5XEek0=Aw3(<1B9m0R!$6x9+|cPkoxQMxQbgKPSp6NrEiSN9c$sFEB*U$>SjP5m z#Z^%MV(c0Nqf5EDT{z}%ePrqlEQB%xJ|4soLI$Gmxs|2!D7D?Z6lcJyIg;G|hO`QaAUty82qX5}AqNfA zbl?Rh7#}_Vd{ZC%bXPzsEi0HX`{}q2KI&DuQp~O)1dhLdpdaU91tYc%#t7d+2w=@_ z{o8tRgow=Js?!53Qvd*ydrWVTBJhAoP$Oyxs*~(pdkUfLqm;)HmAT+XPmeCp=D@4n zrC++S*o?s{q41>b`X$-w!~i<;-sneADad$BP>PlJ5PPfqCh%bi{qH%iHewaQ`2U?uXvbI76wmz-0yhhLR5L z8o8g+!68^YAE-viMO4H6GZ&&72tYq->my@ElectSfH`Wr136k5ma0f>j|Ldcsbgm` zB1=O5y;e9^@>_^$X_++`t>J;7@G!of@IHmozo26kcB!YA^Py-4aGH!cML2RKU#QWO zvFK|2Yr5z)3$d1w?44#P#L<;OJ8)_z?Bz4Y?#nIDZ!jF@p~L&jOj4ZH2d;rn*ES zz_wKQMImm4eMK{~YmtO|VCb=PUN=H9U2MEiNP3OWNVrCM#l(A|!M3`;KX0EOi>709 z$2n4DZeO^_KlYFB^+n~eSA~M$fr8U5y&7__xxE9@x*~PnE#RVy`+T42w$v+p*g>_+ zkE6M}<2aa2#8H&mSh_l{Ca+8VKvagoIor2axjGprpZVfuz0;Qz=iPW2gqpny{db7B zd(U57q~rd^6nzozzMRQ{P|e$>NFHze^+!@vBb|8%0ngw8BgXS>q#8#k=y#GZ#qYKx zEgC<`Lc7#S)6n#Es#^6mCL83T0n+Ni#7yP)f=YF#$6~yAJ|wTQ1-<&vv$=}WpNP=< zDyK9mFDhhhh00LBtq3ECMeW^w8Qqq8KmFw(Aw9I?YCnwq6=xR#s176z?ddQ3l}F`^ zm%tys1*Af``Vd|VYX784K&{K?l4@(SkbQXx)^>wq-bE+Ues5IOy|_?rZDSSpLk$yz zP})=4Nh$e80HW}Svo$^?{%Up*F-&K5;+SH|#`dD#$3ek^VJmcDWPg5GFmJx7Pq(~6 z!6OB_XNy)=j1jqES<-l*l?*5IPhgdcw&Nr}!@FOi&g84-=Sb~VzEF-fRJ+s>5ea#tve zTrWXXaJjH+5s+#jk|5>9#Q&Q%fuia0QnM~checkd0=7XOQDm5ZOQ{UA?FoNibA;&E z&4Dj+>tytunn6~M4sUV-DZA1$n^UT|?1Vi-^va@d;BqdQ3Y_*BT}bai+ZtfJa4*LtnPs4SCtE>rC(uHvt^K4)*Vk@gRkT z>|f9R_l6}rM4iJhOkmxpir7TnDG^iT@DdDuuQ)YkCZoe~*>OmX(?c*1)L>?@eDJbR z=*ASry(1H-pWGN%9XTku|0K!WM}EjX>uYuzqvhtvOA@<`AGad+9aX;}_;X=u0`XhQL_a!Y3+a-ELDj) zhHM^Ds((+Bo9s6R_Gwx~mvQHrY^;6z>b5MBo61^dsAohxG>TsTu9)*_Ileva>q)- zou=o305!g~WZyIX(9B-FeGPMCXx5VhMg&6M3-iDVW?#(J>NY3#$qRRtjd~)y6Ez#z z?!v`>f|4ud3rtZ)8-OWFpVoh&hy|enMy2gPyU4GieL^ISB~@1wwnOR=8kVImMM#F0 zKN^r_#x^;-t_~zgT_untQp_|p)ZD5C-wTKN@#`XQBEQ}1<}xH)^Dls$KQH%fFyoTh zOcDBSgK8zE3OQ1l_J?dXfkn40yP)!WxP>W_)C<{SPmBdp>upz<=-rz$Yr9TK;zVAp zTGC(Ex+u_Bs%TgL?u#@%1{^jhcl;%|_Hrkv<}nH?W=RN6*Sx&hpbp(hQivU)ds$Rv zz+QkgC65xr2F!VHHpOBL$d!ucyNN1Q6{^lrN~)4iN)C#abbT$_yIH*wwZV%xpzUB# z)NiRfs~mLIAK`p_B+Qh1rDv>*T@a$XP)s!|9+NlHzkoQ(Qkd2xKPO{B{Pz2!ufY=_6}hr4OJ?QovTzVecw2S7&zH zbkgrE%#M1KH!t_=tVh(3RtR1y>;&;RD|3F{KUkU!@6?cy;Zga+DQsw%85Vh<8}Zy9 z4T8?UE8a@HcKmP32PCV5zzJq1w)4xYgI2|FoOmYBGIren0tXbhYB!>OSX7d$Qno3Gi8k0 zcRaK~Tj5xUutLRh^j0!o;z|ZB?2a+xmR^5Pf(*T#eiJ{LPGfJ0WYc%V#FC_W*Dulz zwou;HB$0_o&cG%=Y*s{c(%N?|$fm-u$&J1K%6mHt!ExBMH~86$v|bXk@wpXp2%Bo0 zY^}L)VvpTLPScPsGaO>-n=1fQP6?Q9aQDw|*EKuXsmC4Dc!9r9*k{XIxH_>7_Z z8s3T#If7|RQKo|sDVcL1Wxad@gAS;nA;^qm_Abm4pw=VzvT`Xgk6kO|HZ!0jtC$3> z%Cgz9I?=tLqx(!zQbRiobM52TjK^ z;sx3}eNgi^LUmC{=FQKnAjrvC3sx@$nQ<`6;YVXAOIQfT@yX}5vVGw-<*2q0*IPaX z%x)FgDV^h^#b3D>-EqA(t_{qjYJy$bm(3W!RV7Hrgr88) z75^hA8XmLEt!09*qx1sL$+1do@h9&MQrJngM+B~>K14nisE3`Y(f=*(i55g>nb(QW z1Vhi;6R(|Z6bLyA5X!TPPGd4HNa`N8(`I?J2)2+t64V<{jKiJ}i|t%#nLZUn;q=vY zE3h|M3V~8Yd0UW-3Hh3ni=ueVQ}3_1>1*uSwYqgXd29F1n$bi>H+faP+#O4kdT-YD zm*bwwtgk(bAz@#yBBnQR+vVrG&FPV&3p1)jOfOuGBa-~kBkhfD?r)JY8i+wz8Y$%0akqegA(2~iBG zIqBw%Y|9XA9~Njhp3RnM{A@VNP<;O}pQx)t2F1V9_3}*XOKP+Wi=2Vrm<&j})su-% zVM6);a>>avRl1df_icNMn>|L#*C1~%!~9#?Q;)4|hgW#&uH+1(a*;X^E1V!?BXDkh zIn4d_zJ8W9MZ8E*6eH%tVfWp7P7g z!b;UT2u~j`p}0N>S#G=1*`*5yHXUdvGU~v34jD5s8|<5AAci)RzlWPQ||y)S21*^Y>(S*aM8 z1R}N?e$ziDf_KZ}Xq+wqFS>$ZIyB%&oYdcEB!@Rj0e@sh-Ppw?1;ad1lQ+t5;or=LZ-02G4XTOWj9K@)ofH$Qq>Tb z&tp@ib{U-BF zyUoI}k9mb=te44)4QIwXlg-SNcIEt>cZej`wL`4b{DSR|Z`9a7t#XnoQ)2Z*hhE(C z2+9M6O~Ek~j|b-6m9a6)0r3|Imf}9OWZ0ZOmm&9VV307CqK1ic3cqn)Ks~}9jIsjP zP?VHp^ZAAKhh{BFLTJ>SlYnVbtiXspE^r-B01yucvP{OvO+w<&e74g$@vUJp`;TG| zaS5S0Qm~{P;UGH555R-)uRy|09{oR;J%Bjb;kO!PS{c?RHJJ16k*{qRt@~Obo%&

q-g&;?E{(x2TjtM)30h(9^tAvN-zZ!9n&?1~FF&H&q z=-)i|iIR~7&RkcwV`UAhWsT^hkC2la_3Pd-v)(&hOV=58;aJvBjl#?PW0whkYB>l( z*~A%qC0>vfw#6M3iGu(fpTe4DmsL`pO(7Au!Qp`Nfjxjs4*eHdAmlTgFm8_LLo_+v zec7J>9ckaFB>Cde8FgN-4n3O+;x$nHVv zYCg!r&$s?5{93--dHa1RlW#5qT?!PS@z`512;SSG7o}LX9KBV?v1$zg(wyp*`9x(_ zcS$dNTX^J#1u#iMc}%`W7bx)!2Mc*V&Qfp%up%NNPl}Qt- z|4^8V%w!2p4CztO{zU{g;Kv9mIYQD{6Kqa54Zu#B!mF>ZX?v5r&h6H^>Xn2RFpHWx zquKFcV1@>dl@uW<;f?nu|Ai+U;^JfbVw*R@h2Gm6d~I%7&#j&UkDCi8?fb+V%srZ^-XUl^}qLlWc@SgQ9Vfc#zbB;In_KN z_nx*LP_+k1JGXOA-~);q7dS;yEcf}5Gsy#X<}Hy76J(z347HyO6M2M%t-(ZOv{Tzg zE+`88#SMx}ar(mpap%l%i&D#|WFnHVMKnI`F&@QX3@oIhiB>=i0Ju{cg%+AMO_Y`xc@ra1fhEFKamH-J~R4Th&RM_$U(xP$dCxUa_%!@V@>kNr(NqH?7A0)dJvUHaW|XM@z4 z>Uy&gddd}f?5_KZ9tfJ0P(#4t)1PGyKukAlS2w|XnBZ+%nqwfIDQjhHG{zrp^J9}C+w;6WSaB3WMPXjlOk z$6u0nNi(qnu?r_4g+b%yh|xs~m_mv$sRGO5zhR-3_s`%tp};g)5*gddz`{lZQFA!e zCjYUW*HxC1FJ-}vbCeNk9)~d3oYFK(*4AwlTRXes*$2a}RnG*$f$QE{>N>C_96!mR z*y3Mi^rx)pu<`bH9e;!VeQ0rl4QKI5gNw?)P>zNxXEr840!#}uBey3CRHgtwkh@MN z?|%oKMDM418dl4;HQ(1L@uwnF9}WAEDkmyb zf-^7kY6M~xY-_wHKP~Avp;}pG=GNB24{N5+N`uK^2k%snKy*Q03RNhiY%?p-3>&!~ z;#=twdb}7i4NF4^+nCUQr1o`89D@U{=772w?ECNoqm z4*wxk(XKqb?Lv=5K@jL()hzd#lD8zB*SgSnQH`?C{!++d&$^cXrjKp6wPUirIs5J- zN9)sM*Kz2!36ZKLOHBH}fE4WRnaWEn=gcH{y`-b8@{Ns#mXFWUVdk~gP)t%bd}2R+ zNs>y8)*C28)JBInIyAQ(qGgRkcv`umdpjiZ?D;5waO;I=$ujQ%(3{3$*!3%VTK%H5 zKNU-YZLNUDa=E8=5j=bJA!!6STO1n#@_Q$hKT%Xv8ozSv!Xj*UhwGx;34%omBv^PO z6JCCU!AyEjrS%U!?XL*r6#9umjfn}kM)U?JKbNw%fD`^!zgPm-SpIk3D8&QtdFBSx zxyb4in<@Vn1$`)T4P1)6v0L7Xn$A1YeauPeQT{8eOPEYP9UNaJI%rp>c9{QNZuIR* zDCm~5&XK)rqZEKZkl@1S*N(u* zc-*~RgM!MO@>TRNF6!is@&;z!uG7IEMQ&b|kGQ~P@dkk`w}{#XYMs5~CV$0%7r|GM zI4Vsp$4Ed75rboh%kTG5zm(GtPTtZ7L)+bi(o3oH#{t)M+9hRW;jgc#+dJcvgUwnW zfb82iAGCBipRty_e4^9f)`u6#zF`o^^RhkD4SY6)L%;%%4t>YWw)x3OjoAadUFay} zNyg~V0FB#^NnalAggWJ9;ATTza%*Fo$?JYz&#qJ-yy=<6a7Jap&CMpkwB=FUJ&nU{e9! zkHL7!vU?b8F;bcpC$IEbs$DSHgOO5Nv+|D;OGw+>Aq0WMa-j>N-^9~X{=iYQ6Jq9u z+s@}(8mYMYg6+-9UXHVP$Nv{#45+~8AA=j9t8Cj!eU>V9YGj;*q`Gke4R=g$Q-<$I zCHMA7*F0sQQ_NQldhTO8O(Nv8g*1M&J%?EvjxuXzaM1jO-F}Lm!<#`U7!{kyZt{%} zP=8XM%yT(gc=&wPCH?$X+8Reg<(W$l|0YezNvo8Th4$X@px*pal&vkFqm=~n^Yw52 zlnds5<)J6qCo);aLk#5WP{IsWXXA7*AIPdFfORwmmlnt*kg$B{U??!0LxDjfgT4%l zC9j2Pd>Cx$!jDT{;OX*QgEL!PpGAm9D3a(A)$^%8LbRX`31xQsGVS}=9LRU6H~b&y z?@Q5%V~1nREQd6o8&}!V)0slCVBn!BxD$^@%a1~GGJPAu0SLx`IYKVs`TR=~0bf0K{4uzhzv;7&Fy+HtvEkhPZw%!C1w2T4u8MUl)_2%%@mLMcX%^a)qWt4QaiGJ zm4}8w{o>0lGhL*U)8Z-!F0tJ|sWm(n>rf8v&?~j;`(Y>dl!5VVn?u3DPfdN#A~s5p zgKrV-VDIc^4$LYBPq$ahw#)XZ&#+uP$l(TcJ|t_H?y(RzBJZe>H^SY)c$?5v3_wXK zf#Sy0U%%YFu>#}9#2CdtAZ(0|JV^pbpQjLXEhlNx? zr&?jv^0(UHk!)e;POf_z40kNy*l-pwsBUgTkdHK-?P0!>Ig^`8a{NA{Skg{*OLiv| z`99g2>+6Gu5KGo_IIyJaJHoY`jaS_-HofM%?W5DCs$z5{*ykG8_z#wD5f+gCIA(?V z;4k6LxNLz8iu{*mPU6-=g(+uYkE2dCP0IF5taponGzom@#yhIYpXqfjQTe38aKewl(S-RA z+u2`bn3w{Kd$k;B%w3Z2nw&*Ok+9K*Fzw3dR@Ql*Va&jiP<;!?%DM&u@+R2o-(LmS z>@Jzp4-+E9>%9{8X9E1A^9sxQZJ{%@I$zg6Y?Db*^kOC02cn1Z>`=X`UtSUhipB;U z-^*^K2Em8mgVj0o6%bcHE}FpQ!^2Q{S@fu3e>iR~!tN(2JwEaNl~`+~bL{?gTys`} z`^jWu@K~wiFSE%JjbnRkUdtTdc3LMD$L0-d(zoGsyDyyU!CqZ;pi@9Bei-yDGq2FB zTPX{jNwUjFGGPSQ8y%p(kF&Ay-0AAuPVTn7@Nf{|t&TONCUE@8J;y4DKo!G1b&zYc zIShH2PYZP!uX)14TG|Y=)lE(Tb~a(#P@Z##4lm{izGO#~YCsh+F05e7g(je~4%Nmi zyw;V8qb zCk~w^#|EKhQ9ZDum9&N82le)n^tm3qMhbBWkuZriM>sNG;({nWHZP|^P=PY%q^*Z^ zfM$EgZf^@#NOvQS0Nk>;IAgg0a+kp!V)F}$JG@}8mCI4Fwp06wEjL&EY)rSIXn?V_ zM1d?1us&eRx`&SVV8F!u{{;kA!kM>{raub%eRk_!(Tt1nE^t0rLbuuZO`E}QFX!by zt6yb?A_wVYEA+>=5irlG_I>X9og5u&1?S2ueHzt=%8Jc)Rn4d`ia2r_IpT-&!r44z zgyv4_Pg9AJ3G(JnM4e!R0Wcc-;*0y>7V?gP6C(n<;GM*{Q`y8;$)P{ZaBO1n)Pt-$ zBaZ?oRNlv9M#G(43HmLdOer4Q$Vf~P9~zpN93s}rLVA(7XOIRt47Boij1Fiuq~BG3)LGQz)27iNFkG(8WGmzqS-}DlOyit2yYTqg zhse6``;t*Reapy5@$_v;p0uwovJTSUfk?!YA~KX#dHkJ8fI=1DnpWxj->ZMcz;F65 z<*cXGwa=?;Z4NgC46KW(z~*LhdtBHS+)z{SS_w;(DypHMZM>@{9F7Heo*){-dybRj)bK!iXKn0k2NP$^@nLEGu65 z*6=3^Kj$5Vi@vxqS7S*o1u?K8svhLT?()LQA01{W5XXJX&R{^&Yf(%`8NvA;SY*n? zY0DaxqEOy#q*>xr0x>{776A#v%_XU$nJbqX8I-*g&gw> z`rX9~ID==h$Q$mk9p~z15Y68Dd~J@{WfE=R=BN6XQd{Q?tV1QZ!Y{nU>k`L~vq?f@ zschjza;eABSHjd&7{EgrGBY?vO7UezhJ4)FM4Il%+6J*dknx1bQS!vS{`{biZ@=Xz zc5eqTc?yAVb=%l&Ae-18)1bMd8%pmhcS^@WL7Q@gh=gGw5??P4Ixl1A+*aw5pl+l; zy<)?yhs48zHyrFmMGxxhu4@*!g-Q#an?d!nZ2f8Cgs?yo`3gP&yti;4I{Q6FqGTS2 z6|$s^jc)|B0PqF68MtT|m4fGvrYPl|Q5`9;(y>Lvp$7#)^|TO)5!C2|=^QyYX8nfya-BDkI}y8A~~KG&IMkPKxo)((VbRPcgWCQT3}cufmtfUEfkOklm< zWNhyoRVTqpG^<8=l6WCDT0g66ngj|-T509`j50IXOsc9Vgt0yab&Qxc)-m3TE!3VF zqI@h#SZU6{Pdf?FjCbbW1J=kjC5RKRAdsvOJBm7!oR+U(loC3BWTOR{<4pvZ{s*NF z-K!tD=D0N?MPnw(5K*MEcAUYhN~a+&8}ALgowpSRUOyW6D=r7`n+yly-1Cao0g;X) z?2f~@kN!7R;jcdgM4b(ss2`A|CLTA>BXJ%o*>GZ!=aJY6zMG4|nBh3=Jmv>}N z^S7aI`jG-PucRYI{Z=7AT*F4X-+Aup3+o#&Y-otA%@Vv;f4r|Kr~JgNqM6}N^zX~N z5*7Lv2=be65!12&heN56?|(;2PP^QDRK$Q?sB#Tz(C>n_mHe)8c$(~v-}w2lc2zzD zSmACr$wrGLeV=tE27!lIxhFxw&nIE(m_Gaa|t%+ToEtz!{o&lwA;(R`J7iu0RyG(T@OWd4`y;18- zoV`P5x$$Jj4{t)CZu0(kTp^QbvbA<2=YX|dmG>F^7;X9_^3`P8oNj}~*AeJm`fEyT zgA;UrG$n(-oc$*|$Srt($e<|=C;+I}k|-4c2)b9b|ugr^E8ByWkWS6?tNce3I$yk0+$t`7mGY z13P3W5sFdfL;8sZaLtZ5c#aiCL*s~DJRbVv2t{yoIHt9gU#r$Q^l^&!uxOK3E(J{4 z8Zc{unfVim=)j*uQLqg)KD~QQ6@!oN9;`5p3JkSozqm~%Ww7rH{0F$e4FtA{Wq(?B z2)1U|L2j#~)Pmu<5VrAgqw;a zksl6u7THj3*}PWi-9|j;@xsPaVU>UNCkC3P40B4G?)dQUWuQ2rV0b`4aj#jnn-j z8~%R9E7h8Z#urt}Jp-;|6b8L0DYZ^~@LOsS%)Izg?vR$1we|M=qJD7K+g)|d_Y3`+ zf)$IG`?IO3sSnWo;X*N_d@~*BjSx&@^9E$EU@t3m1OVq>JE>{JA^gN8}V<5VCO&G!`6*T`^Udg?r;gtRaB zJ`Z~&TfImJ!6RFqmVWQaB=DBb4^Iz$zk`mnyM9ne&QODd4pV-eA1133>94h%RSSQZ z^!xkct1V2Tp@_CaG@;z5)*|oQ-OVTyZ$>v*_U(f0{>VeHAqBz*y3NJ0(F-g(Fe}3F zK;R)Sli(L<^~4Fx-&eN?e9wJ`@K)qmAPN|V&LF;pY}klW(-fEN^E z7|j6khhu)feo0iy_?^)CTxL2B7U&?atD;+U_TpmE*QIpU{DBUQ+9t0%E3Fo%B8qP^ z8sd91oxU%*?d_yh%{$1v2U*U7)|4d16D&c^DoIlftG_Fsy473m-Xc06oCmw;#Z7{A6;B%*6tRaxfiEwB*wP=2N~j{kA?Z z!00k~r5~)~L&1;bN3-MG55J7JeuvkbIJ)+Jdmc>Pws!eX%55-Bl4=3HXawzBd1Z2< zofHPni^?|jne?wWnUCACWcJo}Yfj3sH%mK1^;$f%^Dj`47&?n1R1{r`94T&=xU06k zjpBa-CBAEa_cO0FFT4Ko0kNjnFEK5P!|PPwtN4xgu&o_0f68C>mGLQcyKBGb!O?t0 zBJX_s)V!P37TPN1Ayl39PuM`#}rixpuGm(S-HA0_Zc zuSyUfaoe)S-)*{xlrh7Yr9td$_ZxQrX;ysTpZk?n@RnsZuYMX#sMg|1=kG1~px4au(<9HOY}FP%POd?LkRW0Q z1p+~7+|2R@$^XvG#j~`q4$+oNZd8h##HgB9SE%p8(GXxnYP|1ev=~a0SRUc4L7Er3 z&Qf0fJeZ|O0!W&(sE;K74J(Q_4iT zNZQ~+o}rGGuSh)0)R1Bx^ZA#Cj1)7EF`xuLz{?e5pmeKi1md?qeuIRS#@-z+ zzOX1nN(+0-N1KT|+E%3>Il)U03HL8??tN6`iVD2xiFaFh8Y@ippvRsH39Ds|<2V3y6D+WW9O`s6*2A<497r_W%d zaEW!Zea$w9@bWHvp%-y=(~;V{D$N%!MhXz~zspIl*bnB=mdGE_npbbYU=f7YV?vb5 zy1L9!3Hinpt>9D3zrjzuSVB;B2qmSm`Io^6IX@!Q&+H?F{-@m8@OSnaKJ<|eQLqxB z7xf?SS>Z)9sLHGaN3S2RPCSdkfUB9Xd*`v!&j*QtzK;zC1Sp5}c+MXMoGs*P}TB>IIrHZ9JH-KCjMVFTlPHP(n)yk-%pw;jOe@N==dHl@Y zvQ09*ui^Hz_nWp?UtV=?MJXw=YFPJ}jzMUpG1w9#+OxrD)VIkN9 z!2GK$aH`EyNf=eRedQvuzsc`(?F{Ubc-s&z!W$X;1_cc}ThbCnEJ^u6t>*V2#K4+$ zFP8$T02StZreXsa6e$;o%`>;BzXL_L2s`zS;H=n(7D)<`Gu3Tz>SW86FRC(K7MSUu zk2h5$6U%YuAN+V#AYYJIzG^XUg}roLxVuAk5`))ipL|C{1Skxw$d{2j&=jjeo{2T7 z_V@2(O!5ZswM~tnoGc8?^9$ws{pi*8rd}kRy?1bc{r>iBB+ZH=s%)^rd z6#s+nE3a3{s4+=?fCOjr0;}a)U9=5FP`I$(0woYDTzZR?IgoI*aQ^?F1wa##R7MgJ z(L=CDc32jR%c~y)q*lFR)@ej7D=#-%Z*?^kcg2J-U39$*?@=A?&N_f^cUlP3UbY0w zFxjX_BSVIaAfNnRJst~94IRrrk3r)gMx8%3zNTo zED4cY$5Gd)!sUb-v*6J5JQ&Ss%&qLE^;e&X}3ko<~Ebn_;35;%xG}p+f7^*T~ zgerBj7|{R32ogn{Qnu}88*~fOFn-Mol3t1ZwSfv>(yKC_I}AfIjkbcJ*s9`FfzGt? zifXr)psiG_-~xNfi8wfq)K5CBOcJBlUft9hGCrLlzB6@?Bf!-wJ&JP_phDD#SYqdO z9^GZ306Dh!h%E;?^HJLCXgd*l{QF8Gp*@j}tJuQO;;{Iw3;Ri;dmw#hVBEku0_UGp z4uLv4KR)%zb}dQ3rg%EZMYmiJiLfkr!}oiFmMiPd4xotcm(h;nA`;?o@i)cw2uW3%aJC)=CktxU|YS(Hyf%5}u6 zQF6RQcoQTp;O|AQ&ob4_(D-h&4_w5W%KOHsx7S{Lmh>=C0t0Z`%i=YG7hnG!E`lJE z5?k`yNuf4tXNXK@6_G zitIkQx`Yp~4$MN#)$Nuf;AGo8pA^`=`(>wsc#I>d$#6!=)LFQic&tMv>Doj>P9XHu z$!hxAFr;NJr9R~Er;Z+5uVz7eUn1`Oa8lo{QvNxt3){*pi0thLWl;dPkgB!00hk6o z?b~FOuFlbteLf)vEDL&D;^w52{oi};G)v}QYF%tysfkO+7?SbiI#5Qg`g%Hb*H?;y z7!xQFh=q2u{pp?!;8LC9uesOw3v0xwr(I%7ZPh0W>yQO-%(cGS=%r(zbYIij+!W#T z)+x~)9N&$)LliT74h)heLp29}xA)Lpz|nagLg6!FPwxq{E~p)MC0rduUnp~8|88E& z;#GJw;No;5wLsQG#k8`j-SgEMfRy@?Jxy((d2h*-$g7L2@0sH12f+5FNo**{J{P6= zJoT>hqOg!A3x7guGuK9IS-YI6$Ffwi$*weLua?fevWaovRZ+F8m=HiL5;d*-N))de zngl~N^_GlfXrkNx090Pfv@8)@4m2-vE+s+iW2V-RNb2{H}nti8L)4s9m;RhDqf4piuU8u8F zR&7BvhM+#5Jz?Y`f1F@B)cp4LsWPq_4x%Ae7XgnxPj(O8!gCH~NNsswk=QNisC#bU zTYpkhhbmqLazU9KY{f2}SNc8L0w3&)CTgcau;sj;iW}PCJD2j$_cQ3PFZpx{bO<7gM7aRbr(C#qU1|uSjffL9i z@hxhd%h62DZC@-0U|WoWd!eD7MHX&FRX-dj5*@dv#0A#zqoV4Zp`ZN0*q-`E1PBou z_qlFQwuH3+Gi;6&Mq2K3eTq%sUTu;Jj5x~^Hy{2cZEM_;b$RaFk`ckOcs^N&10tei zNPKYFR+{fihH0-7OQ1e`NSl#7F_e!uHTeNK7V!7P*^)3gRbo3h}Qpgwe*TH(qLax%vF_7dfo{q!%cK z`xA80%j84Ssq4j^!zaQRWPU)XzStL!@|a9> zVD)MIUbM7nP>bkyyE2{-;~1%mGm~3)6@ou0joa-X<+vgLD8uPNas(Vke3SuwZyuBu zxqi6`?{s0pt9n99al5Mu0;IdU+uwKU-h(_m8%{0=8lIpc2(ZwS^#nHX@9V@9q3WEe zx7w4$_?BmG444kEzV1#$BSk?7_jvJzy~L4B2*A>a&#UT=Yog6dNxt56K=WN3xs`=D zMvB!WmHAt~g74GyK6sJ>+RVyH2`=nSpd@1V@nD^s=b~yc3$TC=bc3|bYN1*`>pKG>i&U}nZK=IAF-*4am) z%=zsA>r-3X(FZ7MgY~?$VvrEc`=?h=w@S(p$Ep+(gumxGbo^1_jX?cwjlx;!i%7vu zPI(wGxc14Ai?~PL?kb3LL~nn;NEB*b<OL!HXUfaE`&4xDwct@Q{`2Z}&p%`})m|dXFfwzyGm4vlt4>{h|-InVRH05P=n7zNY=G!iW zDctHzbT}c~a+|*JarwxWrhjD8S%x#A1o35j_0QRBX2P)uVJ~Xz)2}o`OHkXOL;z^# zw9IhO$xTyf>+KY*Ajg#D+wty|w|_ zQ=)=oUQ&wk5y7kWZ6CPp`2r}(V%Yt3DeD`xjTV2JkQ);r;YIm(2Y^PFfn3O}>Bl*Z z0uJM~c#+%YsPGUiU$|4cII-Dcu7p~PPuQRTR!@%ltv5c}Z0frLm@_}MOL;S4^Vcq! zqn3FJF4|dUNeP+{B^-r?pq9LE86*fAA*89!u4kZHAtGHq-&uF7sKo}*h{@{$NJ+TK zcG&Ngs&^hJGC0qJD8JP>^qA5!@WrwI!8RPc#R^KJ{=M8A3}&nTeTf>Sb0!v`TjWX2 z()#5#i#SuL_(1Fnl4{%Q&FXs)hMaKF{EH?^lhaq4pTBwWqg+3u>9vm&@uQUJl_o&u z>GGo@g#Qwb$EwQ&5)RB=g(70{5hw_5R{x=Aoj$BkAva_D>4L>9F>?}YYu~f5o0(gN z^rlJmEd@6R(8m$h7t>3`j+m^`Ik+`V@%?|^=KonFp_LvSz{~09$WIFJ9%F}?;l>gx z!Dt|N|M?m~GG^>0I$)zRv+J&TZA&V*xCq})lnt~8*vLHN??n5leM8rLQeogJAh>nC z6uKH9P!#MZRyZLmrw}qrponMWaoEyQ)k*ZbRtk42w-YfEUI?-~*C8WmRzimONi+(J z7Au&|Hx(@t#)L#Mpr8|hnM5S~5etXHaqn>pk9(=BpamT67eRen|#M_4Z4|Z$mFQ3qKPZG8}_q!+(RQ3uS-Ch+mAue z@e)pRC3Mxero)5%NRwC+`TI96J@ar-Ug)y$!5^h)-9i6<3OuM>R3kAWYXFB0H%FAq zF^jo0+%CuExwgQRxtV zVrlLa`}u-|5ctnUSvu%S7zm}|q?x6n=K*a~9S=}#B#2zoU!B>S84+c0n=JKnqeyG~ zqi|{-B2MxtWjvYqOt=_nC-BQBpOJf`n4Lho+qO&SI>fo3EWG-YV3FNmXFrLQsn7o{ z+XUg#1ZrDlIOG`LG?&Xp;8M+m8$UFo&K{!23DO*m2R=mMyPSMY{fs;_`Vi32j(RNY ziGxa@k9Gx54WRR_F+glpwqC0tCf4jaNyOV`N3E6N-yTZczU+>GnjGNurnY@6u6B7S zxj#ea&t=1eHB-odNTpY&VU_RhH+!b%C@`Hq7Kt4-OZFz~*v|<`)Dj_?&`e!B&-U|8 z=iYOPPGAs0aZm{A7rO|k%NT(lKpJkAn`877ME&8kDT^&ALJWMd5UU}KlK>#PwuBU z!CAWRlJ}l_Ly-*$X*t6@!t>=od<&MzKh+cC-X}s|-rU;knUPXfE=rAP!aDO$L90W7 zZ``6deGQr^+|I5srH~L(Ss965e=tE~;4l#P4#*KyLlGJeGj=pDf*Uluv;wVkA-Hdp4)&vbxlA6{} z=y-xcoJL~3LzdE1MP%jMW6xan9YC@(mIVF-7xtpvH_+-uEmp-!U~RDWy?QZ%I~tGla1`CdSlYfLBERAJX_}*zyg^b{fJ_ z!Nc60T|y0r(xWvVq|inZid@DmDr2x9PztJxueBa&2)m3QuXiwL@Q(a*nsorepk-6`^o(OOyvLiR7-#*A@rpT(7Y!j4$W(n zn#}FWIF{cdhYF~`(N{Jx0pu`Lw29+y4`FN!cd#nToQ(@7zcBG$Tr1l@6pN^=s=&~m zamFmJCUw*wnR$4hSQ9?3qhhf6!ATi1Z_2QHZSO|AYl6K^g!|2m)-Xk4^qQYwunCB2 zfS5fAX_(=)zKOXFtuQijpPXEx<$0a_}9yfQ4qIEse_wK#C5-Gm1*Fi0kdD3;^dG-you!HsEs@@Z}IqnyuiqecUWK#GVJ7ksIiXK=_-42BFhS^T>`;ny8IYHGi-iYy0 zQ4S=5ZUVsRIKG95Bd*OpVs1w}>B_xbcPqL&7bPWr4(h(-f4RoLOP5p$L<%n!H+_3& z143}WiNcgCz74Sa*oXT3U@`&)dBbuA?1KK+dh@>%4Q(kgOrXfsyup+mVaySAx-M|Z zNV+MOI2xvQUvm3J#!b2kw_7(PW^OFChdwtnoU*&~R8FEFbn{Cez%$XdAh*dfW@j+e?v54vow>cQTJe^3jaNV3pvEx|CJbzBOloTWQJib= zDsNcu=d>p~#t2yfRV5|1Oo`8_gjVy3Ziv<(E}{bbZVzz|9A7w(sP+I%gr#lpf~|r0 zi5o28O%w%p(+86?npSnOrOwJc^!4JiaCAAmewsq@7(PjQ{o&Beo|qhpuLqXH63@J7 zhg5NEZF~xb)m0&3I2XZ`ltji54=MutPakjb!XLP!h)m0wVWsy~7VB%&3Z~&wep8i@ z^TS((D-yh%e?~tKVn;$|L`Y1GbPy+9dL|8|U@a8}QM(WSiwXaZIP?d+1g%dApj9>v zRj&I#&#sK1oM5p7TQ`Pz2uSCS*M|2NPdWF=-~WKtMID`E)0yg>j zCUQc8w?}=K-JWChZqL-BduYq01il#P{r45;DkJ1xVH9=J?*Li<-@z}YaL>drswWA( zbhNbOrwX=I`tfQHJU@Wwh^>;JiQ9G#l$mq1Dy*G73L_tt?mESVR@ZQV z;Eg0!De!Q;wX_OI?fP4=swesb%iw>W(gFBMJju3!49%CM5yrWN#!VIpG7%Qk z-WFR9Tw7m6~<9wRT_pS%`<9KVpkEMWAGN(SpBh+`4u}Q+dU_PYistHYB!-i zi2Q&g`rw}DfGv1P#2b}3<5Ly9w&h(9`3byQz#8ha38Uv{pI21gsc{GBjXG=swFTZG znz4RPz>-mnlTKDb=HzY+!ji?9IXfJWV`7OCM>x%FG$&OuId`ZrMa42z8XgRKGrTd3iw(at`7$?# z5$y!-@HgRIr7PUZhbi+Zi52v~)H8Cf*|VEBPb_6T+{tbor2CT|g9l3YzqG(+z*H8q zRm1r}jhb>F#5wn}{1OPQb9Jb_LYt~}{0`;Y<2a}-c^cgcYSh4-UG0L*`a# z95@VYMnxZUI*nN4oePSMI5F94`tj&O3ldpUj@KkAW7w8j4HuaNCDu9y1Uv<@5?wsh zA0_iI{)chay_-ym>QZP#DQJ#Y(@$$N-Zal$@E?7i-$^fl|LZ3NG69Y=w<-*QOmk}< zxKtEfpxc5pD1J1B+lyD?lX5%x2>B=D3IVnFO(K0752%~>e`HSgMOzyc|02>ls|r2d z^KgR4@iouYj1;IGSO73kDL4E^@*!bVg{=ABN!%CGne|A}cod_i1CpHRdZ9#`puHYV zkl*dsaJ-GBzxWkPS5*;YNrb7WIJM{ReM^#044%(B#{SSLBA2}@T~>Dex1kHC24_-_ zHoT3s(skc07Jz91yV-)Kbq=DbNk1y>xet9+3Er%CYfmD(-NpGOH@KHT|- z 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%0D^ek0k65!;zi4v#4*`Qjypvf0agaXXEU*!n5i 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 E50pIlS^xk5 diff --git a/docs/demos/ArgoCD/fleet-argocd-integration.md b/docs/demos/ArgoCD/fleet-argocd-integration.md deleted file mode 100644 index b7c68458f..000000000 --- a/docs/demos/ArgoCD/fleet-argocd-integration.md +++ /dev/null @@ -1,669 +0,0 @@ -# Fleet and ArgoCD Integration - -This hands-on guide of Fleet and ArgoCD integration shows how these powerful tools work in concert to revolutionize multi-cluster application management. -Discover how Fleet's intelligent orchestration capabilities complement ArgoCD's popular GitOps approach, enabling seamless deployments across diverse environments while maintaining consistency and control. -This demo illuminates practical strategies for targeted deployments, environment-specific configurations, and safe, controlled rollouts. -Follow along to transform your multi-cluster challenges into streamlined, automated workflows that enhance both developer productivity and operational reliability. - -Suppose in a multi-cluster, multi-tenant organization, team A wants to deploy the resources ONLY to the clusters they own. -They want to make sure each cluster receives the correct configuration, and they want to ensure safe deployment by rolling out to their staging environment first, then to canary if staging is healthy, and lastly to the production. -Our demo will walk you through a hands-on experience of how to achieve this. Below image demonstrates the major components and their interactions. - -![fleet-argocd-integration](./fleet-argocd-integration.jpg) - -## Prerequisites - -### Fleet environment - -In this demo, we prepare a fleet environment with one hub cluster and four member clusters. -The member clusters are labeled to indicate their environment and team ownership. -From the hub cluster, we can verify the clustermembership and their labels: -```bash -kubectl config use-context hub -kubectl get memberclusters --show-labels -NAME JOINED AGE MEMBER-AGENT-LAST-SEEN NODE-COUNT AVAILABLE-CPU AVAILABLE-MEMORY LABELS -member1 True 84d 10s 3 4036m 13339148Ki environment=staging,team=A,... -member2 True 84d 14s 3 4038m 13354748Ki environment=canary,team=A,... -member3 True 144m 6s 3 3676m 12458504Ki environment=production,team=A,... -member4 True 6m7s 15s 3 4036m 13347336Ki team=B,... -``` -From above output, we can see that: -- `member1` is in `staging` environment and owned by team `A`. -- `member2` is in `canary` environment and owned by team `A`. -- `member3` is in `production` environment and owned by team `A`. -- `member4` is owned by team `B`. - -### Install ArgoCD - -In this demo, we expect ArgoCD controllers to be installed on each member cluster. Only ArgoCD CRDs need to be installed on the hub cluster so that ArgoCD `Applications` can be created. - -* **Option 1: Install ArgoCD on each member cluster directly (RECOMMENDED)** - - It's straightforward to install ArgoCD on each member cluster. You can follow the instructions in [ArgoCD Getting Started](https://argo-cd.readthedocs.io/en/stable/getting_started/). - To install only CRDs on the hub cluster, you can run the following command: - ```bash - kubectl config use-context hub - kubectl apply -k https://github.com/argoproj/argo-cd/manifests/crds?ref=stable --server-side=true - ``` -* **Option 2: Use Fleet ClusterResourcePlacement (CRP) to install ArgoCD on member clusters (Experimental)** - - Alternatively, you can first install all the ArgoCD manifests on the hub cluster, and then use Fleet `ClusterResourcePlacement` to populate to the member clusters. - Install the CRDs on the hub cluster: - ```bash - kubectl config use-context hub - kubectl apply -k https://github.com/argoproj/argo-cd/manifests/crds?ref=stable --server-side=true - ``` - Then apply the resource manifest we prepared at [./manifests/argocd-install.yaml](./manifests/argocd-install.yaml) to the hub cluster: - ```bash - kubectl config use-context hub - kubectl create ns argocd && kubectl apply -f ./manifests/argocd-install.yaml -n argocd --server-side=true - ``` - We then use a `ClusterResourcePlacement` (refer to [./manifests/argocd-crp.yaml](./manifests/argocd-crp.yaml)) to populate the manifests to the member clusters: - ```bash - kubectl config use-context hub - kubectl apply -f ./manifests/argocd-crp.yaml - ``` - Verify the CRP becomes available: - ```bash - kubectl get crp - NAME GEN SCHEDULED SCHEDULED-GEN AVAILABLE AVAILABLE-GEN AGE - crp-argocd 1 True 1 True 1 79m - ``` - -### Enable "Applications in any namespace" in ArgoCD - -In this demo, we are going to deploy an ArgoCD `Application` in the guestbook namespace. -Enabling "Applications in any namespace" feature, application teams can manage their applications in a more flexible way without the risk of a privilege escalation. In this demo, we need to enable `Applications` to be created in the `guestbook` namespace. - -* **Option 1: Enable on each member cluster manually** - - You can follow the instructions in [ArgoCD Applications-in-any-namespace](https://argo-cd.readthedocs.io/en/latest/operator-manual/app-any-namespace/) documentation to enable this feature on each member cluster manually. - It generally involves updating the `argocd-cmd-params-cm` configmap and restarting the `argocd-application-controller` statefulset and `argocd-server` deployment. - You will also want to create an ArgoCD `AppProject` in the `argocd` namespace for `Applications` to refer to. You can find the manifest at [./manifests/guestbook-appproject.yaml](./manifests/guestbook-appproject.yaml). - ```bash - cat ./manifests/guestbook-appproject.yaml - apiVersion: argoproj.io/v1alpha1 - kind: AppProject - metadata: - name: guestbook-project - namespace: argocd - spec: - sourceNamespaces: - - guestbook - destinations: - - namespace: '*' - server: https://kubernetes.default.svc - sourceRepos: - - '*' - - kubectl config use-context member<*> - kubectl apply -f ./manifests/guestbook-appproject.yaml - ``` -* **Option 2: Populate ArgoCD AppProject to member clusters with CRP (Experimental)** - - If you tried above Option 2 to install ArgoCD from hub cluster to member clusters, you gain the flexibility by just updating the `argocd-cmd-params-cm` configmap, and adding the [guestbook-appproject](./manifests/guestbook-appproject.yaml) to the `argocd` namespace, and [existing CRP](./manifests/argocd-crp.yaml) will populate the resources automatically to the member clusters. *Note: you probably also want to update the `argocd-application-controller` and `argocd-server` a bit to trigger pod restarts.* - -## Deploy resources to clusters using ArgoCD Application orchestrated by Fleet - -In [./manifests/guestbook/](./manifests/guestbook/) directory, we have prepared one test configmap for each member cluster. -The configmaps are same except for the `cluster` key in data pointing to the member cluster name. This simulates different configurations for different clusters. - -### Deploy an ArgoCD Application for gitops continuous delivery - -Team A want to create an ArgoCD `Application` to automatically sync the manifests from git repository to the member clusters. -The `Application` should be created on the hub cluster and placed onto the member clusters team A owns. The `Application` example can be found at [./manifests/guestbook-app.yaml](./manifests/guestbook-app.yaml). -```bash -kubectl config use-context hub -kubectl create ns guestbook -kubectl apply of - << EOF -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: guestbook-app - namespace: guestbook -spec: - destination: - namespace: guestbook - server: https://kubernetes.default.svc - project: guestbook-project - source: - path: docs/demos/ArgoCD/manifests/guestbook - repoURL: https://github.com/Azure/fleet.git - targetRevision: main - syncPolicy: - automated: - prune: true - selfHeal: true - retry: - backoff: - duration: 5s - factor: 2 - maxDuration: 3m0s - limit: 10 - syncOptions: - - PruneLast=true - - PrunePropagationPolicy=foreground - - CreateNamespace=true - - ApplyOutOfSyncOnly=true -EOF -``` - -### Place ArgoCD Application to member clusters with CRP - -A `ClusterResourcePlacement` (CRP) is used to place resources on the hub cluster to member clusters. -Team A is able to select their own member clusters by specifying cluster labels. -In `spec.resourceSelectors`, specifying `guestbook` namespace includes all resources in it including the `Application` just deployed. -The `spec.strategy.type` is set to `External` so that CRP is not rolled out immediately. Instead, rollout will be triggered separately in next steps. -The CRP resource can be found at [./manifests/guestbook-crp.yaml](./manifests/guestbook-crp.yaml). -```bash -kubectl config use-context hub -kubectl apply -f - << EOF -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: guestbook-crp -spec: - policy: - placementType: PickAll # select all member clusters with label team=A - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - team: A # label selectors - resourceSelectors: - - group: "" - kind: Namespace - name: guestbook # select guestbook namespace with all resources in it - version: v1 - revisionHistoryLimit: 10 - strategy: - type: External # will use an updateRun to trigger the rollout -EOF -``` - -Verify the CRP status and it's clear that only `member1`, `member2`, and `member3` are selected with `team=A` label are selected, and rollout has not started yet. -```bash -kubectl get crp guestbook-crp -o yaml -... -status: - conditions: - - lastTransitionTime: "2025-03-23T23:46:56Z" - message: found all cluster needed as specified by the scheduling policy, found - 3 cluster(s) - observedGeneration: 1 - reason: SchedulingPolicyFulfilled - status: "True" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2025-03-23T23:46:56Z" - message: There are still 3 cluster(s) in the process of deciding whether to roll - out the latest resources or not - observedGeneration: 1 - reason: RolloutStartedUnknown - status: Unknown - type: ClusterResourcePlacementRolloutStarted - observedResourceIndex: "0" - placementStatuses: - - clusterName: member1 - conditions: - - lastTransitionTime: "2025-03-24T00:22:22Z" - message: 'Successfully scheduled resources for placement in "member1" (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 1 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2025-03-24T00:22:22Z" - message: In the process of deciding whether to roll out the latest resources - or not - observedGeneration: 1 - reason: RolloutStartedUnknown - status: Unknown - type: RolloutStarted - - clusterName: member2 - conditions: - - lastTransitionTime: "2025-03-23T23:46:56Z" - message: 'Successfully scheduled resources for placement in "member2" (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 1 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2025-03-23T23:46:56Z" - message: In the process of deciding whether to roll out the latest resources - or not - observedGeneration: 1 - reason: RolloutStartedUnknown - status: Unknown - type: RolloutStarted - - clusterName: member3 - conditions: - - lastTransitionTime: "2025-03-23T23:46:56Z" - message: 'Successfully scheduled resources for placement in "member3" (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 1 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2025-03-23T23:46:56Z" - message: In the process of deciding whether to roll out the latest resources - or not - observedGeneration: 1 - reason: RolloutStartedUnknown - status: Unknown - type: RolloutStarted -... -``` - -### Override path for different member clusters with ResourceOverride - -Above `Application` specifies `spec.source.path` as `docs/demos/ArgoCD/manifests/guestbook`. -By default, every member cluster selected receives the same `Application` resource. -In this demo, different member clusters should receive different manifests, as configured in different folders in the git repo. -To achieve this, a `ResourceOverride` is used to override the `Application` resource for each member cluster. -The `ResourceOverride` resource can be found at [./manifests/guestbook-ro.yaml](./manifests/guestbook-ro.yaml). -```bash -kubectl config use-context hub -kubectl apply -f - << EOF -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ResourceOverride -metadata: - name: guestbook-app-ro - namespace: guestbook # ro needs to be created in the same namespace as the resource it overrides -spec: - placement: - name: guestbook-crp # specify the CRP name - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: {} # empty labelSelector selected all member clusters - jsonPatchOverrides: - - op: replace - path: /spec/source/path # spec.source.path is overridden - value: "docs/demos/ArgoCD/manifests/guestbook/${MEMBER-CLUSTER-NAME}" # ${MEMBER-CLUSTER-NAME} is replaced with the member cluster name - overrideType: JSONPatch - resourceSelectors: - - group: argoproj.io - kind: Application - name: guestbook-app # name of the Application - version: v1alpha1 -EOF -``` - -### Trigger CRP progressive rollout with clusterStagedUpdateRun - -A `ClusterStagedUpdateRun` (or updateRun for short) is used to trigger the rollout of the CRP in a progressive, stage-by-stage manner by following a pre-defined rollout strategy, namely `ClusterStagedUpdateStrategy`. - -A `ClusterStagedUpdateStrategy` is provided at [./manifests/teamA-strategy.yaml](./manifests/teamA-strategy.yaml). -It defines 3 stages: staging, canary, and production. Clusters are grouped by label `environment` into different stages. -The `TimedWait` after-stage task in `staging` stageis used to pause the rollout for 1 minute before moving to `canary` stage.s -The `Approval` after-stage task in `canary` stage waits for manual approval before moving to `production` stage. -After applying the strategy, a `ClusterStagedUpdateRun` can then reference it to generate the concrete test plan. -```bash -kubectl config use-context hub -kubectl apply -f - << EOF -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateStrategy -metadata: - name: team-a-strategy -spec: - stages: # 3 stages: staging, canary, production - - afterStageTasks: - - type: TimedWait - waitTime: 1m # wait 1 minute before moving to canary stage - labelSelector: - matchLabels: - environment: staging - name: staging - - afterStageTasks: - - type: Approval # wait for manual approval before moving to production stage - labelSelector: - matchLabels: - environment: canary - name: canary - - labelSelector: - matchLabels: - environment: production - name: production -EOF -``` - -Now it's time to trigger the rollout. A sample `ClusterStagedUpdateRun` can be found at [./manifests/guestbook-updaterun.yaml](./manifests/guestbook-updaterun.yaml). -It's pretty straightforward, just specifying the CRP resource name, the strategy name, and resource version. -```bash -kubectl config use-context hub -kubectl apply -f - << EOF -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateRun -metadata: - name: guestbook-updaterun -spec: - placementName: guestbook-crp - resourceSnapshotIndex: "0" - stagedRolloutStrategyName: team-a-strategy -EOF -``` - -Checking the updateRun status to see the rollout progress, `member1` in `staging` stage has been updated, and it's pausing at the `after-stage` task before moving to `canary` stage. -```bash -kubectl config use-context hub -kubectl get crsur gestbook-updaterun -o yaml -... -stagesStatus: - - afterStageTaskStatus: - - type: TimedWait - clusters: - - clusterName: member1 - conditions: - - lastTransitionTime: "2025-03-24T00:47:41Z" - message: "" - observedGeneration: 1 - reason: ClusterUpdatingStarted - status: "True" - type: Started - - lastTransitionTime: "2025-03-24T00:47:56Z" - message: "" - observedGeneration: 1 - reason: ClusterUpdatingSucceeded - status: "True" - type: Succeeded - resourceOverrideSnapshots: - - name: guestbook-app-ro-0 - namespace: guestbook - conditions: - - lastTransitionTime: "2025-03-24T00:47:56Z" - message: "" - observedGeneration: 1 - reason: StageUpdatingWaiting - status: "False" - type: Progressing - stageName: staging - startTime: "2025-03-24T00:47:41Z" - - afterStageTaskStatus: - - approvalRequestName: guestbook-updaterun-canary - type: Approval - clusters: - - clusterName: member2 - resourceOverrideSnapshots: - - name: guestbook-app-ro-0 - namespace: guestbook - stageName: canary - - clusters: - - clusterName: member3 - resourceOverrideSnapshots: - - name: guestbook-app-ro-0 - namespace: guestbook - stageName: production -... -``` - -Checking the `Application` status on each member cluster, and it's synced and healthy: -```bash -kubectl config use-context member1 -kubectl get Applications -n guestbook -NAMESPACE NAME SYNC STATUS HEALTH STATUS -guestbook guestbook-app Synced Healthy -``` -At the same time, there's no `Application` in `member2` or `member3` as they are not rolled out yet. - -After 1 minute, the `staging` stage is completed, and `member2` in `canary` stage is updated. -```bash -kubectl config use-context hub -kubectl get crsur guestbook-updaterun -o yaml -... -- afterStageTaskStatus: - - approvalRequestName: guestbook-updaterun-canary - conditions: - - lastTransitionTime: "2025-03-24T00:49:11Z" - message: "" - observedGeneration: 1 - reason: AfterStageTaskApprovalRequestCreated - status: "True" - type: ApprovalRequestCreated - type: Approval - clusters: - - clusterName: member2 - conditions: - - lastTransitionTime: "2025-03-24T00:48:56Z" - message: "" - observedGeneration: 1 - reason: ClusterUpdatingStarted - status: "True" - type: Started - - lastTransitionTime: "2025-03-24T00:49:11Z" - message: "" - observedGeneration: 1 - reason: ClusterUpdatingSucceeded - status: "True" - type: Succeeded - resourceOverrideSnapshots: - - name: guestbook-app-ro-0 - namespace: guestbook - conditions: - - lastTransitionTime: "2025-03-24T00:49:11Z" - message: "" - observedGeneration: 1 - reason: StageUpdatingWaiting - status: "False" - type: Progressing - stageName: canary - startTime: "2025-03-24T00:48:56Z" -... -``` -`canary` stage requires manual approval to complete. The controller generates a `ClusterApprovalRequest` object for user to approve. -The name is included in the updateRun status, as shown above, `approvalRequestName: guestbook-updaterun-canary`. -Team A can verify everything works properly and then approve the request to proceed to `production` stage: -```bash -kubectl config use-context hub - -kubectl get clusterapprovalrequests -NAME UPDATE-RUN STAGE APPROVED APPROVALACCEPTED AGE -guestbook-updaterun-canary guestbook-updaterun canary 21m - -kubectl patch clusterapprovalrequests guestbook-updaterun-canary --type='merge' -p '{"status":{"conditions":[{"type":"Approved","status":"True","reason":"lgtm","message":"lgtm","lastTransitionTime":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","observedGeneration":1}]}}' --subresource=status - -kubectl get clusterapprovalrequests -NAME UPDATE-RUN STAGE APPROVED APPROVALACCEPTED AGE -guestbook-updaterun-canary guestbook-updaterun canary True True 22m -``` - -Not the updateRun moves on to `production` stage, and `member3` is updated. The whole updateRun is completed: -```bash -kubectl config use-context hub - -kubectl get crsur guestbook-updaterun -o yaml -... -status: - conditions: - - lastTransitionTime: "2025-03-24T00:47:41Z" - message: ClusterStagedUpdateRun initialized successfully - observedGeneration: 1 - reason: UpdateRunInitializedSuccessfully - status: "True" - type: Initialized - - lastTransitionTime: "2025-03-24T00:47:41Z" - message: "" - observedGeneration: 1 - reason: UpdateRunStarted - status: "True" - type: Progressing - - lastTransitionTime: "2025-03-24T01:11:45Z" - message: "" - observedGeneration: 1 - reason: UpdateRunSucceeded - status: "True" - type: Succeeded -... - stagesStatus: - ... - - clusters: - - clusterName: member3 - conditions: - - lastTransitionTime: "2025-03-24T01:11:30Z" - message: "" - observedGeneration: 1 - reason: ClusterUpdatingStarted - status: "True" - type: Started - - lastTransitionTime: "2025-03-24T01:11:45Z" - message: "" - observedGeneration: 1 - reason: ClusterUpdatingSucceeded - status: "True" - type: Succeeded - resourceOverrideSnapshots: - - name: guestbook-app-ro-0 - namespace: guestbook - conditions: - - lastTransitionTime: "2025-03-24T01:11:45Z" - message: "" - observedGeneration: 1 - reason: StageUpdatingWaiting - status: "False" - type: Progressing - - lastTransitionTime: "2025-03-24T01:11:45Z" - message: "" - observedGeneration: 1 - reason: StageUpdatingSucceeded - status: "True" - type: Succeeded - endTime: "2025-03-24T01:11:45Z" - stageName: production - startTime: "2025-03-24T01:11:30Z" -... -``` - -### Verify the Application on member clusters - -Now we are able to see the `Application` is created, synced, and healthy on all member clusters except `member4` as it does not belong to team A. -We can also verify that the configMaps synced from git repo are different for each member cluster: -```bash -kubectl config use-context member1 -kubectl get app -n guestbook -NAMESPACE NAME SYNC STATUS HEALTH STATUS -guestbook guestbook-app Synced Healthy - -kubectl get cm -n guestbook test-config -o yaml -apiVersion: v1 -data: - branch: main - cluster: member1 # <- member1 exclusive -kind: ConfigMap -metadata: - ... - name: test-config - namespace: guestbook - -# verify member2 -kubectl config use-context member2 -kubectl get app -n guestbook -NAMESPACE NAME SYNC STATUS HEALTH STATUS -guestbook guestbook-app Synced Healthy - -kubectl get cm -n guestbook test-config -o yaml -apiVersion: v1 -data: - branch: main - cluster: member2 # <- member2 exclusive -kind: ConfigMap -metadata: - ... - name: test-config - namespace: guestbook - -# verify member3 -kubectl config use-context member3 -kubectl get app -n guestbook -NAMESPACE NAME SYNC STATUS HEALTH STATUS -guestbook guestbook-app Synced Healthy - -kubectl get cm -n guestbook test-config -o yaml -apiVersion: v1 -data: - branch: main - cluster: member3 # <- member3 exclusive -kind: ConfigMap -metadata: - ... - name: test-config - namespace: guestbook - -# verify member4 -kubectl config use-context member4 -kubectl get app -A -No resources found -``` - -## Release a new version - -When team A makes some changes and decides to release a new version, they can cut a new branch or tag in the git repo. -To rollout this new version progressively, they can simply: -1. Update the `targetRevision` in the `Application` resource to the new branch or tag. -2. Create a new `ClusterStagedUpdateRun` with the new resource snapshot index. - -In our repo, we have prepared a new branch `argocd-demo` to simulate a new release. -Updating the `spec.source.targetRevision` in the `Application` resource to `argocd-demo` will not trigger rollout instantly. -```bash -kubectl config use-context hub -kubectl edit app guestbook-app -n guestbook -... -spec: - source: - targetRevision: argocd-demo -... -``` - -Checking the crp, and it's clear that the new `Application` is not available yet: -```bash -kubectl config use-context hub -kubectl get crp -NAME GEN SCHEDULED SCHEDULED-GEN AVAILABLE AVAILABLE-GEN AGE -guestbook-crp 1 True 1 130m -``` - -Check a new version of `ClusterResourceSnapshot` is generated: -```bash -kubectl config use-context hub -kubectl get clusterresourcesnapshots --show-labels -NAME GEN AGE LABELS -guestbook-crp-0-snapshot 1 133m kubernetes-fleet.io/is-latest-snapshot=false,kubernetes-fleet.io/parent-CRP=guestbook-crp,kubernetes-fleet.io/resource-index=0 -guestbook-crp-1-snapshot 1 3m46s kubernetes-fleet.io/is-latest-snapshot=true,kubernetes-fleet.io/parent-CRP=guestbook-crp,kubernetes-fleet.io/resource-index=1 -``` -Notice that `guestbook-crp-1-snapshot` is latest with `resource-index` set to `1`. - -Create a new `ClusterStagedUpdateRun` with the new resource snapshot index: -```bash -kubectl config use-context hub -kubectl apply -f - << EOF -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateRun -metadata: - name: guestbook-updaterun -spec: - placementName: guestbook-crp - resourceSnapshotIndex: "1" - stagedRolloutStrategyName: team-a-strategy -EOF -``` - -Following the same steps as before, we can see the new version is rolled out progressively to all member clusters. -Checking `member1` (and same for `member2` and `member3`), we can see the data in the configMap is updated: -```bash -kubectl config use-context member1 -kubectl get cm -n guestbook test-config -o yaml -... -data: - branch: argocd-demo # <- new branch updated here - cluster: member1 -``` - -## Summary - -Fleet and ArgoCD integration offers a powerful solution for multi-cluster application management, combining Fleet's intelligent orchestration with ArgoCD's popular GitOps approach. This demo showcased how teams can deploy applications across diverse environments with cluster-specific configurations while maintaining complete control over the rollout process. Through practical examples, we demonstrated targeted deployments using cluster labels, environment-specific configurations via overrides, and safe, controlled rollouts with staged update runs. This integration enables teams to transform multi-cluster challenges into streamlined, automated workflows that enhance both developer productivity and operational reliability. - -## Next steps -* Learn more about [ClusterResourcePlacements](../../concepts/ClusterResourcePlacement/README.md). -* Learn more about [ClusterResourceOverrides and ResourceOverrides](../../concepts/Override/README.md). -* Learn more about [ClusterStagedUpdateRun](../../concepts/StagedUpdateRun/README.md). diff --git a/docs/demos/ArgoCD/manifests/argocd-crp.yaml b/docs/demos/ArgoCD/manifests/argocd-crp.yaml deleted file mode 100644 index 5005dcf89..000000000 --- a/docs/demos/ArgoCD/manifests/argocd-crp.yaml +++ /dev/null @@ -1,52 +0,0 @@ -# This CRP manifest is used to install ArgoCD from hub cluster to member clusters. -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp-argocd -spec: - policy: - placementType: PickAll - strategy: - applyStrategy: - type: ServerSideApply - resourceSelectors: - - group: apiextensions.k8s.io - kind: CustomResourceDefinition - name: applications.argoproj.io - version: v1 - - group: apiextensions.k8s.io - kind: CustomResourceDefinition - name: applicationsets.argoproj.io - version: v1 - - group: apiextensions.k8s.io - kind: CustomResourceDefinition - name: appprojects.argoproj.io - version: v1 - - group: rbac.authorization.k8s.io - kind: ClusterRole - name: argocd-server - version: v1 - - group: rbac.authorization.k8s.io - kind: ClusterRole - name: argocd-applicationset-controller - version: v1 - - group: rbac.authorization.k8s.io - kind: ClusterRole - name: argocd-application-controller - version: v1 - - group: rbac.authorization.k8s.io - kind: ClusterRoleBinding - name: argocd-server - version: v1 - - group: rbac.authorization.k8s.io - kind: ClusterRoleBinding - name: argocd-applicationset-controller - version: v1 - - group: rbac.authorization.k8s.io - kind: ClusterRoleBinding - name: argocd-application-controller - version: v1 - - group: "" - kind: Namespace - name: argocd - version: v1 diff --git a/docs/demos/ArgoCD/manifests/argocd-install.yaml b/docs/demos/ArgoCD/manifests/argocd-install.yaml deleted file mode 100644 index ea9ad4a63..000000000 --- a/docs/demos/ArgoCD/manifests/argocd-install.yaml +++ /dev/null @@ -1,2623 +0,0 @@ -# This file contains manifests to install ArgoCD on the hub cluster first and then populate to member clusters using CRP. -# This file is mostly a copy of https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml -# Changes include: -# - Removed the CRDs to save space. (CRDs can be installed separately) -# - The executables (deployments, statefulsets) are wrapped in an envelope configmap to prevent pod creation on the hub cluster. -# Last update: 2025-03-22 -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/component: application-controller - app.kubernetes.io/name: argocd-application-controller - app.kubernetes.io/part-of: argocd - name: argocd-application-controller ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/component: applicationset-controller - app.kubernetes.io/name: argocd-applicationset-controller - app.kubernetes.io/part-of: argocd - name: argocd-applicationset-controller ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/component: dex-server - app.kubernetes.io/name: argocd-dex-server - app.kubernetes.io/part-of: argocd - name: argocd-dex-server ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/component: notifications-controller - app.kubernetes.io/name: argocd-notifications-controller - app.kubernetes.io/part-of: argocd - name: argocd-notifications-controller ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/component: redis - app.kubernetes.io/name: argocd-redis - app.kubernetes.io/part-of: argocd - name: argocd-redis ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/component: repo-server - app.kubernetes.io/name: argocd-repo-server - app.kubernetes.io/part-of: argocd - name: argocd-repo-server ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server - app.kubernetes.io/part-of: argocd - name: argocd-server ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - app.kubernetes.io/component: application-controller - app.kubernetes.io/name: argocd-application-controller - app.kubernetes.io/part-of: argocd - name: argocd-application-controller -rules: -- apiGroups: - - "" - resources: - - secrets - - configmaps - verbs: - - get - - list - - watch -- apiGroups: - - argoproj.io - resources: - - applications - - appprojects - verbs: - - create - - get - - list - - watch - - update - - patch - - delete -- apiGroups: - - "" - resources: - - events - verbs: - - create - - list -- apiGroups: - - apps - resources: - - deployments - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - app.kubernetes.io/component: applicationset-controller - app.kubernetes.io/name: argocd-applicationset-controller - app.kubernetes.io/part-of: argocd - name: argocd-applicationset-controller -rules: -- apiGroups: - - argoproj.io - resources: - - applications - - applicationsets - - applicationsets/finalizers - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - argoproj.io - resources: - - appprojects - verbs: - - get - - list - - watch -- apiGroups: - - argoproj.io - resources: - - applicationsets/status - verbs: - - get - - patch - - update -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - watch -- apiGroups: - - "" - resources: - - secrets - - configmaps - verbs: - - get - - list - - watch -- apiGroups: - - apps - - extensions - resources: - - deployments - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - app.kubernetes.io/component: dex-server - app.kubernetes.io/name: argocd-dex-server - app.kubernetes.io/part-of: argocd - name: argocd-dex-server -rules: -- apiGroups: - - "" - resources: - - secrets - - configmaps - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - app.kubernetes.io/component: notifications-controller - app.kubernetes.io/name: argocd-notifications-controller - app.kubernetes.io/part-of: argocd - name: argocd-notifications-controller -rules: -- apiGroups: - - argoproj.io - resources: - - applications - - appprojects - verbs: - - get - - list - - watch - - update - - patch -- apiGroups: - - "" - resources: - - configmaps - - secrets - verbs: - - list - - watch -- apiGroups: - - "" - resourceNames: - - argocd-notifications-cm - resources: - - configmaps - verbs: - - get -- apiGroups: - - "" - resourceNames: - - argocd-notifications-secret - resources: - - secrets - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - app.kubernetes.io/component: redis - app.kubernetes.io/name: argocd-redis - app.kubernetes.io/part-of: argocd - name: argocd-redis -rules: -- apiGroups: - - "" - resourceNames: - - argocd-redis - resources: - - secrets - verbs: - - get -- apiGroups: - - "" - resources: - - secrets - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server - app.kubernetes.io/part-of: argocd - name: argocd-server -rules: -- apiGroups: - - "" - resources: - - secrets - - configmaps - verbs: - - create - - get - - list - - watch - - update - - patch - - delete -- apiGroups: - - argoproj.io - resources: - - applications - - appprojects - - applicationsets - verbs: - - create - - get - - list - - watch - - update - - delete - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - list ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/component: application-controller - app.kubernetes.io/name: argocd-application-controller - app.kubernetes.io/part-of: argocd - name: argocd-application-controller -rules: -- apiGroups: - - '*' - resources: - - '*' - verbs: - - '*' -- nonResourceURLs: - - '*' - verbs: - - '*' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/component: applicationset-controller - app.kubernetes.io/name: argocd-applicationset-controller - app.kubernetes.io/part-of: argocd - name: argocd-applicationset-controller -rules: -- apiGroups: - - argoproj.io - resources: - - applications - - applicationsets - - applicationsets/finalizers - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - argoproj.io - resources: - - applicationsets/status - verbs: - - get - - patch - - update -- apiGroups: - - argoproj.io - resources: - - appprojects - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - watch -- apiGroups: - - "" - resources: - - configmaps - verbs: - - create - - update - - delete - - get - - list - - patch - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch -- apiGroups: - - apps - - extensions - resources: - - deployments - verbs: - - get - - list - - watch -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create - - delete - - get - - list - - patch - - update - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server - app.kubernetes.io/part-of: argocd - name: argocd-server -rules: -- apiGroups: - - '*' - resources: - - '*' - verbs: - - delete - - get - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - list -- apiGroups: - - "" - resources: - - pods - - pods/log - verbs: - - get -- apiGroups: - - argoproj.io - resources: - - applications - - applicationsets - verbs: - - get - - list - - watch -- apiGroups: - - batch - resources: - - jobs - verbs: - - create -- apiGroups: - - argoproj.io - resources: - - workflows - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - app.kubernetes.io/component: application-controller - app.kubernetes.io/name: argocd-application-controller - app.kubernetes.io/part-of: argocd - name: argocd-application-controller -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: argocd-application-controller -subjects: -- kind: ServiceAccount - name: argocd-application-controller ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - app.kubernetes.io/component: applicationset-controller - app.kubernetes.io/name: argocd-applicationset-controller - app.kubernetes.io/part-of: argocd - name: argocd-applicationset-controller -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: argocd-applicationset-controller -subjects: -- kind: ServiceAccount - name: argocd-applicationset-controller ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - app.kubernetes.io/component: dex-server - app.kubernetes.io/name: argocd-dex-server - app.kubernetes.io/part-of: argocd - name: argocd-dex-server -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: argocd-dex-server -subjects: -- kind: ServiceAccount - name: argocd-dex-server ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - app.kubernetes.io/component: notifications-controller - app.kubernetes.io/name: argocd-notifications-controller - app.kubernetes.io/part-of: argocd - name: argocd-notifications-controller -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: argocd-notifications-controller -subjects: -- kind: ServiceAccount - name: argocd-notifications-controller ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - app.kubernetes.io/component: redis - app.kubernetes.io/name: argocd-redis - app.kubernetes.io/part-of: argocd - name: argocd-redis -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: argocd-redis -subjects: -- kind: ServiceAccount - name: argocd-redis ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server - app.kubernetes.io/part-of: argocd - name: argocd-server -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: argocd-server -subjects: -- kind: ServiceAccount - name: argocd-server ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/component: application-controller - app.kubernetes.io/name: argocd-application-controller - app.kubernetes.io/part-of: argocd - name: argocd-application-controller -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: argocd-application-controller -subjects: -- kind: ServiceAccount - name: argocd-application-controller - namespace: argocd ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/component: applicationset-controller - app.kubernetes.io/name: argocd-applicationset-controller - app.kubernetes.io/part-of: argocd - name: argocd-applicationset-controller -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: argocd-applicationset-controller -subjects: -- kind: ServiceAccount - name: argocd-applicationset-controller - namespace: argocd ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server - app.kubernetes.io/part-of: argocd - name: argocd-server -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: argocd-server -subjects: -- kind: ServiceAccount - name: argocd-server - namespace: argocd ---- -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - app.kubernetes.io/name: argocd-cm - app.kubernetes.io/part-of: argocd - name: argocd-cm ---- -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - app.kubernetes.io/name: argocd-cmd-params-cm - app.kubernetes.io/part-of: argocd - name: argocd-cmd-params-cm ---- -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - app.kubernetes.io/name: argocd-gpg-keys-cm - app.kubernetes.io/part-of: argocd - name: argocd-gpg-keys-cm ---- -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - app.kubernetes.io/component: notifications-controller - app.kubernetes.io/name: argocd-notifications-controller - app.kubernetes.io/part-of: argocd - name: argocd-notifications-cm ---- -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - app.kubernetes.io/name: argocd-rbac-cm - app.kubernetes.io/part-of: argocd - name: argocd-rbac-cm ---- -apiVersion: v1 -data: - ssh_known_hosts: | - # This file was automatically generated by hack/update-ssh-known-hosts.sh. DO NOT EDIT - [ssh.github.com]:443 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg= - [ssh.github.com]:443 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl - [ssh.github.com]:443 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk= - bitbucket.org ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPIQmuzMBuKdWeF4+a2sjSSpBK0iqitSQ+5BM9KhpexuGt20JpTVM7u5BDZngncgrqDMbWdxMWWOGtZ9UgbqgZE= - bitbucket.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIazEu89wgQZ4bqs3d63QSMzYVa0MuJ2e2gKTKqu+UUO - bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQeJzhupRu0u0cdegZIa8e86EG2qOCsIsD1Xw0xSeiPDlCr7kq97NLmMbpKTX6Esc30NuoqEEHCuc7yWtwp8dI76EEEB1VqY9QJq6vk+aySyboD5QF61I/1WeTwu+deCbgKMGbUijeXhtfbxSxm6JwGrXrhBdofTsbKRUsrN1WoNgUa8uqN1Vx6WAJw1JHPhglEGGHea6QICwJOAr/6mrui/oB7pkaWKHj3z7d1IC4KWLtY47elvjbaTlkN04Kc/5LFEirorGYVbt15kAUlqGM65pk6ZBxtaO3+30LVlORZkxOh+LKL/BvbZ/iRNhItLqNyieoQj/uh/7Iv4uyH/cV/0b4WDSd3DptigWq84lJubb9t/DnZlrJazxyDCulTmKdOR7vs9gMTo+uoIrPSb8ScTtvw65+odKAlBj59dhnVp9zd7QUojOpXlL62Aw56U4oO+FALuevvMjiWeavKhJqlR7i5n9srYcrNV7ttmDw7kf/97P5zauIhxcjX+xHv4M= - github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg= - github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl - github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk= - gitlab.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY= - gitlab.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAfuCHKVTjquxvt6CM6tdG4SLp1Btn/nOeHHE5UOzRdf - gitlab.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsj2bNKTBSpIYDEGk9KxsGh3mySTRgMtXL583qmBpzeQ+jqCMRgBqB98u3z++J1sKlXHWfM9dyhSevkMwSbhoR8XIq/U0tCNyokEi/ueaBMCvbcTHhO7FcwzY92WK4Yt0aGROY5qX2UKSeOvuP4D6TPqKF1onrSzH9bx9XUf2lEdWT/ia1NEKjunUqu1xOB/StKDHMoX4/OKyIzuS0q/T1zOATthvasJFoPrAjkohTyaDUz2LN5JoH839hViyEG82yB+MjcFV5MU3N1l1QL3cVUCh93xSaua1N85qivl+siMkPGbO5xR/En4iEY6K2XPASUEMaieWVNTRCtJ4S8H+9 - ssh.dev.azure.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Hr1oTWqNqOlzGJOfGJ4NakVyIzf1rXYd4d7wo6jBlkLvCA4odBlL0mDUyZ0/QUfTTqeu+tm22gOsv+VrVTMk6vwRU75gY/y9ut5Mb3bR5BV58dKXyq9A9UeB5Cakehn5Zgm6x1mKoVyf+FFn26iYqXJRgzIZZcZ5V6hrE0Qg39kZm4az48o0AUbf6Sp4SLdvnuMa2sVNwHBboS7EJkm57XQPVU3/QpyNLHbWDdzwtrlS+ez30S3AdYhLKEOxAG8weOnyrtLJAUen9mTkol8oII1edf7mWWbWVf0nBmly21+nZcmCTISQBtdcyPaEno7fFQMDD26/s0lfKob4Kw8H - vs-ssh.visualstudio.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Hr1oTWqNqOlzGJOfGJ4NakVyIzf1rXYd4d7wo6jBlkLvCA4odBlL0mDUyZ0/QUfTTqeu+tm22gOsv+VrVTMk6vwRU75gY/y9ut5Mb3bR5BV58dKXyq9A9UeB5Cakehn5Zgm6x1mKoVyf+FFn26iYqXJRgzIZZcZ5V6hrE0Qg39kZm4az48o0AUbf6Sp4SLdvnuMa2sVNwHBboS7EJkm57XQPVU3/QpyNLHbWDdzwtrlS+ez30S3AdYhLKEOxAG8weOnyrtLJAUen9mTkol8oII1edf7mWWbWVf0nBmly21+nZcmCTISQBtdcyPaEno7fFQMDD26/s0lfKob4Kw8H -kind: ConfigMap -metadata: - labels: - app.kubernetes.io/name: argocd-ssh-known-hosts-cm - app.kubernetes.io/part-of: argocd - name: argocd-ssh-known-hosts-cm ---- -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - app.kubernetes.io/name: argocd-tls-certs-cm - app.kubernetes.io/part-of: argocd - name: argocd-tls-certs-cm ---- -apiVersion: v1 -kind: Secret -metadata: - labels: - app.kubernetes.io/component: notifications-controller - app.kubernetes.io/name: argocd-notifications-controller - app.kubernetes.io/part-of: argocd - name: argocd-notifications-secret -type: Opaque ---- -apiVersion: v1 -kind: Secret -metadata: - labels: - app.kubernetes.io/name: argocd-secret - app.kubernetes.io/part-of: argocd - name: argocd-secret -type: Opaque ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/component: applicationset-controller - app.kubernetes.io/name: argocd-applicationset-controller - app.kubernetes.io/part-of: argocd - name: argocd-applicationset-controller -spec: - ports: - - name: webhook - port: 7000 - protocol: TCP - targetPort: webhook - - name: metrics - port: 8080 - protocol: TCP - targetPort: metrics - selector: - app.kubernetes.io/name: argocd-applicationset-controller ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/component: dex-server - app.kubernetes.io/name: argocd-dex-server - app.kubernetes.io/part-of: argocd - name: argocd-dex-server -spec: - ports: - - appProtocol: TCP - name: http - port: 5556 - protocol: TCP - targetPort: 5556 - - name: grpc - port: 5557 - protocol: TCP - targetPort: 5557 - - name: metrics - port: 5558 - protocol: TCP - targetPort: 5558 - selector: - app.kubernetes.io/name: argocd-dex-server ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/component: metrics - app.kubernetes.io/name: argocd-metrics - app.kubernetes.io/part-of: argocd - name: argocd-metrics -spec: - ports: - - name: metrics - port: 8082 - protocol: TCP - targetPort: 8082 - selector: - app.kubernetes.io/name: argocd-application-controller ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/component: notifications-controller - app.kubernetes.io/name: argocd-notifications-controller-metrics - app.kubernetes.io/part-of: argocd - name: argocd-notifications-controller-metrics -spec: - ports: - - name: metrics - port: 9001 - protocol: TCP - targetPort: 9001 - selector: - app.kubernetes.io/name: argocd-notifications-controller ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/component: redis - app.kubernetes.io/name: argocd-redis - app.kubernetes.io/part-of: argocd - name: argocd-redis -spec: - ports: - - name: tcp-redis - port: 6379 - targetPort: 6379 - selector: - app.kubernetes.io/name: argocd-redis ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/component: repo-server - app.kubernetes.io/name: argocd-repo-server - app.kubernetes.io/part-of: argocd - name: argocd-repo-server -spec: - ports: - - name: server - port: 8081 - protocol: TCP - targetPort: 8081 - - name: metrics - port: 8084 - protocol: TCP - targetPort: 8084 - selector: - app.kubernetes.io/name: argocd-repo-server ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server - app.kubernetes.io/part-of: argocd - name: argocd-server -spec: - ports: - - name: http - port: 80 - protocol: TCP - targetPort: 8080 - - name: https - port: 443 - protocol: TCP - targetPort: 8080 - selector: - app.kubernetes.io/name: argocd-server ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server-metrics - app.kubernetes.io/part-of: argocd - name: argocd-server-metrics -spec: - ports: - - name: metrics - port: 8083 - protocol: TCP - targetPort: 8083 - selector: - app.kubernetes.io/name: argocd-server ---- -apiVersion: v1 -kind: ConfigMap -metadata: - annotations: - kubernetes-fleet.io/envelope-configmap: "true" - name: argocd-runnable-cm -data: - argocd-applicationset-controller.yaml: | - apiVersion: apps/v1 - kind: Deployment - metadata: - labels: - app.kubernetes.io/component: applicationset-controller - app.kubernetes.io/name: argocd-applicationset-controller - app.kubernetes.io/part-of: argocd - name: argocd-applicationset-controller - namespace: argocd - spec: - selector: - matchLabels: - app.kubernetes.io/name: argocd-applicationset-controller - template: - metadata: - labels: - app.kubernetes.io/name: argocd-applicationset-controller - spec: - containers: - - args: - - /usr/local/bin/argocd-applicationset-controller - env: - - name: ARGOCD_APPLICATIONSET_CONTROLLER_GLOBAL_PRESERVED_ANNOTATIONS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.global.preserved.annotations - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_GLOBAL_PRESERVED_LABELS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.global.preserved.labels - name: argocd-cmd-params-cm - optional: true - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_LEADER_ELECTION - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.leader.election - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER - valueFrom: - configMapKeyRef: - key: repo.server - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_POLICY - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.policy - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_POLICY_OVERRIDE - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.policy.override - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.debug - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_LOGLEVEL - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_DRY_RUN - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.dryrun - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_PROGRESSIVE_SYNCS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.progressive.syncs - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_TOKENREF_STRICT_MODE - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.tokenref.strict.mode - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_NEW_GIT_FILE_GLOBBING - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.new.git.file.globbing - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER_PLAINTEXT - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.repo.server.plaintext - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER_STRICT_TLS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.repo.server.strict.tls - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER_TIMEOUT_SECONDS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.repo.server.timeout.seconds - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_CONCURRENT_RECONCILIATIONS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.concurrent.reconciliations.max - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_NAMESPACES - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.namespaces - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_SCM_ROOT_CA_PATH - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.scm.root.ca.path - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ALLOWED_SCM_PROVIDERS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.allowed.scm.providers - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_SCM_PROVIDERS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.scm.providers - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_WEBHOOK_PARALLELISM_LIMIT - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.webhook.parallelism.limit - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_REQUEUE_AFTER - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.requeue.after - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:v2.14.6 - imagePullPolicy: Always - name: argocd-applicationset-controller - ports: - - containerPort: 7000 - name: webhook - - containerPort: 8080 - name: metrics - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - volumeMounts: - - mountPath: /app/config/ssh - name: ssh-known-hosts - - mountPath: /app/config/tls - name: tls-certs - - mountPath: /app/config/gpg/source - name: gpg-keys - - mountPath: /app/config/gpg/keys - name: gpg-keyring - - mountPath: /tmp - name: tmp - - mountPath: /app/config/reposerver/tls - name: argocd-repo-server-tls - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: argocd-applicationset-controller - volumes: - - configMap: - name: argocd-ssh-known-hosts-cm - name: ssh-known-hosts - - configMap: - name: argocd-tls-certs-cm - name: tls-certs - - configMap: - name: argocd-gpg-keys-cm - name: gpg-keys - - emptyDir: {} - name: gpg-keyring - - emptyDir: {} - name: tmp - - name: argocd-repo-server-tls - secret: - items: - - key: tls.crt - path: tls.crt - - key: tls.key - path: tls.key - - key: ca.crt - path: ca.crt - optional: true - secretName: argocd-repo-server-tls - argocd-dex-server.yaml: | - apiVersion: apps/v1 - kind: Deployment - metadata: - labels: - app.kubernetes.io/component: dex-server - app.kubernetes.io/name: argocd-dex-server - app.kubernetes.io/part-of: argocd - name: argocd-dex-server - namespace: argocd - spec: - selector: - matchLabels: - app.kubernetes.io/name: argocd-dex-server - template: - metadata: - labels: - app.kubernetes.io/name: argocd-dex-server - spec: - affinity: - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/part-of: argocd - topologyKey: kubernetes.io/hostname - weight: 5 - containers: - - command: - - /shared/argocd-dex - - rundex - env: - - name: ARGOCD_DEX_SERVER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: dexserver.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_DEX_SERVER_LOGLEVEL - valueFrom: - configMapKeyRef: - key: dexserver.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_DEX_SERVER_DISABLE_TLS - valueFrom: - configMapKeyRef: - key: dexserver.disable.tls - name: argocd-cmd-params-cm - optional: true - image: ghcr.io/dexidp/dex:v2.41.1 - imagePullPolicy: Always - name: dex - ports: - - containerPort: 5556 - - containerPort: 5557 - - containerPort: 5558 - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - volumeMounts: - - mountPath: /shared - name: static-files - - mountPath: /tmp - name: dexconfig - - mountPath: /tls - name: argocd-dex-server-tls - initContainers: - - command: - - /bin/cp - - -n - - /usr/local/bin/argocd - - /shared/argocd-dex - image: quay.io/argoproj/argocd:v2.14.6 - imagePullPolicy: Always - name: copyutil - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - volumeMounts: - - mountPath: /shared - name: static-files - - mountPath: /tmp - name: dexconfig - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: argocd-dex-server - volumes: - - emptyDir: {} - name: static-files - - emptyDir: {} - name: dexconfig - - name: argocd-dex-server-tls - secret: - items: - - key: tls.crt - path: tls.crt - - key: tls.key - path: tls.key - - key: ca.crt - path: ca.crt - optional: true - secretName: argocd-dex-server-tls - argocd-notifications-controller.yaml: | - apiVersion: apps/v1 - kind: Deployment - metadata: - labels: - app.kubernetes.io/component: notifications-controller - app.kubernetes.io/name: argocd-notifications-controller - app.kubernetes.io/part-of: argocd - name: argocd-notifications-controller - namespace: argocd - spec: - selector: - matchLabels: - app.kubernetes.io/name: argocd-notifications-controller - strategy: - type: Recreate - template: - metadata: - labels: - app.kubernetes.io/name: argocd-notifications-controller - spec: - containers: - - args: - - /usr/local/bin/argocd-notifications - env: - - name: ARGOCD_NOTIFICATIONS_CONTROLLER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: notificationscontroller.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_NOTIFICATIONS_CONTROLLER_LOGLEVEL - valueFrom: - configMapKeyRef: - key: notificationscontroller.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_NAMESPACES - valueFrom: - configMapKeyRef: - key: application.namespaces - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_NOTIFICATION_CONTROLLER_SELF_SERVICE_NOTIFICATION_ENABLED - valueFrom: - configMapKeyRef: - key: notificationscontroller.selfservice.enabled - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_NOTIFICATION_CONTROLLER_REPO_SERVER_PLAINTEXT - valueFrom: - configMapKeyRef: - key: notificationscontroller.repo.server.plaintext - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:v2.14.6 - imagePullPolicy: Always - livenessProbe: - tcpSocket: - port: 9001 - name: argocd-notifications-controller - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - volumeMounts: - - mountPath: /app/config/tls - name: tls-certs - - mountPath: /app/config/reposerver/tls - name: argocd-repo-server-tls - workingDir: /app - nodeSelector: - kubernetes.io/os: linux - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - serviceAccountName: argocd-notifications-controller - volumes: - - configMap: - name: argocd-tls-certs-cm - name: tls-certs - - name: argocd-repo-server-tls - secret: - items: - - key: tls.crt - path: tls.crt - - key: tls.key - path: tls.key - - key: ca.crt - path: ca.crt - optional: true - secretName: argocd-repo-server-tls - argocd-redis.yaml: | - apiVersion: apps/v1 - kind: Deployment - metadata: - labels: - app.kubernetes.io/component: redis - app.kubernetes.io/name: argocd-redis - app.kubernetes.io/part-of: argocd - name: argocd-redis - namespace: argocd - spec: - selector: - matchLabels: - app.kubernetes.io/name: argocd-redis - template: - metadata: - labels: - app.kubernetes.io/name: argocd-redis - spec: - affinity: - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/name: argocd-redis - topologyKey: kubernetes.io/hostname - weight: 100 - - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/part-of: argocd - topologyKey: kubernetes.io/hostname - weight: 5 - containers: - - args: - - --save - - "" - - --appendonly - - "no" - - --requirepass $(REDIS_PASSWORD) - env: - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - key: auth - name: argocd-redis - image: redis:7.0.15-alpine - imagePullPolicy: Always - name: redis - ports: - - containerPort: 6379 - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - initContainers: - - command: - - argocd - - admin - - redis-initial-password - image: quay.io/argoproj/argocd:v2.14.6 - imagePullPolicy: IfNotPresent - name: secret-init - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - nodeSelector: - kubernetes.io/os: linux - securityContext: - runAsNonRoot: true - runAsUser: 999 - seccompProfile: - type: RuntimeDefault - serviceAccountName: argocd-redis - argocd-repo-server.yaml: | - apiVersion: apps/v1 - kind: Deployment - metadata: - labels: - app.kubernetes.io/component: repo-server - app.kubernetes.io/name: argocd-repo-server - app.kubernetes.io/part-of: argocd - name: argocd-repo-server - namespace: argocd - spec: - selector: - matchLabels: - app.kubernetes.io/name: argocd-repo-server - template: - metadata: - labels: - app.kubernetes.io/name: argocd-repo-server - spec: - affinity: - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/name: argocd-repo-server - topologyKey: kubernetes.io/hostname - weight: 100 - - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/part-of: argocd - topologyKey: kubernetes.io/hostname - weight: 5 - automountServiceAccountToken: false - containers: - - args: - - /usr/local/bin/argocd-repo-server - env: - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - key: auth - name: argocd-redis - - name: ARGOCD_RECONCILIATION_TIMEOUT - valueFrom: - configMapKeyRef: - key: timeout.reconciliation - name: argocd-cm - optional: true - - name: ARGOCD_REPO_SERVER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: reposerver.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_LOGLEVEL - valueFrom: - configMapKeyRef: - key: reposerver.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_PARALLELISM_LIMIT - valueFrom: - configMapKeyRef: - key: reposerver.parallelism.limit - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_LISTEN_ADDRESS - valueFrom: - configMapKeyRef: - key: reposerver.listen.address - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_LISTEN_METRICS_ADDRESS - valueFrom: - configMapKeyRef: - key: reposerver.metrics.listen.address - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_DISABLE_TLS - valueFrom: - configMapKeyRef: - key: reposerver.disable.tls - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_TLS_MIN_VERSION - valueFrom: - configMapKeyRef: - key: reposerver.tls.minversion - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_TLS_MAX_VERSION - valueFrom: - configMapKeyRef: - key: reposerver.tls.maxversion - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_TLS_CIPHERS - valueFrom: - configMapKeyRef: - key: reposerver.tls.ciphers - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - key: reposerver.repo.cache.expiration - name: argocd-cmd-params-cm - optional: true - - name: REDIS_SERVER - valueFrom: - configMapKeyRef: - key: redis.server - name: argocd-cmd-params-cm - optional: true - - name: REDIS_COMPRESSION - valueFrom: - configMapKeyRef: - key: redis.compression - name: argocd-cmd-params-cm - optional: true - - name: REDISDB - valueFrom: - configMapKeyRef: - key: redis.db - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_DEFAULT_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - key: reposerver.default.cache.expiration - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_OTLP_ADDRESS - valueFrom: - configMapKeyRef: - key: otlp.address - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_OTLP_INSECURE - valueFrom: - configMapKeyRef: - key: otlp.insecure - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_OTLP_HEADERS - valueFrom: - configMapKeyRef: - key: otlp.headers - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_MAX_COMBINED_DIRECTORY_MANIFESTS_SIZE - valueFrom: - configMapKeyRef: - key: reposerver.max.combined.directory.manifests.size - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_PLUGIN_TAR_EXCLUSIONS - valueFrom: - configMapKeyRef: - key: reposerver.plugin.tar.exclusions - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_PLUGIN_USE_MANIFEST_GENERATE_PATHS - valueFrom: - configMapKeyRef: - key: reposerver.plugin.use.manifest.generate.paths - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_ALLOW_OUT_OF_BOUNDS_SYMLINKS - valueFrom: - configMapKeyRef: - key: reposerver.allow.oob.symlinks - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_STREAMED_MANIFEST_MAX_TAR_SIZE - valueFrom: - configMapKeyRef: - key: reposerver.streamed.manifest.max.tar.size - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_STREAMED_MANIFEST_MAX_EXTRACTED_SIZE - valueFrom: - configMapKeyRef: - key: reposerver.streamed.manifest.max.extracted.size - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_HELM_MANIFEST_MAX_EXTRACTED_SIZE - valueFrom: - configMapKeyRef: - key: reposerver.helm.manifest.max.extracted.size - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_DISABLE_HELM_MANIFEST_MAX_EXTRACTED_SIZE - valueFrom: - configMapKeyRef: - key: reposerver.disable.helm.manifest.max.extracted.size - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REVISION_CACHE_LOCK_TIMEOUT - valueFrom: - configMapKeyRef: - key: reposerver.revision.cache.lock.timeout - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_GIT_MODULES_ENABLED - valueFrom: - configMapKeyRef: - key: reposerver.enable.git.submodule - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_GIT_LS_REMOTE_PARALLELISM_LIMIT - valueFrom: - configMapKeyRef: - key: reposerver.git.lsremote.parallelism.limit - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_GIT_REQUEST_TIMEOUT - valueFrom: - configMapKeyRef: - key: reposerver.git.request.timeout - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_GRPC_MAX_SIZE_MB - valueFrom: - configMapKeyRef: - key: reposerver.grpc.max.size - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_REPO_SERVER_INCLUDE_HIDDEN_DIRECTORIES - valueFrom: - configMapKeyRef: - key: reposerver.include.hidden.directories - name: argocd-cmd-params-cm - optional: true - - name: HELM_CACHE_HOME - value: /helm-working-dir - - name: HELM_CONFIG_HOME - value: /helm-working-dir - - name: HELM_DATA_HOME - value: /helm-working-dir - image: quay.io/argoproj/argocd:v2.14.6 - imagePullPolicy: Always - livenessProbe: - failureThreshold: 3 - httpGet: - path: /healthz?full=true - port: 8084 - initialDelaySeconds: 30 - periodSeconds: 30 - timeoutSeconds: 5 - name: argocd-repo-server - ports: - - containerPort: 8081 - - containerPort: 8084 - readinessProbe: - httpGet: - path: /healthz - port: 8084 - initialDelaySeconds: 5 - periodSeconds: 10 - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - volumeMounts: - - mountPath: /app/config/ssh - name: ssh-known-hosts - - mountPath: /app/config/tls - name: tls-certs - - mountPath: /app/config/gpg/source - name: gpg-keys - - mountPath: /app/config/gpg/keys - name: gpg-keyring - - mountPath: /app/config/reposerver/tls - name: argocd-repo-server-tls - - mountPath: /tmp - name: tmp - - mountPath: /helm-working-dir - name: helm-working-dir - - mountPath: /home/argocd/cmp-server/plugins - name: plugins - initContainers: - - command: - - /bin/cp - - -n - - /usr/local/bin/argocd - - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v2.14.6 - name: copyutil - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - volumeMounts: - - mountPath: /var/run/argocd - name: var-files - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: argocd-repo-server - volumes: - - configMap: - name: argocd-ssh-known-hosts-cm - name: ssh-known-hosts - - configMap: - name: argocd-tls-certs-cm - name: tls-certs - - configMap: - name: argocd-gpg-keys-cm - name: gpg-keys - - emptyDir: {} - name: gpg-keyring - - emptyDir: {} - name: tmp - - emptyDir: {} - name: helm-working-dir - - name: argocd-repo-server-tls - secret: - items: - - key: tls.crt - path: tls.crt - - key: tls.key - path: tls.key - - key: ca.crt - path: ca.crt - optional: true - secretName: argocd-repo-server-tls - - emptyDir: {} - name: var-files - - emptyDir: {} - name: plugins - argocd-server.yaml: | - apiVersion: apps/v1 - kind: Deployment - metadata: - labels: - app.kubernetes.io/component: server - app.kubernetes.io/name: argocd-server - app.kubernetes.io/part-of: argocd - name: argocd-server - namespace: argocd - spec: - selector: - matchLabels: - app.kubernetes.io/name: argocd-server - template: - metadata: - labels: - app.kubernetes.io/name: argocd-server - spec: - affinity: - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/name: argocd-server - topologyKey: kubernetes.io/hostname - weight: 100 - - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/part-of: argocd - topologyKey: kubernetes.io/hostname - weight: 5 - containers: - - args: - - /usr/local/bin/argocd-server - env: - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - key: auth - name: argocd-redis - - name: ARGOCD_SERVER_INSECURE - valueFrom: - configMapKeyRef: - key: server.insecure - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_BASEHREF - valueFrom: - configMapKeyRef: - key: server.basehref - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_ROOTPATH - valueFrom: - configMapKeyRef: - key: server.rootpath - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: server.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_LOG_LEVEL - valueFrom: - configMapKeyRef: - key: server.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_REPO_SERVER - valueFrom: - configMapKeyRef: - key: repo.server - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_DEX_SERVER - valueFrom: - configMapKeyRef: - key: server.dex.server - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_DISABLE_AUTH - valueFrom: - configMapKeyRef: - key: server.disable.auth - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_ENABLE_GZIP - valueFrom: - configMapKeyRef: - key: server.enable.gzip - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_REPO_SERVER_TIMEOUT_SECONDS - valueFrom: - configMapKeyRef: - key: server.repo.server.timeout.seconds - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_X_FRAME_OPTIONS - valueFrom: - configMapKeyRef: - key: server.x.frame.options - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_CONTENT_SECURITY_POLICY - valueFrom: - configMapKeyRef: - key: server.content.security.policy - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_REPO_SERVER_PLAINTEXT - valueFrom: - configMapKeyRef: - key: server.repo.server.plaintext - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_REPO_SERVER_STRICT_TLS - valueFrom: - configMapKeyRef: - key: server.repo.server.strict.tls - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_DEX_SERVER_PLAINTEXT - valueFrom: - configMapKeyRef: - key: server.dex.server.plaintext - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_DEX_SERVER_STRICT_TLS - valueFrom: - configMapKeyRef: - key: server.dex.server.strict.tls - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_TLS_MIN_VERSION - valueFrom: - configMapKeyRef: - key: server.tls.minversion - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_TLS_MAX_VERSION - valueFrom: - configMapKeyRef: - key: server.tls.maxversion - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_TLS_CIPHERS - valueFrom: - configMapKeyRef: - key: server.tls.ciphers - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_CONNECTION_STATUS_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - key: server.connection.status.cache.expiration - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_OIDC_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - key: server.oidc.cache.expiration - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_LOGIN_ATTEMPTS_EXPIRATION - valueFrom: - configMapKeyRef: - key: server.login.attempts.expiration - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_STATIC_ASSETS - valueFrom: - configMapKeyRef: - key: server.staticassets - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APP_STATE_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - key: server.app.state.cache.expiration - name: argocd-cmd-params-cm - optional: true - - name: REDIS_SERVER - valueFrom: - configMapKeyRef: - key: redis.server - name: argocd-cmd-params-cm - optional: true - - name: REDIS_COMPRESSION - valueFrom: - configMapKeyRef: - key: redis.compression - name: argocd-cmd-params-cm - optional: true - - name: REDISDB - valueFrom: - configMapKeyRef: - key: redis.db - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_DEFAULT_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - key: server.default.cache.expiration - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_MAX_COOKIE_NUMBER - valueFrom: - configMapKeyRef: - key: server.http.cookie.maxnumber - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_LISTEN_ADDRESS - valueFrom: - configMapKeyRef: - key: server.listen.address - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_METRICS_LISTEN_ADDRESS - valueFrom: - configMapKeyRef: - key: server.metrics.listen.address - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_OTLP_ADDRESS - valueFrom: - configMapKeyRef: - key: otlp.address - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_OTLP_INSECURE - valueFrom: - configMapKeyRef: - key: otlp.insecure - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_OTLP_HEADERS - valueFrom: - configMapKeyRef: - key: otlp.headers - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_NAMESPACES - valueFrom: - configMapKeyRef: - key: application.namespaces - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_ENABLE_PROXY_EXTENSION - valueFrom: - configMapKeyRef: - key: server.enable.proxy.extension - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_K8SCLIENT_RETRY_MAX - valueFrom: - configMapKeyRef: - key: server.k8sclient.retry.max - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_K8SCLIENT_RETRY_BASE_BACKOFF - valueFrom: - configMapKeyRef: - key: server.k8sclient.retry.base.backoff - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_API_CONTENT_TYPES - valueFrom: - configMapKeyRef: - key: server.api.content.types - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_SERVER_WEBHOOK_PARALLELISM_LIMIT - valueFrom: - configMapKeyRef: - key: server.webhook.parallelism.limit - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_NEW_GIT_FILE_GLOBBING - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.new.git.file.globbing - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_SCM_ROOT_CA_PATH - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.scm.root.ca.path - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ALLOWED_SCM_PROVIDERS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.allowed.scm.providers - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_SCM_PROVIDERS - valueFrom: - configMapKeyRef: - key: applicationsetcontroller.enable.scm.providers - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_HYDRATOR_ENABLED - valueFrom: - configMapKeyRef: - key: hydrator.enabled - name: argocd-cmd-params-cm - optional: true - image: quay.io/argoproj/argocd:v2.14.6 - imagePullPolicy: Always - livenessProbe: - httpGet: - path: /healthz?full=true - port: 8080 - initialDelaySeconds: 3 - periodSeconds: 30 - timeoutSeconds: 5 - name: argocd-server - ports: - - containerPort: 8080 - - containerPort: 8083 - readinessProbe: - httpGet: - path: /healthz - port: 8080 - initialDelaySeconds: 3 - periodSeconds: 30 - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - volumeMounts: - - mountPath: /app/config/ssh - name: ssh-known-hosts - - mountPath: /app/config/tls - name: tls-certs - - mountPath: /app/config/server/tls - name: argocd-repo-server-tls - - mountPath: /app/config/dex/tls - name: argocd-dex-server-tls - - mountPath: /home/argocd - name: plugins-home - - mountPath: /tmp - name: tmp - - mountPath: /home/argocd/params - name: argocd-cmd-params-cm - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: argocd-server - volumes: - - emptyDir: {} - name: plugins-home - - emptyDir: {} - name: tmp - - configMap: - name: argocd-ssh-known-hosts-cm - name: ssh-known-hosts - - configMap: - name: argocd-tls-certs-cm - name: tls-certs - - name: argocd-repo-server-tls - secret: - items: - - key: tls.crt - path: tls.crt - - key: tls.key - path: tls.key - - key: ca.crt - path: ca.crt - optional: true - secretName: argocd-repo-server-tls - - name: argocd-dex-server-tls - secret: - items: - - key: tls.crt - path: tls.crt - - key: ca.crt - path: ca.crt - optional: true - secretName: argocd-dex-server-tls - - configMap: - items: - - key: server.profile.enabled - path: profiler.enabled - name: argocd-cmd-params-cm - optional: true - name: argocd-cmd-params-cm - argocd-application-controller.yaml: | - apiVersion: apps/v1 - kind: StatefulSet - metadata: - labels: - app.kubernetes.io/component: application-controller - app.kubernetes.io/name: argocd-application-controller - app.kubernetes.io/part-of: argocd - name: argocd-application-controller - namespace: argocd - spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: argocd-application-controller - serviceName: argocd-application-controller - template: - metadata: - labels: - app.kubernetes.io/name: argocd-application-controller - spec: - affinity: - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/name: argocd-application-controller - topologyKey: kubernetes.io/hostname - weight: 100 - - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/part-of: argocd - topologyKey: kubernetes.io/hostname - weight: 5 - containers: - - args: - - /usr/local/bin/argocd-application-controller - env: - - name: REDIS_PASSWORD - valueFrom: - secretKeyRef: - key: auth - name: argocd-redis - - name: ARGOCD_CONTROLLER_REPLICAS - value: "1" - - name: ARGOCD_RECONCILIATION_TIMEOUT - valueFrom: - configMapKeyRef: - key: timeout.reconciliation - name: argocd-cm - optional: true - - name: ARGOCD_HARD_RECONCILIATION_TIMEOUT - valueFrom: - configMapKeyRef: - key: timeout.hard.reconciliation - name: argocd-cm - optional: true - - name: ARGOCD_RECONCILIATION_JITTER - valueFrom: - configMapKeyRef: - key: timeout.reconciliation.jitter - name: argocd-cm - optional: true - - name: ARGOCD_REPO_ERROR_GRACE_PERIOD_SECONDS - valueFrom: - configMapKeyRef: - key: controller.repo.error.grace.period.seconds - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER - valueFrom: - configMapKeyRef: - key: repo.server - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER_TIMEOUT_SECONDS - valueFrom: - configMapKeyRef: - key: controller.repo.server.timeout.seconds - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_STATUS_PROCESSORS - valueFrom: - configMapKeyRef: - key: controller.status.processors - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_OPERATION_PROCESSORS - valueFrom: - configMapKeyRef: - key: controller.operation.processors - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_LOGFORMAT - valueFrom: - configMapKeyRef: - key: controller.log.format - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_LOGLEVEL - valueFrom: - configMapKeyRef: - key: controller.log.level - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_METRICS_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - key: controller.metrics.cache.expiration - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_SELF_HEAL_TIMEOUT_SECONDS - valueFrom: - configMapKeyRef: - key: controller.self.heal.timeout.seconds - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_SELF_HEAL_BACKOFF_TIMEOUT_SECONDS - valueFrom: - configMapKeyRef: - key: controller.self.heal.backoff.timeout.seconds - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_SELF_HEAL_BACKOFF_FACTOR - valueFrom: - configMapKeyRef: - key: controller.self.heal.backoff.factor - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_SELF_HEAL_BACKOFF_CAP_SECONDS - valueFrom: - configMapKeyRef: - key: controller.self.heal.backoff.cap.seconds - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_SYNC_TIMEOUT - valueFrom: - configMapKeyRef: - key: controller.sync.timeout.seconds - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER_PLAINTEXT - valueFrom: - configMapKeyRef: - key: controller.repo.server.plaintext - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_REPO_SERVER_STRICT_TLS - valueFrom: - configMapKeyRef: - key: controller.repo.server.strict.tls - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_PERSIST_RESOURCE_HEALTH - valueFrom: - configMapKeyRef: - key: controller.resource.health.persist - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APP_STATE_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - key: controller.app.state.cache.expiration - name: argocd-cmd-params-cm - optional: true - - name: REDIS_SERVER - valueFrom: - configMapKeyRef: - key: redis.server - name: argocd-cmd-params-cm - optional: true - - name: REDIS_COMPRESSION - valueFrom: - configMapKeyRef: - key: redis.compression - name: argocd-cmd-params-cm - optional: true - - name: REDISDB - valueFrom: - configMapKeyRef: - key: redis.db - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_DEFAULT_CACHE_EXPIRATION - valueFrom: - configMapKeyRef: - key: controller.default.cache.expiration - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_OTLP_ADDRESS - valueFrom: - configMapKeyRef: - key: otlp.address - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_OTLP_INSECURE - valueFrom: - configMapKeyRef: - key: otlp.insecure - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_OTLP_HEADERS - valueFrom: - configMapKeyRef: - key: otlp.headers - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_NAMESPACES - valueFrom: - configMapKeyRef: - key: application.namespaces - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_CONTROLLER_SHARDING_ALGORITHM - valueFrom: - configMapKeyRef: - key: controller.sharding.algorithm - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_KUBECTL_PARALLELISM_LIMIT - valueFrom: - configMapKeyRef: - key: controller.kubectl.parallelism.limit - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_K8SCLIENT_RETRY_MAX - valueFrom: - configMapKeyRef: - key: controller.k8sclient.retry.max - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_K8SCLIENT_RETRY_BASE_BACKOFF - valueFrom: - configMapKeyRef: - key: controller.k8sclient.retry.base.backoff - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_APPLICATION_CONTROLLER_SERVER_SIDE_DIFF - valueFrom: - configMapKeyRef: - key: controller.diff.server.side - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_IGNORE_NORMALIZER_JQ_TIMEOUT - valueFrom: - configMapKeyRef: - key: controller.ignore.normalizer.jq.timeout - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_HYDRATOR_ENABLED - valueFrom: - configMapKeyRef: - key: hydrator.enabled - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_CLUSTER_CACHE_BATCH_EVENTS_PROCESSING - valueFrom: - configMapKeyRef: - key: controller.cluster.cache.batch.events.processing - name: argocd-cmd-params-cm - optional: true - - name: ARGOCD_CLUSTER_CACHE_EVENTS_PROCESSING_INTERVAL - valueFrom: - configMapKeyRef: - key: controller.cluster.cache.events.processing.interval - name: argocd-cmd-params-cm - optional: true - - name: KUBECACHEDIR - value: /tmp/kubecache - image: quay.io/argoproj/argocd:v2.14.6 - imagePullPolicy: Always - name: argocd-application-controller - ports: - - containerPort: 8082 - readinessProbe: - httpGet: - path: /healthz - port: 8082 - initialDelaySeconds: 5 - periodSeconds: 10 - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - volumeMounts: - - mountPath: /app/config/controller/tls - name: argocd-repo-server-tls - - mountPath: /home/argocd - name: argocd-home - - mountPath: /home/argocd/params - name: argocd-cmd-params-cm - - mountPath: /tmp - name: argocd-application-controller-tmp - workingDir: /home/argocd - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: argocd-application-controller - volumes: - - emptyDir: {} - name: argocd-home - - emptyDir: {} - name: argocd-application-controller-tmp - - name: argocd-repo-server-tls - secret: - items: - - key: tls.crt - path: tls.crt - - key: tls.key - path: tls.key - - key: ca.crt - path: ca.crt - optional: true - secretName: argocd-repo-server-tls - - configMap: - items: - - key: controller.profile.enabled - path: profiler.enabled - name: argocd-cmd-params-cm - optional: true - name: argocd-cmd-params-cm ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: argocd-application-controller-network-policy -spec: - ingress: - - from: - - namespaceSelector: {} - ports: - - port: 8082 - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-application-controller - policyTypes: - - Ingress ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: argocd-applicationset-controller-network-policy -spec: - ingress: - - from: - - namespaceSelector: {} - ports: - - port: 7000 - protocol: TCP - - port: 8080 - protocol: TCP - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-applicationset-controller - policyTypes: - - Ingress ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: argocd-dex-server-network-policy -spec: - ingress: - - from: - - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-server - ports: - - port: 5556 - protocol: TCP - - port: 5557 - protocol: TCP - - from: - - namespaceSelector: {} - ports: - - port: 5558 - protocol: TCP - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-dex-server - policyTypes: - - Ingress ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/component: notifications-controller - app.kubernetes.io/name: argocd-notifications-controller - app.kubernetes.io/part-of: argocd - name: argocd-notifications-controller-network-policy -spec: - ingress: - - from: - - namespaceSelector: {} - ports: - - port: 9001 - protocol: TCP - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-notifications-controller - policyTypes: - - Ingress ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: argocd-redis-network-policy -spec: - ingress: - - from: - - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-server - - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-repo-server - - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-application-controller - ports: - - port: 6379 - protocol: TCP - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-redis - policyTypes: - - Ingress ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: argocd-repo-server-network-policy -spec: - ingress: - - from: - - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-server - - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-application-controller - - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-notifications-controller - - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-applicationset-controller - ports: - - port: 8081 - protocol: TCP - - from: - - namespaceSelector: {} - ports: - - port: 8084 - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-repo-server - policyTypes: - - Ingress ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: argocd-server-network-policy -spec: - ingress: - - {} - podSelector: - matchLabels: - app.kubernetes.io/name: argocd-server - policyTypes: - - Ingress \ No newline at end of file diff --git a/docs/demos/ArgoCD/manifests/guestbook-app.yaml b/docs/demos/ArgoCD/manifests/guestbook-app.yaml deleted file mode 100644 index 45c6e73eb..000000000 --- a/docs/demos/ArgoCD/manifests/guestbook-app.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: guestbook-app - namespace: guestbook # the application is created in guestbook namespace -spec: - destination: - namespace: guestbook # the target manifests will be deployed in guestbook namespace - server: https://kubernetes.default.svc - project: guestbook-project - source: - path: docs/demos/ArgoCD/manifests/guestbook # manifest path - repoURL: https://github.com/Azure/fleet.git # source repo - targetRevision: main # source branch - syncPolicy: - automated: - prune: true - selfHeal: true - syncOptions: - - PruneLast=true - - PrunePropagationPolicy=foreground - - CreateNamespace=true - - ApplyOutOfSyncOnly=true diff --git a/docs/demos/ArgoCD/manifests/guestbook-appproject.yaml b/docs/demos/ArgoCD/manifests/guestbook-appproject.yaml deleted file mode 100644 index c6a8e381e..000000000 --- a/docs/demos/ArgoCD/manifests/guestbook-appproject.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: AppProject -metadata: - name: guestbook-project - namespace: argocd -spec: - sourceNamespaces: - - guestbook - destinations: - - namespace: '*' - server: https://kubernetes.default.svc - sourceRepos: - - '*' diff --git a/docs/demos/ArgoCD/manifests/guestbook-crp.yaml b/docs/demos/ArgoCD/manifests/guestbook-crp.yaml deleted file mode 100644 index 155e280dc..000000000 --- a/docs/demos/ArgoCD/manifests/guestbook-crp.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: guestbook-crp -spec: - policy: - placementType: PickAll # select all member clusters with label team=A - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - team: A # label selectors - resourceSelectors: - - group: "" - kind: Namespace - name: guestbook # select guestbook namespace with all resources in it - version: v1 - revisionHistoryLimit: 10 - strategy: - type: External # will use an updateRun to trigger the rollout diff --git a/docs/demos/ArgoCD/manifests/guestbook-ro.yaml b/docs/demos/ArgoCD/manifests/guestbook-ro.yaml deleted file mode 100644 index c7b6bb5f4..000000000 --- a/docs/demos/ArgoCD/manifests/guestbook-ro.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ResourceOverride -metadata: - name: guestbook-app-ro - namespace: guestbook # ro needs to be created in the same namespace as the resource it overrides -spec: - placement: - name: guestbook-crp # specify the CRP name - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: {} # empty labelSelector selected all member clusters - jsonPatchOverrides: - - op: replace - path: /spec/source/path # spec.source.path is overridden - value: "docs/demos/ArgoCD/manifests/guestbook/${MEMBER-CLUSTER-NAME}" # ${MEMBER-CLUSTER-NAME} is replaced with the member cluster name - overrideType: JSONPatch - resourceSelectors: - - group: argoproj.io - kind: Application - name: guestbook-app # name of the Application - version: v1alpha1 diff --git a/docs/demos/ArgoCD/manifests/guestbook-updaterun.yaml b/docs/demos/ArgoCD/manifests/guestbook-updaterun.yaml deleted file mode 100644 index 2212de3a7..000000000 --- a/docs/demos/ArgoCD/manifests/guestbook-updaterun.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateRun -metadata: - name: guestbook-updaterun -spec: - placementName: guestbook-crp - resourceSnapshotIndex: "0" - stagedRolloutStrategyName: team-a-strategy diff --git a/docs/demos/ArgoCD/manifests/guestbook/member1/test-configmap.yaml b/docs/demos/ArgoCD/manifests/guestbook/member1/test-configmap.yaml deleted file mode 100644 index c989b897b..000000000 --- a/docs/demos/ArgoCD/manifests/guestbook/member1/test-configmap.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: test-config -data: - branch: main - cluster: member1 diff --git a/docs/demos/ArgoCD/manifests/guestbook/member2/test-configmap.yaml b/docs/demos/ArgoCD/manifests/guestbook/member2/test-configmap.yaml deleted file mode 100644 index d2240d5e9..000000000 --- a/docs/demos/ArgoCD/manifests/guestbook/member2/test-configmap.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: test-config -data: - branch: main - cluster: member2 diff --git a/docs/demos/ArgoCD/manifests/guestbook/member3/test-configmap.yaml b/docs/demos/ArgoCD/manifests/guestbook/member3/test-configmap.yaml deleted file mode 100644 index 2d9b13e04..000000000 --- a/docs/demos/ArgoCD/manifests/guestbook/member3/test-configmap.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: test-config -data: - branch: main - cluster: member3 diff --git a/docs/demos/ArgoCD/manifests/teamA-strategy.yaml b/docs/demos/ArgoCD/manifests/teamA-strategy.yaml deleted file mode 100644 index 3da5d2409..000000000 --- a/docs/demos/ArgoCD/manifests/teamA-strategy.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateStrategy -metadata: - name: team-a-strategy -spec: - stages: # 3 stages: staging, canary, production - - afterStageTasks: - - type: TimedWait - waitTime: 1m # wait 1 minute before moving to canary stage - labelSelector: - matchLabels: - environment: staging - name: staging - - afterStageTasks: - - type: Approval # wait for manual approval before moving to production stage - labelSelector: - matchLabels: - environment: canary - name: canary - - labelSelector: - matchLabels: - environment: production - name: production diff --git a/docs/demos/README.md b/docs/demos/README.md deleted file mode 100644 index f639c120a..000000000 --- a/docs/demos/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Demos - -Explore our demo section for hands-on examples of integrating Fleet to streamline application deployment and management across your multi-cluster environment. - -* [Fleet and ArgoCD Integration](./ArgoCD/fleet-argocd-integration.md) - See Fleet and ArgoCD working together to efficiently manage Kubernetes resources across your fleet of clusters. This demonstration showcases how to: - - Target specific clusters for ArgoCD `Application` deployment using `ClusterResourcePlacement`. - - Customize configurations for different environments with `ResourceOverride`. - - Implement controlled, safe rollouts of `Applications` through `ClusterStagedUpdateRun`. diff --git a/docs/faq.md b/docs/faq.md deleted file mode 100644 index 0100b8644..000000000 --- a/docs/faq.md +++ /dev/null @@ -1,64 +0,0 @@ -# Frequently Asked Questions - -## What are fleet-owned resources on the hub and member clusters? Can these fleet-owned resources be modified by the user? - -Majority of the `internal` resources and fleet reserved namespaces described below are safeguarded by a series of validating webhooks, serving as a preventive measure to restrict users from making modifications to them. - -The fleet reserved namespace are `fleet-system` and `fleet-member-{clusterName}` where clusterName is the name of each member cluster that has joined the fleet. - -### Fleet hub cluster internal resources: -| Resource | -|------------------------------------| -| `InternalMemberCluster` | -| `Work` | -| `ClusterResourceSnapshot` | -| `ClusterSchedulingPolicySnapshot` | -| `ClusterResourceBinding` | - -### Fleet member cluster internal resources: -| Resource | -|-------------------------| -| `InternalMemberCluster` | -| `AppliedWork` | - -**Fleet APIs** are defined [here](https://github.com/Azure/fleet/tree/main/apis), **Fleet CRDs** are defined [here](https://github.com/Azure/fleet/tree/main/config/crd/bases). - -### Fleet Networking hub cluster internal resources: -| Resource | -|-------------------------| -| `EndpointSliceExport` | -| `EndpointSliceImport` | -| `InternalServiceExport` | -| `InternalServiceImport` | -| `ServiceImport` | - -**Fleet Networking APIs** are defined [here](https://github.com/Azure/fleet-networking/tree/main/api/v1alpha1), **Fleet Networking CRDs** are defined [here](https://github.com/Azure/fleet-networking/tree/main/config/crd/bases). - -## What kind of the resources are allowed to be propagated from the hub cluster to the member clusters? How can I control the list? - -The resources to be propagated from the hub cluster to the member clusters can be controlled by either an exclude/skip list or an include/allow list which are mutually exclusive. - -`ClusterResourcePlacement` excludes certain groups/resources when propagating the resources by default. They are defined [here](https://github.com/Azure/fleet/blob/main/pkg/utils/apiresources.go). -- `k8s.io/api/events/v1` (group) -- `k8s.io/api/coordination/v1` (group) -- `k8s.io/metrics/pkg/apis/metrics/v1beta1` (group) -- `k8s.io/api/core/v1` (pod, node) -- `networking.fleet.azure.com` (service import resource) -- any resources in the "default" namespace - -You can use `skipped-propagating-apis` and `skipped-propagating-namespaces` flag when installing the hub-agent to skip resources from being propagated by specifying their group/group-version/group-version-kind and namespaces. - -You can use `allowed-propagating-apis` flag on the hub-agent to only allow propagation of desired set of resources specified in the form of group/group-version/group-version-kind. This flag is mutually exclusive with `skipped-propagating-apis`. - -## What happens to existing resources in member clusters when their definitions conflict with the desired resources in the hub cluster? - -In case of a conflict, where a resource already exists on the member cluster, the apply operation fails when trying to propagate the same resource from the hub cluster. - -## What happens if modifies resources that were placed from hub to member clusters? - -Possible scenarios: - -- If the user `updates` the resource on the hub cluster, the update is propagated to all member clusters where the resource exists. -- If the user `deletes` the resource on the hub cluster, the resource is deleted on all clusters to which it was propagated. -- If the user `updates` the resource on the member cluster, no automatic action occurs as it's a user-made modification. -- If the user `deletes` the resource on the member cluster, the resource is automatically created again on the member cluster after reconciliation. diff --git a/docs/getting-started/README.md b/docs/getting-started/README.md deleted file mode 100644 index 96e32d956..000000000 --- a/docs/getting-started/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Fleet Getting Started Tutorials - -The Fleet documentation provides a variety of getting-started tutorials that help you try out -Fleet in environments that you are most familiar with; see the list below for more -information. - -## Using kind clusters - -[Getting started with Fleet using kind clusters](./kind.md) is a tutorial that helps set up -Fleet with [kind](https://kind.sigs.k8s.io/) clusters; these are Kubernetes clusters running -on a local machine via [Docker](https://docker.com) containers. This setup is the easiest way -to get started with Fleet, with very little overhead; it is strongly recommended if you do -not have any Kubernetes clusters available for testing purposes on hand. - -## Using on-premises clusters - -[Getting started with Fleet using on-premises clusters](./on-prem.md) is a tutorial that helps -set up Fleet with existing on-premises Kubernetes clusters. If you are familiar with Kubernetes -administrative tasks and are evaluating Fleet as the multi-cluster management solution for your -on-premises clusters, consider starting with this tutorial. diff --git a/docs/getting-started/kind.md b/docs/getting-started/kind.md deleted file mode 100644 index 4a1ba6e55..000000000 --- a/docs/getting-started/kind.md +++ /dev/null @@ -1,250 +0,0 @@ -# Getting started with Fleet using kind clusters - -In this tutorial, you will try Fleet out using -[kind](https://kind.sigs.k8s.io/) clusters, which are Kubernetes clusters running on your own -local machine via [Docker](https://docker.com) containers. This is the easiest way -to get started with Fleet, which can help you understand how Fleet simiplify the day-to-day multi-cluster management experience with very little setup needed. - -> Note -> -> kind is a tool for setting up a Kubernetes environment for experimental purposes; -> some instructions below for running Fleet in the kind environment may not apply to other -> environments, and there might also be some minor differences in the Fleet -> experience. - -## Before you begin - -To complete this tutorial, you will need: - -* The following tools on your local machine: - * `kind`, for running Kubernetes clusters on your local machine - * Docker - * `git` - * `curl` - * `helm`, the Kubernetes package manager - * `jq` - * `base64` - -## Spin up a few kind clusters - -The Fleet open-source project manages a multi-cluster environment using a hub-spoke pattern, -which consists of one hub cluster and one or more member clusters: - -* The hub cluster is the portal to which every member cluster connects; it also serves as an -interface for centralized management, through which you can perform a number of tasks, -primarily orchestrating workloads across different clusters. -* A member cluster connects to the hub cluster and runs your workloads as orchestrated by the -hub cluster. - -In this tutorial you will create two kind clusters; one of which serves as the Fleet -hub cluster, and the other the Fleet member cluster. Run the commands below to create them: - -```sh -# Replace YOUR-KIND-IMAGE with a kind node image name of your -# choice. It should match with the version of kind installed -# on your system; for more information, see -# [kind releases](https://github.com/kubernetes-sigs/kind/releases). -export KIND_IMAGE=YOUR-KIND-IMAGE -# Replace YOUR-KUBECONFIG-PATH with the path to a Kubernetes -# configuration file of your own, typically $HOME/.kube/config. -export KUBECONFIG_PATH=YOUR-KUBECONFIG-PATH - -# The names of the kind clusters; you may use values of your own if you'd like to. -export HUB_CLUSTER=hub -export MEMBER_CLUSTER=member-1 - -kind create cluster --name $HUB_CLUSTER \ - --image=$KIND_IMAGE \ - --kubeconfig=$KUBECONFIG_PATH -kind create cluster --name $MEMBER_CLUSTER \ - --image=$KIND_IMAGE \ - --kubeconfig=$KUBECONFIG_PATH - -# Export the configurations for the kind clusters. -kind export kubeconfig -n $HUB_CLUSTER -kind export kubeconfig -n $MEMBER_CLUSTER -``` - -# Set up the Fleet hub cluster - -To set up the hub cluster, run the commands below: - -```sh -export HUB_CLUSTER_CONTEXT=kind-$HUB_CLUSTER -kubectl config use-context $HUB_CLUSTER_CONTEXT - -# The variables below uses the Fleet images kept in the Microsoft Container Registry (MCR), -# and will retrieve the latest version from the Fleet GitHub repository. -# -# You can, however, build the Fleet images of your own; see the repository README for -# more information. -export REGISTRY="mcr.microsoft.com/aks/fleet" -export FLEET_VERSION=$(curl "https://api.github.com/repos/Azure/fleet/tags" | jq -r '.[0].name') -export HUB_AGENT_IMAGE="hub-agent" - -# Clone the Fleet repository from GitHub if not already done. -git clone https://github.com/Azure/fleet.git -cd fleet - -# Install the helm chart for running Fleet agents on the hub cluster. -helm install hub-agent ./charts/hub-agent/ \ - --set image.pullPolicy=Always \ - --set image.repository=$REGISTRY/$HUB_AGENT_IMAGE \ - --set image.tag=$FLEET_VERSION \ - --set logVerbosity=5 \ - --set namespace=fleet-system \ - --set enableWebhook=true \ - --set webhookClientConnectionType=service \ - --set enableV1Alpha1APIs=false \ - --set enableV1Beta1APIs=true -``` - -It may take a few seconds for the installation to complete. Once it finishes, verify that -the Fleet hub agents are up and running with the commands below: - -```sh -kubectl get pods -n fleet-system -``` - -You should see that all the pods are in the ready state. - -## Set up the Fleet member custer - -Next, you will set up the other kind cluster you created earlier as the Fleet -member cluster, which requires that you install the Fleet member agent on -the cluster and connect it to the Fleet hub cluster. - -For your convenience, Fleet provides a script that can automate the process of joining a cluster -into a fleet. To use the script, follow the steps below: - -```sh -# Query the API server address of the hub cluster. -export HUB_CLUSTER_ADDRESS="https://$(docker inspect $HUB_CLUSTER-control-plane --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'):6443" - -export MEMBER_CLUSTER_CONTEXT=kind-$MEMBER_CLUSTER - -# Run the script. -chmod +x ./hack/membership/join.sh -./hack/membership/join.sh -``` - -It may take a few minutes for the script to finish running. Once it is completed, verify -that the cluster has joined successfully with the command below: - -```sh -kubectl config use-context $HUB_CLUSTER_CONTEXT -kubectl get membercluster $MEMBER_CLUSTER -``` - -The newly joined cluster should have the `JOINED` status field set to `True`. If you see that -the cluster is still in an unknown state, it might be that the member cluster -is still connecting to the hub cluster. Should this state persist for a prolonged -period, refer to the [Troubleshooting Guide](../troubleshooting/README.md) for -more information. - -> Note -> -> If you would like to know more about the steps the script runs, or would like to join -> a cluster into a fleet manually, refer to the [Managing Clusters](../howtos/clusters.md) How-To -> Guide. - -## Use the `ClusterResourcePlacement` API to orchestrate resources among member clusters. - -Fleet offers an API, `ClusterResourcePlacement`, which helps orchestrate workloads, i.e., any group -Kubernetes resources, among all member clusters. In this last part of the tutorial, you will use -this API to place some Kubernetes resources automatically into the member clusters via the hub -cluster, saving the trouble of having to create them one by one in each member cluster. - -### Create the resources for placement - -Run the commands below to create a namespace and a config map, which will be placed onto the -member clusters. - -```sh -kubectl create namespace work -kubectl create configmap app -n work --from-literal=data=test -``` - -It may take a few seconds for the commands to complete. - -### Create the `ClusterResourcePlacement` API object - -Next, create a `ClusterResourcePlacement` API object in the hub cluster: - -```sh -kubectl apply -f - < Note -> -> This tutorial assumes that you have some experience of performing administrative tasks for -> Kubernetes clusters. If you are just getting started with Kubernetes, or do not have much -> experience of setting up a Kubernetes cluster, it is recommended that you follow the -> [Getting started with Fleet using Kind clusters](kind.md) tutorial instead. - -## Before you begin - -To complete this tutorial, you will need: - -* At least two Kubernetes clusters of your own. - * Note that one of these clusters will serve as your hub cluster; other clusters must be able - to reach it via the network. -* The following tools on your local machine: - * `kubectl`, the Kubernetes CLI tool. - * `git` - * `curl` - * `helm`, the Kubernetes package manager - * `jq` - * `base64` - -## Set up a Fleet hub cluster - -The Fleet open-source project manages a multi-cluster environment using a hub-spoke pattern, -which consists of one hub cluster and one or more member clusters: - -* The hub cluster is the portal to which every member cluster connects; it also serves as an -interface for centralized management, through which you can perform a number of tasks, -primarily orchestrating workloads across different clusters. -* A member cluster connects to the hub cluster and runs your workloads as orchestrated by the -hub cluster. - -Any Kubernetes cluster running a supported version of Kubernetes can serve as the hub cluster; -it is recommended that you reserve a cluster -specifically for this responsibility, and do not run other workloads on it. For the best -experience, consider disabling the built-in `kube-controller-manager` controllers for the -cluster: you could achieve this by setting the `--controllers` CLI argument; for more information, -see the [`kube-controller-manager` documentation](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/). - -To set up the hub cluster, run the commands below: - -```sh -# Replace YOUR-HUB-CLUSTER-CONTEXT with the name of the kubeconfig context for your hub cluster. -export HUB_CLUSTER_CONTEXT=YOUR-HUB-CLUSTER-CONTEXT - -kubectl config use-context $HUB_CLUSTER_CONTEXT - -# The variables below uses the Fleet images kept in the Microsoft Container Registry (MCR), -# and will retrieve the latest version from the Fleet GitHub repository. -# -# You can, however, build the Fleet images of your own; see the repository README for -# more information. -export REGISTRY="mcr.microsoft.com/aks/fleet" -export FLEET_VERSION=$(curl "https://api.github.com/repos/Azure/fleet/tags" | jq -r '.[0].name') -export HUB_AGENT_IMAGE="hub-agent" - -# Clone the Fleet repository from GitHub. -git clone https://github.com/Azure/fleet.git -cd fleet - -# Install the helm chart for running Fleet agents on the hub cluster. -helm install hub-agent ./charts/hub-agent/ \ - --set image.pullPolicy=Always \ - --set image.repository=$REGISTRY/$HUB_AGENT_IMAGE \ - --set image.tag=$FLEET_VERSION \ - --set logVerbosity=5 \ - --set namespace=fleet-system \ - --set enableWebhook=true \ - --set webhookClientConnectionType=service \ - --set enableV1Alpha1APIs=false \ - --set enableV1Beta1APIs=true -``` - -It may take a few seconds for the installation to complete. Once it finishes, verify that -the Fleet hub agents are up and running with the commands below: - -```sh -kubectl get pods -n fleet-system -``` - -You should see that all the pods are in the ready state. - -## Connect a member cluster to the hub cluster - -Next, you will set up a cluster as the member cluster for your fleet. This cluster should -run a supported version of Kubernetes and be able to connect to the hub cluster via the network. - -For your convenience, Fleet provides a script that can automate the process of joining a cluster -into a fleet. To use the script, follow the steps below: - -```sh -# Replace the value of HUB_CLUSTER_ADDRESS with the address of your hub cluster API server. -export HUB_CLUSTER_ADDRESS=YOUR-HUB-CLUSTER-ADDRESS -# Replace the value of MEMBER_CLUSTER with the name you would like to assign to the new member -# cluster. -# -# Note that Fleet will recognize your cluster with this name once it joins. -export MEMBER_CLUSTER=YOUR-MEMBER-CLUSTER -# Replace the value of MEMBER_CLUSTER_CONTEXT with the name of the kubeconfig context you use -# for accessing your member cluster. -export MEMBER_CLUSTER_CONTEXT=YOUR-MEMBER-CLUSTER-CONTEXT - -# Run the script. -chmod +x ./hack/Azure/setup/joinMC.sh -./hack/Azure/setup/joinMC.sh -``` - -It may take a few minutes for the script to finish running. Once it is completed, verify -that the cluster has joined successfully with the command below: - -```sh -kubectl config use-context $HUB_CLUSTER_CONTEXT -kubectl get membercluster $MEMBER_CLUSTER -``` - -The newly joined cluster should have the `JOINED` status field set to `True`. If you see that -the cluster is still in an unknown state, it might be that the member cluster -is still connecting to the hub cluster. Should this state persist for a prolonged -period, refer to the [Troubleshooting Guide](../troubleshooting/README.md) for -more information. - -> Note -> -> If you would like to know more about the steps the script runs, or would like to join -> a cluster into a fleet manually, refer to the [Managing Clusters](../howtos/clusters.md) How-To -> Guide. - -Repeat the steps above to join more clusters into your fleet. - -## Use the `ClusterResourcePlacement` API to orchestrate resources among member clusters. - -Fleet offers an API, `ClusterResourcePlacement`, which helps orchestrate workloads, i.e., any group -Kubernetes resources, among all member clusters. In this last part of the tutorial, you will use -this API to place some Kubernetes resources automatically into the member clusters via the hub -cluster, saving the trouble of having to create them one by one in each member cluster. - -### Create the resources for placement - -Run the commands below to create a namespace and a config map, which will be placed onto the -member clusters. - -```sh -kubectl create namespace work -kubectl create configmap app -n work --from-literal=data=test -``` - -It may take a few seconds for the commands to complete. - -### Create the `ClusterResourcePlacement` API object - -Next, create a `ClusterResourcePlacement` API object in the hub cluster: - -```sh -kubectl apply -f - < Note -> -> If you are just getting started with Fleet, it is recommended that you refer to the -> [Fleet Getting Started Guide](../../README.md) for how to create a fleet and [Fleet Concepts](../concepts/README.md) -> for an overview of Fleet features and capabilities. - -Below is a walkthrough of all the how-to guides currently available, categorized by their -domains: - -## `ClusterResourcePlacement` API - -* [Using the `ClusterResourcePlacement` API to place resources](crp.md) - - This how-to guide explains the specifics of the `ClusterResourcePlacement` API, including its - resource selectors, scheduling policy, rollout strategy, and more. `ClusterResourcePlacement` - is a core Fleet API that allows easy and flexible distribution of resources to clusters. - -* [Using Affinity to Pick Clusters](affinities.md) - - This how-to guide explains in depth the concept and usage of affinities terms in the - `ClusterResourcePlacement` API, which you can leverage to place resources on specific - clusters or specify a preference. - -* [Using Topology Spread Constraint to Pick Clusters](topology-spread-constraints.md) - - This how-to guide explains in depth the concept and usage of topology spread constraints - in the `ClusterResourcePlacement API`, which you can leverage to spread resources evenly - across different groups of clusters, so as to achieve, for example, high availability and - elimination of resource usage hotspots. - -* [Understanding the `ClusterResourcePlacement` Status](crp-status.md) - - This how-to guide explains in depth the status Fleet reports in `ClusterResourcePlacement` - API objects, which you can read about to track which clusters Fleet has picked for a - resource placement and whether a placement has been successfully completed. - -* [Using Enveloped Objects to propagate resources using `ClusterResourcePlacement` API](envelope-object.md) - - This how-to guide explains in depth the concept, usage and examples of enveloped objects with - `ClusterResourcePlacement` API objects, which you can leverage to propagate resources without - unintended side effects on the hub cluster. - -* [Using the Fleet `ClusterResourceOverride` API](cluster-resource-override.md) - - This how-to guide explains the specifics of the Fleet `ClusterResourceOverride` API, including - its resource selectors, policy, and more. `ClusterResourceOverride` is a Fleet feature that - allows you to modify or override specific attributes across cluster-scoped resources. - -* [Using the Fleet `ResourceOverride` API](resource-override.md) - - This how-to guide explains the specifics of the Fleet `ResourceOverride` API, including its - resource selectors, policy, and more. `ResourceOverride` is a Fleet API that allows you to - modify or override specific attributes across namespaced resources. - -* [Using the Fleet `ClusterResourcePlacementEviction` and `ClusterResourcePlacementDisruptionBudget` APIs](eviction-placement-disruption-budget.md) - - This how-to guide explains the specifics of the Fleet `ClusterResourcePlacementEviction` and - `ClusterResourcePlacementDisruptionBudget` APIs, including how to evict resources from a - cluster and protect resources from voluntary disruption. \ No newline at end of file diff --git a/docs/howtos/affinities.md b/docs/howtos/affinities.md deleted file mode 100644 index 74da8f68c..000000000 --- a/docs/howtos/affinities.md +++ /dev/null @@ -1,303 +0,0 @@ -# Using Affinity to Pick Clusters - -This how-to guide discusses how to use affinity settings to fine-tune how Fleet picks clusters -for resource placement. - -Affinities terms are featured in the `ClusterResourcePlacement` API, specifically the scheduling -policy section. Each affinity term is a particular requirement that Fleet will check against clusters; -and the fulfillment of this requirement (or the lack of) would have certain effect on whether -Fleet would pick a cluster for resource placement. - -Fleet currently supports two types of affinity terms: - -* `requiredDuringSchedulingIgnoredDuringExecution` affinity terms; and -* `perferredDuringSchedulingIgnoredDuringExecution` affinity terms - -Most affinity terms deal with cluster labels. To manage member clusters, specifically -adding/removing labels from a member cluster, see [Managing Member Clusters](clusters.md) How-To -Guide. - -## `requiredDuringSchedulingIgnoredDuringExecution` affinity terms - -The `requiredDuringSchedulingIgnoredDuringExecution` type of affinity terms serves as a hard -constraint that **a cluster must satisfy** before it can be picked. Each term may feature: - -* a label selector, which specifies a set of labels that a cluster must have or not have before -it can be picked; -* a property selector, which specifies a cluster property requirement that a cluster must satisfy -before it can be picked; -* a combination of both. - -For the specifics about property selectors, see the -[How-To Guide: Using Property-Based Scheduling](./property-based-scheduling.md). - -### `matchLabels` - -The most straightforward way is to specify `matchLabels` in the label selector, as showcased below: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickAll - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - system: critical -``` - -The example above includes a `requiredDuringSchedulingIgnoredDuringExecution` term which requires -that the label `system=critical` must be present on a cluster before Fleet can pick it for the -`ClusterResourcePlacement`. - -You can add multiple labels to `matchLabels`; any cluster that satisfy this affinity term would -have **all** the labels present. - -### `matchExpressions` - -For more complex logic, consider using `matchExpressions`, which allow you to use operators to -set rules for validating labels on a member cluster. Each `matchExpressions` requirement -includes: - -* a key, which is the key of the label; and -* a list of values, which are the possible values for the label key; and -* an operator, which represents the relationship between the key and the list of values. - - Supported operators include: - - * `In`: the cluster must have a label key with one of the listed values. - * `NotIn`: the cluster must have a label key that is not associated with any of the listed values. - * `Exists`: the cluster must have the label key present; any value is acceptable. - * `NotExists`: the cluster must not have the label key. - - If you plan to use `Exists` and/or `NotExists`, you must leave the list of values empty. - -Below is an example of `matchExpressions` affinity term using the `In` operator: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickAll - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchExpressions: - - key: system - operator: In - values: - - critical - - standard -``` - -Any cluster with the label `system=critical` or `system=standard` will be picked by Fleet. - -Similarly, you can also specify multiple `matchExpressions` requirements; any cluster that -satisfy this affinity term would meet all the requirements. - -### Using both `matchLabels` and `matchExpressions` in one affinity term - -You can specify both `matchLabels` and `matchExpressions` in one `requiredDuringSchedulingIgnoredDuringExecution` affinity term, as showcased below: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickAll - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - region: east - matchExpressions: - - key: system - operator: Exists - -``` - -With this affinity term, any cluster picked must: - -* have the label `region=east` present; -* have the label `system` present, any value would do. - -### Using multiple affinity terms - -You can also specify multiple `requiredDuringSchedulingIgnoredDuringExecution` affinity terms, -as showcased below; a cluster will be picked if it can satisfy **any** affinity term. - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickAll - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - region: west - - labelSelector: - matchExpressions: - - key: system - operator: DoesNotExist -``` - -With these two affinity terms, any cluster picked must: - -* have the label `region=west` present; **or** -* does not have the label `system` - -## `preferredDuringSchedulingIgnoredDuringExecution` affinity terms - -The `preferredDuringSchedulingIgnoredDuringExecution` type of affinity terms serves as a soft -constraint for clusters; any cluster that satisfy such terms would receive an affinity score, -which Fleet uses to rank clusters when processing `ClusterResourcePlacement` with scheduling -policy of the `PickN` placement type. - -Each term features: - -* a weight, between -100 and 100, which is the affinity score that Fleet would assign to a -cluster if it satisfies this term; and -* a label selector, or a property sorter. - -Both are required for this type of affinity terms to function. - -The label selector is of the same struct as the one used in -`requiredDuringSchedulingIgnoredDuringExecution` type of affinity terms; see -[the documentation above](#requiredduringschedulingignoredduringexecution-affinity-terms) for usage. - -For the specifics about property sorters, see the -[How-To Guide: Using Property-Based Scheduling](./property-based-scheduling.md). - -Below is an example with a `preferredDuringSchedulingIgnoredDuringExecution` affinity term: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickN - numberOfClusters: 10 - affinity: - clusterAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 20 - preference: - labelSelector: - matchLabels: - region: west -``` - -Any cluster with the `region=west` label would receive an affinity score of 20. - -### Using multiple affinity terms - -Similarly, you can use multiple `preferredDuringSchedulingIgnoredDuringExection` affinity terms, -as showcased below: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickN - numberOfClusters: 10 - affinity: - clusterAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 20 - preference: - labelSelector: - matchLabels: - region: west - - weight: -20 - preference: - labelSelector: - matchLabels: - environment: prod -``` - -Cluster will be validated against each affinity term individually; the affinity scores it -receives will be summed up. For example: - -* if a cluster has only the `region=west` label, it would receive an affinity score of 20; however -* if a cluster has both the `region=west` and `environment=prod` labels, it would receive an -affinity score of `20 + (-20) = 0`. - -## Use both types of affinity terms - -You can, if necessary, add both `requiredDuringSchedulingIgnoredDuringExecution` and -`preferredDuringSchedulingIgnoredDuringExection` types of affinity terms. Fleet will -first run all clusters against all the `requiredDuringSchedulingIgnoredDuringExecution` type -of affinity terms, filter out any that does not meet the requirements, and then -assign the rest with affinity scores per `preferredDuringSchedulingIgnoredDuringExection` type of -affinity terms. - -Below is an example with both types of affinity terms: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickN - numberOfClusters: 10 - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchExpressions: - - key: system - operator: Exists - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 20 - preference: - labelSelector: - matchLabels: - region: west -``` - -With these affinity terms, only clusters with the label `system` (any value would do) can be -picked; and among them, those with the `region=west` will be prioritized for resource placement -as they receive an affinity score of 20. \ No newline at end of file diff --git a/docs/howtos/cluster-resource-override.md b/docs/howtos/cluster-resource-override.md deleted file mode 100644 index 187e8d07f..000000000 --- a/docs/howtos/cluster-resource-override.md +++ /dev/null @@ -1,374 +0,0 @@ -# How-to Guide: Using the Fleet `ClusterResourceOverride` API - -This guide provides an overview of how to use the Fleet `ClusterResourceOverride` API to override cluster resources. - -## Overview -`ClusterResourceOverride` is a feature within Fleet that allows for the modification or override of specific attributes -across cluster-wide resources. With ClusterResourceOverride, you can define rules based on cluster labels or other -criteria, specifying changes to be applied to various cluster-wide resources such as namespaces, roles, role bindings, -or custom resource definitions. These modifications may include updates to permissions, configurations, or other -parameters, ensuring consistent management and enforcement of configurations across your Fleet-managed Kubernetes clusters. - -## API Components -The ClusterResourceOverride API consists of the following components: -- **Placement**: This specifies which placement the override is applied to. -- **Cluster Resource Selectors**: These specify the set of cluster resources selected for overriding. -- **Policy**: This specifies the policy to be applied to the selected resources. - - -The following sections discuss these components in depth. - -## Placement - -To configure which placement the override is applied to, you can use the name of `ClusterResourcePlacement`. - -## Cluster Resource Selectors -A `ClusterResourceOverride` object may feature one or more cluster resource selectors, specifying which resources to select to be overridden. - -The `ClusterResourceSelector` object supports the following fields: -- `group`: The API group of the resource -- `version`: The API version of the resource -- `kind`: The kind of the resource -- `name`: The name of the resource -> Note: The resource can only be selected by name. - - -To add a resource selector, edit the `clusterResourceSelectors` field in the `ClusterResourceOverride` spec: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ClusterResourceOverride -metadata: - name: example-cro -spec: - placement: - name: crp-example - clusterResourceSelectors: - - group: rbac.authorization.k8s.io - kind: ClusterRole - version: v1 - name: secret-reader -``` - -The example in the tutorial will pick the `ClusterRole` named `secret-reader`, as shown below, to be overridden. -```yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: secret-reader -rules: -- apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "watch", "list"] -``` - -## Policy -The `Policy` is made up of a set of rules (`OverrideRules`) that specify the changes to be applied to the selected -resources on selected clusters. - -Each `OverrideRule` supports the following fields: -- **Cluster Selector**: This specifies the set of clusters to which the override applies. -- **Override Type**: This specifies the type of override to be applied. The default type is `JSONPatch`. - - `JSONPatch`: applies the JSON patch to the selected resources using [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902). - - `Delete`: deletes the selected resources on the target cluster. -- **JSON Patch Override**: This specifies the changes to be applied to the selected resources when the override type is `JSONPatch`. - -### Cluster Selector - -To specify the clusters to which the override applies, you can use the `clusterSelector` field in the `OverrideRule` spec. -The `clusterSelector` field supports the following fields: -- `clusterSelectorTerms`: A list of terms that are used to select clusters. - * Each term in the list is used to select clusters based on the label selector. - -### Override Type - -To specify the type of override to be applied, you can use the overrideType field in the OverrideRule spec. -The default value is `JSONPatch`. -- `JSONPatch`: applies the JSON patch to the selected resources using [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902). -- `Delete`: deletes the selected resources on the target cluster. - -#### JSON Patch Override - -To specify the changes to be applied to the selected resources, you can use the jsonPatchOverrides field in the OverrideRule spec. -The jsonPatchOverrides field supports the following fields: - ->JSONPatchOverride applies a JSON patch on the selected resources following [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902). -> All the fields defined follow this RFC. - -- `op`: The operation to be performed. The supported operations are `add`, `remove`, and `replace`. - * `add`: Adds a new value to the specified path. - * `remove`: Removes the value at the specified path. - * `replace`: Replaces the value at the specified path. - - -- `path`: The path to the field to be modified. - * Some guidelines for the path are as follows: - * Must start with a `/` character. - * Cannot be empty. - * Cannot contain an empty string ("///"). - * Cannot be a TypeMeta Field ("/kind", "/apiVersion"). - * Cannot be a Metadata Field ("/metadata/name", "/metadata/namespace"), except the fields "/metadata/annotations" and "metadata/labels". - * Cannot be any field in the status of the resource. - * Some examples of valid paths are: - * `/metadata/labels/new-label` - * `/metadata/annotations/new-annotation` - * `/spec/template/spec/containers/0/resources/limits/cpu` - * `/spec/template/spec/containers/0/resources/requests/memory` - - -- `value`: The value to be set. - * If the `op` is `remove`, the value cannot be set. - * There is a list of reserved variables that will be replaced by the actual values: - * `${MEMBER-CLUSTER-NAME}`: this will be replaced by the name of the `memberCluster` that represents this cluster. - -##### Example: Override Labels - -To overwrite the existing labels on the `ClusterRole` named `secret-reader` on clusters with the label `env: prod`, -you can use the following configuration: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ClusterResourceOverride -metadata: - name: example-cro -spec: - placement: - name: crp-example - clusterResourceSelectors: - - group: rbac.authorization.k8s.io - kind: ClusterRole - version: v1 - name: secret-reader - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - jsonPatchOverrides: - - op: add - path: /metadata/labels - value: - {"cluster-name":"${MEMBER-CLUSTER-NAME}"} -``` - -> Note: To add a new label to the existing labels, please use the below configuration: -> ```yaml -> - op: add -> path: /metadata/labels/new-label -> value: "new-value" -> ``` - -The `ClusterResourceOverride` object above will add a label `cluster-name` with the value of the `memberCluster` name to the `ClusterRole` named `secret-reader` on clusters with the label `env: prod`. - -##### Example: Remove Verbs - -To remove the verb "list" in the `ClusterRole` named `secret-reader` on clusters with the label `env: prod`, - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ClusterResourceOverride -metadata: - name: example-cro -spec: - placement: - name: crp-example - clusterResourceSelectors: - - group: rbac.authorization.k8s.io - kind: ClusterRole - version: v1 - name: secret-reader - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - jsonPatchOverrides: - - op: remove - path: /rules/0/verbs/2 -``` -The `ClusterResourceOverride` object above will remove the verb "list" in the `ClusterRole` named `secret-reader` on -clusters with the label `env: prod` selected by the clusterResourcePlacement `crp-example`. - -> The ClusterResourceOverride mentioned above utilizes the cluster role displayed below: -> ``` -> Name: secret-reader -> Labels: -> Annotations: -> PolicyRule: -> Resources Non-Resource URLs Resource Names Verbs -> --------- ----------------- -------------- ----- -> secrets [] [] [get watch list] ->``` - -#### Delete - -The `Delete` override type can be used to delete the selected resources on the target cluster. - -##### Example: Delete Selected Resource -To delete the `secret-reader` on the clusters with the label `env: test` selected by the clusterResourcePlacement `crp-example`, you can use the `Delete` override type. -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ClusterResourceOverride -metadata: - name: example-cro -spec: - placement: - name: crp-example - clusterResourceSelectors: - - group: rbac.authorization.k8s.io - kind: ClusterRole - version: v1 - name: secret-reader - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: test - overrideType: Delete -``` - -### Multiple Override Patches -You may add multiple `JSONPatchOverride` to an `OverrideRule` to apply multiple changes to the selected cluster resources. -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ClusterResourceOverride -metadata: - name: example-cro -spec: - placement: - name: crp-example - clusterResourceSelectors: - - group: rbac.authorization.k8s.io - kind: ClusterRole - version: v1 - name: secret-reader - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - jsonPatchOverrides: - - op: remove - path: /rules/0/verbs/2 - - op: remove - path: /rules/0/verbs/1 -``` -The `ClusterResourceOverride` object above will remove the verbs "list" and "watch" in the `ClusterRole` named -`secret-reader` on clusters with the label `env: prod`. - -#### Breaking down the paths: -- First `JSONPatchOverride`: - - `/rules/0`: This denotes the first rule in the rules array of the ClusterRole. In the provided ClusterRole definition, - there's only one rule defined ("secrets"), so this corresponds to the first (and only) rule. - - `/verbs/2`: Within this rule, the third element of the verbs array is targeted ("list"). -- Second `JSONPatchOverride`: - - `/rules/0`: This denotes the first rule in the rules array of the ClusterRole. In the provided ClusterRole definition, - there's only one rule defined ("secrets"), so this corresponds to the first (and only) rule. - - `/verbs/1`: Within this rule, the second element of the verbs array is targeted ("watch"). - ->The ClusterResourceOverride mentioned above utilizes the cluster role displayed below: -> ```yaml -> Name: secret-reader -> Labels: -> Annotations: -> PolicyRule: -> Resources Non-Resource URLs Resource Names Verbs -> --------- ----------------- -------------- ----- -> secrets [] [] [get watch list] - -## Applying the ClusterResourceOverride -Create a ClusterResourcePlacement resource to specify the placement rules for distributing the cluster resource overrides across -the cluster infrastructure. Ensure that you select the appropriate resource. -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp-example -spec: - resourceSelectors: - - group: rbac.authorization.k8s.io - kind: ClusterRole - version: v1 - name: secret-reader - policy: - placementType: PickAll - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - - labelSelector: - matchLabels: - env: test -``` -The `ClusterResourcePlacement` configuration outlined above will disperse resources across all clusters labeled with `env: prod`. -As the changes are implemented, the corresponding `ClusterResourceOverride` configurations will be applied to the -designated clusters, triggered by the selection of matching cluster role resource `secret-reader`. - -## Verifying the Cluster Resource is Overridden -To ensure that the `ClusterResourceOverride` object is applied to the selected clusters, verify the `ClusterResourcePlacement` -status by running `kubectl describe crp crp-example` command: -``` -Status: - Conditions: - ... - Last Transition Time: 2024-04-27T04:18:00Z - Message: The selected resources are successfully overridden in the 10 clusters - Observed Generation: 1 - Reason: OverriddenSucceeded - Status: True - Type: ClusterResourcePlacementOverridden - ... - Observed Resource Index: 0 - Placement Statuses: - Applicable Cluster Resource Overrides: - example-cro-0 - Cluster Name: member-50 - Conditions: - ... - Message: Successfully applied the override rules on the resources - Observed Generation: 1 - Reason: OverriddenSucceeded - Status: True - Type: Overridden - ... -``` -Each cluster maintains its own `Applicable Cluster Resource Overrides` which contain the cluster resource override snapshot -if relevant. Additionally, individual status messages for each cluster indicate whether the override rules have been -effectively applied. - -The `ClusterResourcePlacementOverridden` condition indicates whether the resource override has been successfully applied -to the selected resources in the selected clusters. - - -To verify that the `ClusterResourceOverride` object has been successfully applied to the selected resources, -check resources in the selected clusters: -1. Get cluster credentials: - `az aks get-credentials --resource-group --name ` -2. Get the `ClusterRole` object in the selected cluster: - `kubectl --context= get clusterrole secret-reader -o yaml` - -Upon inspecting the described ClusterRole object, it becomes apparent that the verbs "watch" and "list" have been -removed from the permissions list within the ClusterRole named "secret-reader" on the prod clusters. - ``` - apiVersion: rbac.authorization.k8s.io/v1 - kind: ClusterRole - metadata: - ... - rules: - - apiGroups: - - "" - resources: - - secrets - verbs: - - get - ``` -Similarly, you can verify that this cluster role does not exist in the test clusters. \ No newline at end of file diff --git a/docs/howtos/clusters.md b/docs/howtos/clusters.md deleted file mode 100644 index 3e849916c..000000000 --- a/docs/howtos/clusters.md +++ /dev/null @@ -1,290 +0,0 @@ -# Managing Clusters - -This how-to guide discusses how to manage clusters in a fleet, specifically: - -* how to join a cluster into a fleet; and -* how to set a cluster to leave a fleet; and -* how to add labels to a member cluster - -## Joining a cluster into a fleet - -A cluster can join in a fleet if: - -* it runs a supported Kubernetes version; it is recommended that you use Kubernetes 1.24 or later -versions, and -* it has network connectivity to the hub cluster of the fleet. - -For your convenience, Fleet provides a script that can automate the process of joining a cluster -into a fleet. To use the script, run the commands below: - -> Note -> -> To run this script, make sure that you have already installed the following tools in your -> system: -> * `kubectl`, the Kubernetes CLI -> * `helm`, a Kubernetes package manager -> * `curl` -> * `jq` -> * `base64` - -```sh -# Replace the value of HUB_CLUSTER_CONTEXT with the name of the kubeconfig context you use for -# accessing your hub cluster. -export HUB_CLUSTER_CONTEXT=YOUR-HUB-CLUSTER-CONTEXT -# Replace the value of HUB_CLUSTER_ADDRESS with the address of your hub cluster API server. -export HUB_CLUSTER_ADDRESS=YOUR-HUB-CLUSTER-ADDRESS -# Replace the value of MEMBER_CLUSTER with the name you would like to assign to the new member -# cluster. -# -# Note that Fleet will recognize your cluster with this name once it joins. -export MEMBER_CLUSTER=YOUR-MEMBER-CLUSTER -# Replace the value of MEMBER_CLUSTER_CONTEXT with the name of the kubeconfig context you use -# for accessing your member cluster. -export MEMBER_CLUSTER_CONTEXT=YOUR-MEMBER-CLUSTER-CONTEXT - -# Clone the Fleet GitHub repository. -git clone https://github.com/Azure/fleet.git - -# Run the script. -chmod +x fleet/hack/membership/join.sh -./fleet/hack/membership/join.sh -``` - -It may take a few minutes for the script to finish running. Once it is completed, verify -that the cluster has joined successfully with the command below: - -```sh -kubectl config use-context $HUB_CLUSTER_CONTEXT -kubectl get membercluster $MEMBER_CLUSTER -``` - -If you see that the cluster is still in an unknown state, it might be that the member cluster -is still connecting to the hub cluster. Should this state persist for a prolonged -period, refer to the [Troubleshooting Guide](../troubleshooting/README.md) for -more information. - -Alternatively, if you would like to find out the exact steps the script performs, or if you feel -like fine-tuning some of the steps, you may join a cluster manually to your fleet with the -instructions below: - -

-Joining a member cluster manually - -1. Make sure that you have installed `kubectl`, `helm`, `curl`, `jq`, and `base64` in your -system. - -2. Create a Kubernetes service account in your hub cluster: - - ```sh - # Replace the value of HUB_CLUSTER_CONTEXT with the name of the kubeconfig - # context you use for accessing your hub cluster. - export HUB_CLUSTER_CONTEXT="YOUR-HUB-CLUSTER-CONTEXT" - # Replace the value of MEMBER_CLUSTER with a name you would like to assign to the new - # member cluster. - # - # Note that the value of MEMBER_CLUSTER will be used as the name the member cluster registers - # with the hub cluster. - export MEMBER_CLUSTER="YOUR-MEMBER-CLUSTER" - - export SERVICE_ACCOUNT="$MEMBER_CLUSTER-hub-cluster-access" - - kubectl config use-context $HUB_CLUSTER_CONTEXT - # The service account can, in theory, be created in any namespace; for simplicity reasons, - # here you will use the namespace reserved by Fleet installation, `fleet-system`. - # - # Note that if you choose a different value, commands in some steps below need to be - # modified accordingly. - kubectl create serviceaccount $SERVICE_ACCOUNT -n fleet-system - ``` - -3. Create a Kubernetes secret of the service account token type, which the member cluster will -use to access the hub cluster. - - ```sh - export SERVICE_ACCOUNT_SECRET="$MEMBER_CLUSTER-hub-cluster-access-token" - cat < Note - > - > Keep the token in a secure place; anyone with access to this token can access the hub cluster - > in the same way as the Fleet member cluster does. - - You may have noticed that at this moment, no access control has been set on the service - account; Fleet will set things up when the member cluster joins. The service account will be - given the minimally viable set of permissions for the Fleet member cluster to connect to the - hub cluster; its access will be restricted to one namespace, specifically reserved for the - member cluster, as per security best practices. - -4. Register the member cluster with the hub cluster; Fleet manages cluster membership using the -`MemberCluster` API: - - ```sh - cat < - -## Setting a cluster to leave a fleet - -Fleet uses the `MemberCluster` API to manage cluster memberships. To remove a member cluster -from a fleet, simply delete its corresponding `MemberCluster` object from your hub cluster: - -```sh -# Replace the value of MEMBER-CLUSTER with the name of the member cluster you would like to -# remove from a fleet. -export MEMBER_CLUSTER=YOUR-MEMBER-CLUSTER -kubectl delete membercluster $MEMBER_CLUSTER -``` - -It may take a while before the member cluster leaves the fleet successfully. Fleet will perform -some cleanup; all the resources placed onto the cluster will be removed. - -After the member cluster leaves, you can remove the member agent installation from it using Helm: - -```sh -# Replace the value of MEMBER_CLUSTER_CONTEXT with the name of the kubeconfig context you use -# for member cluster access. -export MEMBER_CLUSTER_CONTEXT=YOUR-MEMBER-CLUSTER-CONTEXT -kubectl config use-context $MEMBER_CLUSTER_CONTEXT -helm uninstall member-agent -``` - -It may take a few moments before the uninstallation completes. - -## Viewing the status of a member cluster - -Similarly, you can use the `MemberCluster` API in the hub cluster to view the status of a -member cluster: - -```sh -# Replace the value of MEMBER-CLUSTER with the name of the member cluster of which you would like -# to view the status. -export MEMBER_CLUSTER=YOUR-MEMBER-CLUSTER -kubectl get membercluster $MEMBER_CLUSTER -o jsonpath="{.status}" -``` - -The status consists of: - -* an array of conditions, including: - - * the `ReadyToJoin` condition, which signals whether the hub cluster is ready to accept - the member cluster; and - * the `Joined` condition, which signals whether the cluster has joined the fleet; and - * the `Healthy` condition, which signals whether the cluster is in a healthy state. - - Typically, a member cluster should have all three conditions set to true. Refer to the - [Troubleshooting Guide](../troubleshooting/README.md) for help if a cluster fails to join - into a fleet. - -* the resource usage of the cluster; at this moment Fleet reports the capacity and -the allocatable amount of each resource in the cluster, summed up from all nodes in the cluster. - -* an array of agent status, which reports the status of specific Fleet agents installed in -the cluster; each entry features: - - * an array of conditions, in which `Joined` signals whether the specific agent has been - successfully installed in the cluster, and `Healthy` signals whether the agent is in a - healthy state; and - * the timestamp of the last received heartbeat from the agent. - -## Adding labels to a member cluster - -You can add labels to a `MemberCluster` object in the same as with any other Kubernetes object. -These labels can then be used for targeting specific clusters in resource placement. To add a label, -run the command below: - -```sh -# Replace the values of MEMBER_CLUSTER, LABEL_KEY, and LABEL_VALUE with those of your own. -export MEMBER_CLUSTER=YOUR-MEMBER-CLUSTER -export LABEL_KEY=YOUR-LABEL-KEY -export LABEL_VALUE=YOUR-LABEL-VALUE -kubectl label membercluster $MEMBER_CLUSTER $LABEL_KEY=$LABEL_VALUE -``` diff --git a/docs/howtos/crp-status.md b/docs/howtos/crp-status.md deleted file mode 100644 index ed3e5187d..000000000 --- a/docs/howtos/crp-status.md +++ /dev/null @@ -1 +0,0 @@ -TBA. \ No newline at end of file diff --git a/docs/howtos/crp.md b/docs/howtos/crp.md deleted file mode 100644 index ea720cee8..000000000 --- a/docs/howtos/crp.md +++ /dev/null @@ -1,525 +0,0 @@ -# How-to Guide: Using the Fleet `ClusterResourcePlacement` API - -This guide provides an overview of how to use the Fleet `ClusterResourcePlacement` (CRP) API to orchestrate workload distribution across your fleet. - -## Overview - -The CRP API is a core Fleet API that facilitates the distribution of specific resources from the hub cluster to -member clusters within a fleet. This API offers scheduling capabilities that allow you to target the most suitable -group of clusters for a set of resources using a complex rule set. For example, you can distribute resources to -clusters in specific regions (North America, East Asia, Europe, etc.) and/or release stages (production, canary, etc.). -You can even distribute resources according to certain topology spread constraints. - -## API Components - -The CRP API generally consists of the following components: - -- **Resource Selectors**: These specify the set of resources selected for placement. -- **Scheduling Policy**: This determines the set of clusters where the resources will be placed. -- **Rollout Strategy**: This controls the behavior of resource placement when the resources themselves and/or the - scheduling policy are updated, minimizing interruptions caused by refreshes. - -The following sections discuss these components in depth. - -## Resource selectors - -A `ClusterResourcePlacement` object may feature one or more resource selectors, -specifying which resources to select for placement. To add a resource selector, edit -the `resourceSelectors` field in the `ClusterResourcePlacement` spec: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - group: "rbac.authorization.k8s.io" - kind: ClusterRole - version: v1 - name: secretReader -``` - -The example above will pick a `ClusterRole` named `secretReader` for resource placement. - -It is important to note that, as its name implies, `ClusterResourcePlacement` **selects only -cluster-scoped resources**. However, if you select a namespace, all the resources under the -namespace will also be placed. - -### Different types of resource selectors - -You can specify a resource selector in many different ways: - -* To select **one specific resource**, such as a namespace, specify its API GVK (group, version, and -kind), and its name, in the resource selector: - - ```yaml - # As mentioned earlier, all the resources under the namespace will also be selected. - resourceSelectors: - - group: "" - kind: Namespace - version: v1 - name: work - ``` - -* Alternately, you may also select a set of resources of the same API GVK using a label selector; -it also requires that you specify the API GVK and the filtering label(s): - - ```yaml - # As mentioned earlier, all the resources under the namespaces will also be selected. - resourceSelectors: - - group: "" - kind: Namespace - version: v1 - labelSelector: - matchLabels: - system: critical - ``` - - In the example above, all the namespaces in the hub cluster with the label `system=critical` - will be selected (along with the resources under them). - - Fleet uses standard Kubernetes label selectors; for its specification and usage, see the - [Kubernetes API reference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#labelselector-v1-meta). - -* Very occasionally, you may need to select all the resources under a specific GVK; to achieve -this, use a resource selector with only the API GVK added: - - ```yaml - resourceSelectors: - - group: "rbac.authorization.k8s.io" - kind: ClusterRole - version: v1 - ``` - - In the example above, all the cluster roles in the hub cluster will be picked. - -### Multiple resource selectors - -You may specify up to 100 different resource selectors; Fleet will pick a resource if it matches -any of the resource selectors specified (i.e., all selectors are OR'd). - -```yaml -# As mentioned earlier, all the resources under the namespace will also be selected. -resourceSelectors: - - group: "" - kind: Namespace - version: v1 - name: work - - group: "rbac.authorization.k8s.io" - kind: ClusterRole - version: v1 - name: secretReader -``` - -In the example above, Fleet will pick the namespace `work` (along with all the resources -under it) and the cluster role `secretReader`. - -> Note -> -> You can find the GVKs of built-in Kubernetes API objects in the -> [Kubernetes API reference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/). - -## Scheduling policy - -Each scheduling policy is associated with a placement type, which determines how Fleet will -pick clusters. The `ClusterResourcePlacement` API supports the following placement types: - -| Placement type | Description | -|----------------|-------------| -| `PickFixed` | Pick a specific set of clusters by their names. | -| `PickAll` | Pick all the clusters in the fleet, per some standard. | -| `PickN` | Pick a count of N clusters in the fleet, per some standard. | - -> Note -> -> Scheduling policy itself is optional. If you do not specify a scheduling policy, -> Fleet will assume that you would like to use -> a scheduling of the `PickAll` placement type; it effectively sets Fleet to pick -> all the clusters in the fleet. - -Fleet does not support switching between different placement types; if you need to do -so, re-create a new `ClusterResourcePlacement` object. - -### `PickFixed` placement type - -`PickFixed` is the most straightforward placement type, through which you directly tell Fleet -which clusters to place resources at. To use this placement type, specify the target cluster -names in the `clusterNames` field, such as - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickFixed - clusterNames: - - bravelion - - smartfish -``` - -The example above will place resources to two clusters, `bravelion` and `smartfish`. - -### `PickAll` placement type - -`PickAll` placement type allows you to pick all clusters in the fleet per some standard. With -this placement type, you may use affinity terms to fine-tune which clusters you would like -for Fleet to pick: - -* An affinity term specifies a requirement that a cluster needs to meet, usually the presence -of a label. - - There are two types of affinity terms: - - * `requiredDuringSchedulingIgnoredDuringExecution` terms are requirements that a cluster - must meet before it can be picked; and - * `preferredDuringSchedulingIgnoredDuringExecution` terms are requirements that, if a - cluster meets, will set Fleet to prioritize it in scheduling. - - In the scheduling policy of the `PickAll` placement type, you may only use the - `requiredDuringSchedulingIgnoredDuringExecution` terms. - -> Note -> -> You can learn more about affinities in [Using Affinities to Pick Clusters](affinities.md) How-To -> Guide. - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickAll - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - system: critical -``` - -The `ClusterResourcePlacement` object above will pick all the clusters with the label -`system:critical` on them; clusters without the label will be ignored. - -Fleet is forward-looking with the `PickAll` placement type: any cluster that satisfies the -affinity terms of a `ClusterResourcePlacement` object, even if it joins after the - `ClsuterResourcePlacement` object is created, will be picked. - -> Note -> -> You may specify a scheduling policy of the `PickAll` placement with no affinity; this will set -> Fleet to select all clusters currently present in the fleet. - -### `PickN` placement type - -`PickN` placement type allows you to pick a specific number of clusters in the fleet for resource -placement; with this placement type, you may use affinity terms and topology spread constraints -to fine-tune which clusters you would like Fleet to pick. - -* An affinity term specifies a requirement that a cluster needs to meet, usually the presence -of a label. - - There are two types of affinity terms: - - * `requiredDuringSchedulingIgnoredDuringExecution` terms are requirements that a cluster - must meet before it can be picked; and - * `preferredDuringSchedulingIgnoredDuringExecution` terms are requirements that, if a - cluster meets, will set Fleet to prioritize it in scheduling. - -* A topology spread constraint can help you spread resources evenly across different groups -of clusters. For example, you may want to have a database replica deployed in each region -to enable high-availability. - -> Note -> -> You can learn more about affinities in [Using Affinities to Pick Clusters](affinities.md) -> How-To Guide, and more about topology spread constraints in -> [Using Topology Spread Constraints to Pick Clusters](topology-spread-constraints.md) How-To Guide. - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickN - numberOfClusters: 3 - affinity: - clusterAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 20 - preference: - - labelSelector: - matchLabels: - critical-level: 1 -``` - -The `ClusterResourcePlacement` object above will pick first clusters with the `critical-level=1` -on it; if only there are not enough (less than 3) such clusters, will Fleet pick clusters with no -such label. - -To be more precise, with this placement type, Fleet scores clusters on how well it satisfies the -affinity terms and the topology spread constraints; Fleet will assign: - -* an affinity score, for how well the cluster satisfies the affinity terms; and -* a topology spread score, for how well the cluster satisfies the topology spread constraints. - -> Note -> -> For more information on the scoring specifics, see -> [Using Affinities to Pick Clusters](affinities.md) How-To Guide (for affinity score) and -> [Using Topology Spread Constraints to Pick Clusters](topology-spread-constraints.md) How-To -> Guide (for topology spread score). - -After scoring, Fleet ranks the clusters using the rule below and picks the top N clusters: - -* the cluster with the highest topology spread score ranks the highest; -* if there are multiple clusters with the same topology spread score, the one with the highest -affinity score ranks the highest; -* if there are multiple clusters with same topology spread score and affinity score, sort their -names by alphanumeric order; the one with the most significant name ranks the highest. - - This helps establish deterministic scheduling behavior. - -Both affinity terms and topology spread constraints are optional. If you do not specify -affinity terms or topology spread constraints, all clusters will be assigned 0 in -affinity score or topology spread score respectively. When neither is added in the scheduling -policy, Fleet will simply rank clusters by their names, and pick N out of them, with -most significant names in alphanumeric order. - -#### When there are not enough clusters to pick - -It may happen that Fleet cannot find enough clusters to pick. In this situation, Fleet will -keep looking until all N clusters are found. - -Note that Fleet will stop looking once all N clusters are found, even if there appears a -cluster that scores higher. - -#### Up-scaling and downscaling - -You can edit the `numberOfClusters` field in the scheduling policy to pick more or less clusters. -When up-scaling, Fleet will score all the clusters that have not been picked earlier, and find -the most appropriate ones; for downscaling, Fleet will unpick the clusters that ranks lower -first. - -> Note -> -> For downscaling, the ranking Fleet uses for unpicking clusters is composed when the scheduling -> is performed, i.e., it may not reflect the latest setup in the Fleet. - -### A few more points about scheduling policies - -#### Responding to changes in the fleet - -Generally speaking, once a cluster is picked by Fleet for a `ClusterResourcePlacement` object, -it will not be unpicked even if you modify the cluster in a way that renders it unfit for -the scheduling policy, e.g., you have removed a label for the cluster, which is required for -some affinity term. Fleet will also not remove resources from the cluster even if the cluster -becomes unhealthy, e.g., it gets disconnected from the hub cluster. This helps reduce service -interruption. - -However, Fleet will unpick a cluster if it leaves the fleet. If you are using a scheduling -policy of the `PickN` placement type, Fleet will attempt to find a new cluster as replacement. - -#### Finding the scheduling decisions Fleet makes - -You can find out why Fleet picks a cluster in the status of a `ClusterResourcePlacement` object. -For more information, see the -[Understanding the Status of a `ClusterResourcePlacement`](crp-status.md) How-To Guide. - -#### Available fields for each placement type - -The table below summarizes the available scheduling policy fields for each placement type: - -| | `PickFixed` | `PickAll` | `PickN` | -|-----------------------------|-------------|-----------|---------| -| `placementType` | ✅ | ✅ | ✅ | -| `numberOfClusters` | ❌ | ❌ | ✅ | -| `clusterNames` | ✅ | ❌ | ❌ | -| `affinity` | ❌ | ✅ | ✅ | -| `topologySpreadConstraints` | ❌ | ❌ | ✅ | - -## Rollout strategy - -After a `ClusterResourcePlacement` is created, you may want to - -* Add, update, or remove the resources that have been selected by the -`ClusterResourcePlacement` in the hub cluster -* Update the resource selectors in the `ClusterResourcePlacement` -* Update the scheduling policy in the `ClusterResourcePlacement` - -These changes may trigger the following outcomes: - -* New resources may need to be placed on all picked clusters -* Resources already placed on a picked cluster may get updated or deleted -* Some clusters picked previously are now unpicked, and resources must be removed from such clusters -* Some clusters are newly picked, and resources must be added to them - -Most outcomes can lead to service interruptions. Apps running on member clusters may temporarily become -unavailable as Fleet dispatches updated resources. Clusters that are no longer selected will lose all placed resources, -resulting in lost traffic. If too many new clusters are selected and Fleet places resources on them simultaneously, -your backend may become overloaded. The exact interruption pattern may vary depending on the resources you place using Fleet. -To minimize interruption, Fleet allows users to configure the rollout strategy. There are two types of rollout strategies we currently support. - -### Default rollout strategy: Rolling Update - -The default strategy is rolling update, and it applies to all changes you initiate. -This strategy ensures changes, including the addition or removal of selected clusters and resource refreshes, -are applied incrementally in a phased manner at a pace suitable for you, similar to native Kubernetes deployments. - -This rollout strategy can be configured with the following parameters: - -* `maxUnavailable` determines how many clusters may become unavailable during a change for the selected set of resources. -It can be set as an absolute number or a percentage. The default is 25%, and zero should not be used for this value. - - - Setting this parameter to a lower value will result in less interruption during a change but will lead to slower rollouts. - - - Fleet considers a cluster as unavailable if resources have not been successfully applied to the cluster. - - -
How Fleet interprets this value - Fleet, in actuality, makes sure that at any time, there are **at least** N - `maxUnavailable` - number of clusters available, where N is: - - * for scheduling policies of the `PickN` placement type, the `numberOfClusters` value given; - * for scheduling policies of the `PickFixed` placement type, the number of cluster names given; - * for scheduling policies of the `PickAll` placement type, the number of clusters Fleet picks. - - If you use a percentage for the `maxUnavailable` parameter, it is calculated against N as - well. - -
- -* `maxSurge` determines the number of additional clusters, beyond the required number, that will receive resource placements. -It can also be set as an absolute number or a percentage. The default is 25%, and zero should not be used for this value. - - - Setting this parameter to a lower value will result in fewer resource placements on additional - clusters by Fleet, which may slow down the rollout process. - - -
How Fleet interprets this value - Fleet, in actuality, makes sure that at any time, there are **at most** N + `maxSurge` - number of clusters available, where N is: - - * for scheduling policies of the `PickN` placement type, the `numberOfClusters` value given; - * for scheduling policies of the `PickFixed` placement type, the number of cluster names given; - * for scheduling policies of the `PickAll` placement type, the number of clusters Fleet picks. - - If you use a percentage for the `maxUnavailable` parameter, it is calculated against N as well. - -
- -* `unavailablePeriodSeconds` allows users to inform the fleet when the resources are deemed "ready". - The default value is 60 seconds. - - - Fleet only considers newly applied resources on a cluster as "ready" once `unavailablePeriodSeconds` seconds - have passed **after** the resources have been **successfully** applied to that cluster. - - Setting a lower value for this parameter will result in faster rollouts. However, we **strongly** - recommend that users set it to a value that all the initialization/preparation tasks can be completed within - that time frame. This ensures that the resources are typically ready after the `unavailablePeriodSeconds` have passed. - - We are currently designing a generic "ready gate" for resources being applied to clusters. Please feel free to raise - issues or provide feedback if you have any thoughts on this. - -> Note -> -> Fleet will round numbers up if you use a percentage for `maxUnavailable` and/or `maxSurge`. - -For example, if you have a `ClusterResourcePlacement` with a scheduling policy of the `PickN` -placement type and a target number of clusters of 10, with the default rollout strategy, as -shown in the example below, - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - ... - strategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 25% - maxSurge: 25% - unavailablePeriodSeconds: 60 -``` - -Every time you initiate a change on selected resources, Fleet will: - -* Find `10 * 25% = 2.5, rounded up to 3` clusters, which will receive the resource refresh; -* Wait for 60 seconds (`unavailablePeriodSeconds`), and repeat the process; -* Stop when all the clusters have received the latest version of resources. - -The exact period of time it takes for Fleet to complete a rollout depends not only on the -`unavailablePeriodSeconds`, but also the actual condition of a resource placement; that is, -if it takes longer for a cluster to get the resources applied successfully, Fleet will wait -longer to complete the rollout, in accordance with the rolling update strategy you specified. - -> Note -> -> In very extreme circumstances, rollout may get stuck, if Fleet just cannot apply resources -> to some clusters. You can identify this behavior if CRP status; for more information, see -> [Understanding the Status of a `ClusterResourcePlacement`](crp-status.md) How-To Guide. - -### External rollout strategy and staged update run - -Fleet supports flexible rollout patterns through an `External` rollout strategy, which allows you to implement custom rollout controllers. -When configured, Fleet delegates the responsibility of resource placement to your external controller instead of using Fleet's built-in rolling update mechanism. - -One implementation of an external rollout strategy is the **Staged Update Run**. -This approach enables a controlled, stage-by-stage placement of workload resources defined in a `ClusterResourcePlacement`. - -To utilize this strategy: -1. Set `spec.strategy.type` as `External` in the `ClusterResourcePlacement` object. -2. Define your rollout process using two custom resources: - - `ClusterStagedUpdateStrategy`: A reusable template defining the rollout pattern - - `ClusterStagedUpdateRun`: The resource that triggers and manages the actual rollout process. - -For comprehensive guidance on implementing staged updates, please refer to the [Staged Update Run Concepts](../concepts/StagedUpdateRun/README.md) -and [Staged Update Run How-To Guide](updaterun.md). - -## Snapshots and revisions - -Internally, Fleet keeps a history of all the scheduling policies you have used with a -`ClusterResourcePlacement`, and all the resource versions (snapshots) the -`ClusterResourcePlacement` has selected. These are kept as `ClusterSchedulingPolicySnapshot` -and `ClusterResourceSnapshot` objects respectively. - -You can list and view such objects for reference, but you should not modify their contents -(in a typical setup, such requests will be rejected automatically). To control the length -of the history (i.e., how many snapshot objects Fleet will keep for a `ClusterResourcePlacement`), -configure the `revisionHistoryLimit` field: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - ... - strategy: - ... - revisionHistoryLimit: 10 -``` - -The default value is 10. - -> Note -> -> In this early stage, the history is kept for reference purposes only; in the future, Fleet -> may add features to allow rolling back to a specific scheduling policy and/or resource version. diff --git a/docs/howtos/drift-detection.md b/docs/howtos/drift-detection.md deleted file mode 100644 index ec1a423e1..000000000 --- a/docs/howtos/drift-detection.md +++ /dev/null @@ -1,317 +0,0 @@ -# How-to Guide: Enabling Drift Detection in Fleet - -This guide provides an overview on how to enable drift detection in Fleet. This feature can help -developers and admins identify (and act upon) configuration drifts in their KubeFleet system, -which are often brought by temporary fixes, inadvertent changes, and failed automations. - -> Before you begin -> -> The new drift detection experience is currently in preview. -> -> Note that the APIs for the new experience are only available in the Fleet v1beta1 API, not the v1 API. If you do not see the new APIs in command outputs, verify that you are explicitly requesting the v1beta1 API objects, as opposed to the v1 API objects (the default). - -## What is a drift? - -A drift occurs when a non-Fleet agent (e.g., a developer or a controller) makes changes to -a field of a Fleet-managed resource directly on the member cluster side without modifying -the corresponding resource template created on the hub cluster. - -See the steps below for an example; the code assumes that you have a Fleet of two clusters, -`member-1` and `member-2`. - -* Switch to the hub cluster in the preview environment: - - ```sh - kubectl config use-context hub-admin - ``` - -* Create a namespace, `work`, on the hub cluster, with some labels: - - ```sh - kubectl create ns work - kubectl label ns work app=work - kubectl label ns work owner=redfield - ``` - -* Create a CRP object, which places the namespace on all member clusters: - - ```sh - cat < Important: - > - > The presence of drifts will **NOT** stop Fleet from rolling out newer resource versions. If you choose to edit the resource template on the hub cluster, Fleet will always apply the new resource template in the rollout process, which may also resolve the drift. - -## Comparison options - -One may have found out that the namespace on the member cluster has another drift, the -label `use=hack`, which is not reported in the CRP status by Fleet. This is because by default -Fleet compares only managed fields, i.e., fields that are explicitly specified in the resource -template. If a field is not populated on the hub cluster side, Fleet will not recognize its -presence on the member cluster side as a drift. This allows controllers on the member cluster -side to manage some fields automatically without Fleet's involvement; for example, one might would -like to use an HPA solution to auto-scale Deployments as appropriate and consequently decide not -to include the `.spec.replicas` field in the resource template. - -Fleet recognizes that there might be cases where developers and admins would like to have their -resources look exactly the same across their fleet. If this scenario applies, one might set up -the `comparisonOptions` field in the apply strategy from the `partialComparison` value -(the default) to `fullComparison`: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: work -spec: - resourceSelectors: - - group: "" - kind: Namespace - version: v1 - labelSelector: - matchLabels: - app: work - policy: - placementType: PickAll - strategy: - applyStrategy: - whenToApply: IfNotDrifted - comparisonOption: fullComparison -``` - -With this setting, Fleet will recognize the presence of any unmanaged fields (i.e., fields that -are present on the member cluster side, but not set on the hub cluster side) as drifts as well. -If anyone adds a field to a Fleet-managed object directly on the member cluster, it would trigger -an apply error, which you can find out about the details the same way as illustrated in the -section above. - -## Summary - -Below is a summary of the synergy between the whenToApply and comparisonOption settings: - -| `whenToApply` setting | `comparisonOption` setting | Drift scenario | Outcome -| -------- | ------- | -------- | ------- | -| `IfNotDrifted` | `partialComparison` | A managed field (i.e., a field that has been explicitly set in the hub cluster resource template) is edited. | Fleet will report an apply error in the status, plus the drift details. | -| `IfNotDrifted` | `partialComparison` | An unmanaged field (i.e., a field that has not been explicitly set in the hub cluster resource template) is edited/added. | N/A; the change is left untouched, and Fleet will ignore it. | -| `IfNotDrifted` | `fullComparison` | Any field is edited/added. | Fleet will report an apply error in the status, plus the drift details. | -| `Always` | `partialComparison` | A managed field (i.e., a field that has been explicitly set in the hub cluster resource template) is edited. | N/A; the change is overwritten shortly. | -| `Always` | `partialComparison` | An unmanaged field (i.e., a field that has not been explicitly set in the hub cluster resource template) is edited/added. | N/A; the change is left untouched, and Fleet will ignore it. | -| `Always` | `fullComparison` | Any field is edited/added. | The change on managed fields will be overwritten shortly; Fleet will report drift details about changes on unmanaged fields, but this is not considered as an apply error. | - - - diff --git a/docs/howtos/envelope-object.md b/docs/howtos/envelope-object.md deleted file mode 100644 index 5c71bbdd1..000000000 --- a/docs/howtos/envelope-object.md +++ /dev/null @@ -1,229 +0,0 @@ -# How-to Guide: To propagate resources using ClusterResourcePlacement API without unintended side effects on the hub cluster - -## Propagating Resources with Envelope Objects - -This guide provides instructions on propagating a set of resources from the hub cluster to joined member clusters within an envelope object. - -## Envelope Object with ConfigMap - -Currently, we support using a `ConfigMap` as an envelope object by leveraging a fleet-reserved annotation. - -To designate a `ConfigMap` as an envelope object, ensure that it contains the following annotation: - -```yaml -metadata: - annotations: - kubernetes-fleet.io/envelope-configmap: "true" -``` - -### Example ConfigMap Envelope Object: -``` -apiVersion: v1 -kind: ConfigMap -metadata: - name: envelope-configmap - namespace: app - annotations: - kubernetes-fleet.io/envelope-configmap: "true" -data: - resourceQuota.yaml: | - apiVersion: v1 - kind: ResourceQuota - metadata: - name: mem-cpu-demo - namespace: app - spec: - hard: - requests.cpu: "1" - requests.memory: 1Gi - limits.cpu: "2" - limits.memory: 2Gi - webhook.yaml: | - apiVersion: admissionregistration.k8s.io/v1 - kind: MutatingWebhookConfiguration - metadata: - creationTimestamp: null - labels: - azure-workload-identity.io/system: "true" - name: azure-wi-webhook-mutating-webhook-configuration - webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: azure-wi-webhook-webhook-service - namespace: app - path: /mutate-v1-pod - failurePolicy: Fail - matchPolicy: Equivalent - name: mutation.azure-workload-identity.io - rules: - - apiGroups: - - "" - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - pods - sideEffects: None -``` - -## Propagating an Envelope ConfigMap from Hub cluster to Member cluster: - -We will now apply the example envelope object above on our hub cluster. Then we use a `ClusterResourcePlacement` object to propagate the resource from hub to a member cluster named `kind-cluster-1`. - -### CRP spec: -``` -spec: - policy: - clusterNames: - - kind-cluster-1 - placementType: PickFixed - resourceSelectors: - - group: "" - kind: Namespace - name: app - version: v1 - revisionHistoryLimit: 10 - strategy: - type: RollingUpdate -``` - -### CRP status: - -``` -status: - 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 - selectedResources: - - kind: Namespace - name: app - version: v1 - - kind: ConfigMap - name: envelope-configmap - namespace: app - version: v1 -``` - ->>Note: In the `selectedResources` section, we specifically display the propagated envelope object. Please note that we do not individually list all the resources contained within the envelope object in the status. - -Upon inspection of the `selectedResources`, it indicates that the namespace `app` and the configmap `envelope-configmap` have been successfully propagated. Users can further verify the successful propagation of resources mentioned within the `envelope-configmap` object by ensuring that the `failedPlacements` section in the `placementStatus` for `kind-cluster-1` does not appear in the status. - -## Example CRP status where resource within an envelope object failed to apply: - -### CRP status: - -In the example below, within the `placementStatus` section for `kind-cluster-1`, the `failedPlacements` section provides details on resource that failed to apply along with information about the `envelope object` which contained the resource. - -``` -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: envelop-configmap - namespace: test-ns - type: ConfigMap - kind: ResourceQuota - name: mem-cpu-demo - namespace: app - version: v1 - selectedResources: - - kind: Namespace - name: test-ns - version: v1 - - kind: ConfigMap - name: envelop-configmap - namespace: test-ns - version: v1 -``` \ No newline at end of file diff --git a/docs/howtos/eviction-placement-disruption-budget.md b/docs/howtos/eviction-placement-disruption-budget.md deleted file mode 100644 index 2c2ba1c4e..000000000 --- a/docs/howtos/eviction-placement-disruption-budget.md +++ /dev/null @@ -1,182 +0,0 @@ -# Using ClusterResourcePlacementEviction and ClusterResourcePlacementDisruptionBudget - -This how-to guide discusses how to create `ClusterResourcePlacementEviction` objects and `ClusterResourcePlacementDisruptionBudget` objects to evict resources from member clusters and protect resources on member clusters from voluntary disruption, respectively. - -## Evicting Resources from Member Clusters using ClusterResourcePlacementEviction - -The `ClusterResourcePlacementEviction` object is used to remove resources from a member cluster once the resources have already been propagated from the hub cluster. - -To successfully evict resources from a cluster, the user needs to specify: -- The name of the `ClusterResourcePlacement` object which propagated resources to the target cluster. -- The name of the target cluster from which we need to evict resources. - -In this example, we will create a `ClusterResourcePlacement` object with PickAll placement policy to propagate resources to an existing `MemberCluster`, add a taint to the member cluster -resource and then create a `ClusterResourcePlacementEviction` object to evict resources from the `MemberCluster`. - -We will first create a namespace that we will propagate to the member cluster. - -``` -kubectl create ns test-ns -``` - -Then we will apply a `ClusterResourcePlacement` with the following spec: - -```yaml -spec: - resourceSelectors: - - group: "" - kind: Namespace - version: v1 - name: test-ns - policy: - placementType: PickN - numberOfClusters: 1 -``` - -The `CRP` status after applying should look something like this: - -```yaml -kubectl get crp test-crp -NAME GEN SCHEDULED SCHEDULED-GEN AVAILABLE AVAILABLE-GEN AGE -test-crp 2 True 2 True 2 5m49s -``` - -let's now add a taint to the member cluster to ensure this cluster is not picked again by the scheduler once we evict resources from it. - -Modify the cluster object to add a taint: - -```yaml -spec: - heartbeatPeriodSeconds: 60 - identity: - kind: ServiceAccount - name: fleet-member-agent-cluster-1 - namespace: fleet-system - taints: - - effect: NoSchedule - key: test-key - value: test-value -``` - -Now we will create a `ClusterResourcePlacementEviction` object to evict resources from the member cluster: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacementEviction -metadata: - name: test-eviction -spec: - placementName: test-crp - clusterName: kind-cluster-1 -``` - -the eviction object should look like this, if the eviction was successful: - -```yaml -kubectl get crpe test-eviction -NAME VALID EXECUTED -test-eviction True True -``` - -since the eviction is successful, the resources should be removed from the cluster, let's take a look at the `CRP` object status to verify: - -```yaml -kubectl get crp test-crp -NAME GEN SCHEDULED SCHEDULED-GEN AVAILABLE AVAILABLE-GEN AGE -test-crp 2 True 2 15m -``` - -from the object we can clearly tell that the resources were evicted since the `AVAILABLE` column is empty. If the user needs more information `ClusterResourcePlacement` object's status can be checked. - -## Protecting resources from voluntary disruptions using ClusterResourcePlacementDisruptionBudget - -In this example, we will create a `ClusterResourcePlacement` object with PickN placement policy to propagate resources to an existing MemberCluster, -then create a `ClusterResourcePlacementDisruptionBudget` object to protect resources on the MemberCluster from voluntary disruption and -then try to evict resources from the MemberCluster using `ClusterResourcePlacementEviction`. - -We will first create a namespace that we will propagate to the member cluster. - -``` -kubectl create ns test-ns -``` - -Then we will apply a `ClusterResourcePlacement` with the following spec: - -```yaml -spec: - resourceSelectors: - - group: "" - kind: Namespace - version: v1 - name: test-ns - policy: - placementType: PickN - numberOfClusters: 1 -``` - -The `CRP` object after applying should look something like this: - -```yaml -kubectl get crp test-crp -NAME GEN SCHEDULED SCHEDULED-GEN AVAILABLE AVAILABLE-GEN AGE -test-crp 2 True 2 True 2 8s -``` - -Now we will create a `ClusterResourcePlacementDisruptionBudget` object to protect resources on the member cluster from voluntary disruption: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacementDisruptionBudget -metadata: - name: test-crp -spec: - minAvailable: 1 -``` - -> **Note:** An eviction object is only reconciled once, after which it reaches a terminal state, if the user desires to create/apply the same eviction object again they need to delete the existing eviction object and re-create the object for the eviction to occur again. - -Now we will create a `ClusterResourcePlacementEviction` object to evict resources from the member cluster: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacementEviction -metadata: - name: test-eviction -spec: - placementName: test-crp - clusterName: kind-cluster-1 -``` - -> **Note:** The eviction controller will try to get the corresponding `ClusterResourcePlacementDisruptionBudget` object when a `ClusterResourcePlacementEviction` object is reconciled to check if the specified MaxAvailable or MinAvailable allows the eviction to be executed. - -let's take a look at the eviction object to see if the eviction was executed, - -```yaml -kubectl get crpe test-eviction -NAME VALID EXECUTED -test-eviction True False -``` - -from the eviction object we can see the eviction was not executed. - -let's take a look at the `ClusterResourcePlacementEviction` object status to verify why the eviction was not executed: - -```yaml -status: - conditions: - - lastTransitionTime: "2025-01-21T15:52:29Z" - message: Eviction is valid - observedGeneration: 1 - reason: ClusterResourcePlacementEvictionValid - status: "True" - type: Valid - - lastTransitionTime: "2025-01-21T15:52:29Z" - message: 'Eviction is blocked by specified ClusterResourcePlacementDisruptionBudget, - availablePlacements: 1, totalPlacements: 1' - observedGeneration: 1 - reason: ClusterResourcePlacementEvictionNotExecuted - status: "False" - type: Executed -``` - -the eviction status clearly mentions that the eviction was blocked by the specified `ClusterResourcePlacementDisruptionBudget`. \ No newline at end of file diff --git a/docs/howtos/property-based-scheduling.md b/docs/howtos/property-based-scheduling.md deleted file mode 100644 index 2cc833664..000000000 --- a/docs/howtos/property-based-scheduling.md +++ /dev/null @@ -1,267 +0,0 @@ -# Using property-based scheduling - -This how-to guide discusses how to use property-based scheduling to produce scheduling decisions -based on cluster properties. - -> Note -> -> The availability of properties depend on which (and if) you have a property provider -> set up in your Fleet deployment. For more information, see the -> [Concept: Property Provider and Cluster Properties](../concepts/PropertyProviderAndClusterProperties/README.md) -> documentation. -> -> It is also recommended that you read the -> [How-To Guide: Using Affinity to Pick Clusters](./affinities.md) first before following -> instructions in this document. - -Fleet allows users to pick clusters based on exposed cluster properties via the affinity -terms in the `ClusterResourcePlacement` API: - -* for the `requiredDuringSchedulingIgnoredDuringExecution` affinity terms, you may specify -property selectors to filter clusters based on their properties; -* for the `preferredDuringSchedulingIgnoredDuringExecution` affinity terms, you may specify -property sorters to prefer clusters with a property that ranks higher or lower. - -# Property selectors in `requiredDuringSchedulingIgnoredDuringExecution` affinity terms - -A property selector is an array of expression matchers against cluster properties. -In each matcher you will specify: - -* A name, which is the name of the property. - - If the property is a non-resource one, you may refer to it directly here; however, if the - property is a resource one, the name here should be of the following format: - - ``` - resources.kubernetes-fleet.io/[CAPACITY-TYPE]-[RESOURCE-NAME] - ``` - - where `[CAPACITY-TYPE]` is one of `total`, `allocatable`, or `available`, depending on - which capacity (usage information) you would like to check against, and `[RESOURCE-NAME]` is - the name of the resource. - - For example, if you would like to select clusters based on the available CPU capacity of - a cluster, the name used in the property selector should be - - ``` - resources.kubernetes-fleet.io/available-cpu - ``` - - and for the allocatable memory capacity, use - - ``` - resources.kubernetes-fleet.io/allocatable-memory - ``` - -* A list of values, which are possible values of the property. -* An operator, which describes the relationship between a cluster's observed value of the given -property and the list of values in the matcher. - - Currently, available operators are - - * `Gt` (Greater than): a cluster's observed value of the given property must be greater than - the value in the matcher before it can be picked for resource placement. - * `Ge` (Greater than or equal to): a cluster's observed value of the given property must be - greater than or equal to the value in the matcher before it can be picked for resource placement. - * `Lt` (Less than): a cluster's observed value of the given property must be less than - the value in the matcher before it can be picked for resource placement. - * `Le` (Less than or equal to): a cluster's observed value of the given property must be - less than or equal to the value in the matcher before it can be picked for resource placement. - * `Eq` (Equal to): a cluster's observed value of the given property must be equal to - the value in the matcher before it can be picked for resource placement. - * `Ne` (Not equal to): a cluster's observed value of the given property must be - not equal to the value in the matcher before it can be picked for resource placement. - - Note that if you use the operator `Gt`, `Ge`, `Lt`, `Le`, `Eq`, or `Ne`, the list of values - in the matcher should have exactly one value. - -Fleet will evaluate each cluster, specifically their exposed properties, against the matchers; -failure to satisfy **any** matcher in the selector will exclude the cluster from resource -placement. - -Note that if a cluster does not have the specified property for a matcher, it will automatically -fail the matcher. - -Below is an example that uses a property selector to select only clusters with a node count of -at least 5 for resource placement: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickAll - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - propertySelector: - matchExpressions: - - name: "kubernetes-fleet.io/node-count" - operator: Ge - values: - - "5" -``` - -You may use both label selector and property selector in a -`requiredDuringSchedulingIgnoredDuringExecution` affinity term. Both selectors must be satisfied -before a cluster can be picked for resource placement: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickAll - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - region: east - propertySelector: - matchExpressions: - - name: "kubernetes-fleet.io/node-count" - operator: Ge - values: - - "5" -``` - -In the example above, Fleet will only consider a cluster for resource placement if it has the -`region=east` label and a node count no less than 5. - -# Property sorters in `preferredDuringSchedulingIgnoredDuringExecution` affinity terms - -A property sorter ranks all the clusters in the Fleet based on their values of a specified -property in ascending or descending order, then yields weights for the clusters in proportion -to their ranks. The proportional weights are calculated based on the weight value given in the -`preferredDuringSchedulingIgnoredDuringExecution` term. - -A property sorter consists of: - -* A name, which is the name of the property; see the format in the previous section for more -information. -* A sort order, which is one of `Ascending` and `Descending`, for ranking in ascending and -descending order respectively. - - As a rule of thumb, when the `Ascending` order is used, Fleet will prefer clusters with lower - observed values, and when the `Descending` order is used, clusters with higher observed values - will be preferred. - -When using the sort order `Descending`, the proportional weight is calculated using the formula: - -``` -((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value)) * Weight -``` - -For example, suppose that you would like to rank clusters based on the property of available CPU -capacity in descending order and currently, you have a fleet of 3 clusters with the available CPU -capacities as follows: - -| Cluster | Available CPU capacity | -| -------- | ------- | -| bravelion | 100 | -| smartfish | 20 | -| jumpingcat | 10 | - -The sorter would yield the weights below: - -| Cluster | Available CPU capacity | Weight | -| -------- | ------- | ------- | -| bravelion | 100 | (100 - 10) / (100 - 10) = 100% of the weight | -| smartfish | 20 | (20 - 10) / (100 - 10) = 11.11% of the weight | -| jumpingcat | 10 | (10 - 10) / (100 - 10) = 0% of the weight | - - -And when using the sort order `Ascending`, the proportional weight is calculated using the formula: - -``` -(1 - ((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value))) * Weight -``` - -For example, suppose that you would like to rank clusters based on their per CPU core cost -in ascending order and currently across the fleet, you have a fleet of 3 clusters with the -per CPU core costs as follows: - -| Cluster | Per CPU core cost | -| -------- | ------- | -| bravelion | 1 | -| smartfish | 0.2 | -| jumpingcat | 0.1 | - -The sorter would yield the weights below: - -| Cluster | Per CPU core cost | Weight | -| -------- | ------- | ------- | -| bravelion | 1 | 1 - ((1 - 0.1) / (1 - 0.1)) = 0% of the weight | -| smartfish | 0.2 | 1 - ((0.2 - 0.1) / (1 - 0.1)) = 88.89% of the weight | -| jumpingcat | 0.1 | 1 - (0.1 - 0.1) / (1 - 0.1) = 100% of the weight | - -The example below showcases a property sorter using the `Descending` order: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickN - numberOfClusters: 10 - affinity: - clusterAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 20 - preference: - metricSorter: - name: kubernetes-fleet.io/node-count - sortOrder: Descending -``` - -In this example, Fleet will prefer clusters with higher node counts. The cluster with the highest -node count would receive a weight of 20, and the cluster with the lowest would receive 0. Other -clusters receive proportional weights calculated using the formulas above. - -You may use both label selector and property sorter in a -`preferredDuringSchedulingIgnoredDuringExecution` affinity term. A cluster that fails the label -selector would receive no weight, and clusters that pass the label selector receive proportional -weights under the property sorter. - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickN - numberOfClusters: 10 - affinity: - clusterAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 20 - preference: - labelSelector: - matchLabels: - env: prod - metricSorter: - name: resources.kubernetes-fleet.io/total-cpu - sortOrder: Descending -``` - -In the example above, a cluster would only receive additional weight if it has the label -`env=prod`, and the more total CPU capacity it has, the more weight it will receive, up to the -limit of 20. diff --git a/docs/howtos/reportdiff.md b/docs/howtos/reportdiff.md deleted file mode 100644 index 8b8b7f5ba..000000000 --- a/docs/howtos/reportdiff.md +++ /dev/null @@ -1,178 +0,0 @@ -# How-to Guide: Using the `ReportDiff` Apply Mode - -This guide provides an overview on how to use the `ReportDiff` apply mode, which allows one to -easily evaluate how things will change in the system without the risk of incurring unexpected -changes. In this mode, Fleet will check for configuration differences between the hub cluster -resource templates and their corresponding resources on the member clusters, but will not -perform any apply op. This is most helpful in cases of experimentation and drift/diff analysis. - -# How the `ReportDiff` mode can help - -To use this mode, simply set the `type` field in the apply strategy part of the CRP API -from `ClientSideApply` (the default) or `ServerSideApply` to `ReportDiff`. Configuration -differences are checked per `comparisonOption` setting, in consistency with the behavior -documented in the drift detection how-to guide; see the document for more information. - -The steps below might help explain the workflow better; it assumes that you have a fleet -of two member clusters, `member-1` and `member-2`: - -* Switch to the hub cluster and create a namespace, `work-3`, with some labels. - - ```sh - kubectl config use-context hub-admin - kubectl create ns work-3 - kubectl label ns work-3 app=work-3 - kubectl label ns work-3 owner=leon - ``` - -* Create a CRP object that places the namespace to all member clusters: - - ```sh - cat < Note: The resource can only be selected by name. - - -To add a resource selector, edit the `resourceSelectors` field in the `ResourceOverride` spec: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ResourceOverride -metadata: - name: example-ro - namespace: test-namespace -spec: - placement: - name: crp-example - resourceSelectors: - - group: apps - kind: Deployment - version: v1 - name: my-deployment -``` -> Note: The ResourceOverride needs to be in the same namespace as the resources it is overriding. - -The examples in the tutorial will pick a `Deployment` named `my-deployment` from the namespace `test-namespace`, as shown below, to be overridden. -``` -apiVersion: apps/v1 -kind: Deployment -metadata: - ... - name: my-deployment - namespace: test-namespace - ... -spec: - progressDeadlineSeconds: 600 - replicas: 2 - revisionHistoryLimit: 10 - selector: - matchLabels: - app: test-nginx - strategy: - rollingUpdate: - maxSurge: 25% - maxUnavailable: 25% - type: RollingUpdate - template: - metadata: - creationTimestamp: null - labels: - app: test-nginx - spec: - containers: - - image: nginx:1.14.2 - imagePullPolicy: IfNotPresent - name: nginx - ports: - - containerPort: 80 - protocol: TCP - resources: {} - terminationMessagePath: /dev/termination-log - terminationMessagePolicy: File - dnsPolicy: ClusterFirst - restartPolicy: Always - schedulerName: default-scheduler - securityContext: {} - terminationGracePeriodSeconds: 30 -status: - ... -``` - -## Policy -The `Policy` is made up of a set of rules (`OverrideRules`) that specify the changes to be applied to the selected -resources on selected clusters. - -Each `OverrideRule` supports the following fields: -- **Cluster Selector**: This specifies the set of clusters to which the override applies. -- **Override Type**: This specifies the type of override to be applied. The default type is `JSONPatch`. - - `JSONPatch`: applies the JSON patch to the selected resources using [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902). - - `Delete`: deletes the selected resources on the target cluster. -- **JSON Patch Override**: This specifies the changes to be applied to the selected resources when the override type is `JSONPatch`. - -### Cluster Selector -To specify the clusters to which the override applies, you can use the `clusterSelector` field in the `OverrideRule` spec. -The `clusterSelector` field supports the following fields: -- `clusterSelectorTerms`: A list of terms that are used to select clusters. - * Each term in the list is used to select clusters based on the label selector. - -### Override Type -To specify the type of override to be applied, you can use the overrideType field in the OverrideRule spec. -The default value is `JSONPatch`. -- `JSONPatch`: applies the JSON patch to the selected resources using [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902). -- `Delete`: deletes the selected resources on the target cluster. - -#### JSON Patch Override -To specify the changes to be applied to the selected resources, you can use the jsonPatchOverrides field in the OverrideRule spec. -The jsonPatchOverrides field supports the following fields: - ->JSONPatchOverride applies a JSON patch on the selected resources following [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902). -> All the fields defined follow this RFC. - -The `jsonPatchOverrides` field supports the following fields: -- `op`: The operation to be performed. The supported operations are `add`, `remove`, and `replace`. - * `add`: Adds a new value to the specified path. - * `remove`: Removes the value at the specified path. - * `replace`: Replaces the value at the specified path. - -- `path`: The path to the field to be modified. - * Some guidelines for the path are as follows: - * Must start with a `/` character. - * Cannot be empty. - * Cannot contain an empty string ("///"). - * Cannot be a TypeMeta Field ("/kind", "/apiVersion"). - * Cannot be a Metadata Field ("/metadata/name", "/metadata/namespace"), except the fields "/metadata/annotations" and "metadata/labels". - * Cannot be any field in the status of the resource. - * Some examples of valid paths are: - * `/metadata/labels/new-label` - * `/metadata/annotations/new-annotation` - * `/spec/template/spec/containers/0/resources/limits/cpu` - * `/spec/template/spec/containers/0/resources/requests/memory` - - -- `value`: The value to be set. - * If the `op` is `remove`, the value cannot be set. - * There is a list of reserved variables that will be replaced by the actual values: - * `${MEMBER-CLUSTER-NAME}`: this will be replaced by the name of the `memberCluster` that represents this cluster. - -##### Example: Override Labels - -To overwrite the existing labels on the `Deployment` named `my-deployment` on clusters with the label `env: prod`, -you can use the following configuration: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ResourceOverride -metadata: - name: example-ro - namespace: test-namespace -spec: - placement: - name: crp-example - resourceSelectors: - - group: apps - kind: Deployment - version: v1 - name: my-deployment - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - jsonPatchOverrides: - - op: add - path: /metadata/labels - value: - {"cluster-name":"${MEMBER-CLUSTER-NAME}"} -``` - -> Note: To add a new label to the existing labels, please use the below configuration: -> ```yaml -> - op: add -> path: /metadata/labels/new-label -> value: "new-value" -> ``` - -The `ResourceOverride` object above will add a label `cluster-name` with the value of the `memberCluster` name to the `Deployment` named `example-ro` on clusters with the label `env: prod`. - -##### Example: Override Image - -To override the image of the container in the `Deployment` named `my-deployment` on all clusters with the label `env: prod`: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ResourceOverride -metadata: - name: example-ro - namespace: test-namespace -spec: - placement: - name: crp-example - resourceSelectors: - - group: apps - kind: Deployment - version: v1 - name: my-deployment - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - jsonPatchOverrides: - - op: replace - path: /spec/template/spec/containers/0/image - value: "nginx:1.20.0" -``` -The `ResourceOverride` object above will replace the image of the container in the `Deployment` named `my-deployment` -with the image `nginx:1.20.0` on all clusters with the label `env: prod` selected by the clusterResourcePlacement `crp-example`. -> The ResourceOverride mentioned above utilizes the deployment displayed below: -> ``` -> apiVersion: apps/v1 -> kind: Deployment -> metadata: -> ... -> name: my-deployment -> namespace: test-namespace -> ... -> spec: -> ... -> template: -> ... -> spec: -> containers: -> - image: nginx:1.14.2 -> imagePullPolicy: IfNotPresent -> name: nginx -> ports: -> ... -> ... -> ... ->``` - -#### Delete - -The `Delete` override type can be used to delete the selected resources on the target cluster. - -##### Example: Delete Selected Resource - -To delete the `my-deployment` on the clusters with the label `env: test` selected by the clusterResourcePlacement `crp-example`, -you can use the `Delete` override type. -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ResourceOverride -metadata: - name: example-ro - namespace: test-namespace -spec: - placement: - name: crp-example - resourceSelectors: - - group: apps - kind: Deployment - version: v1 - name: my-deployment - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: test - overrideType: Delete -``` - -### Multiple Override Rules - -You may add multiple `OverrideRules` to a `Policy` to apply multiple changes to the selected resources. -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ResourceOverride -metadata: - name: example-ro - namespace: test-namespace -spec: - placement: - name: crp-example - resourceSelectors: - - group: apps - kind: Deployment - version: v1 - name: my-deployment - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - jsonPatchOverrides: - - op: replace - path: /spec/template/spec/containers/0/image - value: "nginx:1.20.0" - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: test - jsonPatchOverrides: - - op: replace - path: /spec/template/spec/containers/0/image - value: "nginx:latest" -``` -The `ResourceOverride` object above will replace the image of the container in the `Deployment` named `my-deployment` -with the image `nginx:1.20.0` on all clusters with the label `env: prod` and the image `nginx:latest` on all clusters with the label `env: test`. - -> The ResourceOverride mentioned above utilizes the deployment displayed below: -> ``` -> apiVersion: apps/v1 -> kind: Deployment -> metadata: -> ... -> name: my-deployment -> namespace: test-namespace -> ... -> spec: -> ... -> template: -> ... -> spec: -> containers: -> - image: nginx:1.14.2 -> imagePullPolicy: IfNotPresent -> name: nginx -> ports: -> ... -> ... -> ... ->``` - -## Applying the ResourceOverride -Create a ClusterResourcePlacement resource to specify the placement rules for distributing the resource overrides across -the cluster infrastructure. Ensure that you select the appropriate namespaces containing the matching resources. -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp-example -spec: - resourceSelectors: - - group: "" - kind: Namespace - name: test-namespace - version: v1 - policy: - placementType: PickAll - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - - labelSelector: - matchLabels: - env: test -``` -The `ClusterResourcePlacement` configuration outlined above will disperse resources within `test-namespace` across all -clusters labeled with `env: prod` and `env: test`. As the changes are implemented, the corresponding `ResourceOverride` -configurations will be applied to the designated clusters, triggered by the selection of matching deployment resource -`my-deployment`. - -## Verifying the Cluster Resource is Overridden -To ensure that the `ResourceOverride` object is applied to the selected resources, verify the `ClusterResourcePlacement` -status by running `kubectl describe crp crp-example` command: -``` -Status: - Conditions: - ... - Message: The selected resources are successfully overridden in the 10 clusters - Observed Generation: 1 - Reason: OverriddenSucceeded - Status: True - Type: ClusterResourcePlacementOverridden - ... - Observed Resource Index: 0 - Placement Statuses: - Applicable Resource Overrides: - Name: example-ro-0 - Namespace: test-namespace - Cluster Name: member-50 - Conditions: - ... - Last Transition Time: 2024-04-26T22:57:14Z - Message: Successfully applied the override rules on the resources - Observed Generation: 1 - Reason: OverriddenSucceeded - Status: True - Type: Overridden - ... -``` -Each cluster maintains its own `Applicable Resource Overrides` which contain the resource override snapshot and -the resource override namespace if relevant. Additionally, individual status messages for each cluster indicates -whether the override rules have been effectively applied. - -The `ClusterResourcePlacementOverridden` condition indicates whether the resource override has been successfully applied -to the selected resources in the selected clusters. - -To verify that the `ResourceOverride` object has been successfully applied to the selected resources, -check resources in the selected clusters: -1. Get cluster credentials: - `az aks get-credentials --resource-group --name ` -2. Get the `Deployment` object in the selected cluster: - `kubectl --context= get deployment my-deployment -n test-namespace -o yaml` - -Upon inspecting the member cluster, it was found that the selected cluster had the label env: prod. -Consequently, the image on deployment `my-deployment` was modified to be `nginx:1.20.0` on selected cluster. - ``` - apiVersion: apps/v1 - kind: Deployment - metadata: - ... - name: my-deployment - namespace: test-namespace - ... - spec: - ... - template: - ... - spec: - containers: - - image: nginx:1.20.0 - imagePullPolicy: IfNotPresent - name: nginx - ports: - ... - ... - status: - ... -``` \ No newline at end of file diff --git a/docs/howtos/taint-toleration.md b/docs/howtos/taint-toleration.md deleted file mode 100644 index 2768020a7..000000000 --- a/docs/howtos/taint-toleration.md +++ /dev/null @@ -1,324 +0,0 @@ -# Adding/Removing taints on MemberCluster and Adding tolerations on ClusterResourcePlacement - -This how-to guide discusses how to add/remove taints on `MemberCluster` and how to add tolerations on `ClusterResourcePlacement`. - -## Adding taint to MemberCluster - -In this example, we will add a taint to a `MemberCluster`. Then try to propagate resources to the `MemberCluster` using a `ClusterResourcePlacement` -with **PickAll** placement policy. The resources should not be propagated to the `MemberCluster` because of the taint. - -We will first create a namespace that we will propagate to the member cluster, - -``` -kubectl create ns test-ns -``` - -Then apply the `MemberCluster` with a taint, - -Example `MemberCluster` with taint: - -```yaml -apiVersion: cluster.kubernetes-fleet.io/v1beta1 -kind: MemberCluster -metadata: - name: kind-cluster-1 -spec: - identity: - name: fleet-member-agent-cluster-1 - kind: ServiceAccount - namespace: fleet-system - apiGroup: "" - taints: - - key: test-key1 - value: test-value1 - effect: NoSchedule -``` - -After applying the above `MemberCluster`, we will apply a `ClusterResourcePlacement` with the following spec: - -```yaml - resourceSelectors: - - group: "" - kind: Namespace - version: v1 - name: test-ns - policy: - placementType: PickAll -``` - -The `ClusterResourcePlacement` CR should not propagate the `test-ns` namespace to the member cluster because of the taint, -looking at the status of the CR should show the following: - -```yaml -status: - conditions: - - lastTransitionTime: "2024-04-16T19:03:17Z" - message: found all the clusters needed as specified by the scheduling policy - observedGeneration: 2 - reason: SchedulingPolicyFulfilled - status: "True" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-04-16T19:03:17Z" - message: All 0 cluster(s) are synchronized to the latest resources on the hub - cluster - observedGeneration: 2 - reason: SynchronizeSucceeded - status: "True" - type: ClusterResourcePlacementSynchronized - - lastTransitionTime: "2024-04-16T19:03:17Z" - message: There are no clusters selected to place the resources - observedGeneration: 2 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - observedResourceIndex: "0" - selectedResources: - - kind: Namespace - name: test-ns - version: v1 -``` - -Looking at the `ClusterResourcePlacementSynchronized`, `ClusterResourcePlacementApplied` conditions and reading the message fields -we can see that no clusters were selected to place the resources. - -## Removing taint from MemberCluster - -In this example, we will remove the taint from the `MemberCluster` from the last section. This should automatically trigger the Fleet scheduler to propagate the resources to the `MemberCluster`. - -After removing the taint from the `MemberCluster`. Let's take a look at the status of the `ClusterResourcePlacement`: - -```yaml -status: - conditions: - - lastTransitionTime: "2024-04-16T20:00:03Z" - message: found all the clusters needed as specified by the scheduling policy - observedGeneration: 2 - reason: SchedulingPolicyFulfilled - status: "True" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-04-16T20:02:57Z" - message: All 1 cluster(s) are synchronized to the latest resources on the hub - cluster - observedGeneration: 2 - reason: SynchronizeSucceeded - status: "True" - type: ClusterResourcePlacementSynchronized - - lastTransitionTime: "2024-04-16T20:02:57Z" - message: Successfully applied resources to 1 member clusters - observedGeneration: 2 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - observedResourceIndex: "0" - placementStatuses: - - clusterName: kind-cluster-1 - conditions: - - lastTransitionTime: "2024-04-16T20:02:52Z" - message: 'Successfully scheduled resources for placement in kind-cluster-1 (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 2 - reason: ScheduleSucceeded - status: "True" - type: Scheduled - - lastTransitionTime: "2024-04-16T20:02:57Z" - message: Successfully Synchronized work(s) for placement - observedGeneration: 2 - reason: WorkSynchronizeSucceeded - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-04-16T20:02:57Z" - message: Successfully applied resources - observedGeneration: 2 - reason: ApplySucceeded - status: "True" - type: Applied - selectedResources: - - kind: Namespace - name: test-ns - version: v1 -``` - -From the status we can clearly see that the resources were propagated to the member cluster after removing the taint. - -## Adding toleration to ClusterResourcePlacement - -Adding a toleration to a `ClusterResourcePlacement` CR allows the Fleet scheduler to tolerate specific taints on the `MemberClusters`. - -For this section we will start from scratch, we will first create a namespace that we will propagate to the `MemberCluster` - -``` -kubectl create ns test-ns -``` - -Then apply the `MemberCluster` with a taint, - -Example `MemberCluster` with taint: - -```yaml -spec: - heartbeatPeriodSeconds: 60 - identity: - apiGroup: "" - kind: ServiceAccount - name: fleet-member-agent-cluster-1 - namespace: fleet-system - taints: - - effect: NoSchedule - key: test-key1 - value: test-value1 -``` - -The `ClusterResourcePlacement` CR will not propagate the `test-ns` namespace to the member cluster because of the taint. - -Now we will add a toleration to a `ClusterResourcePlacement` CR as part of the placement policy, which will use the Exists operator to tolerate the taint. - -Example `ClusterResourcePlacement` spec with tolerations after adding new toleration: - -```yaml -spec: - policy: - placementType: PickAll - tolerations: - - key: test-key1 - operator: Exists - resourceSelectors: - - group: "" - kind: Namespace - name: test-ns - version: v1 - revisionHistoryLimit: 10 - strategy: - type: RollingUpdate -``` - -Let's take a look at the status of the `ClusterResourcePlacement` CR after adding the toleration: - -```yaml -status: - conditions: - - lastTransitionTime: "2024-04-16T20:16:10Z" - message: found all the clusters needed as specified by the scheduling policy - observedGeneration: 3 - reason: SchedulingPolicyFulfilled - status: "True" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-04-16T20:16:15Z" - message: All 1 cluster(s) are synchronized to the latest resources on the hub - cluster - observedGeneration: 3 - reason: SynchronizeSucceeded - status: "True" - type: ClusterResourcePlacementSynchronized - - lastTransitionTime: "2024-04-16T20:16:15Z" - message: Successfully applied resources to 1 member clusters - observedGeneration: 3 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - observedResourceIndex: "0" - placementStatuses: - - clusterName: kind-cluster-1 - conditions: - - lastTransitionTime: "2024-04-16T20:16:10Z" - message: 'Successfully scheduled resources for placement in kind-cluster-1 (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 3 - reason: ScheduleSucceeded - status: "True" - type: Scheduled - - lastTransitionTime: "2024-04-16T20:16:15Z" - message: Successfully Synchronized work(s) for placement - observedGeneration: 3 - reason: WorkSynchronizeSucceeded - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-04-16T20:16:15Z" - message: Successfully applied resources - observedGeneration: 3 - reason: ApplySucceeded - status: "True" - type: Applied - selectedResources: - - kind: Namespace - name: test-ns - version: v1 -``` - -From the status we can see that the resources were propagated to the `MemberCluster` after adding the toleration. - -Now let's try adding a new taint to the member cluster CR and see if the resources are still propagated to the `MemberCluster`, - -Example `MemberCluster` CR with new taint: - -```yaml - heartbeatPeriodSeconds: 60 - identity: - apiGroup: "" - kind: ServiceAccount - name: fleet-member-agent-cluster-1 - namespace: fleet-system - taints: - - effect: NoSchedule - key: test-key1 - value: test-value1 - - effect: NoSchedule - key: test-key2 - value: test-value2 -``` - -Let's take a look at the `ClusterResourcePlacement` CR status after adding the new taint: - -```yaml -status: - conditions: - - lastTransitionTime: "2024-04-16T20:27:44Z" - message: found all the clusters needed as specified by the scheduling policy - observedGeneration: 2 - reason: SchedulingPolicyFulfilled - status: "True" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-04-16T20:27:49Z" - message: All 1 cluster(s) are synchronized to the latest resources on the hub - cluster - observedGeneration: 2 - reason: SynchronizeSucceeded - status: "True" - type: ClusterResourcePlacementSynchronized - - lastTransitionTime: "2024-04-16T20:27:49Z" - message: Successfully applied resources to 1 member clusters - observedGeneration: 2 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - observedResourceIndex: "0" - placementStatuses: - - clusterName: kind-cluster-1 - conditions: - - lastTransitionTime: "2024-04-16T20:27:44Z" - message: 'Successfully scheduled resources for placement in kind-cluster-1 (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 2 - reason: ScheduleSucceeded - status: "True" - type: Scheduled - - lastTransitionTime: "2024-04-16T20:27:49Z" - message: Successfully Synchronized work(s) for placement - observedGeneration: 2 - reason: WorkSynchronizeSucceeded - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-04-16T20:27:49Z" - message: Successfully applied resources - observedGeneration: 2 - reason: ApplySucceeded - status: "True" - type: Applied - selectedResources: - - kind: Namespace - name: test-ns - version: v1 -``` - -Nothing changes in the status because even if the new taint is not tolerated, the existing resources on the `MemberCluster` -will continue to run because the taint effect is `NoSchedule` and the cluster was already selected for resource propagation in a -previous scheduling cycle. diff --git a/docs/howtos/takeover.md b/docs/howtos/takeover.md deleted file mode 100644 index 8d3597fc0..000000000 --- a/docs/howtos/takeover.md +++ /dev/null @@ -1,368 +0,0 @@ -# How-to Guide: Enabling Drift Detection in Fleet - -This guide provides an overview on how to set up Fleet's takeover experience, which allows -developers and admins to choose what will happen when Fleet encounters a pre-existing resource. -This occurs most often in the Fleet adoption scenario, where a cluster just joins into a fleet and -the system finds out that the resources to place onto the new member cluster via the CRP API has -already been running there. - -A concern commonly associated with this scenario is that the running (pre-existing) set of -resources might have configuration differences from their equivalents on the hub cluster, -for example: On the hub cluster one might have a namespace `work` where it hosts a deployment -`web-server` that runs the image `rpd-stars:latest`; while on the member cluster in the same -namespace lives a deployment of the same name but with the image `umbrella-biolab:latest`. -If Fleet applies the resource template from the hub cluster, unexpected service interruptions -might occur. - -To address this concern, Fleet also introduces a new field, `whenToTakeOver`, in the apply -strategy. Two options are available: - -* `Always`: this is the default option 😑. With this setting, Fleet will take over a -pre-existing resource as soon as it encounters them. Fleet will apply the corresponding -resource template from the hub cluster, and any value differences in the managed fields -will be overwritten. This is consistent with the behavior before the new takeover experience is -added. -* `IfNoDiff`: this is the new option ✨ provided by the takeover mechanism. With this setting, -Fleet will check for configuration differences when it finds a pre-existing resource and -will only take over the resource (apply the resource template) if no configuration -differences are found. Consider using this option for a safer adoption journey. -* `Never`: this is another new option ✨ provided by the takeover mechanism. With this setting, -Fleet will ignore pre-existing resources and no apply op will be performed. This will be considered -as an apply error. Use this option if you would like to check for the presence of pre-existing -resources without taking any action. - -> Before you begin -> -> The new takeover experience is currently in preview. -> -> Note that the APIs for the new experience are only available in the Fleet v1beta1 API, not the v1 API. If you do not see the new APIs in command outputs, verify that you are explicitly requesting the v1beta1 API objects, as opposed to the v1 API objects (the default). - -## How Fleet can be used to safely take over pre-existing resources - -The steps below explain how the takeover experience functions. The code assumes that you have -a fleet of two clusters, `member-1` and `member-2`: - -* Switch to the second member cluster, and create a namespace, `work-2`, with labels: - - ```sh - kubectl config use-context member-2-admin - kubectl create ns work-2 - kubectl label ns work-2 app=work-2 - kubectl label ns work-2 owner=wesker - ``` - -* Switch to the hub cluster, and create the same namespace, but with a slightly different set of labels: - - ```sh - kubectl config use-context hub-admin - kubectl create ns work-2 - kubectl label ns work-2 app=work-2 - kubectl label ns work-2 owner=redfield - ``` - -* Create a CRP object that places the namespace to all member clusters: - - ```sh - cat < Important -> -> When Fleet fails to take over an object, the pre-existing resource will not be put under Fleet's management: any change one makes on the hub cluster side will have no effect on the pre-existing resource. If you choose to delete -the resource template, or remove the CRP object, Fleet will not attempt to delete the pre-existing resource. - -## Takeover and comparison options - -Fleet provides a `comparisonOptions` setting that allows you to fine-tune how Fleet calculate -configuration differences between a resource template created on the hub cluster and the -corresponding pre-existing resource on a member cluster. - -> Note -> -> The `comparisonOptions` setting controls also how Fleet detect drifts. See the how-to guide on drift detection for more information. - -If `partialComparison` is used, Fleet will only report configuration differences in the managed -fields, i.e., fields that are explicitly specified in the resource template; the presence of additional -fields on the member cluster side will not stop Fleet from taking -over the pre-existing resource; on the contrary, with `fullComparison`, Fleet will only take over -a pre-existing resource if it looks exactly the same as its hub cluster counterpart. - -Below is the synergy table that summarizes the combos and their respective effects: - -| `whenToTakeOver` setting | `comparisonOption` setting | Configuration difference scenario | Outcome -| -------- | ------- | -------- | ------- | -| `IfNoDiff` | `partialComparison` | There exists a value difference in a managed field between a pre-existing resource on a member cluster and the hub cluster resource template. | Fleet will report an apply error in the status, plus the diff details. | -| `IfNoDiff` | `partialComparison` | The pre-existing resource has a field that is absent on the hub cluster resource template. | Fleet will take over the resource; the configuration difference in the unmanaged field will be left untouched. | -| `IfNoDiff` | `fullComparison` | **Difference has been found on a field, managed or not.** | Fleet will report an apply error in the status, plus the diff details. | -| `Always` | any option | Difference has been found on a field, managed or not. | Fleet will take over the resource; configuration differences in unmanaged fields will be left untouched. | diff --git a/docs/howtos/topology-spread-constraints.md b/docs/howtos/topology-spread-constraints.md deleted file mode 100644 index 421cf264d..000000000 --- a/docs/howtos/topology-spread-constraints.md +++ /dev/null @@ -1,232 +0,0 @@ -# Using Topology Spread Constraints to Pick Clusters - -This how-to guide discusses how to use topology spread constraints to fine-tune how Fleet picks -clusters for resource placement. - -Topology spread constraints are features in the `ClusterResourcePlacement` API, specifically -the scheduling policy section. Generally speaking, these constraints can help you spread -resources evenly across different groups of clusters in your fleet; or in other words, it -assures that Fleet will not pick too many clusters from one group, and too little from another. -You can use topology spread constraints to, for example: - -* achieve high-availability for your database backend by making sure that there is at least -one database replica in each region; or -* verify if your application can support clusters of different configurations; or -* eliminate resource utilization hotspots in your infrastructure through spreading jobs -evenly across sections. - -## Specifying a topology spread constraint - -A topology spread constraint consists of three fields: - -* `topologyKey` is a label key which Fleet uses to split your clusters from a fleet into different -groups. - - Specifically, clusters are grouped by the label values they have. For example, if you have - three clusters in a fleet: - - * cluster `bravelion` with the label `system=critical` and `region=east`; and - * cluster `smartfish` with the label `system=critical` and `region=west`; and - * cluster `jumpingcat` with the label `system=normal` and `region=east`, - - and you use `system` as the topology key, the clusters will be split into 2 groups: - - * group 1 with cluster `bravelion` and `smartfish`, as they both have the value `critical` - for label `system`; and - * group 2 with cluster `jumpingcat`, as it has the value `normal` for label `system`. - - Note that the splitting concerns only one label `system`; other labels, - such as `region`, do not count. - - If a cluster does not have the given topology key, it **does not** belong to any group. - Fleet may still pick this cluster, as placing resources on it does not violate the - associated topology spread constraint. - - This is a required field. - -* `maxSkew` specifies how **unevenly** resource placements are spread in your fleet. - - The skew of a set of resource placements are defined as the difference in count of - resource placements between the group with the most and the group with - the least, as split by the topology key. - - For example, in the fleet described above (3 clusters, 2 groups): - - * if Fleet picks two clusters from group A, but none from group B, the skew would be - `2 - 0 = 2`; however, - * if Fleet picks one cluster from group A and one from group B, the skew would be - `1 - 1 = 0`. - - The minimum value of `maxSkew` is 1. The less you set this value with, the more evenly - resource placements are spread in your fleet. - - This is a required field. - - > Note - > - > Naturally, `maxSkew` only makes sense when there are no less than two groups. If you - > set a topology key that will not split the Fleet at all (i.e., all clusters with - > the given topology key has exactly the same value), the associated topology spread - > constraint will take no effect. - -* `whenUnsatisfiable` specifies what Fleet would do when it exhausts all options to satisfy the -topology spread constraint; that is, picking any cluster in the fleet would lead to a violation. - - Two options are available: - - * `DoNotSchedule`: with this option, Fleet would guarantee that the topology spread constraint - will be enforced all time; scheduling may fail if there is simply no possible way to satisfy - the topology spread constraint. - - * `ScheduleAnyway`: with this option, Fleet would enforce the topology spread constraint - in a best-effort manner; Fleet may, however, pick clusters that would violate the topology - spread constraint if there is no better option. - - This is an optional field; if you do not specify a value, Fleet will use `DoNotSchedule` by - default. - -Below is an example of topology spread constraint, which tells Fleet to pick clusters evenly -from different groups, split based on the value of the label `system`: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickN - numberOfClusters: 3 - topologySpreadConstraints: - - maxSkew: 2 - topologyKey: system - whenUnsatisfiable: DoNotSchedule -``` - -## How Fleet enforces topology spread constraints: topology spread scores - -When you specify some topology spread constraints in the scheduling policy of -a `ClusterResourcePlacement` object, Fleet will start picking clusters **one at a time**. -More specifically, Fleet will: - -* for each cluster in the fleet, evaluate how skew would change if resources were placed on it. - - Depending on the current spread of resource placements, there are three possible outcomes: - - * placing resources on the cluster reduces the skew by 1; or - * placing resources on the cluster has no effect on the skew; or - * placing resources on the cluster increases the skew by 1. - - Fleet would then assign a topology spread score to the cluster: - - * if the provisional placement reduces the skew by 1, the cluster receives a topology spread - score of 1; or - * if the provisional placement has no effect on the skew, the cluster receives a topology - spread score of 0; or - * if the provisional placement increases the skew by 1, but does not yet exceed the max skew - specified in the constraint, the cluster receives a topology spread score of -1; or - * if the provisional placement increases the skew by 1, and has exceeded the max skew specified in the constraint, - - * for topology spread constraints with the `ScheduleAnyway` effect, the cluster receives a topology spread score of -1000; and - * for those with the `DoNotSchedule` effect, the cluster will be removed from - resource placement consideration. - -* rank the clusters based on the topology spread score and other factors (e.g., affinity), -pick the one that is most appropriate. -* repeat the process, until all the needed count of clusters are found. - -Below is an example that illustrates the process: - -Suppose you have a fleet of 4 clusters: - -* cluster `bravelion`, with label `region=east` and `system=critical`; and -* cluster `smartfish`, with label `region=east`; and -* cluster `jumpingcat`, with label `region=west`, and `system=critical`; and -* cluster `flyingpenguin`, with label `region=west`, - -And you have created a `ClusterResourcePlacement` as follows: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickN - numberOfClusters: 2 - topologySpreadConstraints: - - maxSkew: 1 - topologyKey: region - whenUnsatisfiable: DoNotSchedule -``` - -Fleet will first scan all the 4 clusters in the fleet; they all have the `region` label, with -two different values `east` and `west` (2 cluster in each of them). This divides the clusters -into two groups, the `east` and the `west` - -At this stage, no cluster has been picked yet, so there is no resource placement at all. The -current skew is thus 0, and placing resources on any of them would increase the skew by 1. This -is still below the `maxSkew` threshold given, so all clusters would receive a topology spread -score of -1. - -Fleet could not find the most appropriate cluster based on the topology spread score so far, -so it would resort to other measures for ranking clusters. This would lead Fleet to pick cluster -`smartfish`. - -> Note -> -> See [Using `ClusterResourcePlacement` to Place Resources](crp.md) How-To Guide for more -> information on how Fleet picks clusters. - -Now, one cluster has been picked, and one more is needed by the `ClusterResourcePlacement` -object (as the `numberOfClusters` field is set to 2). Fleet scans the left 3 clusters again, -and this time, since `smartfish` from group `east` has been picked, any more resource placement -on clusters from group `east` would increase the skew by 1 more, and would lead to violation -of the topology spread constraint; Fleet will then assign the topology spread score of -1000 to -cluster `bravelion`, which is in group `east`. On the contrary, picking a cluster from any -cluster in group `west` would reduce the skew by 1, so Fleet assigns the topology spread score -of 1 to cluster `jumpingcat` and `flyingpenguin`. - -With the higher topology spread score, `jumpingcat` and `flyingpenguin` become the leading -candidate in ranking. They have the same topology spread score, and based on the rules Fleet -has for picking clusters, `jumpingcat` would be picked finally. - -## Using multiple topology spread constraints - -You can, if necessary, use multiple topology spread constraints. Fleet will evaluate each of them -separately, and add up topology spread scores for each cluster for the final ranking. A cluster -would be removed from resource placement consideration if placing resources on it would violate -any one of the `DoNotSchedule` topology spread constraints. - -Below is an example where two topology spread constraints are used: - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: crp -spec: - resourceSelectors: - - ... - policy: - placementType: PickN - numberOfClusters: 2 - topologySpreadConstraints: - - maxSkew: 2 - topologyKey: region - whenUnsatisfiable: DoNotSchedule - - maxSkew: 3 - topologyKey: environment - whenUnsatisfiable: ScheduleAnyway -``` - -> Note -> -> It might be very difficult to find candidate clusters when multiple topology spread constraints -> are added. Considering using the `ScheduleAnyway` effect to add some leeway to the scheduling, -> if applicable. diff --git a/docs/howtos/updaterun.md b/docs/howtos/updaterun.md deleted file mode 100644 index 992653500..000000000 --- a/docs/howtos/updaterun.md +++ /dev/null @@ -1,540 +0,0 @@ -# How-to Guide: Using `ClusterStagedUpdateRun` for Rollout and Rollback - -This how-to guide demonstrates how to use `ClusterStagedUpdateRun` to rollout resources to member clusters in a staged manner and rollback resources to a previous version. - -## Prerequisite - -`ClusterStagedUpdateRun` CR is used to deploy resources from hub cluster to member clusters with `ClusterResourcePlacement` (or CRP) in a stage by stage manner. This tutorial is based on a demo fleet environment with 3 member clusters: -| cluster name | labels | -|--------------|-----------------------------| -| member1 | environment=canary, order=2 | -| member2 | environment=staging | -| member3 | environment=canary, order=1 | - -To demonstrate the rollout and rollback behavior, we create a demo namespace and a sample configmap with very simple data on the hub cluster. The namespace with configmap will be deployed to the member clusters. -```bash -kubectl create ns test-namespace -kubectl create cm test-cm --from-literal=key=value1 -n test-namespace -``` - -Now we create a `ClusterResourcePlacement` to deploy the resources: -```bash -kubectl apply -f - << EOF -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourcePlacement -metadata: - name: example-placement -spec: - resourceSelectors: - - group: "" - kind: Namespace - name: test-namespace - version: v1 - policy: - placementType: PickAll - strategy: - type: External -EOF -``` -**Note that `spec.strategy.type` is set to `External` to allow rollout triggered with a ClusterStagedUpdateRun.** -Both clusters should be scheduled since we use the `PickAll` policy but at the moment no resource should be deployed on the member clusters because we haven't created a `ClusterStagedUpdateRun` yet. The CRP is not AVAILABLE yet. -```bash -kubectl get crp example-placement -NAME GEN SCHEDULED SCHEDULED-GEN AVAILABLE AVAILABLE-GEN AGE -example-placement 1 True 1 8s -``` - -## Check resource snapshot versions - -Fleet keeps a list of resource snapshots for version control and audit, (for more details, please refer to [api-references](../api-references.md)). - -To check current resource snapshots: -```bash -kubectl get clusterresourcesnapshots --show-labels -NAME GEN AGE LABELS -example-placement-0-snapshot 1 7m31s kubernetes-fleet.io/is-latest-snapshot=true,kubernetes-fleet.io/parent-CRP=example-placement,kubernetes-fleet.io/resource-index=0 -``` -We only have one version of the snapshot. It is the current latest (`kubernetes-fleet.io/is-latest-snapshot=true`) and has resource-index 0 (`kubernetes-fleet.io/resource-index=0`). - -Now we modify the our configmap with a new value `value2`: -```bash -kubectl edit cm test-cm -n test-namespace - -kubectl get configmap test-cm -n test-namespace -o yaml -apiVersion: v1 -data: - key: value2 # value updated here, old value: value1 -kind: ConfigMap -metadata: - creationTimestamp: ... - name: test-cm - namespace: test-namespace - resourceVersion: ... - uid: ... -``` - -It now shows 2 versions of resource snapshots with index 0 and 1 respectively: -```bash -kubectl get clusterresourcesnapshots --show-labels -NAME GEN AGE LABELS -example-placement-0-snapshot 1 17m kubernetes-fleet.io/is-latest-snapshot=false,kubernetes-fleet.io/parent-CRP=example-placement,kubernetes-fleet.io/resource-index=0 -example-placement-1-snapshot 1 2m2s kubernetes-fleet.io/is-latest-snapshot=true,kubernetes-fleet.io/parent-CRP=example-placement,kubernetes-fleet.io/resource-index=1 -``` - -The `latest` label set to `example-placement-1-snapshot` which contains the latest configmap data: -```bash -kubectl get clusterresourcesnapshots example-placement-1-snapshot -o yaml -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterResourceSnapshot -metadata: - ... - labels: - kubernetes-fleet.io/is-latest-snapshot: "true" - kubernetes-fleet.io/parent-CRP: example-placement - kubernetes-fleet.io/resource-index: "1" - name: example-placement-1-snapshot - ... -spec: - selectedResources: - - apiVersion: v1 - kind: Namespace - metadata: - labels: - kubernetes.io/metadata.name: test-namespace - name: test-namespace - spec: - finalizers: - - kubernetes - - apiVersion: v1 - data: - key: value2 # latest value: value2, old value: value1 - kind: ConfigMap - metadata: - name: test-cm - namespace: test-namespace -``` - -## Deploy a ClusterStagedUpdateStrategy - -A `ClusterStagedUpdateStrategy` defines the orchestration pattern that groups clusters into stages and specifies the rollout sequence. -It selects member clusters by labels. For our demonstration, we create one with two stages: -```bash -kubectl apply -f - << EOF -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateStrategy -metadata: - name: example-strategy -spec: - stages: - - name: staging - labelSelector: - matchLabels: - environment: staging - afterStageTasks: - - type: TimedWait - waitTime: 1m - - name: canary - labelSelector: - matchLabels: - environment: canary - sortingLabelKey: order - afterStageTasks: - - type: Approval -EOF -``` - -## Deploy a ClusterStagedUpdateRun to rollout latest change - -A `ClusterStagedUpdateRun` executes the rollout of a `ClusterResourcePlacement` following a `ClusterStagedUpdateStrategy`. To trigger the staged update run for our CRP, we create a `ClusterStagedUpdateRun` specifying the CRP name, updateRun strategy name, and the latest resource snapshot index ("1"): -```bash -kubectl apply -f - << EOF -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateRun -metadata: - name: example-run -spec: - placementName: example-placement - resourceSnapshotIndex: "1" - stagedRolloutStrategyName: example-strategy -EOF -``` - -The staged update run is initialized and running: -```bash -kubectl get crsur example-run -NAME PLACEMENT RESOURCE-SNAPSHOT POLICY-SNAPSHOT INITIALIZED SUCCEEDED AGE -example-run example-placement 1 0 True 44s -``` - -A more detailed look at the status: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateRun -metadata: - ... - name: example-run - ... -spec: - placementName: example-placement - resourceSnapshotIndex: "1" - stagedRolloutStrategyName: example-strategy -status: - conditions: - - lastTransitionTime: ... - message: ClusterStagedUpdateRun initialized successfully - observedGeneration: 1 - reason: UpdateRunInitializedSuccessfully - status: "True" # the updateRun is initialized successfully - type: Initialized - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: UpdateRunStarted - status: "True" - type: Progressing # the updateRun is still running - deletionStageStatus: - clusters: [] # no clusters need to be cleaned up - stageName: kubernetes-fleet.io/deleteStage - policyObservedClusterCount: 3 # number of clusters to be updated - policySnapshotIndexUsed: "0" - stagedUpdateStrategySnapshot: # snapshot of the strategy - stages: - - afterStageTasks: - - type: TimedWait - waitTime: 1m0s - labelSelector: - matchLabels: - environment: staging - name: staging - - afterStageTasks: - - type: Approval - labelSelector: - matchLabels: - environment: canary - name: canary - sortingLabelKey: order - stagesStatus: # detailed status for each stage - - afterStageTaskStatus: - - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: AfterStageTaskWaitTimeElapsed - status: "True" # the wait after-stage task has completed - type: WaitTimeElapsed - type: TimedWait - clusters: - - clusterName: member2 # stage staging contains member2 cluster only - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: ClusterUpdatingStarted - status: "True" - type: Started - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: ClusterUpdatingSucceeded - status: "True" # member2 is updated successfully - type: Succeeded - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: StageUpdatingWaiting - status: "False" - type: Progressing - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: StageUpdatingSucceeded - status: "True" # stage staging has completed successfully - type: Succeeded - endTime: ... - stageName: staging - startTime: ... - - afterStageTaskStatus: - - approvalRequestName: example-run-canary # ClusterApprovalRequest name for this stage - type: Approval - clusters: - - clusterName: member3 # according the labelSelector and sortingLabelKey, member3 is selected first in this stage - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: ClusterUpdatingStarted - status: "True" - type: Started - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: ClusterUpdatingSucceeded - status: "True" # member3 update is completed - type: Succeeded - - clusterName: member1 # member1 is selected after member3 because of order=2 label - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: ClusterUpdatingStarted - status: "True" # member1 update has not finished yet - type: Started - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: StageUpdatingStarted - status: "True" # stage canary is still executing - type: Progressing - stageName: canary - startTime: ... -``` -Wait a little bit more, and we can see stage `canary` finishes cluster update and is waiting for the Approval task. -We can check the `ClusterApprovalRequest` generated and not approved yet: -```bash -kubectl get clusterapprovalrequest -NAME UPDATE-RUN STAGE APPROVED APPROVALACCEPTED AGE -example-run-canary example-run canary 2m2s -``` -We can approve the `ClusterApprovalRequest` by patching its status: -```bash -kubectl patch clusterapprovalrequests example-run-canary --type=merge -p {"status":{"conditions":[{"type":"Approved","status":"True","reason":"lgtm","message":"lgtm","lastTransitionTime":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","observedGeneration":1}]}} --subresource=status -clusterapprovalrequest.placement.kubernetes-fleet.io/example-run-canary patched -``` -This can be done equivalently by creating a json patch file and applying it: -```bash -cat << EOF > approval.json -"status": { - "conditions": [ - { - "lastTransitionTime": "$(date -u +%Y-%m-%dT%H:%M:%SZ)", - "message": "lgtm", - "observedGeneration": 1, - "reason": "lgtm", - "status": "True", - "type": "Approved" - } - ] -} -EOF -kubectl patch clusterapprovalrequests example-run-canary --type='merge' --subresource=status --patch-file approval.json -``` - -Then verify it's approved: -```bash -kubectl get clusterapprovalrequest -NAME UPDATE-RUN STAGE APPROVED APPROVALACCEPTED AGE -example-run-canary example-run canary True True 2m30s -``` -The updateRun now is able to proceed and complete: -```bash -kubectl get crsur example-run -NAME PLACEMENT RESOURCE-SNAPSHOT POLICY-SNAPSHOT INITIALIZED SUCCEEDED AGE -example-run example-placement 1 0 True True 4m22s -``` -The CRP also shows rollout has completed and resources are available on all member clusters: -```bash -kubectl get crp example-placement -NAME GEN SCHEDULED SCHEDULED-GEN AVAILABLE AVAILABLE-GEN AGE -example-placement 1 True 1 True 1 134m -``` -The configmap `test-cm` should be deployed on all 3 member clusters, with latest data: -```yaml -data: - key: value2 -``` - -## Deploy a second ClusterStagedUpdateRun to rollback to a previous version - -Now suppose the workload admin wants to rollback the configmap change, reverting the value `value2` back to `value1`. -Instead of manually updating the configmap from hub, they can create a new `ClusterStagedUpdateRun` with a previous resource snapshot index, "0" in our context and they can reuse the same strategy: -```bash -kubectl apply -f - << EOF -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateRun -metadata: - name: example-run-2 -spec: - placementName: example-placement - resourceSnapshotIndex: "0" - stagedRolloutStrategyName: example-strategy -EOF -``` - -Following the same step as [deploying the first updateRun](#deploy-a-clusterstagedupdaterun-to-rollout-latest-change), the second updateRun should succeed also. Complete status shown as below: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterStagedUpdateRun -metadata: - ... - name: example-run-2 - ... -spec: - placementName: example-placement - resourceSnapshotIndex: "0" - stagedRolloutStrategyName: example-strategy -status: - conditions: - - lastTransitionTime: ... - message: ClusterStagedUpdateRun initialized successfully - observedGeneration: 1 - reason: UpdateRunInitializedSuccessfully - status: "True" - type: Initialized - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: UpdateRunStarted - status: "True" - type: Progressing - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: UpdateRunSucceeded # updateRun succeeded - status: "True" - type: Succeeded - deletionStageStatus: - clusters: [] - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: StageUpdatingStarted - status: "True" - type: Progressing - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: StageUpdatingSucceeded - status: "True" # no clusters in the deletion stage, it completes directly - type: Succeeded - endTime: ... - stageName: kubernetes-fleet.io/deleteStage - startTime: ... - policyObservedClusterCount: 3 - policySnapshotIndexUsed: "0" - stagedUpdateStrategySnapshot: - stages: - - afterStageTasks: - - type: TimedWait - waitTime: 1m0s - labelSelector: - matchLabels: - environment: staging - name: staging - - afterStageTasks: - - type: Approval - labelSelector: - matchLabels: - environment: canary - name: canary - sortingLabelKey: order - stagesStatus: - - afterStageTaskStatus: - - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: AfterStageTaskWaitTimeElapsed - status: "True" - type: WaitTimeElapsed - type: TimedWait - clusters: - - clusterName: member2 - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: ClusterUpdatingStarted - status: "True" - type: Started - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: ClusterUpdatingSucceeded - status: "True" - type: Succeeded - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: StageUpdatingWaiting - status: "False" - type: Progressing - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: StageUpdatingSucceeded - status: "True" - type: Succeeded - endTime: ... - stageName: staging - startTime: ... - - afterStageTaskStatus: - - approvalRequestName: example-run-2-canary - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: AfterStageTaskApprovalRequestCreated - status: "True" - type: ApprovalRequestCreated - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: AfterStageTaskApprovalRequestApproved - status: "True" - type: ApprovalRequestApproved - type: Approval - clusters: - - clusterName: member3 - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: ClusterUpdatingStarted - status: "True" - type: Started - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: ClusterUpdatingSucceeded - status: "True" - type: Succeeded - - clusterName: member1 - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: ClusterUpdatingStarted - status: "True" - type: Started - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: ClusterUpdatingSucceeded - status: "True" - type: Succeeded - conditions: - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: StageUpdatingWaiting - status: "False" - type: Progressing - - lastTransitionTime: ... - message: "" - observedGeneration: 1 - reason: StageUpdatingSucceeded - status: "True" - type: Succeeded - endTime: ... - stageName: canary - startTime: ... -``` -The configmap `test-cm` should be updated on all 3 member clusters, with old data: -```yaml -data: - key: value1 -``` \ No newline at end of file diff --git a/docs/troubleshooting/README.md b/docs/troubleshooting/README.md deleted file mode 100644 index 0618fba29..000000000 --- a/docs/troubleshooting/README.md +++ /dev/null @@ -1,147 +0,0 @@ -# Troubleshooting guide - -## Overview: - -This TSG is meant to help you troubleshoot issues with the ClusterResourcePlacement API in Fleet. - -## Cluster Resource Placement: - -Internal Objects to keep in mind when troubleshooting CRP related errors on the hub cluster: - - `ClusterResourceSnapshot` - - `ClusterSchedulingPolicySnapshot` - - `ClusterResourceBinding` - - `Work` - -Please read the API reference for more details about each object https://github.com/Azure/fleet/blob/main/docs/api-references.md. -____ -## Complete Progress of the ClusterResourcePlacement -Understanding the progression and the status of the `ClusterResourcePlacement` custom resource is crucial for diagnosing and identifying failures. -You can view the status of the `ClusterResourcePlacement` custom resource by using the following command: -```bash -kubectl describe clusterresourceplacement -``` - -The complete progression of `ClusterResourcePlacement` is as follows: -1. `ClusterResourcePlacementScheduled`: Indicates a resource has been scheduled for placement.. - - If this condition is false, refer to [How can I debug when my CRP status is ClusterResourcePlacementScheduled condition status is set to false?](./clusterResourcePlacementScheduled.md). -2. `ClusterResourcePlacementRolloutStarted`: Indicates the rollout process has begun. - - If this condition is false refer to [How can I debug when my CRP status is ClusterResourcePlacementRolloutStarted condition status is set to false?](./clusterResourcePlacementRolloutStarted.md) - - If you are triggering a rollout with a staged update run, refer to [Staged Update Run Troubleshooting Guide](./updaterun.md). -3. `ClusterResourcePlacementOverridden`: Indicates the resource has been overridden. - - If this condition is false, refer to [How can I debug when my CRP status is ClusterResourcePlacementOverridden condition status is set to false?](./clusterResourcePlacementOverridden.md) -4. `ClusterResourcePlacementWorkSynchronized`: Indicates the work objects have been synchronized. - - If this condition is false, refer to [How can I debug when my CRP status is ClusterResourcePlacementWorkSynchronized condition status is set to false?](./clusterResourcePlacementWorkSynchronized.md) -5. `ClusterResourcePlacementApplied`: Indicates the resource has been applied. - - If this condition is false, refer to [How can I debug when my CRP status is ClusterResourcePlacementApplied condition is set to false?](./clusterResourcePlacementApplied.md) -6. `ClusterResourcePlacementAvailable`: Indicates the resource is available. - - If this condition is false, refer to [How can I debug when my CRP status is ClusterResourcePlacementAvailable condition status is set to false?](./clusterResourcePlacementAvailable.md) - -___ -## How can I debug if some clusters are not selected as expected? - -Check the status of the `ClusterSchedulingPolicySnapshot` to determine which clusters were selected along with the reason. - -## How can I debug if a selected cluster does not have the expected resources on it or if CRP doesn't pick up the latest changes? - -Please check the following cases, -- Check whether the `ClusterResourcePlacementRolloutStarted` condition in `ClusterResourcePlacement` status is set to **true** or **false**. -- If `false`, see [How to debug ClusterResourcePlacementScheduled condition status set to false](#how-can-i-debug-when-my-crp-status-is-clusterresourceplacementrolloutstarted-condition-status-is-set-to-false). -- If `true`, - - Check to see if `ClusterResourcePlacementApplied` condition is set to **unknown**, **false** or **true**. - - If `unknown`, wait for the process to finish, as the resources are still being applied to the member cluster. If the state remains unknown for a while, create a [issue](https://github.com/Azure/fleet/issues), as this is an unusual behavior. - - If `false`, refer to [How to debug ClusterResourcePlacementApplied condition status set to false](#how-can-i-debug-when-my-crp-clusterresourceplacementapplied-condition-is-set-to-false). - - If `true`, verify that the resource exists on the hub cluster. - -We can also take a look at the `placementStatuses` section in `ClusterResourcePlacement` status for that particular cluster. In `placementStatuses` we would find `failedPlacements` section which should have the reasons as to why resources failed to apply. - -## How can I find and verify the latest ClusterSchedulingPolicySnapshot for a ClusterResourcePlacement? - -To find the latest `ClusterSchedulingPolicySnapshot` for a `ClusterResourcePlacement` resource, run the following command: - -``` -kubectl get clusterschedulingpolicysnapshot -l kubernetes-fleet.io/is-latest-snapshot=true,kubernetes-fleet.io/parent-CRP={CRPName} -``` -> NOTE: In this command, replace `{CRPName}` with your `ClusterResourcePlacement` name. - -Then, compare the `ClusterSchedulingPolicySnapshot` with the `ClusterResourcePlacement` policy to make sure that they match, excluding the `numberOfClusters` field from the `ClusterResourcePlacement` spec. - -If the placement type is `PickN`, check whether the number of clusters that's requested in the `ClusterResourcePlacement` policy matches the value of the number-of-clusters label. -## How can I find the latest ClusterResourceBinding resource? - -The following command lists all `ClusterResourceBindings` instances that are associated with `ClusterResourcePlacement`: -``` -kubectl get clusterresourcebinding -l kubernetes-fleet.io/parent-CRP={CRPName} -``` -> NOTE: In this command, replace `{CRPName}` with your `ClusterResourcePlacement` name. - -### Example: - -In this case we have `ClusterResourcePlacement` called test-crp. - -1. List the `ClusterResourcePlacement` to get the name of the CRP, -``` -kubectl get crp test-crp -NAME GEN SCHEDULED SCHEDULEDGEN APPLIED APPLIEDGEN AGE -test-crp 1 True 1 True 1 15s -``` - -2. The following command is run to view the status of the `ClusterResourcePlacement` deployment. -```bash -kubectl describe clusterresourceplacement test-crp -``` - -3. Here's an example output. From the `placementStatuses` section of the `test-crp` status, notice that it has distributed -resources to two member clusters and, therefore, has two `ClusterResourceBindings` instances: -``` -status: - conditions: - - lastTransitionTime: "2023-11-23T00:49:29Z" - ... - placementStatuses: - - clusterName: kind-cluster-1 - conditions: - ... - type: ResourceApplied - - clusterName: kind-cluster-2 - conditions: - ... - reason: ApplySucceeded - status: "True" - type: ResourceApplied -``` - -3. To get the `ClusterResourceBindings` value, run the following command: -```bash - kubectl get clusterresourcebinding -l kubernetes-fleet.io/parent-CRP=test-crp -``` -4. The output lists all `ClusterResourceBindings` instances that are associated with `test-crp`. -``` -kubectl get clusterresourcebinding -l kubernetes-fleet.io/parent-CRP=test-crp -NAME WORKCREATED RESOURCESAPPLIED AGE -test-crp-kind-cluster-1-be990c3e True True 33s -test-crp-kind-cluster-2-ec4d953c True True 33s -``` -The `ClusterResourceBinding` resource name uses the following format: `{CRPName}-{clusterName}-{suffix}`. -Find the `ClusterResourceBinding` for the target cluster you are looking for based on the `clusterName`. - - -## How can I find the latest ClusterResourceSnapshot resource? - -To find the latest ClusterResourceSnapshot resource, run the following command: - -``` -kubectl get clusterresourcesnapshot -l kubernetes-fleet.io/is-latest-snapshot=true,kubernetes-fleet.io/parent-CRP={CRPName} -``` -> NOTE: In this command, replace `{CRPName}` with your `ClusterResourcePlacement` name. - -## How can I find the correct work resource that's associated with ClusterResourcePlacement? - -To find the correct work resource, follow these steps: - -1. Identify the member cluster namespace and the `ClusterResourcePlacement` name. The format for the namespace is `fleet-member-{clusterName}`. -2. To get the work resource, run the following command: - -``` -kubectl get work -n fleet-member-{clusterName} -l kubernetes-fleet.io/parent-CRP={CRPName} -``` -> NOTE: In this command, replace `{clusterName}` and `{CRPName}` with the names that you identified in the first step. \ No newline at end of file diff --git a/docs/troubleshooting/clusterResourcePlacementApplied.md b/docs/troubleshooting/clusterResourcePlacementApplied.md deleted file mode 100644 index 7e5cac425..000000000 --- a/docs/troubleshooting/clusterResourcePlacementApplied.md +++ /dev/null @@ -1,242 +0,0 @@ -# How can I debug when my CRP ClusterResourcePlacementApplied condition is set to false? -The `ClusterResourcePlacementApplied` condition is set to `false` when the deployment fails. -> Note: To get more information about why the resources are not applied, you can check the [apply work controller](https://github.com/Azure/fleet/blob/main/pkg/controllers/work/apply_controller.go) logs. - -### Common scenarios: -Instances where this condition may arise: -- The resource already exists on the cluster and isn't managed by the fleet controller. -- Another `ClusterResourcePlacement` deployment is already managing the resource for the selected cluster by using a different apply strategy. -- The `ClusterResourcePlacement` deployment doesn't apply the manifest because of syntax errors or invalid resource configurations. This might also occur if a resource is propagated through an envelope object. - -### Investigation steps: - -1. Check `placementStatuses`: In the `ClusterResourcePlacement` status section, inspect the `placementStatuses` to identify which clusters have the `ResourceApplied` condition set to `false` and note down their `clusterName`. -2. Locate the `Work` Object in Hub Cluster: Use the identified `clusterName` to locate the `Work` object associated with the member cluster. Please refer to this [section](README.md#how-can-i-find-the-correct-work-resource-thats-associated-with-clusterresourceplacement) to learn how to get the correct `Work` resource. -3. Check `Work` object status: Inspect the status of the `Work` object to understand the specific issues preventing successful resource application. - -### Case Study: -In the following example, `ClusterResourcePlacement` is trying to propagate a namespace that contains a deployment to two member clusters. However, the namespace already exists on one member cluster, specifically `kind-cluster-1`. - -### ClusterResourcePlacement spec: -``` - policy: - clusterNames: - - kind-cluster-1 - - kind-cluster-2 - placementType: PickFixed - resourceSelectors: - - group: "" - kind: Namespace - name: test-ns - version: v1 - revisionHistoryLimit: 10 - strategy: - type: RollingUpdate -``` - -### ClusterResourcePlacement status: -``` -status: - conditions: - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: could not find all the clusters needed as specified by the scheduling - policy - observedGeneration: 1 - reason: SchedulingPolicyUnfulfilled - status: "False" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: All 2 cluster(s) start rolling out the latest resource - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: ClusterResourcePlacementRolloutStarted - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: ClusterResourcePlacementOverridden - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: Works(s) are succcesfully created or updated in the 2 target clusters' - namespaces - observedGeneration: 1 - reason: WorkSynchronized - status: "True" - type: ClusterResourcePlacementWorkSynchronized - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: Failed to apply resources to 1 clusters, please check the `failedPlacements` - status - observedGeneration: 1 - reason: ApplyFailed - status: "False" - type: ClusterResourcePlacementApplied - observedResourceIndex: "0" - placementStatuses: - - clusterName: kind-cluster-2 - conditions: - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: 'Successfully scheduled resources for placement in kind-cluster-2 (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 1 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: All of the works are synchronized to the latest - observedGeneration: 1 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: All corresponding work objects are applied - observedGeneration: 1 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-05-07T23:32:49Z" - message: The availability of work object crp-4-work is not trackable - observedGeneration: 1 - reason: WorkNotTrackable - status: "True" - type: Available - - clusterName: kind-cluster-1 - conditions: - - lastTransitionTime: "2024-05-07T23:32:40Z" - 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-07T23:32:40Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: All of the works are synchronized to the latest - observedGeneration: 1 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: Work object crp-4-work is not applied - observedGeneration: 1 - reason: NotAllWorkHaveBeenApplied - status: "False" - type: Applied - failedPlacements: - - condition: - lastTransitionTime: "2024-05-07T23:32:40Z" - message: 'Failed to apply manifest: failed to process the request due to a - client error: resource exists and is not managed by the fleet controller - and co-ownernship is disallowed' - reason: ManifestsAlreadyOwnedByOthers - status: "False" - type: Applied - kind: Namespace - name: test-ns - version: v1 - selectedResources: - - kind: Namespace - name: test-ns - version: v1 - - group: apps - kind: Deployment - name: test-nginx - namespace: test-ns - version: v1 -``` - - -In the `ClusterResourcePlacement` status, within the `failedPlacements` section for `kind-cluster-1`, we get a clear message -as to why the resource failed to apply on the member cluster. In the preceding `conditions` section, -the `Applied` condition for `kind-cluster-1` is flagged as false and shows the `NotAllWorkHaveBeenApplied` reason. -This indicates that the Work object intended for the member cluster `kind-cluster-1` has not been applied. - -For more information, see this [section](#how-and-where-to-find-the-correct-work-resource). - -### Work status of kind-cluster-1: -``` - status: - conditions: - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: 'Apply manifest {Ordinal:0 Group: Version:v1 Kind:Namespace Resource:namespaces - Namespace: Name:test-ns} failed' - observedGeneration: 1 - reason: WorkAppliedFailed - status: "False" - type: Applied - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: "" - observedGeneration: 1 - reason: WorkAppliedFailed - status: Unknown - type: Available - manifestConditions: - - conditions: - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: 'Failed to apply manifest: failed to process the request due to a client - error: resource exists and is not managed by the fleet controller and co-ownernship - is disallowed' - reason: ManifestsAlreadyOwnedByOthers - status: "False" - type: Applied - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: Manifest is not applied yet - reason: ManifestApplyFailed - status: Unknown - type: Available - identifier: - kind: Namespace - name: test-ns - ordinal: 0 - resource: namespaces - version: v1 - - conditions: - - lastTransitionTime: "2024-05-07T23:32:40Z" - message: Manifest is already up to date - observedGeneration: 1 - reason: ManifestAlreadyUpToDate - status: "True" - type: Applied - - lastTransitionTime: "2024-05-07T23:32:51Z" - message: Manifest is trackable and available now - observedGeneration: 1 - reason: ManifestAvailable - status: "True" - type: Available - identifier: - group: apps - kind: Deployment - name: test-nginx - namespace: test-ns - ordinal: 1 - resource: deployments - version: v1 -``` - -From looking at the `Work` status, specifically the `manifestConditions` section, you can see that the namespace could not be applied but the deployment within the namespace got propagated from the hub to the member cluster. - -### Resolution: -In this situation, a potential solution is to set the `AllowCoOwnership` to `true` in the ApplyStrategy policy. However, it's important to notice that this decision should be made by the user because the resources might not be shared. \ No newline at end of file diff --git a/docs/troubleshooting/clusterResourcePlacementAvailable.md b/docs/troubleshooting/clusterResourcePlacementAvailable.md deleted file mode 100644 index 18fc7009f..000000000 --- a/docs/troubleshooting/clusterResourcePlacementAvailable.md +++ /dev/null @@ -1,207 +0,0 @@ -# How can I debug when my CRP ClusterResourcePlacementAvailable condition is set to false? -The `ClusterResourcePlacementAvailable` condition is `false` when some of the resources are not available yet. We will place some of the detailed failure in the `FailedResourcePlacement` array. -> Note: To get more information about why resources are unavailable check [apply work controller](https://github.com/Azure/fleet/blob/main/pkg/controllers/work/apply_controller.go) logs. - -### Common scenarios: -Instances where this condition may arise: -- The member cluster doesn't have enough resource availability. -- The deployment contains an invalid image name. - -### Case Study: -The example output below demonstrates a scenario where the CRP is unable to propagate a deployment to a member cluster due to the deployment having a bad image name. - -#### ClusterResourcePlacement spec: -``` -spec: - resourceSelectors: - - group: "" - kind: Namespace - name: test-ns - version: v1 - policy: - placementType: PickN - numberOfClusters: 1 - strategy: - type: RollingUpdate -``` - -#### ClusterResourcePlacement status: -``` -status: - conditions: - - lastTransitionTime: "2024-05-14T18:52:30Z" - 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-14T18:52:31Z" - message: All 1 cluster(s) start rolling out the latest resource - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: ClusterResourcePlacementRolloutStarted - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: ClusterResourcePlacementOverridden - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: Works(s) are succcesfully created or updated in 1 target cluster(s)' - namespaces - observedGeneration: 1 - reason: WorkSynchronized - status: "True" - type: ClusterResourcePlacementWorkSynchronized - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: The selected resources are successfully applied to 1 cluster(s) - observedGeneration: 1 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: The selected resources in 1 cluster(s) are still not available yet - observedGeneration: 1 - reason: ResourceNotAvailableYet - status: "False" - type: ClusterResourcePlacementAvailable - observedResourceIndex: "0" - placementStatuses: - - clusterName: kind-cluster-1 - conditions: - - lastTransitionTime: "2024-05-14T18:52:30Z" - 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-14T18:52:31Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: All of the works are synchronized to the latest - observedGeneration: 1 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: All corresponding work objects are applied - observedGeneration: 1 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: Work object crp1-work is not available - observedGeneration: 1 - reason: NotAllWorkAreAvailable - status: "False" - type: Available - failedPlacements: - - condition: - lastTransitionTime: "2024-05-14T18:52:31Z" - message: Manifest is trackable but not available yet - observedGeneration: 1 - reason: ManifestNotAvailableYet - status: "False" - type: Available - group: apps - kind: Deployment - name: my-deployment - namespace: test-ns - version: v1 - selectedResources: - - kind: Namespace - name: test-ns - version: v1 - - group: apps - kind: Deployment - name: my-deployment - namespace: test-ns - version: v1 - ``` -In the `ClusterResourcePlacement` status, within the `failedPlacements` section for `kind-cluster-1`, we get a clear message -as to why the resource failed to apply on the member cluster. In the preceding `conditions` section, -the `Available` condition for `kind-cluster-1` is flagged as `false` and shows `NotAllWorkAreAvailable` reason. -This signifies that the Work object intended for the member cluster `kind-cluster-1` is not yet available. - -For more information, see this [section](#how-and-where-to-find-the-correct-work-resource). - -### Work status of kind-cluster-1: -``` -status: -conditions: -- lastTransitionTime: "2024-05-14T18:52:31Z" - message: Work is applied successfully - observedGeneration: 1 - reason: WorkAppliedCompleted - status: "True" - type: Applied -- lastTransitionTime: "2024-05-14T18:52:31Z" - message: Manifest {Ordinal:1 Group:apps Version:v1 Kind:Deployment Resource:deployments - Namespace:test-ns Name:my-deployment} is not available yet - observedGeneration: 1 - reason: WorkNotAvailableYet - status: "False" - type: Available - manifestConditions: -- conditions: - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: Manifest is already up to date - reason: ManifestAlreadyUpToDate - status: "True" - type: Applied - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: Manifest is trackable and available now - reason: ManifestAvailable - status: "True" - type: Available - identifier: - kind: Namespace - name: test-ns - ordinal: 0 - resource: namespaces - version: v1 -- conditions: - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: Manifest is already up to date - observedGeneration: 1 - reason: ManifestAlreadyUpToDate - status: "True" - type: Applied - - lastTransitionTime: "2024-05-14T18:52:31Z" - message: Manifest is trackable but not available yet - observedGeneration: 1 - reason: ManifestNotAvailableYet - status: "False" - type: Available - identifier: - group: apps - kind: Deployment - name: my-deployment - namespace: test-ns - ordinal: 1 - resource: deployments - version: v1 -``` -Check the `Available` status for `kind-cluster-1`. You can see that the `my-deployment` deployment isn't yet available on the member cluster. -This suggests that an issue might be affecting the deployment manifest. - -#### Resolution: -In this situation, a potential solution is to check the deployment in the member cluster because the message indicates that the root cause of the issue is a bad image name. -After this image name is identified, you can correct the deployment manifest and update it. -After you fix and update the resource manifest, the `ClusterResourcePlacement` object API automatically propagates the corrected resource to the member cluster. - -For all other situations, make sure that the propagated resource is configured correctly. -Additionally, verify that the selected cluster has sufficient available capacity to accommodate the new resources. diff --git a/docs/troubleshooting/clusterResourcePlacementOverridden.md b/docs/troubleshooting/clusterResourcePlacementOverridden.md deleted file mode 100644 index d3aecbb18..000000000 --- a/docs/troubleshooting/clusterResourcePlacementOverridden.md +++ /dev/null @@ -1,157 +0,0 @@ -# How can I debug when my CRP status is ClusterResourcePlacementOverridden condition status is set to false? - -The status of the `ClusterResourcePlacementOverridden` condition is set to `false` when there is an Override API related issue. -> Note: To get more information, look into the logs for the overrider controller (includes -> controller for [ClusterResourceOverride](https://github.com/Azure/fleet/blob/main/pkg/controllers/overrider/clusterresource_controller.go) and -> [ResourceOverride](https://github.com/Azure/fleet/blob/main/pkg/controllers/overrider/resource_controller.go)). - -## Common scenarios: -Instances where this condition may arise: -- The `ClusterResourceOverride` or `ResourceOverride` is created with an invalid field path for the resource. - -## Case Study: -In the following example, an attempt is made to override the cluster role `secret-reader` that is being propagated by the `ClusterResourcePlacement` to the selected clusters. -However, the `ClusterResourceOverride` is created with an invalid path for the field within resource. - -### ClusterRole: -``` -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - 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 -``` -The `ClusterRole` `secret-reader` that is being propagated to the member clusters by the `ClusterResourcePlacement`. - -### ClusterResourceOverride spec: -``` -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 -``` -The `ClusterResourceOverride` is created to override the `ClusterRole` `secret-reader` by adding a new label (`new-label`) -that has the value `new-value` for the clusters with the label `env: canary`. - -### ClusterResourcePlacement Spec: -``` -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: -``` -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 -``` -The CRP attempted to override a propagated resource utilizing an applicable `ClusterResourceOverrideSnapshot`. -However, as the `ClusterResourcePlacementOverridden` condition remains false, looking at the placement status for the cluster -where the condition `Overridden` failed will offer insights into the exact cause of the failure. - -In this situation, the message indicates that the override failed because the path `/metadata/labels/new-label` and its corresponding value are missing. -Based on the previous example of the cluster role `secret-reader`, you can see that the path `/metadata/labels/` doesn't exist. This means that `labels` doesn't exist. -Therefore, a new label can't be added. - -### Resolution: -To successfully override the cluster role `secret-reader`, correct the path and value in `ClusterResourceOverride`, as shown in the following code: -``` -jsonPatchOverrides: - - op: add - path: /metadata/labels - value: - newlabel: new-value -``` -This will successfully add the new label `newlabel` with the value `new-value` to the `ClusterRole` `secret-reader`, as we are creating the `labels` field and adding a new value `newlabel: new-value` to it. \ No newline at end of file diff --git a/docs/troubleshooting/clusterResourcePlacementRolloutStarted.md b/docs/troubleshooting/clusterResourcePlacementRolloutStarted.md deleted file mode 100644 index 229507dd0..000000000 --- a/docs/troubleshooting/clusterResourcePlacementRolloutStarted.md +++ /dev/null @@ -1,363 +0,0 @@ -# How can I debug when my CRP status is ClusterResourcePlacementRolloutStarted condition status is set to false? - -When using the `ClusterResourcePlacement` API object in Azure Kubernetes Fleet Manager to propagate resources, the selected resources aren't rolled out in all scheduled clusters and the `ClusterResourcePlacementRolloutStarted` condition status shows as `False`. - -*This TSG only applies to the `RollingUpdate` rollout strategy, which is the default strategy if you don't specify in the `ClusterResourcePlacement`.* -*To troubleshoot the update run strategy as you specify `External` in the `ClusterResourcePlacement`, please refer to the [Staged Update Run Troubleshooting Guide](updaterun.md).* - -> Note: To get more information about why the rollout doesn't start, you can check the [rollout controller](https://github.com/Azure/fleet/blob/main/pkg/controllers/rollout/controller.go) to get more information on why the rollout did not start. - -## Common scenarios: -Instances where this condition may arise: -- The Cluster Resource Placement rollout strategy is blocked because the `RollingUpdate` configuration is too strict. - -### Troubleshooting Steps: - -1. In the `ClusterResourcePlacement` status section, check the `placementStatuses` to identify clusters with the `RolloutStarted` status set to `False`. -2. Locate the corresponding `ClusterResourceBinding` for the identified cluster. For more information, see [How can I find the latest ClusterResourceBinding resource?](README.md#how-can-i-find-the-latest-clusterresourcebinding-resource). -This resource should indicate the status of the `Work` whether it was created or updated. -3. Verify the values of `maxUnavailable` and `maxSurge` to ensure they align with your expectations. - -### Case Study: - -In the following example, the `ClusterResourcePlacement` is trying to propagate a namespace to three member clusters. -However, during the initial creation of the `ClusterResourcePlacement`, the namespace didn't exist on the hub cluster, -and the fleet currently comprises two member clusters named `kind-cluster-1` and `kind-cluster-2`. - -### ClusterResourcePlacement spec: -``` -spec: - policy: - numberOfClusters: 3 - placementType: PickN - resourceSelectors: - - group: "" - kind: Namespace - name: test-ns - version: v1 - revisionHistoryLimit: 10 - strategy: - type: RollingUpdate -``` - -### ClusterResourcePlacement status: -``` -status: - conditions: - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: could not find all the clusters needed as specified by the scheduling - policy - observedGeneration: 1 - reason: SchedulingPolicyUnfulfilled - status: "False" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: All 2 cluster(s) start rolling out the latest resource - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: ClusterResourcePlacementRolloutStarted - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: ClusterResourcePlacementOverridden - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: Works(s) are succcesfully created or updated in the 2 target clusters' - namespaces - observedGeneration: 1 - reason: WorkSynchronized - status: "True" - type: ClusterResourcePlacementWorkSynchronized - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: The selected resources are successfully applied to 2 clusters - observedGeneration: 1 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: The selected resources in 2 cluster are available now - observedGeneration: 1 - reason: ResourceAvailable - status: "True" - type: ClusterResourcePlacementAvailable - observedResourceIndex: "0" - placementStatuses: - - clusterName: kind-cluster-2 - conditions: - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: 'Successfully scheduled resources for placement in kind-cluster-2 (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 1 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: All of the works are synchronized to the latest - observedGeneration: 1 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: All corresponding work objects are applied - observedGeneration: 1 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: All corresponding work objects are available - observedGeneration: 1 - reason: AllWorkAreAvailable - status: "True" - type: Available - - clusterName: kind-cluster-1 - conditions: - - lastTransitionTime: "2024-05-07T23:08:53Z" - 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-07T23:08:53Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: All of the works are synchronized to the latest - observedGeneration: 1 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: All corresponding work objects are applied - observedGeneration: 1 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: All corresponding work objects are available - observedGeneration: 1 - reason: AllWorkAreAvailable - status: "True" - type: Available -``` - -The previous output indicates that the resource `test-ns` namespace never exists on the hub cluster and shows the following `ClusterResourcePlacement` condition statuses: -- `ClusterResourcePlacementScheduled` is set to `False`, as the specified policy aims to pick three clusters, but the scheduler can only accommodate placement in two currently available and joined clusters. -- `ClusterResourcePlacementRolloutStarted` is set to `True`, as the rollout process has commenced with 2 clusters being selected. -- `ClusterResourcePlacementOverridden` is set to `True`, as no override rules are configured for the selected resources. -- `ClusterResourcePlacementWorkSynchronized` is set to `True`. -- `ClusterResourcePlacementApplied` is set to `True`. -- `ClusterResourcePlacementAvailable` is set to `True`. - - -To ensure seamless propagation of the namespace across the relevant clusters, proceed to create the `test-ns` namespace on the hub cluster. - -### ClusterResourcePlacement status after namespace test-ns is created on the hub cluster: -``` -status: - conditions: - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: could not find all the clusters needed as specified by the scheduling - policy - observedGeneration: 1 - reason: SchedulingPolicyUnfulfilled - status: "False" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-05-07T23:13:51Z" - message: The rollout is being blocked by the rollout strategy in 2 cluster(s) - observedGeneration: 1 - reason: RolloutNotStartedYet - status: "False" - type: ClusterResourcePlacementRolloutStarted - observedResourceIndex: "1" - placementStatuses: - - clusterName: kind-cluster-2 - conditions: - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: 'Successfully scheduled resources for placement in kind-cluster-2 (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 1 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2024-05-07T23:13:51Z" - message: The rollout is being blocked by the rollout strategy - observedGeneration: 1 - reason: RolloutNotStartedYet - status: "False" - type: RolloutStarted - - clusterName: kind-cluster-1 - conditions: - - lastTransitionTime: "2024-05-07T23:08:53Z" - 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-07T23:13:51Z" - message: The rollout is being blocked by the rollout strategy - observedGeneration: 1 - reason: RolloutNotStartedYet - status: "False" - type: RolloutStarted - selectedResources: - - kind: Namespace - name: test-ns - version: v1 -``` - -Upon examination, the `ClusterResourcePlacementScheduled` condition status is shown as `False`. -The `ClusterResourcePlacementRolloutStarted` status is also shown as `False` with the message `The rollout is being blocked by the rollout strategy in 2 cluster(s)`. - -Let's check the latest `ClusterResourceSnapshot`. - -Check the latest `ClusterResourceSnapshot` by running the command in [How can I find the latest ClusterResourceSnapshot resource?](README.md#how-can-I-find-the-latest-ClusterResourceSnapshot-resource). - -### Latest ClusterResourceSnapshot: -``` -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterResourceSnapshot -metadata: - annotations: - kubernetes-fleet.io/number-of-enveloped-object: "0" - kubernetes-fleet.io/number-of-resource-snapshots: "1" - kubernetes-fleet.io/resource-hash: 72344be6e268bc7af29d75b7f0aad588d341c228801aab50d6f9f5fc33dd9c7c - creationTimestamp: "2024-05-07T23:13:51Z" - generation: 1 - labels: - kubernetes-fleet.io/is-latest-snapshot: "true" - kubernetes-fleet.io/parent-CRP: crp-3 - kubernetes-fleet.io/resource-index: "1" - name: crp-3-1-snapshot - ownerReferences: - - apiVersion: placement.kubernetes-fleet.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: ClusterResourcePlacement - name: crp-3 - uid: b4f31b9a-971a-480d-93ac-93f093ee661f - resourceVersion: "14434" - uid: 85ee0e81-92c9-4362-932b-b0bf57d78e3f -spec: - selectedResources: - - apiVersion: v1 - kind: Namespace - metadata: - labels: - kubernetes.io/metadata.name: test-ns - name: test-ns - spec: - finalizers: - - kubernetes -``` - -Upon inspecting `ClusterResourceSnapshot` spec, the `selectedResources` section now shows the namespace `test-ns`. - -Let's check the `ClusterResourceBinding` for `kind-cluster-1` to see if it was updated after the namespace `test-ns` was created. -Check the `ClusterResourceBinding` for `kind-cluster-1` by running the command in [How can I find the latest ClusterResourceBinding resource?](README.md#how-can-i-find-the-latest-clusterresourcebinding-resource). - -### ClusterResourceBinding for kind-cluster-1: -``` -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterResourceBinding -metadata: - creationTimestamp: "2024-05-07T23:08:53Z" - finalizers: - - kubernetes-fleet.io/work-cleanup - generation: 2 - labels: - kubernetes-fleet.io/parent-CRP: crp-3 - name: crp-3-kind-cluster-1-7114c253 - resourceVersion: "14438" - uid: 0db4e480-8599-4b40-a1cc-f33bcb24b1a7 -spec: - applyStrategy: - type: ClientSideApply - clusterDecision: - clusterName: kind-cluster-1 - clusterScore: - affinityScore: 0 - priorityScore: 0 - reason: picked by scheduling policy - selected: true - resourceSnapshotName: crp-3-0-snapshot - schedulingPolicySnapshotName: crp-3-0 - state: Bound - targetCluster: kind-cluster-1 -status: - conditions: - - lastTransitionTime: "2024-05-07T23:13:51Z" - message: The resources cannot be updated to the latest because of the rollout - strategy - observedGeneration: 2 - reason: RolloutNotStartedYet - status: "False" - type: RolloutStarted - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: No override rules are configured for the selected resources - observedGeneration: 2 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: All of the works are synchronized to the latest - observedGeneration: 2 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: All corresponding work objects are applied - observedGeneration: 2 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-05-07T23:08:53Z" - message: All corresponding work objects are available - observedGeneration: 2 - reason: AllWorkAreAvailable - status: "True" - type: Available -``` - -Upon inspection, it is observed that the `ClusterResourceBinding` remains unchanged. Notably, in the spec, the `resourceSnapshotName` still references the old `ClusterResourceSnapshot` name. - -This issue arises due to the absence of explicit `rollingUpdate` input from the user. Consequently, the default values are applied: - -- The `maxUnavailable` value is configured to 25% x 3 (desired number), rounded to `1` -- The `maxSurge` value is configured to 25% x 3 (desired number), rounded to `1` - -### Why ClusterResourceBinding isn't updated -Initially, when the `ClusterResourcePlacement` was created, two `ClusterResourceBindings` were generated. -However, since the rollout didn't apply to the initial phase, the `ClusterResourcePlacementRolloutStarted` condition was set to `True`. - -Upon creating the `test-ns` namespace on the hub cluster, the rollout controller attempted to update the two existing `ClusterResourceBindings`. -However, `maxUnavailable` was set to `1` due to the lack of member clusters, which caused the `RollingUpdate` configuration to be too strict. -> NOTE: During the update, if one of the bindings fails to apply, it will also violate the `RollingUpdate` configuration, which causes `maxUnavailable` to be set to `1`. - -### Resolution: -In this situation, to address this issue, consider manually setting `maxUnavailable` to a value greater than `1` to relax the `RollingUpdate` configuration. -Alternatively, you can join a third member cluster. diff --git a/docs/troubleshooting/clusterResourcePlacementScheduled.md b/docs/troubleshooting/clusterResourcePlacementScheduled.md deleted file mode 100644 index 5034e043b..000000000 --- a/docs/troubleshooting/clusterResourcePlacementScheduled.md +++ /dev/null @@ -1,200 +0,0 @@ -# How can I debug when my CRP status is ClusterResourcePlacementScheduled condition status is set to false? -The `ClusterResourcePlacementScheduled` condition is set to `false` when the scheduler cannot find all the clusters needed as specified by the scheduling policy. -> Note: To get more information about why the scheduling fails, you can check the [scheduler](https://github.com/Azure/fleet/blob/main/pkg/scheduler/scheduler.go) logs. - -### Common scenarios: - -Instances where this condition may arise: - -- When the placement policy is set to `PickFixed`, but the specified cluster names do not match any joined member cluster name in the fleet, or the specified cluster is no longer connected to the fleet. -- When the placement policy is set to `PickN`, and N clusters are specified, but there are fewer than N clusters that have joined the fleet or satisfy the placement policy. -- When the `ClusterResourcePlacement` resource selector selects a reserved namespace. - ->Note: When the placement policy is set to `PickAll`, the `ClusterResourcePlacementScheduled` condition is always set to `true`. - -### Case Study: - -In the following example, the `ClusterResourcePlacement` with a `PickN` placement policy is trying to propagate resources to two clusters labeled `env:prod`. -The two clusters, named `kind-cluster-1` and `kind-cluster-2`, have joined the fleet. However, only one member cluster, `kind-cluster-1`, has the label `env:prod`. - -### CRP spec: -``` -spec: - policy: - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - numberOfClusters: 2 - placementType: PickN - resourceSelectors: - ... - revisionHistoryLimit: 10 - strategy: - type: RollingUpdate -``` - -### ClusterResourcePlacement status: -``` -status: - conditions: - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: could not find all the clusters needed as specified by the scheduling - policy - observedGeneration: 1 - reason: SchedulingPolicyUnfulfilled - status: "False" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: All 1 cluster(s) start rolling out the latest resource - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: ClusterResourcePlacementRolloutStarted - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: ClusterResourcePlacementOverridden - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: Works(s) are succcesfully created or updated in the 1 target clusters' - namespaces - observedGeneration: 1 - reason: WorkSynchronized - status: "True" - type: ClusterResourcePlacementWorkSynchronized - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: The selected resources are successfully applied to 1 clusters - observedGeneration: 1 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: The selected resources in 1 cluster are available now - observedGeneration: 1 - reason: ResourceAvailable - status: "True" - type: ClusterResourcePlacementAvailable - observedResourceIndex: "0" - placementStatuses: - - clusterName: kind-cluster-1 - conditions: - - lastTransitionTime: "2024-05-07T22:36:33Z" - 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-07T22:36:33Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: All of the works are synchronized to the latest - observedGeneration: 1 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: All corresponding work objects are applied - observedGeneration: 1 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: All corresponding work objects are available - observedGeneration: 1 - reason: AllWorkAreAvailable - status: "True" - type: Available - - conditions: - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: 'kind-cluster-2 is not selected: ClusterUnschedulable, cluster does not - match with any of the required cluster affinity terms' - observedGeneration: 1 - reason: ScheduleFailed - status: "False" - type: Scheduled - selectedResources: - ... -``` - -The `ClusterResourcePlacementScheduled` condition is set to `false`, the goal is to select two clusters with the label `env:prod`, but only one member cluster possesses the correct label as specified in `clusterAffinity`. - -We can also take a look at the `ClusterSchedulingPolicySnapshot` status to figure out why the scheduler could not schedule the resource for the placement policy specified. -To learn how to get the latest `ClusterSchedulingPolicySnapshot`, see [How can I find and verify the latest ClusterSchedulingPolicySnapshot for a ClusterResourcePlacement deployment?](README.md#how-can-i-find-and-verify-the-latest-clusterschedulingpolicysnapshot-for-a-clusterresourceplacement) to learn how to get the latest `ClusterSchedulingPolicySnapshot`. - -The corresponding `ClusterSchedulingPolicySnapshot` spec and status gives us even more information on why scheduling failed. -### Latest ClusterSchedulingPolicySnapshot: -``` -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterSchedulingPolicySnapshot -metadata: - annotations: - kubernetes-fleet.io/CRP-generation: "1" - kubernetes-fleet.io/number-of-clusters: "2" - creationTimestamp: "2024-05-07T22:36:33Z" - generation: 1 - labels: - kubernetes-fleet.io/is-latest-snapshot: "true" - kubernetes-fleet.io/parent-CRP: crp-2 - kubernetes-fleet.io/policy-index: "0" - name: crp-2-0 - ownerReferences: - - apiVersion: placement.kubernetes-fleet.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: ClusterResourcePlacement - name: crp-2 - uid: 48bc1e92-a8b9-4450-a2d5-c6905df2cbf0 - resourceVersion: "10090" - uid: 2137887e-45fd-4f52-bbb7-b96f39854625 -spec: - policy: - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - placementType: PickN - policyHash: ZjE0Yjk4YjYyMTVjY2U3NzQ1MTZkNWRhZjRiNjQ1NzQ4NjllNTUyMzZkODBkYzkyYmRkMGU3OTI3MWEwOTkyNQ== -status: - conditions: - - lastTransitionTime: "2024-05-07T22:36:33Z" - message: could not find all the clusters needed as specified by the scheduling - policy - observedGeneration: 1 - reason: SchedulingPolicyUnfulfilled - status: "False" - type: Scheduled - observedCRPGeneration: 1 - targetClusters: - - clusterName: kind-cluster-1 - clusterScore: - affinityScore: 0 - priorityScore: 0 - reason: picked by scheduling policy - selected: true - - clusterName: kind-cluster-2 - reason: ClusterUnschedulable, cluster does not match with any of the required - cluster affinity terms - selected: false -``` - -### Resolution: -The solution here is to add the `env:prod` label to the member cluster resource for `kind-cluster-2` as well, so that the scheduler can select the cluster to propagate resources. \ No newline at end of file diff --git a/docs/troubleshooting/clusterResourcePlacementWorkSynchronized.md b/docs/troubleshooting/clusterResourcePlacementWorkSynchronized.md deleted file mode 100644 index b933e00bf..000000000 --- a/docs/troubleshooting/clusterResourcePlacementWorkSynchronized.md +++ /dev/null @@ -1,116 +0,0 @@ -# How can I debug when my CRP status is ClusterResourcePlacementWorkSynchronized condition status is set to false? - -The `ClusterResourcePlacementWorkSynchronized` condition is false when the CRP has been recently updated but the associated work objects have not yet been synchronized with the changes. -> Note: In addition, it may be helpful to look into the logs for the [work generator controller](https://github.com/Azure/fleet/blob/main/pkg/controllers/workgenerator/controller.go) to get more information on why the work synchronization failed. - -## Common Scenarios: -Instances where this condition may arise: -- The controller encounters an error while trying to generate the corresponding `work` object. -- The enveloped object is not well formatted. - -### Case Study: -The CRP is attempting to propagate a resource to a selected cluster, but the work object has not been updated to reflect the latest changes due to the selected cluster has been terminated. - -### ClusterResourcePlacement Spec: -``` -spec: - resourceSelectors: - - group: rbac.authorization.k8s.io - kind: ClusterRole - name: secret-reader - version: v1 - policy: - placementType: PickN - numberOfClusters: 1 - strategy: - type: RollingUpdate - ``` - -### ClusterResourcePlacement Status: -``` -spec: - policy: - numberOfClusters: 1 - placementType: PickN - resourceSelectors: - - group: "" - kind: Namespace - name: test-ns - version: v1 - revisionHistoryLimit: 10 - strategy: - type: RollingUpdate -status: - conditions: - - lastTransitionTime: "2024-05-14T18:05:04Z" - 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-14T18:05:05Z" - message: All 1 cluster(s) start rolling out the latest resource - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: ClusterResourcePlacementRolloutStarted - - lastTransitionTime: "2024-05-14T18:05:05Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: ClusterResourcePlacementOverridden - - lastTransitionTime: "2024-05-14T18:05:05Z" - message: There are 1 cluster(s) which have not finished creating or updating work(s) - yet - observedGeneration: 1 - reason: WorkNotSynchronizedYet - status: "False" - type: ClusterResourcePlacementWorkSynchronized - observedResourceIndex: "0" - placementStatuses: - - clusterName: kind-cluster-1 - conditions: - - lastTransitionTime: "2024-05-14T18:05:04Z" - 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-14T18:05:05Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-05-14T18:05:05Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-05-14T18:05:05Z" - message: 'Failed to synchronize the work to the latest: works.placement.kubernetes-fleet.io - "crp1-work" is forbidden: unable to create new content in namespace fleet-member-kind-cluster-1 - because it is being terminated' - observedGeneration: 1 - reason: SyncWorkFailed - status: "False" - type: WorkSynchronized - selectedResources: - - kind: Namespace - name: test-ns - version: v1 -``` -In the `ClusterResourcePlacement` status, the `ClusterResourcePlacementWorkSynchronized` condition status shows as `False`. -The message for it indicates that the work object `crp1-work` is prohibited from generating new content within the namespace `fleet-member-kind-cluster-1` because it's currently terminating. - -### Resolution: -To address the issue at hand, there are several potential solutions: -- Modify the `ClusterResourcePlacement` with a newly selected cluster. -- Delete the `ClusterResourcePlacement` to remove work through garbage collection. -- Rejoin the member cluster. The namespace can only be regenerated after rejoining the cluster. - -In other situations, you might opt to wait for the work to finish propagating. diff --git a/docs/troubleshooting/updaterun.md b/docs/troubleshooting/updaterun.md deleted file mode 100644 index 43535f120..000000000 --- a/docs/troubleshooting/updaterun.md +++ /dev/null @@ -1,198 +0,0 @@ -# Staged Update Run Troubleshooting Guide - -This guide provides troubleshooting steps for common issues related to Staged Update Run. - -## CRP status without Staged Update Run - -When a `ClusterResourcePlacement` is created with `spec.strategy.type` set to `External`, the rollout does not start immediately. - -A sample status of such `ClusterResourcePlacement` is as follows: - -```bash -$ kubectl describe crp example-placement -... -Status: - Conditions: - Last Transition Time: 2025-03-12T23:01:32Z - Message: found all cluster needed as specified by the scheduling policy, found 2 cluster(s) - Observed Generation: 1 - Reason: SchedulingPolicyFulfilled - Status: True - Type: ClusterResourcePlacementScheduled - Last Transition Time: 2025-03-12T23:01:32Z - Message: There are still 2 cluster(s) in the process of deciding whether to roll out the latest resources or not - Observed Generation: 1 - Reason: RolloutStartedUnknown - Status: Unknown - Type: ClusterResourcePlacementRolloutStarted - Observed Resource Index: 0 - Placement Statuses: - Cluster Name: member1 - Conditions: - Last Transition Time: 2025-03-12T23:01:32Z - Message: Successfully scheduled resources for placement in "member1" (affinity score: 0, topology spread score: 0): picked by scheduling policy - Observed Generation: 1 - Reason: Scheduled - Status: True - Type: Scheduled - Last Transition Time: 2025-03-12T23:01:32Z - Message: In the process of deciding whether to roll out the latest resources or not - Observed Generation: 1 - Reason: RolloutStartedUnknown - Status: Unknown - Type: RolloutStarted - Cluster Name: member2 - Conditions: - Last Transition Time: 2025-03-12T23:01:32Z - Message: Successfully scheduled resources for placement in "member2" (affinity score: 0, topology spread score: 0): picked by scheduling policy - Observed Generation: 1 - Reason: Scheduled - Status: True - Type: Scheduled - Last Transition Time: 2025-03-12T23:01:32Z - Message: In the process of deciding whether to roll out the latest resources or not - Observed Generation: 1 - Reason: RolloutStartedUnknown - Status: Unknown - Type: RolloutStarted - Selected Resources: - ... -Events: -``` - -`SchedulingPolicyFulfilled` condition indicates the CRP has been fully scheduled, while `RolloutStartedUnknown` condition shows that the rollout has not started. - -In the `Placement Statuses` section, it displays the detailed status of each cluster. Both selected clusters are in the `Scheduled` state, but the `RolloutStarted` condition is still `Unknown` because the rollout has not kicked off yet. - -## Investigate ClusterStagedUpdateRun initialization failure - -An updateRun initialization failure can be easily detected by getting the resource: -```bash -$ kubectl get crsur example-run -NAME PLACEMENT RESOURCE-SNAPSHOT-INDEX POLICY-SNAPSHOT-INDEX INITIALIZED SUCCEEDED AGE -example-run example-placement 1 0 False 2s -``` -The `INITIALIZED` field is `False`, indicating the initialization failed. - -Describe the updateRun to get more details: -```bash -$ kubectl describe crsur example-run -... -Status: - Conditions: - Last Transition Time: 2025-03-13T07:28:29Z - Message: cannot continue the ClusterStagedUpdateRun: failed to initialize the clusterStagedUpdateRun: failed to process the request due to a client error: no clusterResourceSnapshots with index `1` found for clusterResourcePlacement `example-placement` - Observed Generation: 1 - Reason: UpdateRunInitializedFailed - Status: False - Type: Initialized - Deletion Stage Status: - Clusters: - Stage Name: kubernetes-fleet.io/deleteStage - Policy Observed Cluster Count: 2 - Policy Snapshot Index Used: 0 -... -``` -The condition clearly indicates the initialization failed. And the condition message gives more details about the failure. -In this case, I used a not-existing resource snapshot index `1` for the updateRun. - -## Investigate ClusterStagedUpdateRun rollout stuck - -A `ClusterStagedUpdateRun` can get stuck when resource placement fails on some clusters. Describing the updateRun will show some cluster is stuck in `ClusterUpdatingStarted` condition: -```bash -$ date; kubectl describe crsur example-run -Thu Mar 13 07:44:28 UTC 2025 -... -Stages Status: - After Stage Task Status: - Approval Request Name: example-run-staging - Type: Approval - Type: TimedWait - Clusters: - Cluster Name: member1 - Conditions: - Last Transition Time: 2025-03-13T07:37:36Z - Message: - Observed Generation: 1 - Reason: ClusterUpdatingStarted - Status: True - Type: Started - Conditions: - Last Transition Time: 2025-03-13T07:37:36Z - Message: - Observed Generation: 1 - Reason: StageUpdatingStarted - Status: True - Type: Progressing - Stage Name: staging - Start Time: 2025-03-13T07:37:36Z -``` - -As you can see, the cluster updating has started about 7 minutes ago, but the `ClusterUpdatingSucceeded` condition is still not set yet. -This usually indicates something wrong happened on the cluster. To further investigate, you can check the `ClusterResourcePlacement` status: -```bash -$ kubectl describe crp example-placement -... -Placement Statuses: - Cluster Name: member1 - Conditions: - Last Transition Time: 2025-03-12T23:01:32Z - Message: Successfully scheduled resources for placement in "member1" (affinity score: 0, topology spread score: 0): picked by scheduling policy - Observed Generation: 1 - Reason: Scheduled - Status: True - Type: Scheduled - Last Transition Time: 2025-03-13T07:37:36Z - Message: Detected the new changes on the resources and started the rollout process, resourceSnapshotIndex: 3, clusterStagedUpdateRun: example-run - Observed Generation: 1 - Reason: RolloutStarted - Status: True - Type: RolloutStarted - Last Transition Time: 2025-03-13T07:37:36Z - Message: No override rules are configured for the selected resources - Observed Generation: 1 - Reason: NoOverrideSpecified - Status: True - Type: Overridden - Last Transition Time: 2025-03-13T07:37:36Z - Message: All of the works are synchronized to the latest - Observed Generation: 1 - Reason: AllWorkSynced - Status: True - Type: WorkSynchronized - Last Transition Time: 2025-03-13T07:37:39Z - Message: Work object example-placement-work has failed to apply - Observed Generation: 1 - Reason: NotAllWorkHaveBeenApplied - Status: False - Type: Applied - Failed Placements: - Condition: - Last Transition Time: 2025-03-13T07:37:36Z - Message: Manifest is trackable but not available yet - Observed Generation: 1 - Reason: ManifestNotAvailableYet - Status: False - Type: Available - Group: apps - Kind: Deployment - Name: nginx - Namespace: test-namespace - Version: v1 - Condition: - Last Transition Time: 2025-03-13T07:37:39Z - Message: Failed to apply manifest: failed to process the request due to a client error: resource exists and is not managed by the fleet controller and co-ownernship is disallowed - Reason: ManifestsAlreadyOwnedByOthers - Status: False - Type: Applied - Group: apps - Kind: ReplicaSet - Name: nginx-7b6df7c758 - Namespace: test-namespace - Version: v1 -... -``` - -The `Applied` condition is `False` and says not all work have been applied. And in the "failed placements" section, it shows the detailed failure. For more debugging instructions, you can refer to [CRP troubleshooting guide](./README.md). - -After resolving the issue, you can create always create a new updateRun to restart the rollout. Stuck updateRuns can be deleted. \ No newline at end of file diff --git a/docs/tutorials/Azure/JoinOnPremClustersToFleet.md b/docs/tutorials/Azure/JoinOnPremClustersToFleet.md deleted file mode 100644 index 882b19ed0..000000000 --- a/docs/tutorials/Azure/JoinOnPremClustersToFleet.md +++ /dev/null @@ -1,131 +0,0 @@ -# Tutorial: Join On-Prem Clusters to Fleet hub cluster -This tutorial will guide you through the process of joining your on-prem clusters as member clusters to a Fleet hub cluster. - -Follow these guides to setup your fleet and get access to your fleet hub cluster: - -- [Quickstart: Create an Azure Kubernetes Fleet Manager resource and join member clusters using Azure CLI (With Hub Cluster)](https://learn.microsoft.com/en-us/azure/kubernetes-fleet/quickstart-create-fleet-and-members?tabs=with-hub-cluster) -- [Quickstart: Access the Kubernetes API of the Fleet hub cluster](https://learn.microsoft.com/en-us/azure/kubernetes-fleet/quickstart-access-fleet-kubernetes-api) - -## Prerequisites - -- [Docker](https://docs.docker.com/get-docker/) -- [Helm](https://github.com/helm/helm#install) -- [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) - -## Steps to join on-prem clusters to Fleet hub cluster - -> **Note:** Please read through the entire document before running the scripts. - -### Run the join script in the fleet repository - -Clone the [fleet repository](https://github.com/Azure/fleet) and navigate to the root directory of the repo. - -Run the following script which sets up the resources on the hub cluster and each on-prem cluster to allow -the member agent installed by the script on each on-prem cluster to communicate with the hub cluster. - -> **Note:** The script creates resources on the hub cluster in a namespace called `connect-to-fleet` and also creates -> a secret on each on-prem cluster please don't update/delete these resources. - -The latest fleet image tag could be found here in [fleet releases](https://github.com/Azure/fleet/releases). - -> **Note:** Please ensure kubectl can access the kube-config of the hub cluster and all the on-prem clusters. - -Ex: -- `./hack/membership/joinMC.sh v0.1.0 hub test-cluster-1` -- `./hack/membership/joinMC.sh v0.1.0 hub test-cluster-1 test-cluster-2` - -```shell -chmod +x ./hack/membership/joinMC.sh -./hack/membership/joinMC.sh ... -``` - -The output should look like: - -``` -% kubectl get membercluster -A -NAME JOINED AGE MEMBER-AGENT-LAST-SEEN NODE-COUNT AVAILABLE-CPU AVAILABLE-MEMORY -test-cluster-1 Unknown 3m33s 5s 1 890m 4074756Ki -test-cluster-2 Unknown 3m16s 4s 1 890m 4074756Ki -``` - -> **Note:** The `JOINED` column will be `Unknown` until the fleet networking member agent charts are installed on each on-prem cluster. - -We can confirm that the member agent was installed correctly when we see `MEMBER-AGENT-LAST-SEEN`, `NODE-COUNT`, `AVAILABLE-CPU`, and `AVAILABLE-MEMORY` columns populated. -The columns mentioned can take upto a minute to populate. - -> **Note:** The script in the fleet-networking repo should only be run once the script in the fleet repo has been -> run to ensure the member agents can communicate with the hub cluster. - -### Run the join script in the fleet networking repository - -Clone the [fleet-networking repository](https://github.com/Azure/fleet-networking) and navigate to the root directory of the repo. - -Run the following script to install the fleet networking member agents on each on-prem cluster. - -The latest fleet-networking image tag could be found here [fleet-networking releases](https://github.com/Azure/fleet-networking/releases). - -Ex: -- `./hack/membership/joinMC.sh v0.1.0 v0.2.0 hub test-cluster-1` -- `./hack/membership/joinMC.sh v0.1.0 v0.2.0 hub test-cluster-1 test-cluster-2` - -```shell -chmod +x ./hack/membership/joinMC.sh -./hack/membership/joinMC.sh ... -``` - -The output should look like: - -``` -% kubectl get membercluster -A -NAME JOINED AGE MEMBER-AGENT-LAST-SEEN NODE-COUNT AVAILABLE-CPU AVAILABLE-MEMORY -test-cluster-1 True 6m49s 6s 1 490m 3550468Ki -test-cluster-2 True 6m32s 4s 1 490m 3550468Ki -``` - -The `JOINED` column will be `True` once both fleet networking member agent charts are installed on each on-prem cluster and the networking -member agents are able to communicate with fleet hub cluster. -The column can take upto a minute to populate. The `JOINED` column indicates that all three fleet member agents have all joined once. -The column is not meant for tracking each member agent's health status. - -# Steps to make an on-prem cluster leave the Fleet hub cluster - -Delete the `MemberCluster` resource for a particular on-prem cluster in the hub cluster. - -The join script in the fleet repo creates `MemberCluster` resource with the same name as your on-prem cluster. -Replace with the name of your on-prem cluster. - -``` -kubectl config use-context hub -kubectl delete membercluster --wait -``` - -Once the above delete command completes the on-prem cluster has successfully left the Fleet hub cluster. -But we still need to clean-up residual resources on the hub and on-prem clusters. - -This ensures the `MemberCluster` can be deleted, so the on-prem cluster can successfully leave the Fleet hub cluster. - -# Clean up resources created by the join scripts - -> **Note:** Before running the below script to clean up resources for on-prem clusters, please ensure that each -> on-prem cluster has left the Fleet hub cluster by manually deleting it's associated `MemberCluster` resource. - -Navigate to the root directory of the [fleet repository](https://github.com/Azure/fleet). - -Run the following script which cleans up all the resources we set up on the hub cluster and each on-prem cluster -to allow the member agents to communicate with the hub cluster. - -Ex: -- `./hack/membership/cleanup.sh hub test-cluster-1` -- `./hack/membership/cleanup.sh hub test-cluster-1 test-cluster-2` - -``` -chmod +x ./hack/membership/cleanup.sh -./hack/membership/cleanup.sh ... -``` - -All the resources created by the join scripts will be deleted except the namespace `connect-to-fleet` on the hub cluster. -If you are sure that all the member clusters have left the Fleet hub cluster, you can delete the `connect-to-fleet` namespace. - -# Troubleshooting - -If at any point we need a clean slate to start over, we can run follow the steps from this [leave section](#steps-to-make-an-on-prem-cluster-leave-the-fleet-hub-cluster). diff --git a/docs/tutorials/ClusterMigrationDR.md b/docs/tutorials/ClusterMigrationDR.md deleted file mode 100644 index e3c9c0fa7..000000000 --- a/docs/tutorials/ClusterMigrationDR.md +++ /dev/null @@ -1,423 +0,0 @@ -# Tutorial: Migrating Applications to Another Cluster When a Cluster Goes Down -This tutorial demonstrates how to move applications from clusters have gone down to other operational clusters using Fleet. - -## Scenario -Your fleet consists of the following clusters: - -1. Member Cluster 1 & Member Cluster 2 (WestUS, 1 node each) -2. Member Cluster 3 (EastUS2, 2 nodes) -3. Member Cluster 4 & Member Cluster 5 (WestEurope, 3 nodes each) - -Due to certain circumstances, Member Cluster 1 and Member Cluster 2 are down, requiring you to migrate your applications from these clusters to other operational ones. - -## Current Application Resources -The following resources are currently deployed in Member Cluster 1 and Member Cluster 2 by the ClusterResourcePlacement: - -#### Service -```yaml -apiVersion: v1 -kind: Service -metadata: - name: nginx-service - namespace: test-app -spec: - selector: - app: nginx - ports: - - protocol: TCP - port: 80 - targetPort: 80 - type: LoadBalancer -``` -Summary: -- This defines a Kubernetes Service named `nginx-svc` in the `test-app` namespace. -- The service is of type LoadBalancer, meaning it exposes the application to the internet. -- It targets pods with the label app: nginx and forwards traffic to port 80 on the pods. - -#### Deployment -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nginx-deployment - namespace: test-app -spec: - selector: - matchLabels: - app: nginx - replicas: 2 - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx:1.16.1 - ports: - - containerPort: 80 -``` -Summary: -- This defines a Kubernetes Deployment named `nginx-deployment` in the `test-app` namespace. -- It creates 2 replicas of the nginx pod, each running the `nginx:1.16.1` image. -- The deployment ensures that the specified number of pods (replicas) are running and available. -- The pods are labeled with `app: nginx` and expose port 80. - -#### ClusterResourcePlacement -```yaml -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterResourcePlacement -metadata: - annotations: - kubectl.kubernetes.io/last-applied-configuration: | - {"apiVersion":"placement.kubernetes-fleet.io/v1","kind":"ClusterResourcePlacement","metadata":{"annotations":{},"name":"crp-migration"},"spec":{"policy":{"affinity":{"clusterAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"clusterSelectorTerms":[{"labelSelector":{"matchLabels":{"fleet.azure.com/location":"westus"}}}]}}},"numberOfClusters":2,"placementType":"PickN"},"resourceSelectors":[{"group":"","kind":"Namespace","name":"test-app","version":"v1"}],"revisionHistoryLimit":10,"strategy":{"type":"RollingUpdate"}}} - creationTimestamp: "2024-07-25T21:27:35Z" - finalizers: - - kubernetes-fleet.io/crp-cleanup - - kubernetes-fleet.io/scheduler-cleanup - generation: 1 - name: crp-migration - resourceVersion: "22177519" - uid: 0683cfaa-df24-4b2c-8a3d-07031692da8f -spec: - policy: - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - fleet.azure.com/location: westus - numberOfClusters: 2 - placementType: PickN - resourceSelectors: - - group: "" - kind: Namespace - name: test-app - version: v1 - revisionHistoryLimit: 10 - strategy: - type: RollingUpdate -status: - conditions: - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: found all cluster needed as specified by the scheduling policy, found - 2 cluster(s) - observedGeneration: 1 - reason: SchedulingPolicyFulfilled - status: "True" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: All 2 cluster(s) start rolling out the latest resource - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: ClusterResourcePlacementRolloutStarted - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: ClusterResourcePlacementOverridden - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: Works(s) are succcesfully created or updated in 2 target cluster(s)' - namespaces - observedGeneration: 1 - reason: WorkSynchronized - status: "True" - type: ClusterResourcePlacementWorkSynchronized - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: The selected resources are successfully applied to 2 cluster(s) - observedGeneration: 1 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - - lastTransitionTime: "2024-07-25T21:27:45Z" - message: The selected resources in 2 cluster(s) are available now - observedGeneration: 1 - reason: ResourceAvailable - status: "True" - type: ClusterResourcePlacementAvailable - observedResourceIndex: "0" - placementStatuses: - - clusterName: aks-member-2 - conditions: - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: 'Successfully scheduled resources for placement in "aks-member-2" - (affinity score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 1 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: All of the works are synchronized to the latest - observedGeneration: 1 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: All corresponding work objects are applied - observedGeneration: 1 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-07-25T21:27:45Z" - message: All corresponding work objects are available - observedGeneration: 1 - reason: AllWorkAreAvailable - status: "True" - type: Available - - clusterName: aks-member-1 - conditions: - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: 'Successfully scheduled resources for placement in "aks-member-1" - (affinity score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 1 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: All of the works are synchronized to the latest - observedGeneration: 1 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-07-25T21:27:35Z" - message: All corresponding work objects are applied - observedGeneration: 1 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-07-25T21:27:45Z" - message: All corresponding work objects are available - observedGeneration: 1 - reason: AllWorkAreAvailable - status: "True" - type: Available - selectedResources: - - kind: Namespace - name: test-app - version: v1 - - group: apps - kind: Deployment - name: nginx-deployment - namespace: test-app - version: v1 - - kind: Service - name: nginx-service - namespace: test-app - version: v1 -``` -Summary: -- This defines a ClusterResourcePlacement named `crp-migration`. -- The PickN placement policy selects 2 clusters based on the label `fleet.azure.com/location: westus`. Consequently, it chooses Member Cluster 1 and Member Cluster 2, as they are located in WestUS. -- It targets resources in the `test-app` namespace. - -## Migrating Applications to a Cluster to Other Operational Clusters -When the clusters in WestUS go down, update the ClusterResourcePlacement (CRP) to migrate the applications to other clusters. -In this tutorial, we will move them to Member Cluster 4 and Member Cluster 5, which are located in WestEurope. - -#### Update the CRP for Migration to Clusters in WestEurope -```yaml -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterResourcePlacement -metadata: - name: crp-migration -spec: - policy: - placementType: PickN - numberOfClusters: 2 - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - fleet.azure.com/location: westeurope # updated label - resourceSelectors: - - group: "" - kind: Namespace - name: test-app - version: v1 - revisionHistoryLimit: 10 - strategy: - type: RollingUpdate -``` -Update the `crp.yaml` to reflect the new region and apply it: -```bash -kubectl apply -f crp.yaml -``` - -### Results -After applying the updated `crp.yaml`, the Fleet will schedule the application on the available clusters in WestEurope. -You can check the status of the CRP to ensure that the application has been successfully migrated and is running on the newly selected clusters: -```bash -kubectl get crp crp-migration -o yaml -``` -You should see a status indicating that the application is now running in the clusters located in WestEurope, similar to the following: -#### CRP Status -```yaml -... -status: - conditions: - - lastTransitionTime: "2024-07-25T21:36:02Z" - message: found all cluster needed as specified by the scheduling policy, found - 2 cluster(s) - observedGeneration: 2 - reason: SchedulingPolicyFulfilled - status: "True" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: All 2 cluster(s) start rolling out the latest resource - observedGeneration: 2 - reason: RolloutStarted - status: "True" - type: ClusterResourcePlacementRolloutStarted - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: No override rules are configured for the selected resources - observedGeneration: 2 - reason: NoOverrideSpecified - status: "True" - type: ClusterResourcePlacementOverridden - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: Works(s) are succcesfully created or updated in 2 target cluster(s)' - namespaces - observedGeneration: 2 - reason: WorkSynchronized - status: "True" - type: ClusterResourcePlacementWorkSynchronized - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: The selected resources are successfully applied to 2 cluster(s) - observedGeneration: 2 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: The selected resources in 2 cluster(s) are available now - observedGeneration: 2 - reason: ResourceAvailable - status: "True" - type: ClusterResourcePlacementAvailable - observedResourceIndex: "0" - placementStatuses: - - clusterName: aks-member-5 - conditions: - - lastTransitionTime: "2024-07-25T21:36:02Z" - message: 'Successfully scheduled resources for placement in "aks-member-5" (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 2 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 2 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: No override rules are configured for the selected resources - observedGeneration: 2 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: All of the works are synchronized to the latest - observedGeneration: 2 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: All corresponding work objects are applied - observedGeneration: 2 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: All corresponding work objects are available - observedGeneration: 2 - reason: AllWorkAreAvailable - status: "True" - type: Available - - clusterName: aks-member-4 - conditions: - - lastTransitionTime: "2024-07-25T21:36:02Z" - message: 'Successfully scheduled resources for placement in "aks-member-4" (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 2 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 2 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: No override rules are configured for the selected resources - observedGeneration: 2 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: All of the works are synchronized to the latest - observedGeneration: 2 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: All corresponding work objects are applied - observedGeneration: 2 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-07-25T21:36:14Z" - message: All corresponding work objects are available - observedGeneration: 2 - reason: AllWorkAreAvailable - status: "True" - type: Available - selectedResources: - - kind: Namespace - name: test-app - version: v1 - - group: apps - kind: Deployment - name: nginx-deployment - namespace: test-app - version: v1 - - kind: Service - name: nginx-service - namespace: test-app - version: v1 -``` - -## Conclusion -This tutorial demonstrated how to migrate applications using Fleet when clusters in one region go down. -By updating the ClusterResourcePlacement, you can ensure that your applications are moved to available clusters in another region, -maintaining availability and resilience. \ No newline at end of file diff --git a/docs/tutorials/MigrationWithOverrideDR.md b/docs/tutorials/MigrationWithOverrideDR.md deleted file mode 100644 index 795351a87..000000000 --- a/docs/tutorials/MigrationWithOverrideDR.md +++ /dev/null @@ -1,502 +0,0 @@ -# Tutorial: Migrating Application Resources to Clusters with More Availability -This tutorial shows how to migrate applications from clusters with lower availability to those with higher availability, -while also scaling up the number of replicas, using Fleet. - -## Scenario -Your fleet consists of the following clusters: - -1. Member Cluster 1 & Member Cluster 2 (WestUS, 1 node each) -2. Member Cluster 3 (EastUS2, 2 nodes) -3. Member Cluster 4 & Member Cluster 5 (WestEurope, 3 nodes each) - -Due to a sudden increase in traffic and resource demands in your WestUS clusters, you need to migrate your applications to clusters in EastUS2 or WestEurope that have higher availability and can better handle the increased load. - -## Current Application Resources -The following resources are currently deployed in the WestUS clusters: - -#### Service - -> Note: Service test file located [here](./testfiles/nginx-service.yaml). - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: nginx-service - namespace: test-app -spec: - selector: - app: nginx - ports: - - protocol: TCP - port: 80 - targetPort: 80 - type: LoadBalancer -``` -Summary: -- This defines a Kubernetes Service named `nginx-svc` in the `test-app` namespace. -- The service is of type LoadBalancer, meaning it exposes the application to the internet. -- It targets pods with the label app: nginx and forwards traffic to port 80 on the pods. - -#### Deployment - -> Note: Deployment test file located [here](./testfiles/nginx-deployment.yaml). - -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nginx-deployment - namespace: test-app -spec: - selector: - matchLabels: - app: nginx - replicas: 2 - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx:1.16.1 - ports: - - containerPort: 80 -``` -> Note: The current deployment has 2 replicas. - -Summary: -- This defines a Kubernetes Deployment named `nginx-deployment` in the `test-app` namespace. -- It creates 2 replicas of the nginx pod, each running the `nginx:1.16.1` image. -- The deployment ensures that the specified number of pods (replicas) are running and available. -- The pods are labeled with `app: nginx` and expose port 80. - -#### ClusterResourcePlacement - -> Note: CRP Availability test file located [here](./testfiles/crp-availability.yaml) - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterResourcePlacement -metadata: - annotations: - kubectl.kubernetes.io/last-applied-configuration: | - {"apiVersion":"placement.kubernetes-fleet.io/v1","kind":"ClusterResourcePlacement","metadata":{"annotations":{},"name":"crp-availability"},"spec":{"policy":{"affinity":{"clusterAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"clusterSelectorTerms":[{"labelSelector":{"matchLabels":{"fleet.azure.com/location":"westus"}}}]}}},"numberOfClusters":2,"placementType":"PickN"},"resourceSelectors":[{"group":"","kind":"Namespace","name":"test-app","version":"v1"}],"revisionHistoryLimit":10,"strategy":{"type":"RollingUpdate"}}} - creationTimestamp: "2024-07-25T23:00:53Z" - finalizers: - - kubernetes-fleet.io/crp-cleanup - - kubernetes-fleet.io/scheduler-cleanup - generation: 1 - name: crp-availability - resourceVersion: "22228766" - uid: 58dbb5d1-4afa-479f-bf57-413328aa61bd -spec: - policy: - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - fleet.azure.com/location: westus - numberOfClusters: 2 - placementType: PickN - resourceSelectors: - - group: "" - kind: Namespace - name: test-app - version: v1 - revisionHistoryLimit: 10 - strategy: - type: RollingUpdate -status: - conditions: - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: found all cluster needed as specified by the scheduling policy, found - 2 cluster(s) - observedGeneration: 1 - reason: SchedulingPolicyFulfilled - status: "True" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: All 2 cluster(s) start rolling out the latest resource - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: ClusterResourcePlacementRolloutStarted - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: ClusterResourcePlacementOverridden - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: Works(s) are succcesfully created or updated in 2 target cluster(s)' - namespaces - observedGeneration: 1 - reason: WorkSynchronized - status: "True" - type: ClusterResourcePlacementWorkSynchronized - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: The selected resources are successfully applied to 2 cluster(s) - observedGeneration: 1 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - - lastTransitionTime: "2024-07-25T23:01:02Z" - message: The selected resources in 2 cluster(s) are available now - observedGeneration: 1 - reason: ResourceAvailable - status: "True" - type: ClusterResourcePlacementAvailable - observedResourceIndex: "0" - placementStatuses: - - clusterName: aks-member-2 - conditions: - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: 'Successfully scheduled resources for placement in "aks-member-2" - (affinity score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 1 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: All of the works are synchronized to the latest - observedGeneration: 1 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: All corresponding work objects are applied - observedGeneration: 1 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-07-25T23:01:02Z" - message: All corresponding work objects are available - observedGeneration: 1 - reason: AllWorkAreAvailable - status: "True" - type: Available - - clusterName: aks-member-1 - conditions: - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: 'Successfully scheduled resources for placement in "aks-member-1" - (affinity score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 1 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: No override rules are configured for the selected resources - observedGeneration: 1 - reason: NoOverrideSpecified - status: "True" - type: Overridden - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: All of the works are synchronized to the latest - observedGeneration: 1 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-07-25T23:00:53Z" - message: All corresponding work objects are applied - observedGeneration: 1 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-07-25T23:01:02Z" - message: All corresponding work objects are available - observedGeneration: 1 - reason: AllWorkAreAvailable - status: "True" - type: Available - selectedResources: - - kind: Namespace - name: test-app - version: v1 - - group: apps - kind: Deployment - name: nginx-deployment - namespace: test-app - version: v1 - - kind: Service - name: nginx-service - namespace: test-app - version: v1 -``` -Summary: -- This defines a ClusterResourcePlacement named `crp-availability`. -- The placement policy PickN selects 2 clusters. The clusters are selected based on the label `fleet.azure.com/location: westus`. -- It targets resources in the `test-app` namespace. - -### Identify Clusters with More Availability -To identify clusters with more availability, you can check the member cluster properties. -```bash -kubectl get memberclusters -A -o wide -``` -The output will show the availability in each cluster, including the number of nodes, available CPU, and memory. -```bash -NAME JOINED AGE NODE-COUNT AVAILABLE-CPU AVAILABLE-MEMORY ALLOCATABLE-CPU ALLOCATABLE-MEMORY -aks-member-1 True 22d 1 30m 40Ki 1900m 4652296Ki -aks-member-2 True 22d 1 30m 40Ki 1900m 4652296Ki -aks-member-3 True 22d 2 2820m 8477196Ki 3800m 9304588Ki -aks-member-4 True 22d 3 4408m 12896012Ki 5700m 13956876Ki -aks-member-5 True 22d 3 4408m 12896024Ki 5700m 13956888Ki -``` -Based on the available resources, you can see that Member Cluster 3 in EastUS2 and Member Cluster 4 & 5 in WestEurope have more nodes and available resources compared to the WestUS clusters. - -## Migrating Applications to a Different Cluster with More Availability While Scaling Up -When the clusters in WestUS are nearing capacity limits and risk becoming overloaded, update the ClusterResourcePlacement (CRP) to migrate the applications to clusters in EastUS2 or WestEurope, which have more available resources and can handle increased demand more effectively. -For this tutorial, we will move them to WestEurope. - -## Create Resource Override - -> Note: Cluster resource override test file located [here](./testfiles/ro-1.yaml) - -To scale up during migration, apply this override before updating crp: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ResourceOverride -metadata: - name: ro-1 - namespace: test-app -spec: - resourceSelectors: - - group: apps - kind: Deployment - version: v1 - name: nginx-deployment - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - fleet.azure.com/location: westeurope - jsonPatchOverrides: - - op: replace - path: /spec/replicas - value: - 4 -``` -This override updates the `nginx-deployment` Deployment in the `test-app` namespace by setting the number of replicas to "4" for clusters located in the westeurope region. - -#### Update the CRP for Migration -```yaml -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterResourcePlacement -metadata: - name: crp-availability -spec: - policy: - placementType: PickN - numberOfClusters: 2 - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - propertySelector: - matchExpressions: - - name: kubernetes-fleet.io/node-count - operator: Ge - values: - - "3" - resourceSelectors: - - group: "" - kind: Namespace - name: test-app - version: v1 - revisionHistoryLimit: 10 - strategy: - type: RollingUpdate -``` -Update the [`crp-availability.yaml`](./testfiles/crp-availability.yaml) to reflect selecting clusters with higher node-count and apply it: -```bash -kubectl apply -f crp-availability.yaml -``` - -### Results -After applying the updated [`crp-availability.yaml`](./testfiles/crp-availability.yaml), the Fleet will schedule the application on the available clusters in WestEurope as they each have 3 nodes. -You can check the status of the CRP to ensure that the application has been successfully migrated and is running in the new region: -```bash -kubectl get crp crp-availability -o yaml -``` -You should see a status indicating that the application is now running in the WestEurope clusters, similar to the following: -#### CRP Status -```yaml -... -status: - conditions: - - lastTransitionTime: "2024-07-25T23:10:08Z" - message: found all cluster needed as specified by the scheduling policy, found - 2 cluster(s) - observedGeneration: 2 - reason: SchedulingPolicyFulfilled - status: "True" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-07-25T23:10:20Z" - message: All 2 cluster(s) start rolling out the latest resource - observedGeneration: 2 - reason: RolloutStarted - status: "True" - type: ClusterResourcePlacementRolloutStarted - - lastTransitionTime: "2024-07-25T23:10:20Z" - message: The selected resources are successfully overridden in 2 cluster(s) - observedGeneration: 2 - reason: OverriddenSucceeded - status: "True" - type: ClusterResourcePlacementOverridden - - lastTransitionTime: "2024-07-25T23:10:20Z" - message: Works(s) are succcesfully created or updated in 2 target cluster(s)' - namespaces - observedGeneration: 2 - reason: WorkSynchronized - status: "True" - type: ClusterResourcePlacementWorkSynchronized - - lastTransitionTime: "2024-07-25T23:10:21Z" - message: The selected resources are successfully applied to 2 cluster(s) - observedGeneration: 2 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - - lastTransitionTime: "2024-07-25T23:10:30Z" - message: The selected resources in 2 cluster(s) are available now - observedGeneration: 2 - reason: ResourceAvailable - status: "True" - type: ClusterResourcePlacementAvailable - observedResourceIndex: "0" - placementStatuses: - - applicableResourceOverrides: - - name: ro-1-0 - namespace: test-app - clusterName: aks-member-5 - conditions: - - lastTransitionTime: "2024-07-25T23:10:08Z" - message: 'Successfully scheduled resources for placement in "aks-member-5" (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 2 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2024-07-25T23:10:20Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 2 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-07-25T23:10:20Z" - message: Successfully applied the override rules on the resources - observedGeneration: 2 - reason: OverriddenSucceeded - status: "True" - type: Overridden - - lastTransitionTime: "2024-07-25T23:10:20Z" - message: All of the works are synchronized to the latest - observedGeneration: 2 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-07-25T23:10:21Z" - message: All corresponding work objects are applied - observedGeneration: 2 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-07-25T23:10:30Z" - message: All corresponding work objects are available - observedGeneration: 2 - reason: AllWorkAreAvailable - status: "True" - type: Available - - applicableResourceOverrides: - - name: ro-1-0 - namespace: test-app - clusterName: aks-member-4 - conditions: - - lastTransitionTime: "2024-07-25T23:10:08Z" - message: 'Successfully scheduled resources for placement in "aks-member-4" (affinity - score: 0, topology spread score: 0): picked by scheduling policy' - observedGeneration: 2 - reason: Scheduled - status: "True" - type: Scheduled - - lastTransitionTime: "2024-07-25T23:10:08Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 2 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-07-25T23:10:08Z" - message: Successfully applied the override rules on the resources - observedGeneration: 2 - reason: OverriddenSucceeded - status: "True" - type: Overridden - - lastTransitionTime: "2024-07-25T23:10:08Z" - message: All of the works are synchronized to the latest - observedGeneration: 2 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-07-25T23:10:09Z" - message: All corresponding work objects are applied - observedGeneration: 2 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-07-25T23:10:19Z" - message: All corresponding work objects are available - observedGeneration: 2 - reason: AllWorkAreAvailable - status: "True" - type: Available - selectedResources: - - kind: Namespace - name: test-app - version: v1 - - group: apps - kind: Deployment - name: nginx-deployment - namespace: test-app - version: v1 - - kind: Service - name: nginx-service - namespace: test-app - version: v1 -``` -The status indicates that the application has been successfully migrated to the WestEurope clusters and is now running with 4 replicas, as the resource override has been applied. - -To double-check, you can also verify the number of replicas in the `nginx-deployment`: -1. Change context to member cluster 4 or 5: - ```bash - kubectl config use-context aks-member-4 - ``` -2. Get the deployment: - ```bash - kubectl get deployment nginx-deployment -n test-app -o wide - ``` - -## Conclusion -This tutorial demonstrated how to migrate applications using Fleet from clusters with lower availability to those with higher availability. -By updating the ClusterResourcePlacement and applying a ResourceOverride, you can ensure that your applications are moved to clusters with better availability while also scaling up the number of replicas to enhance performance and resilience. \ No newline at end of file diff --git a/docs/tutorials/README.md b/docs/tutorials/README.md deleted file mode 100644 index 8452e7a69..000000000 --- a/docs/tutorials/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Fleet Tutorials - -Welcome to the Fleet Tutorials! This guide will help you understand how Fleet can seamlessly integrate with your development and operations workflows. -Follow the instructions provided to get the most out of Fleet's features. - -> Note -> -> If you are just getting started with Fleet, it is recommended that you refer to the -> [Fleet Getting Started Guide](../../README.md) for how to create a fleet and [Fleet Concepts](../concepts/README.md) -> for an overview of Fleet features and capabilities. - - -Below is a walkthrough of all the how-to guides currently available: -* [Migrating Applications to Another Cluster When a Cluster Goes Down ](ClusterMigrationDR.md) - - This tutorial guides you through migrating application resources across regions using Fleet. - If a region experiences an outage, you can update the `ClusterResourcePlacement` (CRP) to redeploy your Kubernetes Service - and Deployment in another region, ensuring continued availability and resilience. - -* [Migrating Application Resources to Clusters with More Availability](MigrationWithOverrideDR.md) - - This tutorial will guide you through migrating your application resources to clusters with higher availability using Fleet. - This process not only ensures your application is deployed in clusters with better resource availability but also scales up the number of replicas to enhance performance and reliability. \ No newline at end of file diff --git a/docs/tutorials/testfiles/crp-availability.yaml b/docs/tutorials/testfiles/crp-availability.yaml deleted file mode 100644 index a71815420..000000000 --- a/docs/tutorials/testfiles/crp-availability.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: placement.kubernetes-fleet.io/v1 -kind: ClusterResourcePlacement -metadata: - name: crp-availability -spec: - policy: - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - fleet.azure.com/location: westus - numberOfClusters: 2 - placementType: PickN - resourceSelectors: - - group: "" - kind: Namespace - name: test-app - version: v1 - revisionHistoryLimit: 10 - strategy: - type: RollingUpdate diff --git a/docs/tutorials/testfiles/nginx-deployment.yaml b/docs/tutorials/testfiles/nginx-deployment.yaml deleted file mode 100644 index bf649c196..000000000 --- a/docs/tutorials/testfiles/nginx-deployment.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nginx-deployment - namespace: test-app -spec: - selector: - matchLabels: - app: nginx - replicas: 2 - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx:1.16.1 - ports: - - containerPort: 80 diff --git a/docs/tutorials/testfiles/nginx-service.yaml b/docs/tutorials/testfiles/nginx-service.yaml deleted file mode 100644 index 88503e2f8..000000000 --- a/docs/tutorials/testfiles/nginx-service.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: nginx-service - namespace: test-app -spec: - selector: - app: nginx - ports: - - protocol: TCP - port: 80 - targetPort: 80 - type: LoadBalancer diff --git a/docs/tutorials/testfiles/ro-1.yaml b/docs/tutorials/testfiles/ro-1.yaml deleted file mode 100644 index 8cd4a2e2c..000000000 --- a/docs/tutorials/testfiles/ro-1.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ResourceOverride -metadata: - name: ro-1 - namespace: test-app -spec: - resourceSelectors: - - group: apps - kind: Deployment - version: v1 - name: nginx-deployment - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - fleet.azure.com/location: westeurope - jsonPatchOverrides: - - op: replace - path: /spec/replicas - value: - 4

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 diff --git a/docs/concepts/EvictionAndDisruptionBudget/README.md b/docs/concepts/EvictionAndDisruptionBudget/README.md deleted file mode 100644 index b0d95b887..000000000 --- a/docs/concepts/EvictionAndDisruptionBudget/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# Eviction & Placement Disruption Budget - -This document explains the concept of `Eviction` and `Placement Disruption Budget` in the context of the fleet. - -## Overview - -`Eviction` provides a way to force remove resources from a target cluster once the resources have already been propagated from the hub cluster by a `Placement` object. -`Eviction` is considered as an voluntary disruption triggered by the user. `Eviction` alone doesn't guarantee that resources won't be propagated to target cluster again by the scheduler. -The users need to use [taints](../../howtos/taint-toleration.md) in conjunction with `Eviction` to prevent the scheduler from picking the target cluster again. - -The `Placement Disruption Budget` object protects against voluntary disruptions. - -The only voluntary disruption that can occur in the fleet is the eviction of resources from a target cluster which can be achieved by creating the `ClusterResourcePlacementEviction` object. - -Some cases of involuntary disruptions in the context of fleet, -- The removal of resources from a member cluster by the scheduler due to scheduling policy changes. -- Users manually deleting workload resources running on a member cluster. -- Users manually deleting the `ClusterResourceBinding` object which is an internal resource the represents the placement of resources on a member cluster. -- Workloads failing to run properly on a member cluster due to misconfiguration or cluster related issues. - -For all the cases of involuntary disruptions described above, the `Placement Disruption Budget` object does not protect against them. - -## ClusterResourcePlacementEviction - -An eviction object is used to remove resources from a member cluster once the resources have already been propagated from the hub cluster. - -The eviction object is only reconciled once after which it reaches a terminal state. Below is the list of terminal states for `ClusterResourcePlacementEviction`, -- `ClusterResourcePlacementEviction` is valid and it's executed successfully. -- `ClusterResourcePlacementEviction` is invalid. -- `ClusterResourcePlacementEviction` is valid but it's not executed. - -To successfully evict resources from a cluster, the user needs to specify: - -- The name of the `ClusterResourcePlacement` object which propagated resources to the target cluster. -- The name of the target cluster from which we need to evict resources. - -When specifying the `ClusterResourcePlacement` object in the eviction's spec, the user needs to consider the following cases: - -- For `PickFixed` CRP, eviction is not allowed; it is recommended that one directly edit the list of target clusters on the CRP object. -- For `PickAll` & `PickN` CRPs, eviction is allowed because the users cannot deterministically pick or unpick a cluster based on the placement strategy; it's up to the scheduler. - -> **Note:** After an eviction is executed, there is no guarantee that the cluster won't be picked again by the scheduler to propagate resources for a `ClusterResourcePlacement` resource. -> The user needs to specify a [taint](../../howtos/taint-toleration.md) on the cluster to prevent the scheduler from picking the cluster again. This is especially true for `PickAll ClusterResourcePlacement` because -> the scheduler will try to propagate resources to all the clusters in the fleet. - -## ClusterResourcePlacementDisruptionBudget - -The `ClusterResourcePlacementDisruptionBudget` is used to protect resources propagated by a `ClusterResourcePlacement` to a target cluster from voluntary disruption, i.e., `ClusterResourcePlacementEviction`. - -> **Note:** When specifying a `ClusterResourcePlacementDisruptionBudget`, the name should be the same as the `ClusterResourcePlacement` that it's trying to protect. - -Users are allowed to specify one of two fields in the `ClusterResourcePlacementDisruptionBudget` spec since they are mutually exclusive: - -- MaxUnavailable - specifies the maximum number of clusters in which a placement can be unavailable due to any form of disruptions. -- MinAvailable - specifies the minimum number of clusters in which placements are available despite any form of disruptions. - -for both `MaxUnavailable` and `MinAvailable`, the user can specify the number of clusters as an integer or as a percentage of the total number of clusters in the fleet. - -> **Note:** For both MaxUnavailable and MinAvailable, involuntary disruptions are not subject to the disruption budget but will still count against it. - -When specifying a disruption budget for a particular `ClusterResourcePlacement`, the user needs to consider the following cases: - -| CRP type | `MinAvailable` DB with an integer | `MinAvailable` DB with a percentage | `MaxUnavailable` DB with an integer | `MaxUnavailable` DB with a percentage | -|--------------|-----------------------------------|-------------------------------------|-------------------------------------|---------------------------------------| -| `PickFixed` | ❌ | ❌ | ❌ | ❌ | -| `PickAll` | ✅ | ❌ | ❌ | ❌ | -| `PickN` | ✅ | ✅ | ✅ | ✅ | - -> **Note:** We don't allow eviction for `PickFixed` CRP and hence specifying a `ClusterResourcePlacementDisruptionBudget` for `PickFixed` CRP does nothing. -> And for `PickAll` CRP, the user can only specify `MinAvailable` because total number of clusters selected by a `PickAll` CRP is non-deterministic. -> If the user creates an invalid `ClusterResourcePlacementDisruptionBudget` object, when an eviction is created, the eviction won't be successfully executed. \ No newline at end of file diff --git a/docs/concepts/MemberCluster/README.md b/docs/concepts/MemberCluster/README.md deleted file mode 100644 index 2014ab801..000000000 --- a/docs/concepts/MemberCluster/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# MemberCluster - -## Overview - -The fleet constitutes an implementation of a [`ClusterSet`](https://multicluster.sigs.k8s.io/api-types/cluster-set/) and -encompasses the following attributes: -- A collective of clusters managed by a centralized authority. -- Typically characterized by a high level of mutual trust within the cluster set. -- Embraces the principle of Namespace Sameness across clusters: - - Ensures uniform permissions and characteristics for a given namespace across all clusters. - - While not mandatory for every cluster, namespaces exhibit consistent behavior across those where they are present. - -The `MemberCluster` represents a cluster-scoped API established within the hub cluster, serving as a representation of -a cluster within the fleet. This API offers a dependable, uniform, and automated approach for multi-cluster applications -(frameworks, toolsets) to identify registered clusters within a fleet. Additionally, it facilitates applications in querying -a list of clusters managed by the fleet or observing cluster statuses for subsequent actions. - -Some illustrative use cases encompass: - -- The Fleet Scheduler utilizing managed cluster statuses or specific cluster properties (e.g., labels, taints) of a `MemberCluster` -for resource scheduling. -- Automation tools like GitOps systems (e.g., ArgoCD or Flux) automatically registering/deregistering clusters in compliance -with the `MemberCluster` API. -- The [MCS API](https://multicluster.sigs.k8s.io/concepts/multicluster-services-api/) automatically generating `ServiceImport` CRs -based on the `MemberCluster` CR defined within a fleet. - -Moreover, it furnishes a user-friendly interface for human operators to monitor the managed clusters. - -## MemberCluster Lifecycle - -### Joining the Fleet - -The process to join the Fleet involves creating a `MemberCluster`. The `MemberCluster` controller, a constituent of the -hub-cluster-agent described in the [Component](../Components/README.md), watches the `MemberCluster` CR and generates -a corresponding namespace for the member cluster within the hub cluster. It configures roles and role bindings within the -hub cluster, authorizing the specified member cluster identity (as detailed in the `MemberCluster` spec) access solely -to resources within that namespace. To collate member cluster status, the controller generates another internal CR named -`InternalMemberCluster` within the newly formed namespace. Simultaneously, the `InternalMemberCluster` controller, a component -of the member-cluster-agent situated in the member cluster, gathers statistics on cluster usage, such as capacity utilization, -and reports its status based on the `HeartbeatPeriodSeconds` specified in the CR. Meanwhile, the `MemberCluster` controller -consolidates agent statuses and marks the cluster as `Joined`. - -### Leaving the Fleet - -Fleet administrators can deregister a cluster by deleting the `MemberCluster` CR. Upon detection of deletion events by -the `MemberCluster` controller within the hub cluster, it removes the corresponding `InternalMemberCluster` CR in the -reserved namespace of the member cluster. It awaits completion of the "leave" process by the `InternalMemberCluster` -controller of member agents, and then deletes role and role bindings and other resources including the member cluster reserved -namespaces on the hub cluster. - -## Taints - -Taints are a mechanism to prevent the Fleet Scheduler from scheduling resources to a `MemberCluster`. We adopt the concept of -[taints and tolerations](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) introduced in Kubernetes to -the multi-cluster use case. - -The `MemberCluster` CR supports the specification of list of taints, which are applied to the `MemberCluster`. Each Taint object comprises -the following fields: -- `key`: The key of the taint. -- `value`: The value of the taint. -- `effect`: The effect of the taint, which can be `NoSchedule` for now. - -Once a `MemberCluster` is tainted with a specific taint, it lets the Fleet Scheduler know that the `MemberCluster` should not receive resources -as part of the workload propagation from the hub cluster. - -The `NoSchedule` taint is a signal to the Fleet Scheduler to avoid scheduling resources from a `ClusterResourcePlacement` to the `MemberCluster`. -Any `MemberCluster` already selected for resource propagation will continue to receive resources even if a new taint is added. - -Taints are only honored by `ClusterResourcePlacement` with **PickAll**, **PickN** placement policies. In the case of **PickFixed** placement policy -the taints are ignored because the user has explicitly specify the `MemberClusters` where the resources should be placed. - -For detailed instructions, please refer to this [document](../../howtos/taint-toleration.md). - -## What's next -* Get hands-on experience [how to add a member cluster to a fleet](../../howtos/clusters.md). -* Explore the [`ClusterResourcePlacement` concept to placement cluster scope resources among managed clusters](../ClusterResourcePlacement/README.md). - - diff --git a/docs/concepts/Override/README.md b/docs/concepts/Override/README.md deleted file mode 100644 index 5819e56c9..000000000 --- a/docs/concepts/Override/README.md +++ /dev/null @@ -1,328 +0,0 @@ -# Override - -## Overview -The `ClusterResourceOverride` and `ResourceOverride` provides a way to customize resource configurations before they are propagated -to the target cluster by the `ClusterResourcePlacement`. - -## Difference Between `ClusterResourceOverride` And `ResourceOverride` - -`ClusterResourceOverride` represents the cluster-wide policy that overrides the cluster scoped resources to one or more -clusters while `ResourceOverride` will apply to resources in the same namespace as the namespace-wide policy. - -> **Note:** If a namespace is selected by the `ClusterResourceOverride`, ALL the resources under the namespace are selected -automatically. - -If the resource is selected by both `ClusterResourceOverride` and `ResourceOverride`, the `ResourceOverride` will win -when resolving the conflicts. - -## When To Use Override -Overrides is useful when you want to customize the resources before they are propagated from the hub cluster to the target clusters. -Some example use cases are: -- As a platform operator, I want to propagate a clusterRoleBinding to cluster-us-east and cluster-us-west and would like to -grant the same role to different groups in each cluster. -- As a platform operator, I want to propagate a clusterRole to cluster-staging and cluster-production and would like to -grant more permissions to the cluster-staging cluster than the cluster-production cluster. -- As a platform operator, I want to propagate a namespace to all the clusters and would like to customize the labels for -each cluster. -- As an application developer, I would like to propagate a deployment to cluster-staging and cluster-production and would -like to always use the latest image in the staging cluster and a specific image in the production cluster. -- As an application developer, I would like to propagate a deployment to all the clusters and would like to use different -commands for my container in different regions. - -## Limits -- Each resource can be only selected by one override simultaneously. In the case of namespace scoped resources, up to two -overrides will be allowed, considering the potential selection through both `ClusterResourceOverride` (select its namespace) -and `ResourceOverride`. -- At most 100 `ClusterResourceOverride` can be created. -- At most 100 `ResourceOverride` can be created. - -## Placement - -This specifies which placement the override should be applied to. - -## Resource Selector -`ClusterResourceSelector` of `ClusterResourceOverride` selects which cluster-scoped resources need to be overridden before -applying to the selected clusters. - -It supports the following forms of resource selection: -- Select resources by specifying the and name. This selection propagates only one resource that -matches the and name. - -> **Note:** Label selector of `ClusterResourceSelector` is not supported. - -`ResourceSelector` of `ResourceOverride` selects which namespace-scoped resources need to be overridden before applying to -the selected clusters. - -It supports the following forms of resource selection: -- Select resources by specifying the and name. This selection propagates only one resource that -matches the and name under the `ResourceOverride` namespace. - -## Override Policy -Override policy defines how to override the selected resources on the target clusters. - -It contains an array of override rules and its order determines the override order. For example, when there are two rules -selecting the same fields on the target cluster, the last one will win. - -Each override rule contains the following fields: -- `ClusterSelector`: which cluster(s) the override rule applies to. It supports the following forms of cluster selection: - - Select clusters by specifying the cluster labels. - - An empty selector selects ALL the clusters. - - A nil selector selects NO target cluster. -- `OverrideType`: which type of the override should be applied to the selected resources. The default type is `JSONPatch`. - - `JSONPatch`: applies the JSON patch to the selected resources using [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902). - - `Delete`: deletes the selected resources on the target cluster. -- `JSONPatchOverrides`: a list of JSON path override rules applied to the selected resources following [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902) when the override type is `JSONPatch`. - -> **Note:** Updating the fields in the TypeMeta (e.g., `apiVersion`, `kind`) is not allowed. - -> **Note:** Updating the fields in the ObjectMeta (e.g., `name`, `namespace`) excluding annotations and labels is not allowed. - -> **Note:** Updating the fields in the Status (e.g., `status`) is not allowed. - -### Reserved Variables in the JSON Patch Override Value - -There is a list of reserved variables that will be replaced by the actual values used in the `value` of the JSON patch override rule: -* `${MEMBER-CLUSTER-NAME}`: this will be replaced by the name of the `memberCluster` that represents this cluster. - -For example, to add a label to the `ClusterRole` named `secret-reader` on clusters with the label `env: prod`, -you can use the following configuration: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ClusterResourceOverride -metadata: - name: example-cro -spec: - placement: - name: crp-example - clusterResourceSelectors: - - group: rbac.authorization.k8s.io - kind: ClusterRole - version: v1 - name: secret-reader - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - jsonPatchOverrides: - - op: add - path: /metadata/labels - value: - {"cluster-name":"${MEMBER-CLUSTER-NAME}"} -``` -The `ClusterResourceOverride` object above will add a label `cluster-name` with the value of the `memberCluster` name to the `ClusterRole` named `secret-reader` on clusters with the label `env: prod`. - -## When To Trigger Rollout - -It will take the snapshot of each override change as a result of `ClusterResourceOverrideSnapshot` and -`ResourceOverrideSnapshot`. The snapshot will be used to determine whether the override change should be applied to the existing -`ClusterResourcePlacement` or not. If applicable, it will start rolling out the new resources to the target clusters by -respecting the rollout strategy defined in the `ClusterResourcePlacement`. - -## Examples - -### add annotations to the configmap by using clusterResourceOverride -Suppose we create a configmap named `app-config-1` under the namespace `application-1` in the hub cluster, and we want to -add an annotation to it, which is applied to all the member clusters. - -```yaml -apiVersion: v1 -data: - data: test -kind: ConfigMap -metadata: - creationTimestamp: "2024-05-07T08:06:27Z" - name: app-config-1 - namespace: application-1 - resourceVersion: "1434" - uid: b4109de8-32f2-4ac8-9e1a-9cb715b3261d -``` - -Create a `ClusterResourceOverride` named `cro-1` to add an annotation to the namespace `application-1`. - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ClusterResourceOverride -metadata: - creationTimestamp: "2024-05-07T08:06:27Z" - finalizers: - - kubernetes-fleet.io/override-cleanup - generation: 1 - name: cro-1 - resourceVersion: "1436" - uid: 32237804-7eb2-4d5f-9996-ff4d8ce778e7 -spec: - placement: - name: crp-example - clusterResourceSelectors: - - group: "" - kind: Namespace - name: application-1 - version: v1 - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: [] - jsonPatchOverrides: - - op: add - path: /metadata/annotations - value: - cro-test-annotation: cro-test-annotation-val -``` - -Check the configmap on one of the member cluster by running `kubectl get configmap app-config-1 -n application-1 -o yaml` command: - -```yaml -apiVersion: v1 -data: - data: test -kind: ConfigMap -metadata: - annotations: - cro-test-annotation: cro-test-annotation-val - kubernetes-fleet.io/last-applied-configuration: '{"apiVersion":"v1","data":{"data":"test"},"kind":"ConfigMap","metadata":{"annotations":{"cro-test-annotation":"cro-test-annotation-val","kubernetes-fleet.io/spec-hash":"4dd5a08aed74884de455b03d3b9c48be8278a61841f3b219eca9ed5e8a0af472"},"name":"app-config-1","namespace":"application-1","ownerReferences":[{"apiVersion":"placement.kubernetes-fleet.io/v1beta1","blockOwnerDeletion":false,"kind":"AppliedWork","name":"crp-1-work","uid":"77d804f5-f2f1-440e-8d7e-e9abddacb80c"}]}}' - kubernetes-fleet.io/spec-hash: 4dd5a08aed74884de455b03d3b9c48be8278a61841f3b219eca9ed5e8a0af472 - creationTimestamp: "2024-05-07T08:06:27Z" - name: app-config-1 - namespace: application-1 - ownerReferences: - - apiVersion: placement.kubernetes-fleet.io/v1beta1 - blockOwnerDeletion: false - kind: AppliedWork - name: crp-1-work - uid: 77d804f5-f2f1-440e-8d7e-e9abddacb80c - resourceVersion: "1449" - uid: a8601007-1e6b-4b64-bc05-1057ea6bd21b -``` - -### add annotations to the configmap by using resourceOverride - -You can use the `ResourceOverride` to add an annotation to the configmap `app-config-1` explicitly in the namespace `application-1`. - -```yaml -apiVersion: placement.kubernetes-fleet.io/v1alpha1 -kind: ResourceOverride -metadata: - creationTimestamp: "2024-05-07T08:25:31Z" - finalizers: - - kubernetes-fleet.io/override-cleanup - generation: 1 - name: ro-1 - namespace: application-1 - resourceVersion: "3859" - uid: b4117925-bc3c-438d-a4f6-067bc4577364 -spec: - placement: - name: crp-example - policy: - overrideRules: - - clusterSelector: - clusterSelectorTerms: [] - jsonPatchOverrides: - - op: add - path: /metadata/annotations - value: - ro-test-annotation: ro-test-annotation-val - resourceSelectors: - - group: "" - kind: ConfigMap - name: app-config-1 - version: v1 -``` - -## How To Validate If Overrides Are Applied - -You can validate if the overrides are applied by checking the `ClusterResourcePlacement` status. The status output will -indicate both placement conditions and individual placement statuses on each member cluster that was overridden. - -Sample output: -```yaml -status: - conditions: - - lastTransitionTime: "2024-05-07T08:06:27Z" - message: found all the clusters needed as specified by the scheduling policy - observedGeneration: 1 - reason: SchedulingPolicyFulfilled - status: "True" - type: ClusterResourcePlacementScheduled - - lastTransitionTime: "2024-05-07T08:06:27Z" - message: All 3 cluster(s) start rolling out the latest resource - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: ClusterResourcePlacementRolloutStarted - - lastTransitionTime: "2024-05-07T08:06:27Z" - message: The selected resources are successfully overridden in the 3 clusters - observedGeneration: 1 - reason: OverriddenSucceeded - status: "True" - type: ClusterResourcePlacementOverridden - - lastTransitionTime: "2024-05-07T08:06:27Z" - message: Works(s) are succcesfully created or updated in the 3 target clusters' - namespaces - observedGeneration: 1 - reason: WorkSynchronized - status: "True" - type: ClusterResourcePlacementWorkSynchronized - - lastTransitionTime: "2024-05-07T08:06:27Z" - message: The selected resources are successfully applied to 3 clusters - observedGeneration: 1 - reason: ApplySucceeded - status: "True" - type: ClusterResourcePlacementApplied - - lastTransitionTime: "2024-05-07T08:06:27Z" - message: The selected resources in 3 cluster are available now - observedGeneration: 1 - reason: ResourceAvailable - status: "True" - type: ClusterResourcePlacementAvailable - observedResourceIndex: "0" - placementStatuses: - - applicableClusterResourceOverrides: - - cro-1-0 - clusterName: kind-cluster-1 - conditions: - - lastTransitionTime: "2024-05-07T08:06:27Z" - 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-07T08:06:27Z" - message: Detected the new changes on the resources and started the rollout process - observedGeneration: 1 - reason: RolloutStarted - status: "True" - type: RolloutStarted - - lastTransitionTime: "2024-05-07T08:06:27Z" - message: Successfully applied the override rules on the resources - observedGeneration: 1 - reason: OverriddenSucceeded - status: "True" - type: Overridden - - lastTransitionTime: "2024-05-07T08:06:27Z" - message: All of the works are synchronized to the latest - observedGeneration: 1 - reason: AllWorkSynced - status: "True" - type: WorkSynchronized - - lastTransitionTime: "2024-05-07T08:06:27Z" - message: All corresponding work objects are applied - observedGeneration: 1 - reason: AllWorkHaveBeenApplied - status: "True" - type: Applied - - lastTransitionTime: "2024-05-07T08:06:27Z" - message: The availability of work object crp-1-work is not trackable - observedGeneration: 1 - reason: WorkNotTrackable - status: "True" - type: Available -... -``` - -`applicableClusterResourceOverrides` in `placementStatuses` indicates which `ClusterResourceOverrideSnapshot` that is applied -to the target cluster. Similarly, `applicableResourceOverrides` will be set if the `ResourceOverrideSnapshot` is applied. diff --git a/docs/concepts/PropertyProviderAndClusterProperties/README.md b/docs/concepts/PropertyProviderAndClusterProperties/README.md deleted file mode 100644 index e600f60f2..000000000 --- a/docs/concepts/PropertyProviderAndClusterProperties/README.md +++ /dev/null @@ -1,119 +0,0 @@ -# Property Provider and Cluster Properties -This document explains the concepts of property provider and cluster properties in Fleet. - -Fleet allows developers to implement a property provider to expose arbitrary properties about -a member cluster, such as its node count and available resources for workload placement. Platforms -could also enable their property providers to expose platform-specific properties via Fleet. -These properties can be useful in a variety of cases: for example, administrators could monitor the -health of a member cluster using related properties; Fleet also supports making scheduling -decisions based on the property data. - -## Property provider - -A property provider implements Fleet's property provider interface: - -```go -// PropertyProvider is the interface that every property provider must implement. -type PropertyProvider interface { - // Collect is called periodically by the Fleet member agent to collect properties. - // - // Note that this call should complete promptly. Fleet member agent will cancel the - // context if the call does not complete in time. - Collect(ctx context.Context) PropertyCollectionResponse - // Start is called when the Fleet member agent starts up to initialize the property provider. - // This call should not block. - // - // Note that Fleet member agent will cancel the context when it exits. - Start(ctx context.Context, config *rest.Config) error -} -``` - -For the details, see the [Fleet source code](../../../pkg/propertyprovider/interface.go). - -A property provider should be shipped as a part of the Fleet member agent and run alongside it. -Refer to the [Fleet source code](../../../cmd/memberagent/main.go) -for specifics on how to set it up with the Fleet member agent. -At this moment, only one property provider can be set up with the Fleet member agent at a time. -Once connected, the Fleet member agent will attempt to start it when -the agent itself initializes; the agent will then start collecting properties from the -property provider periodically. - -A property provider can expose two types of properties: resource properties, and non-resource -properties. To learn about the two types, see the section below. In addition, the provider can -choose to report its status, such as any errors encountered when preparing the properties, -in the form of Kubernetes conditions. - -The Fleet member agent can run with or without a property provider. If a provider is not set up, or -the given provider fails to start properly, the agent will collect limited properties about -the cluster on its own, specifically the node count, plus the total/allocatable -CPU and memory capacities of the host member cluster. - -## Cluster properties - -A cluster property is an attribute of a member cluster. There are two types of properties: - -* Resource property: the usage information of a resource in a member cluster; the -name of the resource should be in the format of -[a Kubernetes label key](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set), -such as `cpu` and `memory`, and the usage information should consist of: - - * the total capacity of the resource, which is the amount of the resource - installed in the cluster; - * the allocatable capacity of the resource, which is the maximum amount of the resource - that can be used for running user workloads, as some amount of the resource might be - reserved by the OS, kubelet, etc.; - * the available capacity of the resource, which is the amount of the resource that - is currently free for running user workloads. - - Note that you may report a virtual resource via the property provider, if applicable. - -* Non-resource property: a metric about a member cluster, in the form of a key/value -pair; the key should be in the format of -[a Kubernetes label key](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set), -such as `kubernetes-fleet.io/node-count`, and the value at this moment should be a sortable -numeric that can be parsed as -[a Kubernetes quantity](https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/). - -Eventually, all cluster properties are exposed via the Fleet `MemberCluster` API, with the -non-resource properties in the `.status.properties` field and the resource properties -`.status.resourceUsage` field: - -```yaml -apiVersion: cluster.kubernetes-fleet.io/v1beta1 -kind: MemberCluster -metadata: ... -spec: ... -status: - agentStatus: ... - conditions: ... - properties: - kubernetes-fleet.io/node-count: - observationTime: "2024-04-30T14:54:24Z" - value: "2" - ... - resourceUsage: - allocatable: - cpu: 32 - memory: "16Gi" - available: - cpu: 2 - memory: "800Mi" - capacity: - cpu: 40 - memory: "20Gi" -``` - -Note that conditions reported by the property provider (if any), would be available in the -`.status.conditions` array as well. - -### Core properties - -The following properties are considered core properties in Fleet, which should be supported -in all property provider implementations. Fleet agents will collect them even when no -property provider has been set up. - -| Property Type | Name | Description | -| ------------- | ---- | ----------- | -| Non-resource property | `kubernetes-fleet.io/node-count` | The number of nodes in a cluster. | -| Resource property | `cpu` | The usage information (total, allocatable, and available capacity) of CPU resource in a cluster. | -| Resource property | `memory` | The usage information (total, allocatable, and available capacity) of memory resource in a cluster. | diff --git a/docs/concepts/README.md b/docs/concepts/README.md deleted file mode 100644 index a176b5b71..000000000 --- a/docs/concepts/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Fleet Concepts - -The Concepts section helps you learn about the parts of the Fleet system and the multi-cluster placement related concepts, -and helps you obtain a deeper understanding how Fleet works. - -## [Components](Components/README.md) -The high level components concepts behind the fleet. - -## [MemberCluster](MemberCluster/README.md) -Understand `MemberCluster` concept to join or leave the fleet. - -## [ClusterResourcePlacement](ClusterResourcePlacement/README.md) -Concepts and resources behind the `ClusterResourcePlacement`. - -## [Scheduler](Scheduler/README.md) -Understand how multi-cluster scheduling works. - -## [Scheduling Framework](Scheduling-Framework/README.md) -Lower-level multi-cluster scheduling system design. - -## [Safe Rollout](SafeRollout/README.md) - -Understand how we support rolling out the changes in a safe way. - -## [Override](Override/README.md) -Allow slightly different manifests depends on the cluster it lands. - -## [PropertyProvider](PropertyProviderAndClusterProperties/README.md) -More ways to select the clusters based on its property. - -## [Eviction & Placement Disruption Budget](EvictionAndDisruptionBudget/README.md) -Understand how placements can be evicted and protected from voluntary disruptions in fleet. diff --git a/docs/concepts/SafeRollout/README.md b/docs/concepts/SafeRollout/README.md deleted file mode 100644 index 506a4e799..000000000 --- a/docs/concepts/SafeRollout/README.md +++ /dev/null @@ -1,231 +0,0 @@ -# Safe Rollout - -One of the most important features of Fleet is the ability to safely rollout changes across multiple clusters. We do -this by rolling out the changes in a controlled manner, ensuring that we only continue to propagate the changes to the -next target clusters if the resources are successfully applied to the previous target clusters. - -## Overview - -We automatically propagate any resource changes that are selected by a `ClusterResourcePlacement` from the hub cluster -to the target clusters based on the placement policy defined in the `ClusterResourcePlacement`. In order to reduce the -blast radius of such operation, we provide users a way to safely rollout the new changes so that a bad release -won't affect all the running instances all at once. - -## Rollout Strategy - -We currently support the `RollingUpdate` rollout strategy. It updates the resources in the selected target clusters -gradually based on the `maxUnavailable` and `maxSurge` settings. - -## In place update policy - -We always try to do in-place update by respecting the rollout strategy if there is no change in the placement. This is to avoid unnecessary -interrupts to the running workloads when there is only resource changes. For example, if you only change the tag of the -deployment in the namespace you want to place, we will do an in-place update on the deployments already placed on the -targeted cluster instead of moving the existing deployments to other clusters even if the labels or properties of the -current clusters are not the best to match the current placement policy. - -## How To Use RollingUpdateConfig - -RolloutUpdateConfig is used to control behavior of the rolling update strategy. - -### MaxUnavailable and MaxSurge - -`MaxUnavailable` specifies the maximum number of connected clusters to the fleet compared to `target number of clusters` -specified in `ClusterResourcePlacement` policy in which resources propagated by the `ClusterResourcePlacement` can be -unavailable. Minimum value for `MaxUnavailable` is set to 1 to avoid stuck rollout during in-place resource update. - -`MaxSurge` specifies the maximum number of clusters that can be scheduled with resources above the `target number of clusters` -specified in `ClusterResourcePlacement` policy. - -> **Note:** `MaxSurge` only applies to rollouts to newly scheduled clusters, and doesn't apply to rollouts of workload triggered by -updates to already propagated resource. For updates to already propagated resources, we always try to do the updates in -place with no surge. - -`target number of clusters` changes based on the `ClusterResourcePlacement` policy. - -- For PickAll, it's the number of clusters picked by the scheduler. -- For PickN, it's the number of clusters specified in the `ClusterResourcePlacement` policy. -- For PickFixed, it's the length of the list of cluster names specified in the `ClusterResourcePlacement` policy. - -#### Example 1: - -Consider a fleet with 4 connected member clusters (cluster-1, cluster-2, cluster-3 & cluster-4) where every member -cluster has label `env: prod`. The hub cluster has a namespace called `test-ns` with a deployment in it. - -The `ClusterResourcePlacement` spec is defined as follows: - -```yaml -spec: - resourceSelectors: - - group: "" - kind: Namespace - version: v1 - name: test-ns - policy: - placementType: PickN - numberOfClusters: 3 - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - env: prod - strategy: - rollingUpdate: - maxUnavailable: 1 - maxSurge: 1 -``` - -The rollout will be as follows: - -- We try to pick 3 clusters out of 4, for this scenario let's say we pick cluster-1, cluster-2 & cluster-3. -- Since we can't track the initial availability for the deployment, we rollout the namespace with deployment to -cluster-1, cluster-2 & cluster-3. - -- Then we update the deployment with a bad image name to update the resource in place on cluster-1, cluster-2 & cluster-3. - -- But since we have `maxUnavailable` set to 1, we will rollout the bad image name update for deployment to one of the clusters -(which cluster the resource is rolled out to first is non-deterministic). - -- Once the deployment is updated on the first cluster, we will wait for the deployment's availability to be true before -rolling out to the other clusters -- And since we rolled out a bad image name update for the deployment it's availability will always be false and hence the -rollout for the other two clusters will be stuck -- Users might think `maxSurge` of 1 might be utilized here but in this case since we are updating the resource in place -`maxSurge` will not be utilized to surge and pick cluster-4. - -> **Note:** `maxSurge` will be utilized to pick cluster-4, if we change the policy to pick 4 cluster or change placement -type to `PickAll`. - -#### Example 2: - -Consider a fleet with 4 connected member clusters (cluster-1, cluster-2, cluster-3 & cluster-4) where, - -- cluster-1 and cluster-2 has label `loc: west` -- cluster-3 and cluster-4 has label `loc: east` - -The hub cluster has a namespace called `test-ns` with a deployment in it. - -Initially, the `ClusterResourcePlacement` spec is defined as follows: - -```yaml -spec: - resourceSelectors: - - group: "" - kind: Namespace - version: v1 - name: test-ns - policy: - placementType: PickN - numberOfClusters: 2 - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - loc: west - strategy: - rollingUpdate: - maxSurge: 2 -``` - -The rollout will be as follows: -- We try to pick clusters (cluster-1 and cluster-2) by specifying the label selector `loc: west`. -- Since we can't track the initial availability for the deployment, we rollout the namespace with deployment to cluster-1 -and cluster-2 and wait till they become available. - -Then we update the `ClusterResourcePlacement` spec to the following: - -```yaml -spec: - resourceSelectors: - - group: "" - kind: Namespace - version: v1 - name: test-ns - policy: - placementType: PickN - numberOfClusters: 2 - affinity: - clusterAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - clusterSelectorTerms: - - labelSelector: - matchLabels: - loc: east - strategy: - rollingUpdate: - maxSurge: 2 -``` - -The rollout will be as follows: - -- We try to pick clusters (cluster-3 and cluster-4) by specifying the label selector `loc: east`. -- But this time around since we have `maxSurge` set to 2 we are saying we can propagate resources to a maximum of -4 clusters but our target number of clusters specified is 2, we will rollout the namespace with deployment to both -cluster-3 and cluster-4 before removing the deployment from cluster-1 and cluster-2. -- And since `maxUnavailable` is always set to 25% by default which is rounded off to 1, we will remove the -resource from one of the existing clusters (cluster-1 or cluster-2) because when `maxUnavailable` is 1 the policy -mandates at least one cluster to be available. - -### UnavailablePeriodSeconds - -`UnavailablePeriodSeconds` is used to configure the waiting time between rollout phases when we cannot determine if the -resources have rolled out successfully or not. This field is used only if the availability of resources we propagate -are not trackable. Refer to the [Availability based Rollout](#availability-based-rollout) section for more details on a list of resources we can track. - -## Availability based Rollout -We have built-in mechanisms to determine the availability of some common Kubernetes native resources. We only mark them -as available in the target clusters when they meet the criteria we defined. - -### How It Works -We have an agent running in the target cluster to check the status of the resources. We have specific criteria for each -of the following resources to determine if they are available or not. Here are the list of resources we support: - -#### Deployment/DaemonSet/StatefulSet -We only mark them as available if the number of updated replicas equals the number of desired replicas. - -#### Service -For `Service` based on the service type the availability is determined as follows: - -- For `ClusterIP` & `NodePort` service, we mark it as available when a cluster IP is assigned. -- For `LoadBalancer` service, we mark it as available when a `LoadBalancerIngress` has been assigned along with an IP or Hostname. -- For `ExternalName` service, checking availability is not supported, so it will be marked as available with a "not trackable" reason. - - -#### Custom Resource Definition -For `CustomResourceDefinition` availability is determined as follows: -- We mark as available when `Established` condition is set to true and `NamesAccepted` condition is set to true. - - -### Pod Disruption Budget -For `PodDisruptionBudget` based on the `DisruptionsAllowed` field the availability is determined as follows: -- For `DisruptionsAllowed` > 0 , we mark it as available when condition `DisruptionAllowed` is set to true and the reason - is `SufficientPods`. -- Otherwise, we mark it as available when condition `DisruptionAllowed` is set to false and the reason - is `InsufficientPodsReason`. - - -#### Data only objects - -For the objects described below since they are a data resource we mark them as available immediately after creation: - -- Namespace -- Secret -- ConfigMap -- Role -- ClusterRole -- RoleBinding -- ClusterRoleBinding -- NetworkPolicy -- CSIDriver -- CSINode -- StorageClass -- CSIStorageCapacity -- ControllerRevision -- IngressClass -- LimitRange -- ResourceQuota -- PriorityClass diff --git a/docs/concepts/Scheduler/README.md b/docs/concepts/Scheduler/README.md deleted file mode 100644 index 874cdd68f..000000000 --- a/docs/concepts/Scheduler/README.md +++ /dev/null @@ -1,113 +0,0 @@ -# Fleet Scheduler - -The scheduler component is a vital element in Fleet workload scheduling. Its primary responsibility is to determine the -schedule decision for a bundle of resources based on the latest `ClusterSchedulingPolicySnapshot`generated by the `ClusterResourcePlacement`. -By default, the scheduler operates in batch mode, which enhances performance. In this mode, it binds a `ClusterResourceBinding` -from a `ClusterResourcePlacement` to multiple clusters whenever possible. - -## Batch in nature - -Scheduling resources within a `ClusterResourcePlacement` involves more dependencies compared with scheduling pods within -a deployment in Kubernetes. There are two notable distinctions: - -1. In a `ClusterResourcePlacement`, multiple replicas of resources cannot be scheduled on the same cluster, whereas pods -belonging to the same deployment in Kubernetes can run on the same node. -2. The `ClusterResourcePlacement` supports different placement types within a single object. - -These requirements necessitate treating the scheduling policy as a whole and feeding it to the scheduler, as opposed to -handling individual pods like Kubernetes today. Specially: -1. Scheduling the entire `ClusterResourcePlacement` at once enables us to increase the parallelism of the scheduler if -needed. -2. Supporting the `PickAll` mode would require generating the replica for each cluster in the fleet to scheduler. This -approach is not only inefficient but can also result in scheduler repeatedly attempting to schedule unassigned replica when -there are no possibilities of placing them. -3. To support the `PickN` mode, the scheduler needs to compute the filtering and scoring for each replica. Conversely, -in batch mode, these calculations are performed once. Scheduler sorts all the eligible clusters and pick the top N clusters. - -## Placement Decisions - -The output of the scheduler is an array of `ClusterResourceBinding`s on the hub cluster. - -`ClusterResourceBinding` sample: -```yaml -apiVersion: placement.kubernetes-fleet.io/v1beta1 -kind: ClusterResourceBinding -metadata: - annotations: - kubernetes-fleet.io/previous-binding-state: Bound - creationTimestamp: "2023-11-06T09:53:11Z" - finalizers: - - kubernetes-fleet.io/work-cleanup - generation: 8 - labels: - kubernetes-fleet.io/parent-CRP: crp-1 - name: crp-1-aks-member-1-2f8fe606 - resourceVersion: "1641949" - uid: 3a443dec-a5ad-4c15-9c6d-05727b9e1d15 -spec: - clusterDecision: - clusterName: aks-member-1 - clusterScore: - affinityScore: 0 - priorityScore: 0 - reason: picked by scheduling policy - selected: true - resourceSnapshotName: crp-1-4-snapshot - schedulingPolicySnapshotName: crp-1-1 - state: Bound - targetCluster: aks-member-1 -status: - conditions: - - lastTransitionTime: "2023-11-06T09:53:11Z" - message: "" - observedGeneration: 8 - reason: AllWorkSynced - status: "True" - type: Bound - - lastTransitionTime: "2023-11-10T08:23:38Z" - message: "" - observedGeneration: 8 - reason: AllWorkHasBeenApplied - status: "True" - type: Applied -``` - -`ClusterResourceBinding` can have three states: -* _Scheduled_: It indicates that the scheduler has selected this cluster for placing the resources. The resource is waiting -to be picked up by the rollout controller. -* _Bound_: It indicates that the rollout controller has initiated the placement of resources on the target cluster. The -resources are actively being deployed. -* _Unscheduled_: This states signifies that the target cluster is no longer selected by the scheduler for the placement. -The resource associated with this cluster are in the process of being removed. They are awaiting deletion from the cluster. - -The scheduler operates by generating scheduling decisions through the creating of new bindings in the "scheduled" state -and the removal of existing bindings by marking them as "unscheduled". There is a separate rollout controller which is -responsible for executing these decisions based on the defined rollout strategy. - -## Enforcing the semantics of "IgnoreDuringExecutionTime" - -The `ClusterResourcePlacement` enforces the semantics of "IgnoreDuringExecutionTime" to prioritize the stability of resources -running in production. Therefore, the resources should not be moved or rescheduled without explicit changes to the scheduling -policy. - -Here are some high-level guidelines outlining the actions that trigger scheduling and corresponding behavior: -1. `Policy` changes trigger scheduling: - * The scheduler makes the placement decisions based on the latest `ClusterSchedulingPolicySnapshot`. - * When it's just a scale out operation (`NumberOfClusters` of pickN mode is increased), the `ClusterResourcePlacement` -controller updates the label of the existing `ClusterSchedulingPolicySnapshot` instead of creating a new one, so that -the scheduler won't move any existing resources that are already scheduled and just fulfill the new requirement. - -2. The following cluster changes trigger scheduling: - * a cluster, originally ineligible for resource placement for some reason, becomes eligible, such as: - * the cluster setting changes, specifically `MemberCluster` labels has changed - * an unexpected deployment which originally leads the scheduler to discard the cluster (for example, agents not joining, - networking issues, etc.) has been resolved - * a cluster, originally eligible for resource placement, is leaving the fleet and becomes ineligible - > Note: The scheduler is only going to place the resources on the new cluster and won't touch the existing clusters. - -3. Resource-only changes **do not** trigger scheduling including: - * `ResourceSelectors` is updated in the `ClusterResourcePlacement` spec. - * The selected resources is updated without directly affecting the `ClusterResourcePlacement`. - -## What's next - * Read about [Scheduling Framework](../Scheduling-Framework/README.md) \ No newline at end of file diff --git a/docs/concepts/Scheduling-Framework/README.md b/docs/concepts/Scheduling-Framework/README.md deleted file mode 100644 index d03ab03e7..000000000 --- a/docs/concepts/Scheduling-Framework/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Scheduling Framework - -The fleet scheduling framework closely aligns with the native [Kubernetes scheduling framework](https://kubernetes.io/docs/concepts/scheduling-eviction/scheduling-framework/), -incorporating several modifications and tailored functionalities. - -![](scheduling-framework.jpg) - -The primary advantage of this framework lies in its capability to compile plugins directly into the scheduler. Its API -facilitates the implementation of diverse scheduling features as plugins, thereby ensuring a lightweight and maintainable -core. - -The fleet scheduler integrates three fundamental built-in plugin types: -* **Topology Spread Plugin**: Supports the TopologySpreadConstraints stipulated in the placement policy. -* **Cluster Affinity Plugin**: Facilitates the Affinity clause of the placement policy. -* **Same Placement Affinity Plugin**: Uniquely designed for the fleet, preventing multiple replicas (selected resources) from -being placed within the same cluster. This distinguishes it from Kubernetes, which allows multiple pods on a node. -* **Cluster Eligibility Plugin**: Enables cluster selection based on specific status criteria. -* ** Taint & Toleration Plugin**: Enables cluster selection based on taints on the cluster & tolerations on the ClusterResourcePlacement. - - -Compared to the Kubernetes scheduling framework, the fleet framework introduces additional stages for the pickN placement type: - -* **Batch & PostBatch**: - * Batch: Defines the batch size based on the desired and current `ClusterResourceBinding`. - * PostBatch: Adjusts the batch size as necessary. Unlike the Kubernetes scheduler, which schedules pods individually (batch size = 1). -* **Sort**: - * Fleet's sorting mechanism selects a number of clusters, whereas Kubernetes' scheduler prioritizes nodes with the highest scores. - -To streamline the scheduling framework, certain stages, such as `permit` and `reserve`, have been omitted due to the absence -of corresponding plugins or APIs enabling customers to reserve or permit clusters for specific placements. However, the -framework remains designed for easy extension in the future to accommodate these functionalities. - -## In-tree plugins - -The scheduler includes default plugins, each associated with distinct extension points: - -| Plugin | PostBatch | Filter | Score | -|------------------------------|-----------|--------|-------| -| Cluster Affinity | ❌ | ✅ | ✅ | -| Same Placement Anti-affinity | ❌ | ✅ | ❌ | -| Topology Spread Constraints | ✅ | ✅ | ✅ | -| Cluster Eligibility | ❌ | ✅ | ❌ | -| Taint & Toleration | ❌ | ✅ | ❌ | - - -The Cluster Affinity Plugin serves as an illustrative example and operates within the following extension points: -1. **PreFilter**: -Verifies whether the policy contains any required cluster affinity terms. If absent, the plugin bypasses the subsequent -Filter stage. -2. **Filter**: -Filters out clusters that fail to meet the specified required cluster affinity terms outlined in the policy. -3. **PreScore**: -Determines if the policy includes any preferred cluster affinity terms. If none are found, this plugin will be skipped -during the Score stage. -4. **Score**: -Assigns affinity scores to clusters based on compliance with the preferred cluster affinity terms stipulated in the policy. diff --git a/docs/concepts/Scheduling-Framework/scheduling-framework.jpg b/docs/concepts/Scheduling-Framework/scheduling-framework.jpg deleted file mode 100644 index 497eaec9d3210eb08a023dfecfa93ebb991d486d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71080 zcmeFa2RK~o+BZIe=tPg6Xd#FYCF&#u5z&K0jfiMrq6JY#h~9!Ah!Q0_(Yw)!-g}!N zdYMrNWBgb4Is2Tw_u2b8-*>L_z3+Md@19t>mNjdw=Xvh-+|Td6pWFGw`2y(D14U&; z5DpFw=soZcbUqD|2jO10@Z$&g-~m7Qg!uS)c=*Hw1Q!WOiAhOGh)GDu$f+)okyDbB zkX)j>L`h9UOG`^iL4TQ!<}wuxEzOUY;NSw!;NcVD;}g-4k&w~+Uw_UUL6n3SW-jjI z;;@4*P~zZH;+(gF*gzm0e4w{KI{eoU&IO>47YPW7h)IAO$}fQ~;Naq3z{CB~Yv68A z;Cm1rB|gCq=eMq*;gQj?@rlVPIAU?>`|`@_+B#}? zZ~x%%2z`9=V_Y~O+`kO#ZzKE7xF~^fUBJV`#UuDJE}RQ4z=2DNhksS*BGp|@0#kcx zcHy^#G;)!ji<^izZfPNDpE(Q?({YNxxllib_S4Az&j#l6FOBSP1N-~9ra+{)H~{l- zDM4V+nRZ$*59t3dN1;hO>+OgZ2L&^mms8=TuM!bup$penSf2-=sjq}4XFRKrzMJ0$ zpCvyBX(y?)S>X0{)j#IBhC73(8*Yh>7I9b~FXSFM;8*4MetJD}m;D4(>w3`p8ortv z_n|^b)H+;t)8%T-zybJ@cv7KFTm;A2hRU_wf)B5m)Ew?CN~{#b;1;vcD}PR^99 zPzak>Z}d9T=;dcDW;pFjAAYDD`3{9YLW^VllBBR_(1X=;ke~L#{0W`Y&gsE9XuL2t z*lP&dgWYxGnE0o6%4D2_;?LmUSUdR6LBv^2uzmiu`J;_