From a63c286f10cd206dca3490a8ee4a98d6667ae3c5 Mon Sep 17 00:00:00 2001 From: Sagar Muchhal Date: Tue, 25 May 2021 17:59:32 -0700 Subject: [PATCH] Adds ClusterClass & managed topologies proposal Signed-off-by: Sagar Muchhal Co-authored-by: Cecile Robert-Michon Co-authored-by: Naadir Jeewa --- ...56-cluster-class-and-managed-topologies.md | 479 ++++++++++++++++++ .../images/cluster-class/create.plantuml | 44 ++ .../proposals/images/cluster-class/create.png | Bin 0 -> 56077 bytes .../images/cluster-class/update.plantuml | 45 ++ .../proposals/images/cluster-class/update.png | Bin 0 -> 44934 bytes 5 files changed, 568 insertions(+) create mode 100644 docs/proposals/202105256-cluster-class-and-managed-topologies.md create mode 100644 docs/proposals/images/cluster-class/create.plantuml create mode 100644 docs/proposals/images/cluster-class/create.png create mode 100644 docs/proposals/images/cluster-class/update.plantuml create mode 100644 docs/proposals/images/cluster-class/update.png diff --git a/docs/proposals/202105256-cluster-class-and-managed-topologies.md b/docs/proposals/202105256-cluster-class-and-managed-topologies.md new file mode 100644 index 000000000000..4ed28ae71480 --- /dev/null +++ b/docs/proposals/202105256-cluster-class-and-managed-topologies.md @@ -0,0 +1,479 @@ +--- +title: ClusterClass and managed topologies +authors: + - "@srm09" + - "@vincepri" + - "@fabriziopandini" + - "@CecileRobertMichon" +reviewers: + - "@vincepri" + - "@fabriziopandini" + - "@CecileRobertMichon" + - "@enxebre" + - "@schrej" +creation-date: 2021-05-26 +status: provisional +replaces: + - [Proposal Google Doc](https://docs.google.com/document/d/1lwxgBK3Q7zmNkOSFqzTGmrSys_vinkwubwgoyqSRAbI/edit#) +--- + +# ClusterClass and Managed Topologies + +## Table of Contents + +- [ClusterClass and Managed Topologies](#clusterclass-and-managed-topologies) + - [Table of Contents](#table-of-contents) + - [Glossary](#glossary) + - [ClusterClass](#clusterclass) + - [Topology](#topology) + - [Worker class](#worker-class) + - [Summary](#summary) + - [Motivation](#motivation) + - [Goals](#goals) + - [Prospective future Work](#prospective-future-work) + - [Proposal](#proposal) + - [User Stories](#user-stories) + - [Story 1 - Use ClusterClass to easily stamp clusters](#story-1---use-clusterclass-to-easily-stamp-clusters) + - [Story 2 - Easier UX for kubernetes version upgrades](#story-2---easier-ux-for-kubernetes-version-upgrades) + - [Story 3 - Easier UX for scaling workers nodes](#story-3---easier-ux-for-scaling-workers-nodes) + - [Implementation Details/Notes/Constraints](#implementation-detailsnotesconstraints) + - [New API types](#new-api-types) + - [ClusterClass](#clusterclass-1) + - [Modification to existing API Types](#modification-to-existing-api-types) + - [Cluster](#cluster) + - [Validations](#validations) + - [ClusterClass](#clusterclass-2) + - [Cluster](#cluster-1) + - [Behaviors](#behaviors) + - [Create a new Cluster using ClusterClass object](#create-a-new-cluster-using-clusterclass-object) + - [Update an existing Cluster using ClusterClass](#update-an-existing-cluster-using-clusterclass) + - [Provider implementation](#provider-implementation) + - [For infrastructure providers](#for-infrastructure-providers) + - [For Control plane providers](#for-control-plane-providers) + - [Risks and Mitigations](#risks-and-mitigations) + - [Alternatives](#alternatives) + - [Upgrade Strategy](#upgrade-strategy) + - [Additional Details](#additional-details) + - [Test Plan [optional]](#test-plan-optional) + - [Graduation Criteria [optional]](#graduation-criteria-optional) + - [Version Skew Strategy [optional]](#version-skew-strategy-optional) + - [Implementation History](#implementation-history) + +## Glossary + +### ClusterClass +A collection of templates that define a topology (control plane and machine deployments) to be used to create one or more clusters. + +### Topology +A topology refers to a Cluster that provides a single control point to manage its own topology; the topology is defined by a ClusterClass. + +### WorkerClass +A collection of templates that define a set of worker nodes in the cluster. A ClusterClass contains zero or more WorkerClass definitions. + + +## Summary + +This proposal introduces a new ClusterClass object which will be used to provide easy stamping of clusters of similar shapes. It serves as a collection of template resources which are used to generate one or more clusters of the same flavor. + +We're enhancing the Cluster CRD and controller to use a ClusterClass resource to provision the underlying objects that compose a cluster. Additionally, the Cluster provides a single control point to manage the Kubernetes version, worker pools, labels, replicas, and so on. + +## Motivation + +Currently, Cluster API does not expose a native way to provision multiple clusters of the same configuration. The ClusterClass object is supposed to act as a collection of template references which can be used to create managed topologies. + +Today, the Cluster object is a logical grouping of components which describe an underlying cluster. The user experience to create a cluster requires the user to create a bunch of underlying resources such as KCP (control plane provider), MachineDeployments, and infrastructure or bootstrap templates for those resources which logically end up representing the cluster. Since the cluster configuration is spread around multiple components, upgrading the cluster version is hard as it requires changes to different fields in different resources to perform an upgrade. The ClusterClass object aims at reducing this complexity by delegating the responsibility of lifecycle managing these underlying resources to the Cluster controller. + +This method of provisioning the cluster would act as a single control point for the entire cluster. Scaling the nodes, adding/removing sets of worker nodes and upgrading cluster kubernetes versions would be achievable by editing the topology. This would facilitate the maintenance of existing clusters as well as ease the creation of newer clusters. + +### Goals + +- Create the new ClusterClass CRD which can serve as a collection of templates to create clusters. +- Extend the Cluster object to use ClusterClass for creating managed topologies. +- Enhance the Cluster object to act as a single point of control for the topology. +- Extend the Cluster controller to create/update/delete managed topologies. + +### Prospective future Work + +⚠️ The following points are mostly ideas and can change at any given time ⚠️ + +We are fully aware that in order to exploit the potential of ClusterClass and managed topologies, the following class of problems still needs to be addressed: +- **Lifecycle of the ClusterClass**: Introduce mechanisms for allowing mutation of a ClusterClass, and the continuous reconciliation of the Cluster managed resources. +- **Upgrade/rollback strategy**: Implement a strategy to upgrade and rollback the managed topologies. +- **Extensibility/Transformation**: Introduce mechanism for allowing Cluster specific transformations of a ClusterClass (e.g. inject API Endpoint for CAPV, customize machine image by version etc.) +- **Adoption**: Providing a way to convert existing clusters into managed topologies. +- **Observability**: Build an SDK and enhance the Cluster object status to surface a summary of the status of the topology. +- **Lifecycle integrations**: Extend ClusterClass to include lifecycle management integrations such as MachineHealthCheck and Cluster Autoscaler to manage the state and health of the managed topologies. + +However we are intentionally leaving them out from this initial iteration for the following reasons: +- We want the community to reach a consensus on cornerstone elements of the design before iterating on additional features. +- We want to enable starting the implementation of the required scaffolding and the initial support for managed topologies as soon as possible, so we can surface problems which are not easy to identify at this stage of the proposal. +- We would like the community to rally in defining use cases for the advanced features, help in prioritizing them, so we can chart a more effective roadmap for the next steps. + +## Proposal + +This proposal enhances the `Cluster` object to create topologies using the `ClusterClass` object. + +### User Stories + +#### Story 1 - Use ClusterClass to easily stamp clusters +As an end user, I want to use one `ClusterClass` to create multiple topologies of similar flavor. +- Rather than recreating the KCP and MD objects for every cluster that needs to be provisioned, the end user can create a template once and reuse it to create multiple clusters with similar configurations. + +#### Story 2 - Easier UX for kubernetes version upgrades +For an end user, the UX to update the kubernetes version of the control plane and worker nodes in the cluster should be easy. +- Instead of individually modifying the KCP and each MachineDeployment, updating a single option should result in k8s version updates for all the CP and worker nodes. + +**Note**: In order to complete the user story for all the providers, some of the advanced features (such as Extensibility/Transformation) are required. However, getting this in place even only for a subset of providers allows us to build and test a big chunk of the entire machinery. + +#### Story 3 - Easier UX for scaling workers nodes +As an end user, I want to be able to easily scale up/down the number of replicas for each set of worker nodes in the cluster. +- Currently, (for a cluster with 3 machine deployments) this is possible by updating these three different objects representing the sets of worker nodes in the pool. An easier user experience would be to update a single object to enable the scaling of multiple sets of worker nodes. + +### Implementation Details/Notes/Constraints + +The following section provides details about the introduction of new types and modifications to existing types to implement the ClusterClass functionality. +If instead you are eager to see an example of ClusterClass and how the Cluster object will look like, you can jump to the Behavior paragraph. + +#### New API types +##### ClusterClass +This CRD is a collection of templates that describe the topology for one or more clusters. +```golang +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=clusterclasses,shortName=cc,scope=Namespaced,categories=cluster-api +// +kubebuilder:storageversion + +// ClusterClass is a template which can be used to create managed topologies. +type ClusterClass struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec ClusterClassSpec `json:"spec,omitempty"` +} + +// ClusterClassSpec describes the desired state of the ClusterClass. +type ClusterClassSpec struct { + // ControlPlane is a reference to a local struct that holds the details + // for provisioning the Control Plane for the Cluster. + ControlPlane LocalObjectTemplate `json:"controlPlane,omitempty"` + + // Worker describes the worker nodes for the cluster. + // It is a collection of node types which can be used to create + // the worker nodes of the cluster. + // +optional + Worker WorkerClass `json:"worker,omitempty"` + + // Infrastructure is a reference to a provider-specific template that holds + // the details for provisioning infrastructure specific cluster + // for the underlying provider. + // The underlying provider is responsible for the implementation + // of the template to an infrastructure cluster. + Infrastructure LocalObjectTemplate `json:"infrastructure,omitempty"` +} + +// WorkerClass is a collection of deployment classes which pronounce +// +type WorkerClass struct { + // Deployments is a list of machine deployment types that can be used to create + // a set of worker plane nodes. + Deployments []DeploymentClass `json:"deployments,omitempty"` +} + + +// DeploymentClass serves as a template to define a set of worker nodes of the cluster +// provisioned using the `ClusterClass`. +type DeploymentClass struct { + // Class denotes a type of worker node present in the cluster + Class string `json:"class,omitempty"` + + // Template is a local struct containing a collection of templates for creation of + // MachineDeployment objects representing a set of worker nodes. + Template DeploymentTemplateClass `json:"template"` +} + +type DeploymentTemplateClass struct { + Metadata ObjectMeta `json:"metadata,omitempty"` + + // Bootstrap contains the bootstrap template references to be used + // for the creation of worker Machines. + Bootstrap LocalObjectTemplate `json:"bootstrap,omitempty"` + + // Infrastructure contains the infrastructure template references to be used + // for the creation of worker Machines. + Infrastructure LocalObjectTemplate `json:"infrastructure,omitempty"` +} + +type LocalObjectTemplate struct { + // Ref is a required reference to a custom resource + // offered by a bootstrap provider. + Ref corev1.ObjectReference `json:"ref"` +} +``` + +#### Modification to existing API Types +##### Cluster +1. Add `Cluster.Spec.Topology` defined as + ```golang + // This encapsulates the topology for the cluster. + // +optional + Topology *Topology `json:"topology,omitempty"` + ``` +1. The `Topology` object has the following definition: + ```golang + // Topology encapsulates the information of the managed resources. + type Topology struct { + // The name of the ClusterClass object to create the topology. + Class string `json:"class,omitempty"` + + // The kubernetes version of the cluster. + Version string `json:"version"` + + // RolloutAfter performs a rollout of the entire cluster one component at a time [...] + // +optional + RolloutAfter *metav1.Time `json:"rolloutAfter,omitempty"` + + // The information for the Control plane of the cluster. + ControlPlane ControlPlane `json:"controlPlane"` + + // Worker encapsulates the different constructs that form the worker nodes + // for the cluster. + // +optional + Worker *Worker `json:"worker,omitempty"` + } + ``` +1. The `ControlPlane` object contains the parameters for the control plane nodes of the topology. + ```golang + // ControlPlane specifies the parameters for the control plane nodes in the cluster. + type ControlPlane struct { + Metadata ObjectMeta `json:"metadata,omitempty"` + + // The number of control plane nodes. + Replicas int `json:"replicas"` + } + ``` +1. The `Worker` object represents the sets of worker nodes of the topology. + + **Note**: In this proposal, a set of worker nodes is handled by a MachineDeployment object. In the future, this can be extended to include Machine Pools as another backing mechanism for managing worker node sets. + ```golang + // Worker represents the different sets of worker nodes in the cluster. + type Worker struct { + MachineDeployments []ManagedMachineDeployment `json:”machineDeployments,omitempty”` + } + ``` +1. The `ManagedMachineDeployment` object represents a single set of worker nodes of the topology. + ```golang + // ManagedMachineDeployment specifies the different parameters for a set of worker nodes in the topology. + // This set of nodes is managed by a MachineDeployment object whose lifecycle is managed by the Cluster controller. + type ManagedMachineDeployment struct { + Metadata ObjectMeta `json:"metadata,omitempty"` + + // Class is the name of the DeploymentClass used to create the set of worker nodes. + // This should match one of the deployment classes defined in the ClusterClass object + // mentioned in the `Cluster.Spec.Class` field. + Class string `json:"class"` + + // Name refers to the name of the set of worker nodes. + Name string `json:"name"` + + // The number of worker nodes belonging to this set. + // If not specified, the cluster autoscaler for CAPI would be responsible + // for maintaining a min/max number of replicas. + // +optional + Replicas *int `json:"replicas,omitempty"` + } + ``` + +#### Validations +##### ClusterClass +- For object creation: + - `spec.worker.deployments[i].class` field must be unique within a ClusterClass. +- For object updates: + - `spec.worker.deployments` supports adding new deployment classes. + +##### Cluster +- For object creation: + - `spec.topology` and `spec.controlPlaneRef` cannot be simultaneously set. + - If `spec.topology.class` is set, `spec.topology.version` cannot be empty and must be a valid semver. + +- For object updates: + - If spec.topology.class is in use, it cannot be unset or modified. + - spec.topology.version cannot be unset and must be a valid semver, if being updated. + - `spec.topology.version` cannot be downgraded. + - `spec.topology.controlPlane.replicas` can be updated. + - `spec.topology.worker.machineDeployments[i].replicas` can be updated. + - `spec.topology.worker.machineDeployments[i].name` field must be unique within a Cluster + - A set of worker nodes can be added to or removed from the `spec.topology.worker.machineDeployments` list. + +#### Behaviors +This section lists out the behavior for Cluster objects using `ClusterClass` in case of creates and updates. + +##### Create a new Cluster using ClusterClass object +1. User creates a ClusterClass object. + ```yaml + apiVersion: cluster.x-k8s.io/v1alpha4 + kind: ClusterClass + metadata: + name: mixed + namespace: bar + spec: + controlPlane: + ref: + apiVersion: controlplane.cluster.x-k8s.io/v1alpha4 + kind: KubeadmControlPlaneTemplate + name: vsphere-prod-cluster-template-kcp + worker: + deployments: + - class: linux-worker + template: + bootstrap: + ref: + apiVersion: bootstrap.cluster.x-k8s.io/v1alpha4 + kind: KubeadmConfigTemplate + name: existing-boot-ref + infrastructure: + ref: + apiVersion: infrastructure.cluster.x-k8s.io/v1alpha4 + kind: VSphereMachineTemplate + name: linux-vsphere-template + - class: windows-worker + template: + bootstrap: + ref: + apiVersion: bootstrap.cluster.x-k8s.io/v1alpha4 + kind: KubeadmConfigTemplate + name: existing-boot-ref-windows + infrastructure: + ref: + apiVersion: infrastructure.cluster.x-k8s.io/v1alpha4 + kind: VSphereMachineTemplate + name: windows-vsphere-template + infrastructure: + ref: + apiVersion: infrastructure.cluster.x-k8s.io/v1alpha4 + kind: VSphereClusterTemplate + name: vsphere-prod-cluster-template + ``` +2. User creates a cluster using the class name and defining the topology. + ```yaml + apiVersion: cluster.x-k8s.io/v1alpha4 + kind: Cluster + metadata: + name: foo + namespace: bar + spec: + topology: + class: mixed + version: v1.19.1 + controlPlane: + replicas: 3 + labels: {} + annotations: {} + worker: + machineDeployments: + - class: linux-worker + name: big-pool-of-machines-1 + replicas: 5 + labels: + # This label is additive to the class' labels, + # or if the same label exists, it overwrites it. + custom-label: "production" + - class: linux-worker + name: small-pool-of-machines-1 + replicas: 1 + - class: windows-worker + name: microsoft-1 + replicas: 3 + ``` +3. The Cluster controller checks for the presence of the `spec.topology.class` field. If the field is missing, the Cluster controller behaves in the existing way. Otherwise the controller starts the creation process of the topology defined in the steps below. +4. Cluster and Control plane object creation + 1. Creates the infrastructure specific/provider cluster using the cluster template referenced in the `ClusterClass.spec.infrastructure.ref` field. + 1. Add the topology label to the provider cluster object: + ```yaml + cluster.x-k8s.io/topology: + ``` + 1. For the ControlPlane object in `cluster.spec.topology.controlPlane` + 1. Initializes a control plane object using the control plane template defined in the `ClusterClass.spec.controlPlane.ref field`. Use the name ``. + 1. Sets the number of replicas on the control plane object from `spec.topology.controlPlane.replicas`. + 1. Sets the k8s version on the control plane object from the `spec.topology.version`. + 1. Add the following labels to the control plane object: + ```yaml + cluster.x-k8s.io/topology: + ``` + 1. Creates the control plane object. + 1. Sets the `spec.controlPlaneRef` field for the Cluster object. + 1. Saves the cluster object in the API server. +5. Machine deployment object creation + 1. For each `spec.topology.worker.machineDeployments` item in the list + 1. Create a name `-` (if too long, hash it) + 1. Initializes a new MachineDeployment object. + 1. Sets the `clusterName` field on the MD object + 1. Sets the `replicas` field on the MD object using `replicas` field for the set of worker nodes. + 1. Sets the `version` field on the MD object from the `spec.topology.version`. + 1. Sets the `spec.template.spec.bootstrap` on the MD object from the `ClusterClass.spec.worker.machineDeployments[i].template.bootstrap.ref` field. + 1. Sets the `spec.template.spec.infrastructureRef` on the MD object from the `ClusterClass.spec.worker.machineDeployments[i].template.infrastructure.ref` field. + 1. Generates the set of labels to be set on the MD object. The labels are additive to the class' labels list, and the value in the `spec.topology.worker.machineDeployments[i].labels` takes precedence over any set by the ClusterClass. Also, include the topology label stated below: + ```yaml + cluster.x-k8s.io/topology: - + ``` + Note: The topology label needs to be set on the individual Machine objects as well. + 1. Creates the Machine Deployment object in the API server. + +![Creation of cluster with ClusterClass][./images/cluster-class/create.png] + +##### Update an existing Cluster using ClusterClass +This section talks about updating a cluster which was created using a `ClusterClass` object. +1. User updates the `cluster.spec.topology` field adhering to the update validation [criteria](#clusterclass-2). +2. For the ControlPlane object in `spec.topology.controlPlane`, the cluster controller checks for the presence of the control plane object using the name ``. If found, + 1. Compares and updates the number of replicas, if necessary. + 1. Compares and updates the k8s version, if necessary. + 1. Updates the KCP object in the API server. +3. The cluster controller reconciles the list of required machine deployments with the current list of managed machine deployments by: + 1. Adding/Removing MachineDeployment if necessary. + 1. Comparing and updating the number of replicas, if necessary. + 1. Comparing and updating the k8s version for the MD, if necessary. + 1. Updating the Machine Deployment object in the API server. + +![Update cluster with ClusterClass][./images/cluster-class/update.png] + +#### Provider implementation +##### For infrastructure providers +With the introduction of ClusterClass, we are extending the responsibility of the Cluster controller to create/update the actual objects from the collection of templates. Following this pattern, a template is required to create the actual infrastructure cluster object as part of the topology. For starter, the template should consist the InfraClusterSpec object. It can be enhanced to include other fields such as labels/annotations in the future. + +The proposal calls for the implementation of an infrastructure cluster template to be referenced by the `ClusterClass` object. This is a required field for the `ClusterClass` object. This template would be used to create an infrastructure cluster object. Currently, this responsibility is assumed by the cluster operator/end user. + +**Note:** As per this proposal, the definition of ClusterClass is immutable. The CC definition consists of infrastructure object references, say AWSMachineTemplate, which could be immutable. For such immutable infrastructure objects, hard-coding the image identifiers leads to those templates being tied to a particular kubernetes version, thus making kubernetes version upgrades impossible. Hence, when using CC, infrastructure objects MUST NOT have mandatory static fields whose values prohibit version upgrades. + +##### For Control plane providers +Similarly, a control plane provider should also create a template for use of creation for the control plane objects. For instance, the kubeadm control plane provider should introduce the notion of a KubeadmControlPlaneTemplate for use by the cluster controller to create a managed Kubeadm Control plane object. + +The CAPI Cluster Controller would use this template to instantiate a control plane object for the topology. The current CRD contract mandates that the control plane provider supports `replicas` in the `spec` fields. With the introduction of ClusterClass which is responsible for handling the kubernetes version too, the current contract needs to be expanded to include the support for `version` in the `spec` fields. + +### Risks and Mitigations + +This proposal tries to model the API design for ClusterClass with a narrow set of use cases. This initial implementation provides a baseline on which incremental changes can be introduced in the future. Instead of encompassing of all use cases under a single proposal, this proposal mitigates the risk of waiting too long to consider all required use cases under this topic. + +## Alternatives + +## Upgrade Strategy + +Existing clusters created without ClusterClass cannot switch over to using ClusterClass for a topology. + +## Additional Details + +### Test Plan [optional] + +TBD + +### Graduation Criteria [optional] + +The initial plan is to rollout Cluster Class and support for managed topologies under a feature flag which would be unset by default. + +## Implementation History + +- [x] 04/05/2021: Proposed idea in an [issue](https://github.com/kubernetes-sigs/cluster-api/issues/4430) +- [x] 05/05/2021: Compile a [Google Doc](https://docs.google.com/document/d/1lwxgBK3Q7zmNkOSFqzTGmrSys_vinkwubwgoyqSRAbI/edit#) following the CAEP template +- [ ] MM/DD/YYYY: First round of feedback from community +- [x] 05/19/2021: Present proposal at a [community meeting](https://docs.google.com/document/d/1LdooNTbb9PZMFWy3_F-XAsl7Og5F2lvG3tCgQvoB5e4/edit#heading=h.bz527cpoqorn) +- [x] 05/26/2021: Open proposal PR + + +[community meeting]: https://docs.google.com/document/d/1Ys-DOR5UsgbMEeciuG0HOgDQc8kZsaWIWJeKJ1-UfbY diff --git a/docs/proposals/images/cluster-class/create.plantuml b/docs/proposals/images/cluster-class/create.plantuml new file mode 100644 index 000000000000..5c81b7faf121 --- /dev/null +++ b/docs/proposals/images/cluster-class/create.plantuml @@ -0,0 +1,44 @@ +@startuml +title Figure 1. Cluster with ClusterClass Provisioning process +actor User + +' -- GROUPS START --- + +box #LightGreen +participant "API Server" +end box + +box #LightBlue +participant "Cluster Controller" +end box + +' -- GROUPS END --- + +User -> "API Server" : Create Cluster object with\n""Cluster.Spec.Managed.Class"" +"API Server" --> "Cluster Controller": New Cluster +opt Required only if Cluster.Spec.Managed.Class is set +"Cluster Controller" --> "API Server": Creates the infrastructure cluster +"Cluster Controller" -> "Cluster Controller": Checks for\nCluster.Spec.ControlPlaneRef +opt Required only if Cluster.Spec.ControlPlaneRef is not set + "Cluster Controller" -> "Cluster Controller": Initializes the control plane \noject using the template + "Cluster Controller" -> "Cluster Controller": Sets the name of the object to + "Cluster Controller" -> "Cluster Controller": Sets the replicas & k8s version + "Cluster Controller" -> "API Server": Saves the control plane object + "Cluster Controller" -> "Cluster Controller": Updates the Cluster.Spec.ControlPlaneRef + "Cluster Controller" -> "API Server": Updates Cluster +end +loop For each deployment in\n""cluster.Spec.Managed.Worker.Deployments"" list + "Cluster Controller" -> "API Server": Check for MachineDeployment object\nwith name\n- + opt If MachineDeployment not found + "Cluster Controller" -> "Cluster Controller": Initializes new MachineDeployment object + "Cluster Controller" -> "Cluster Controller": Sets the name of MD to\n- + "Cluster Controller" -> "Cluster Controller": Sets the replicas & k8s version + "Cluster Controller" -> "API Server": Saves MachineDeployment + end +end +end + + + +hide footbox +@enduml \ No newline at end of file diff --git a/docs/proposals/images/cluster-class/create.png b/docs/proposals/images/cluster-class/create.png new file mode 100644 index 0000000000000000000000000000000000000000..571f5a010d2fca35f26e0b6e2dcd39c693ace29a GIT binary patch literal 56077 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 Wd!*ac1}P~Mlj<(booPGF&i_BxLN}WL literal 0 HcmV?d00001 diff --git a/docs/proposals/images/cluster-class/update.plantuml b/docs/proposals/images/cluster-class/update.plantuml new file mode 100644 index 000000000000..467f21d0bfec --- /dev/null +++ b/docs/proposals/images/cluster-class/update.plantuml @@ -0,0 +1,45 @@ +@startuml +title Figure 2. Cluster update with ClusterClass process +actor User + +' -- GROUPS START --- + +box #LightGreen +participant "API Server" +end box + +box #LightBlue +participant "Cluster Controller" +end box + +' -- GROUPS END --- + +User -> "API Server" : Update Cluster object with\n""Cluster.Spec.Class"" +"API Server" --> "Cluster Controller": Existing Cluster +opt Required only if Cluster.Spec.Class is set + "Cluster Controller" -> "Cluster Controller": Fetches the control plane object\nset in Cluster.Spec.ControlPlaneRef + opt Update the ControlPlaneRef + "Cluster Controller" -> "Cluster Controller": Updates the number of replicas + "Cluster Controller" -> "Cluster Controller": Updates the k8s version + "Cluster Controller" -> "API Server": Updates control plane object + end + + "Cluster Controller" -> "API Server": Fetches the MDs for worker node pools + opt For each worker node pool + alt If worker node pool was removed from Managed + "Cluster Controller" -> "API Server": Delete Machine Deployment + else If new worker node pool was added to Managed + "Cluster Controller" -> "API Server": Create Machine Deployment + end + end + opt For the remaining worker node pools + loop For each worker + "Cluster Controller" -> "Cluster Controller": Updates replicas, labels and version\n for MachineDeployment + "Cluster Controller" -> "API Server": Updates MachineDeployment + end + end +end + + +hide footbox +@enduml \ No newline at end of file diff --git a/docs/proposals/images/cluster-class/update.png b/docs/proposals/images/cluster-class/update.png new file mode 100644 index 0000000000000000000000000000000000000000..26e4ba1a77e0f8763d7d99671a684dfefdb3ce40 GIT binary patch literal 44934 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