From 7acee60c4a6c962cbd168d4b1546a8aec487a37d Mon Sep 17 00:00:00 2001 From: Patrick Dillon Date: Tue, 12 Dec 2023 14:38:39 -0500 Subject: [PATCH 01/20] capi-based installations --- enhancements/installer/capi_embedded.jpg | Bin 0 -> 183257 bytes .../cluster-api-based-installations.md | 485 ++++++++++++++++++ enhancements/installer/terraform_embedded.jpg | Bin 0 -> 156131 bytes 3 files changed, 485 insertions(+) create mode 100644 enhancements/installer/capi_embedded.jpg create mode 100644 enhancements/installer/cluster-api-based-installations.md create mode 100644 enhancements/installer/terraform_embedded.jpg diff --git a/enhancements/installer/capi_embedded.jpg b/enhancements/installer/capi_embedded.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b31d37d2481610e65b81692cdc8b99fb4414f765 GIT binary patch literal 183257 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

!CN8)?rvFN8A>$rQAd_U#kn*Vnu<-f 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%0AJWcEkFfeG@f)~ucR>K=xNMSKb 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/s&1N~FHHhV9gnwjKm&CbCTya8|)j_@h;kG4+ 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.yaml` +- Upon install, the local control plane takes care of modifying any webhook (conversion, admission, validation) to point to the `host:post` combination assigned. + - Each controller manager will have its own `host:port` combination assigned. + - Certificates are generated and injected in the server, and the client certs in the api-server webhook configuration. +- For each process that the local control plane manages, a health check (ping to `/healthz`) is required to pass similarly how, when running in a Deployment, a health probe is configured. + +#### Manifests + +The Installer will produce the CAPI manifests as part of the `manifests` target, writing them to a new +`cluster-api` directory alongside the existing `manifests` and `openshift` directories: + +```shell= +$ ./openshift-install create manifests --dir install-dir +INFO Credentials loaded from the "default" profile in file "~/.aws/credentials" +INFO Consuming Install Config from target directory +INFO Manifests created in: install-dir/cluster-api, install-dir/manifests and install-dir/openshift +$ tree install-dir/cluster-api/ +install-dir/cluster-api/ +├── 00_capi-namespace.yaml +├── 01_aws-cluster-controller-identity-default.yaml +├── 01_capi-cluster.yaml +├── 02_infra-cluster.yaml +├── 10_inframachine_mycluster-6lxqp-master-0.yaml +├── 10_inframachine_mycluster-6lxqp-master-1.yaml +├── 10_inframachine_mycluster-6lxqp-master-2.yaml +├── 10_inframachine_mycluster-6lxqp-master-bootstrap.yaml +├── 10_machine_mycluster-6lxqp-master-0.yaml +├── 10_machine_mycluster-6lxqp-master-1.yaml +├── 10_machine_mycluster-6lxqp-master-2.yaml +└── 10_machine_mycluster-6lxqp-master-bootstrap.yaml + +1 directory, 12 files +``` + +The manifests within this `cluster-api` directory will not be written to the cluster or included in bootstrap ignition. +In future work, we expect these manifests to be pivoted to the cluster to enable the target cluster to take over managing +its own infrastructure. + +The Cluster API manifests will be generated with `.spec` fields in the [manifest asset target][asset] with `.status` +updated after cluster creation. + +#### Infrastructure Provisioning + +##### CAPI Provisioning + +The CAPI infrastructure manifests determine the infrastructure resources that will be provisioned by the CAPI controllers. +Here is an example AWS infra cluster manifest from the proof-of-concept implementation: + +```shell +$ cat cluster-api/02_infra-cluster.yaml +apiVersion: v1beta2 +kind: AWSCluster +metadata: + creationTimestamp: null + name: capi-example-kbdpg + namespace: openshift-cluster-api-guests +spec: + bastion: + enabled: false + controlPlaneEndpoint: + host: "" + port: 0 + controlPlaneLoadBalancer: + additionalListeners: + - port: 22623 + protocol: TCP + crossZoneLoadBalancing: false + loadBalancerType: nlb + name: capi-example-kbdpg-ext + scheme: internet-facing + network: + additionalControlPlaneIngressRules: + - description: MCS traffic from cluster network + fromPort: 22623 + protocol: tcp + sourceSecurityGroupRoles: + - node + - controlplane + toPort: 22623 + - description: controller-manager + fromPort: 10257 + protocol: tcp + sourceSecurityGroupRoles: + - controlplane + - node + toPort: 10257 + - description: kube-scheduler + fromPort: 10259 + protocol: tcp + sourceSecurityGroupRoles: + - controlplane + - node + toPort: 10259 + cni: + cniIngressRules: + - description: ICMP + fromPort: -1 + protocol: icmp + toPort: -1 + # several rules omitted for brevity + - description: Service node ports (UDP) + fromPort: 30000 + protocol: udp + toPort: 32767 + vpc: + availabilityZoneSelection: Ordered + availabilityZoneUsageLimit: 3 + cidrBlock: 10.0.0.0/16 + region: us-east-2 + s3Bucket: + name: openshift-bootstrap-data-capi-example-kbdpg + presignedURLDuration: 1h0m0s +status: + networkStatus: + apiServerElb: + attributes: {} + ready: false +``` + +This manifest describes the network, load balancers, security group rules, etc. that will be used or provisioned for +the target cluster. Control plane machines are provisioned by [AWSMachines][AWSMachines] & [CAPI Machines][CAPIMachines] +manifests. + +##### Additional Infrastructure + +The Installer will generate any additional infrastructure that is needed but not handled by the CAPI provider, either +because it is out of scope (e.g. IAM, DNS) or not adopted upstream (e.g. split-horizon load balancers). The Installer +will provide hooks into the provisioning lifecycle that can be used to provision resources using direct SDK calls +or other tooling. + +The AWS proof-of-concept implementation utilizes hooks defined in this interface: + +```go +type CAPIInfraHelper interface { + // PreProvision is called before provisioning using CAPI controllers has begun. + // and should be used to create dependencies needed for CAPI provisioning, + // such as IAM roles or policies. + PreProvision(in PreProvisionInput) error + + // ControlPlaneAvailable is called once cluster.Spec.ControlPlaneEndpoint.IsValid() + // returns true, typically after load balancers have been provisioned. It can be used + // to create DNS records. + ControlPlaneAvailable(in ControlPlaneAvailableInput) error +} + +type PreProvisionInput struct{ clusterID string } +type ControlPlaneAvailableInput struct{ *clusterv1.Cluster } +``` + +For AWS, IAM roles needed by the CAPA provider are created with `PreProvision` and DNS Records +are created upon `ControlPlaneAvailable`. This interface would be implemented by each cloud provider +and can be expanded as needed. + +##### Bootstrap Resources + +The Bootstrap Machine is created like the other control plane nodes, by defining a CAPI Machine resource. +Accordingly, the bootstrap machine can be deleted by simply deleting the object. This works for all platforms: + +```go + if err := c.Delete(ctx, &clusterv1.Machine{ + ObjectMeta: metav1.ObjectMeta{ + Name: capiutils.GenerateBoostrapMachineName(metadata.InfraID), + Namespace: capiutils.Namespace, + }, + }); +``` + +Further work needs to be done to determine how to delete additional bootstrap resources, such as SSH security group rules +and the bootstrap ignition S3 bucket. These could be deleted either through updating the relevant manifests or created & +deleted out-of-band using hooks. + +### Risks and Mitigations + +While we do not expect these changes to introduce a significant security risk, we are working with product security teams +to ensure they are aware of the changes and are able to review. + + +### Drawbacks + +By depending on CAPI providers whose codebases live in a repository external to the Installer, +the process for developing features and delivering fixes is more complex than in a monolothic repo. +While the same could be true for the Installer Terraform dependency; the CAPI providers will +be more actively developed than their Terraform counterparts. Furthermore, it will be necessary +to ensure that the CAPI providers used by the Installer match the version of those in the payload. + +While this external dependency is a significant drawback, it is not unique to this design +and is common throughout OpenShift (e.g. any time the API or library-go must be updated +before being vendored into a component). To minimize the devex friction, we will focus +on documenting a workflow for developing providers while working with the Installer. + +Additionally, we will explore designs to solve or mitigate these issues. + +## Design Details + +### Open Questions [optional] + +1. UX design during install process as well as during failure (log collection). The Installer will dump +(potentially prettified) controller logs. We expect that this question will become easier to answer further +into the development process. + +2. Whether to use downstream OpenShift-specific `kube-apiserver` and `etcd` dependencies and how to source them? + +3. When should the Installer declare infrastructure provisioning failed? + +### Test Plan + +As this is replacing existing functionality in the Installer, we can rely on existing +testing infrastructure. + +### Graduation Criteria + + +#### Dev Preview -> Tech Preview + +- Ability to utilize the enhancement end to end +- End user documentation, relative API stability + +#### Tech Preview -> GA + +- More testing (upgrade, downgrade, scale) +- Sufficient time for feedback +- Available by default +- User facing documentation created in [openshift-docs](https://github.com/openshift/openshift-docs/) + + +#### Removing a deprecated feature + +- Announce deprecation and support policy of the existing feature +- Deprecate the feature + +### Upgrade / Downgrade Strategy + +As this enhancement only concerns the Installation process and affects only the underlying cluster +infrastructure, this change should not affect existing cluster upgrades. + +### Version Skew Strategy + +N/A + +### Operational Aspects of API Extensions + +N/A + +#### Failure Modes + +During a failed install, the controller logs will contain useful information. The status of the CAPI manifests +may also contain useful information,in which case it would be important to display that to users and collect +for bugs and support cases. There is an open question about the best way to handle this UX, and we expect the answer to become more clear during development. + +As the infrastructure will be reconciled by a controller, it will be possible to resolve issues during an ongoing +installation, although this would not necessarily be a feature we would call attention to for documented use cases. + +Finally, the Installer will need to be able to identify when infrastructure provisioning has failed during an installation. +Initially this will be achieved through a timeout. There is an open question about whether this can be done in a more +sophisticated manner. + +#### Support Procedures + +When infrastrucutre provisioning has failed, users will need to collect the log bundle (see previous section +regarding the open question for the log bundle). + +As the providers will be running in a control loop, it would be possible to resolve certain issues +(e.g. fix missing permissions or delete resources taking up quota) during an installation, but this would +not be a documented procedure. Furthermore, it would be possible to make the installs re-entrant, but +it would not be a goal for simplicity's sake. + +## Implementation History + +Major milestones in the life cycle of a proposal should be tracked in `Implementation +History`. + +## Alternatives + +Using other infrastructure-as-code alternatives such as Pulumi, Ansible, or OpenTofu +all have their own individual drawbacks. We prefer the CAPI solution over +these alternatives because it: + +* streamlines Installer development (we do not need to re-implement features for the control plane) +* lays the foundation for OpenShift to implement future CAPI features +* requires less development effort, as CAPI providers are already setup to provision infrastructure for a cluster + +It would also be possible to implement the installation using direct SDK calls for the cloud provider. In addition +to the reasons stated above, using individual SDK implementations would not present a common framework across various +cloud platforms. + + +## Infrastructure Needed [optional] + +Use this section if you need things from the project. Examples include a new +subproject, repos requested, github details, and/or testing infrastructure. + +Listing these here allows the community to get the process for these resources +started right away. + +[embed]: https://pkg.go.dev/embed +[envtest]: https://github.com/kubernetes-sigs/controller-runtime/tree/main/tools/setup-envtest +[awsCRD]: https://cluster-api-aws.sigs.k8s.io/crd/#infrastructure.cluster.x-k8s.io%2fv1beta2 +[azureCRD]: https://capz.sigs.k8s.io/reference/v1beta1-api#infrastructure.cluster.x-k8s.io%2fv1beta1 +[gcpCRD]: https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api +[ibmCRD]: https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api-provider-ibmcloud +[metalCRD]: https://github.com/metal3-io/cluster-api-provider-metal3/blob/main/api/v1beta1/metal3cluster_types.go +[nutanixCRD]: https://opendocs.nutanix.com/capx/latest/types/nutanix_cluster/ +[openstackCRD]: https://github.com/kubernetes-sigs/cluster-api-provider-openstack/blob/main/api/v1alpha7/openstackcluster_types.go +[vsphereCRD]: https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/main/apis/v1beta1/vspherecluster_type. +[asset]: https://github.com/openshift/installer/blob/master/docs/design/assetgeneration.md +[AWSMachines]: https://github.com/openshift/installer/blob/ba66fc691e67b9bfe04204c3ece98e1386f66057/pkg/asset/machines/aws/awsmachines.go#L57-L85 +[CAPIMachines]: https://github.com/openshift/installer/blob/master/pkg/asset/machines/aws/awsmachines.go#L100-L118 diff --git a/enhancements/installer/terraform_embedded.jpg b/enhancements/installer/terraform_embedded.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab1abccb50555ecd4d158516c0b115b736ee6c05 GIT binary patch literal 156131 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 z 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

  • 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 literal 0 HcmV?d00001 From 28efe26b8c017706f56a4649e422c525fd01eacc Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Wed, 3 Jan 2024 09:24:17 -0800 Subject: [PATCH 02/20] Add sequence diagram in workflow description Signed-off-by: Vince Prignano --- .../cluster-api-based-installations.md | 74 +++++++++++++------ 1 file changed, 50 insertions(+), 24 deletions(-) diff --git a/enhancements/installer/cluster-api-based-installations.md b/enhancements/installer/cluster-api-based-installations.md index 2193643d25..e83544292c 100644 --- a/enhancements/installer/cluster-api-based-installations.md +++ b/enhancements/installer/cluster-api-based-installations.md @@ -47,12 +47,12 @@ being used. ## Motivation -1. OpenShift Alignment with CAPI: CAPI offers numerous potential benefits; +- OpenShift Alignment with CAPI: CAPI offers numerous potential benefits; such as: day-2 infrastructure management, an API for users to edit cluster infrastructure, and upstream collaboration. Installer support for CAPI would be foundational for adopting these benefits. -2. Terraform BSL License Change: due to the restrictive license change of +- Terraform BSL License Change: due to the restrictive license change of Terraform, `openshift-install` needs a framework to replace the primary tool it used to provision cluster infrastructure. In addition to the benefits listed above, CAPI provides solutions for the biggest gaps left by Terraform: @@ -62,7 +62,7 @@ reduce the surface area for security vulnerabilities. Terraform and its provider constitutes over half a million lines of code in the Installer repo and is directly attributable for all (13) CVEs that have been fixed in the Installer repo. -3. Streamline Installer development: a common pattern for Installer development +-Streamline Installer development: a common pattern for Installer development has been to reimplement control-plane features in Terraform that have already been delivered upstream. By utilizing CAPI providers for Day-0 provisioning, our development practices will remove this duplication and become more efficient. @@ -98,7 +98,7 @@ practices will remove this duplication and become more efficient. The Installer will create CAPI infrastructure manifests based on user input from the install config; then, in order to provision cluster infrastructure, apply the manifests to CAPI controllers running on a local Kubernetes control-plane -setup by [envtest](https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/envtest). +setup by [envtest](https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/envtest). ### Workflow Description @@ -107,17 +107,43 @@ cluster. Note that the workflow does not change for this user. **openshift-install** is the Installer binary. -1. The cluster creator provides an install-config and credentials -2. (optional) The cluster creator runs `openshift-install create manifests` -3. (optional) The cluster creator edits the newly created CAPI manifests. -4. The cluster creator runs `openshift-install create cluster` -5. `openshift-install` extracts binaries for kube-apiserver, etcd, CAPI infrastructure provider & cloud CAPI provider to the install dir -6. `openshift-install` using `envtest` initializes a control plane locally on the Installer host -7. `openshift-install` execs the CAPI infrastructure and cloud provider as subprocesses, pointing them to the local control plane -8. `openshift-install` applies the CAPI manifests to the control plane -9. The CAPI controllers provision cluster infrastructure based on the manifests -10. `openshift-install` monitors the status of the CAPI resources as they are applied -11. If the statuses are as expected, infrastrucutre has been provisioned and installation continues with the normal flow. + +```mermaid +sequenceDiagram + actor Operator + participant Installer + participant Local Control Plane + + Operator->>Installer: provides `install-config` and credentials + + opt customization + Operator->>+Installer: runs `openshift-install create manifests` + Installer-->>-Operator: generates manifests in the current folder + Operator-->>Operator: edits manifests + end + + Operator->>+Installer: runs `openshift-install create cluster` + Installer->>Installer: extracts binaries for to the install dir:
    kube-apiserver, etcd,
    CAPI infrastructure provider & cloud CAPI provider + Installer->>Local Control Plane: execs the CAPI infrastructure
    and cloud provider as subprocesses + Installer->>Local Control Plane: applies the CAPI manifests to the control plane + + loop informer watch + Infra Controller-->Local Control Plane: Reconcile resources + end + + Infra Controller->>+Cloud: provision cluster infrastrcuture + Cloud-->>Infra Controller: creation completed + Infra Controller->>Cloud: provision machines + Cloud-->>-Infra Controller: machines created + + loop exponential backoff + Installer-->Local Control Plane: Wait for OpenShift Control Plane Availability + Infra Controller-->Cloud: checks bootstrap machine available + Installer-->OpenShift Cluster: waits until control plane is available and operators are healthy + end + + Installer-->>-Operator: FIN +``` In the case of an error in the final step, the Installer will bubble up resources with non-expected statuses. @@ -126,7 +152,7 @@ In the case of an error in the final step, the Installer will bubble up resource ### API Extensions -As a result of this enhancement, API Extensions will only be used locally by the +As a result of this enhancement, API Extensions will only be used locally by the local Installer control plane--they will not, until future work, be pivoted to the cluster. The following are CRD references for Installer-supported platforms: @@ -189,9 +215,9 @@ The Installer will produce the CAPI manifests as part of the `manifests` target, ```shell= $ ./openshift-install create manifests --dir install-dir -INFO Credentials loaded from the "default" profile in file "~/.aws/credentials" -INFO Consuming Install Config from target directory -INFO Manifests created in: install-dir/cluster-api, install-dir/manifests and install-dir/openshift +INFO Credentials loaded from the "default" profile in file "~/.aws/credentials" +INFO Consuming Install Config from target directory +INFO Manifests created in: install-dir/cluster-api, install-dir/manifests and install-dir/openshift $ tree install-dir/cluster-api/ install-dir/cluster-api/ ├── 00_capi-namespace.yaml @@ -356,8 +382,8 @@ to ensure they are aware of the changes and are able to review. ### Drawbacks By depending on CAPI providers whose codebases live in a repository external to the Installer, -the process for developing features and delivering fixes is more complex than in a monolothic repo. -While the same could be true for the Installer Terraform dependency; the CAPI providers will +the process for developing features and delivering fixes is more complex than in a monolothic repo. +While the same could be true for the Installer Terraform dependency; the CAPI providers will be more actively developed than their Terraform counterparts. Furthermore, it will be necessary to ensure that the CAPI providers used by the Installer match the version of those in the payload. @@ -378,7 +404,7 @@ into the development process. 2. Whether to use downstream OpenShift-specific `kube-apiserver` and `etcd` dependencies and how to source them? -3. When should the Installer declare infrastructure provisioning failed? +3. When should the Installer declare infrastructure provisioning failed? ### Test Plan @@ -423,7 +449,7 @@ N/A During a failed install, the controller logs will contain useful information. The status of the CAPI manifests may also contain useful information,in which case it would be important to display that to users and collect -for bugs and support cases. There is an open question about the best way to handle this UX, and we expect the answer to become more clear during development. +for bugs and support cases. There is an open question about the best way to handle this UX, and we expect the answer to become more clear during development. As the infrastructure will be reconciled by a controller, it will be possible to resolve issues during an ongoing installation, although this would not necessarily be a feature we would call attention to for documented use cases. @@ -439,7 +465,7 @@ regarding the open question for the log bundle). As the providers will be running in a control loop, it would be possible to resolve certain issues (e.g. fix missing permissions or delete resources taking up quota) during an installation, but this would -not be a documented procedure. Furthermore, it would be possible to make the installs re-entrant, but +not be a documented procedure. Furthermore, it would be possible to make the installs re-entrant, but it would not be a goal for simplicity's sake. ## Implementation History From 281ff3ffb412f583ea245dc7fec1500ba47d5eaa Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Wed, 3 Jan 2024 10:00:38 -0800 Subject: [PATCH 03/20] Add note under the title to explain limitations for phase 1 Signed-off-by: Vince Prignano --- enhancements/installer/cluster-api-based-installations.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/enhancements/installer/cluster-api-based-installations.md b/enhancements/installer/cluster-api-based-installations.md index e83544292c..b0ee755093 100644 --- a/enhancements/installer/cluster-api-based-installations.md +++ b/enhancements/installer/cluster-api-based-installations.md @@ -35,6 +35,11 @@ superseded-by: # Enabling Cluster-API-based Installations via openshift-install +> NOTE: At the time of writing (Jan '24), Cluster API +> is only used as an implementation detail to replace Terraform. +> The OpenShift clusters created through these mechanics do not pivot Cluster API resources +> but instead hand off operations to Machine API. + ## Summary This enhancement discusses how `openshift-install` can use From 954969c8cc206c7041acb61359ea830dfa536e51 Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Wed, 3 Jan 2024 10:17:38 -0800 Subject: [PATCH 04/20] Add reqirement to document diff, error handling, and credentials Signed-off-by: Vince Prignano --- .../installer/cluster-api-based-installations.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/enhancements/installer/cluster-api-based-installations.md b/enhancements/installer/cluster-api-based-installations.md index b0ee755093..0bbb33f312 100644 --- a/enhancements/installer/cluster-api-based-installations.md +++ b/enhancements/installer/cluster-api-based-installations.md @@ -83,8 +83,10 @@ practices will remove this duplication and become more efficient. - To provide a common experience across platforms for users and `openshift-install` developers - To be backwards compatible and fully satisfy the requirements of install-config type APIs. + - To document for end users differences in infrastructure created for each cloud provider. + Example: on AWS we are expecting there to be additional security groups used, rather than 1 per worker and 1 per master, each machine will be a member of multiple security groups which add permissions based on their roles (node, master, load balancer, most machines will be in 2 of these). - To keep the user experience for day-zero operations unchanged or improved. -- To not require any new runtime dependencies. +- To not require any new runtime dependencies (e.g. containers). - To maintain compatibility for hive, particularly regarding `destroy` functionality ### Non-Goals / Future work @@ -150,7 +152,13 @@ sequenceDiagram Installer-->>-Operator: FIN ``` -In the case of an error in the final step, the Installer will bubble up resources with non-expected statuses. +##### Error handling + +In the case of an error in the final step, the Installer will bubble up resources with non-expected statuses. The installer binary will collect and save all logs from all controllers used during the day zero operations, including Cluster API and its infrastructure providers. + +##### Credentials management + +The local control plane and Cluster API controllers share similar requirements regarding credentials when compared to Terraform. The installer validates and inject the required credentials from the user environments, cloud infrastructure providers can opt to pass credentials from the environment or install config in well-known Secret objects, or use the inherited environment available. #### Variation and form factor considerations [optional] From e27acec121fa1ea538e4805521b192b1c4d11dbb Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Wed, 3 Jan 2024 14:31:32 -0800 Subject: [PATCH 05/20] add more details Signed-off-by: Vince Prignano --- .../cluster-api-based-installations.md | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/enhancements/installer/cluster-api-based-installations.md b/enhancements/installer/cluster-api-based-installations.md index 0bbb33f312..f5a5db4e66 100644 --- a/enhancements/installer/cluster-api-based-installations.md +++ b/enhancements/installer/cluster-api-based-installations.md @@ -211,19 +211,20 @@ Over time, `envtest` matured in a way that now can be used to run controllers in reducing or eliminating the need for a full Kubernetes cluster to run controllers. At a high level, the local control plane is responsible for: -- Setting up certificates for the apiserver and etcd. +- Setting up temporary certificates for the local api-server and etcd. - Running (and cleaning up, on shutdown) the local control plane components. - Installing any required component, like Custom Resource Definitions (CRDs) - For Cluster API core the CRDs are stored in `data/data/cluster-api/core-components.yaml`. - Infrastructure providers are expected to store their components in `data/data/cluster-api/-infrastructure-components.yaml` -- Upon install, the local control plane takes care of modifying any webhook (conversion, admission, validation) to point to the `host:post` combination assigned. +- Upon install, the local control plane takes care of modifying any webhook (conversion, admission, validation) to point to a `host:post` (usually host is `localhost`) combination assigned. - Each controller manager will have its own `host:port` combination assigned. - Certificates are generated and injected in the server, and the client certs in the api-server webhook configuration. -- For each process that the local control plane manages, a health check (ping to `/healthz`) is required to pass similarly how, when running in a Deployment, a health probe is configured. +- For each process that the local control plane manages, a health check (ping to `/healthz`) is required to pass; similarly how, when running in a Deployment, a health probe is configured. + - The health check is only ran once, once OK, the process can continue. #### Manifests -The Installer will produce the CAPI manifests as part of the `manifests` target, writing them to a new +The Installer produces the CAPI manifests as part of the `manifests` target, writing them to a `cluster-api` directory alongside the existing `manifests` and `openshift` directories: ```shell= @@ -249,12 +250,10 @@ install-dir/cluster-api/ 1 directory, 12 files ``` -The manifests within this `cluster-api` directory will not be written to the cluster or included in bootstrap ignition. -In future work, we expect these manifests to be pivoted to the cluster to enable the target cluster to take over managing -its own infrastructure. +The manifests within the `cluster-api` directory won't be written to the resulting OpenShift cluster, or included in bootstrap ignition. +In future work, we expect these manifests to be pivoted to the cluster to enable the target cluster to take over managing its own infrastructure. -The Cluster API manifests will be generated with `.spec` fields in the [manifest asset target][asset] with `.status` -updated after cluster creation. +The Cluster API manifests will be generated with `.spec` fields in the [manifest asset target][asset] with `.status` updated after cluster creation, which can be useful for debugging purposes. #### Infrastructure Provisioning @@ -334,16 +333,16 @@ status: ready: false ``` -This manifest describes the network, load balancers, security group rules, etc. that will be used or provisioned for -the target cluster. Control plane machines are provisioned by [AWSMachines][AWSMachines] & [CAPI Machines][CAPIMachines] -manifests. +This manifest describes the network, load balancers, security group rules, etc. that will be used or provisioned for the target cluster. +Control plane machines are provisioned by [AWSMachines][AWSMachines] & [CAPI Machines][CAPIMachines] manifests. ##### Additional Infrastructure -The Installer will generate any additional infrastructure that is needed but not handled by the CAPI provider, either -because it is out of scope (e.g. IAM, DNS) or not adopted upstream (e.g. split-horizon load balancers). The Installer -will provide hooks into the provisioning lifecycle that can be used to provision resources using direct SDK calls -or other tooling. +The Installer generates any additional infrastructure that is needed but not handled by the CAPI provider, either because it is out of scope (e.g. IAM, DNS), or not adopted upstream (e.g. split-horizon load balancers). +The Installer codebase provides hooks into the provisioning lifecycle that can be used to provision resources using direct SDK calls or other tooling. + +In most cases, teams are encouraged in discussing and building issues in the respective upstream repositories first, e.g. `cluster-api` or `cluster-api-provider-aws` and only +use the following hook as a fallback path. The AWS proof-of-concept implementation utilizes hooks defined in this interface: @@ -364,9 +363,8 @@ type PreProvisionInput struct{ clusterID string } type ControlPlaneAvailableInput struct{ *clusterv1.Cluster } ``` -For AWS, IAM roles needed by the CAPA provider are created with `PreProvision` and DNS Records -are created upon `ControlPlaneAvailable`. This interface would be implemented by each cloud provider -and can be expanded as needed. +For AWS, IAM roles needed by the CAPA provider are created with `PreProvision` and DNS Records are created upon `ControlPlaneAvailable`. +This interface would be implemented by each cloud provider and can be expanded as needed. ##### Bootstrap Resources @@ -461,15 +459,14 @@ N/A #### Failure Modes During a failed install, the controller logs will contain useful information. The status of the CAPI manifests -may also contain useful information,in which case it would be important to display that to users and collect +may also contain useful information, in which case it would be important to display that to users and collect for bugs and support cases. There is an open question about the best way to handle this UX, and we expect the answer to become more clear during development. As the infrastructure will be reconciled by a controller, it will be possible to resolve issues during an ongoing installation, although this would not necessarily be a feature we would call attention to for documented use cases. Finally, the Installer will need to be able to identify when infrastructure provisioning has failed during an installation. -Initially this will be achieved through a timeout. There is an open question about whether this can be done in a more -sophisticated manner. +Initially this will be achieved through a timeout. There is an open question about whether this can be done in a more sophisticated manner. #### Support Procedures From f2f31276fc362eccc581185afe8d9e597e75aef5 Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Thu, 4 Jan 2024 09:39:00 -0800 Subject: [PATCH 06/20] Add notes about memory, disk space, and binary size Signed-off-by: Vince Prignano --- .../cluster-api-based-installations.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/enhancements/installer/cluster-api-based-installations.md b/enhancements/installer/cluster-api-based-installations.md index f5a5db4e66..fc376030e9 100644 --- a/enhancements/installer/cluster-api-based-installations.md +++ b/enhancements/installer/cluster-api-based-installations.md @@ -392,6 +392,8 @@ to ensure they are aware of the changes and are able to review. ### Drawbacks +#### External/Upstream dependencies + By depending on CAPI providers whose codebases live in a repository external to the Installer, the process for developing features and delivering fixes is more complex than in a monolothic repo. While the same could be true for the Installer Terraform dependency; the CAPI providers will @@ -405,6 +407,25 @@ on documenting a workflow for developing providers while working with the Instal Additionally, we will explore designs to solve or mitigate these issues. +#### Disk space and memory + +> NOTE: All tests are performed on a MacOS system at the time of writing. + +With the introduction of the Local Control Plane, new required components are being run during cluster creation. + +- `api-server` uses ~280MB and `etcd` ~52MB +- Cluster API + - Core controller uses ~28MB + - Infrastructure controller (AWS, in testing) uses ~35MB + +When compared to Terraform, the runtime memory footprint is well-within the current usare or limitations (TODO: provide Terraform benchmark); the disk footprint increases by what's required of `etcd` which is around 128MB while creating an OpenShift cluster on AWS. + +#### Binary size + +> NOTE: All tests are performed on a MacOS system at the time of writing. + +The `openshift-install` resulting binary size, with Cluster API bundled binaries reaches ~515MB, of which, the bundled binaries account 228MB. + ## Design Details ### Open Questions [optional] From 765a1d74ad5e66d5d69df01a599f493e9069398e Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Thu, 4 Jan 2024 09:42:19 -0800 Subject: [PATCH 07/20] Add zip stat Signed-off-by: Vince Prignano --- .../installer/cluster-api-based-installations.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/enhancements/installer/cluster-api-based-installations.md b/enhancements/installer/cluster-api-based-installations.md index fc376030e9..8224dbe767 100644 --- a/enhancements/installer/cluster-api-based-installations.md +++ b/enhancements/installer/cluster-api-based-installations.md @@ -426,6 +426,21 @@ When compared to Terraform, the runtime memory footprint is well-within the curr The `openshift-install` resulting binary size, with Cluster API bundled binaries reaches ~515MB, of which, the bundled binaries account 228MB. +The binaries are stored in `zip` format within the installer, and unpacked at runtime; from the `zip` output, the space savings are quite substantial: + +``` +updating: cluster-api (deflated 68%) +updating: cluster-api-provider-aws (deflated 73%) +updating: cluster-api-provider-azure (deflated 70%) +updating: cluster-api-provider-azureaso (deflated 74%) +updating: cluster-api-provider-gcp (deflated 73%) +updating: cluster-api-provider-ibmcloud (deflated 72%) +updating: cluster-api-provider-nutanix (deflated 69%) +updating: cluster-api-provider-vsphere (deflated 72%) +updating: etcd (deflated 64%) +updating: kube-apiserver (deflated 72%) +``` + ## Design Details ### Open Questions [optional] From 1f9bad3c8e31c8c08d637a64e39cb93babe3fc82 Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Thu, 4 Jan 2024 09:45:02 -0800 Subject: [PATCH 08/20] add comparison with current `openshift-install` binary Signed-off-by: Vince Prignano --- enhancements/installer/cluster-api-based-installations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enhancements/installer/cluster-api-based-installations.md b/enhancements/installer/cluster-api-based-installations.md index 8224dbe767..7bb2d91389 100644 --- a/enhancements/installer/cluster-api-based-installations.md +++ b/enhancements/installer/cluster-api-based-installations.md @@ -424,7 +424,7 @@ When compared to Terraform, the runtime memory footprint is well-within the curr > NOTE: All tests are performed on a MacOS system at the time of writing. -The `openshift-install` resulting binary size, with Cluster API bundled binaries reaches ~515MB, of which, the bundled binaries account 228MB. +The `openshift-install` resulting binary size, with Cluster API bundled binaries reaches ~515MB, of which, the bundled binaries account 228MB. By comparison, the binary available for download on `console.redhat.com` for MacOS, once upacked, is 732MB. The binaries are stored in `zip` format within the installer, and unpacked at runtime; from the `zip` output, the space savings are quite substantial: From 918346439e7523ecda25929be66784c5c7729479 Mon Sep 17 00:00:00 2001 From: Patrick Dillon Date: Thu, 1 Feb 2024 10:07:01 -0500 Subject: [PATCH 09/20] Review feedback - rename - update provider interface details - add initial details on build --- ...strapping-clusters-with-capi-providers.md} | 114 +++++++++++------- 1 file changed, 71 insertions(+), 43 deletions(-) rename enhancements/installer/{cluster-api-based-installations.md => bootstrapping-clusters-with-capi-providers.md} (83%) diff --git a/enhancements/installer/cluster-api-based-installations.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md similarity index 83% rename from enhancements/installer/cluster-api-based-installations.md rename to enhancements/installer/bootstrapping-clusters-with-capi-providers.md index 7bb2d91389..b6783011e7 100644 --- a/enhancements/installer/cluster-api-based-installations.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -1,5 +1,5 @@ --- -title: cluster-api-based-installations +title: bootstrapping-clusters-with-capi-providers authors: - "@patrickdillon" - "@vincepri" @@ -25,15 +25,9 @@ creation-date: 2023-12-12 last-updated: 2023-12-12 tracking-link: # link to the tracking ticket (for example: Jira Feature or Epic ticket) that corresponds to this enhancement - https://issues.redhat.com/browse/CORS-2840 -see-also: - - "/enhancements/this-other-neat-thing.md" -replaces: - - "/enhancements/that-less-than-great-idea.md" -superseded-by: - - "/enhancements/our-past-effort.md" --- -# Enabling Cluster-API-based Installations via openshift-install +# Bootstraping Clusters with CAPI Infrastructure Providers > NOTE: At the time of writing (Jan '24), Cluster API > is only used as an implementation detail to replace Terraform. @@ -88,12 +82,14 @@ practices will remove this duplication and become more efficient. - To keep the user experience for day-zero operations unchanged or improved. - To not require any new runtime dependencies (e.g. containers). - To maintain compatibility for hive, particularly regarding `destroy` functionality +- To continue delivering `openshift-install` for supported os/architectures: linux/x86, linux/arm, linux/powerpc, linux/s390x, darwin/x86, darwin/arm ### Non-Goals / Future work - Non-goal: To maintain a consistent infrastructure footprint as clusters previously created with Terraform - Non-goal: Support openshift cluster creation by using any tools other than `openshift-install`, such as `clusterctl` -- Future work: To optimize build processes or binary size (this will be prioritized ASAP in a separate design doc) +- Non-goal: To create a re-entrant installation process +- Non-goal: To change the machine bootstrapping process, e.g. implementing a CAPI bootstap provider - Future work: To use an existing management cluster to install OpenShift - Future work: To pivot the CAPI manifests to the newly-installed cluster to enable day-2 infrastructure management within the cluster. - Future work: Replace Machine API (MAPI) with CAPI for day-2 machine management. This enhancement assumes we are still using MAPI Day 2. @@ -208,7 +204,8 @@ Envtest was born due to a necessity to run integration tests for controllers aga (conversion, admission, validation), and managing the lifecycle of Custom Resource Definitions. Over time, `envtest` matured in a way that now can be used to run controllers in a local environment, -reducing or eliminating the need for a full Kubernetes cluster to run controllers. +reducing or eliminating the need for a full Kubernetes cluster to run controllers. `envtest` is part of the +[controller-runtime project][controller-runtime]. At a high level, the local control plane is responsible for: - Setting up temporary certificates for the local api-server and etcd. @@ -222,6 +219,9 @@ At a high level, the local control plane is responsible for: - For each process that the local control plane manages, a health check (ping to `/healthz`) is required to pass; similarly how, when running in a Deployment, a health probe is configured. - The health check is only ran once, once OK, the process can continue. +The [envtest APIs][envtestAPI] are a thin layer on top of running binaries and setting up flags or variables. +The logic could be eventually moved into the installer, if warranted. + #### Manifests The Installer produces the CAPI manifests as part of the `manifests` target, writing them to a @@ -250,10 +250,16 @@ install-dir/cluster-api/ 1 directory, 12 files ``` +The cluster-api manifests are generated in parallel with all other manifests, particularly the machine-api manifests, which means that +any changes to the control-plane machines within the manifests will also need to be made in the cluster-api manifests. Although, the +machines are provisioned based off of the cluster-api manifests, post-install the control plane will be managed by the machine-api operator. + The manifests within the `cluster-api` directory won't be written to the resulting OpenShift cluster, or included in bootstrap ignition. In future work, we expect these manifests to be pivoted to the cluster to enable the target cluster to take over managing its own infrastructure. -The Cluster API manifests will be generated with `.spec` fields in the [manifest asset target][asset] with `.status` updated after cluster creation, which can be useful for debugging purposes. +The Cluster API manifests will be generated with `.spec` fields in the [manifest asset target][asset] with `.status` updated after cluster creation. +These manifests can be used by post-install commands such as `openshift-install gather bootstrap` in order to determine the IP addresses of the +control-plane machines. The manifests would also be useful for general debugging tasks. #### Infrastructure Provisioning @@ -344,30 +350,20 @@ The Installer codebase provides hooks into the provisioning lifecycle that can b In most cases, teams are encouraged in discussing and building issues in the respective upstream repositories first, e.g. `cluster-api` or `cluster-api-provider-aws` and only use the following hook as a fallback path. -The AWS proof-of-concept implementation utilizes hooks defined in this interface: - -```go -type CAPIInfraHelper interface { - // PreProvision is called before provisioning using CAPI controllers has begun. - // and should be used to create dependencies needed for CAPI provisioning, - // such as IAM roles or policies. - PreProvision(in PreProvisionInput) error - - // ControlPlaneAvailable is called once cluster.Spec.ControlPlaneEndpoint.IsValid() - // returns true, typically after load balancers have been provisioned. It can be used - // to create DNS records. - ControlPlaneAvailable(in ControlPlaneAvailableInput) error -} - -type PreProvisionInput struct{ clusterID string } -type ControlPlaneAvailableInput struct{ *clusterv1.Cluster } -``` +Provisioning of resources with CAPI is divided into two stages: _infrastructure_ (all non-machine related manifests) and _control plane_, +with hooks before, in between, and after: -For AWS, IAM roles needed by the CAPA provider are created with `PreProvision` and DNS Records are created upon `ControlPlaneAvailable`. -This interface would be implemented by each cloud provider and can be expanded as needed. +* PreProvision Hook - handle prequisites: e.g. IAM role creation, OS Disk upload +* Provision Infrastructure - create `cluster` manifest on local control plane +* InfraReady Hook - handle requirements in between cluster infrastructure and machine provisioning +* Ignition Hook - similar to InfraReady but specifically for generating (bootstrap) ignition +* Provision Machines - create bootstrap ignition and control-plane machines +* PostProvision Hook - post-provision requirements, such as DNS record creation ##### Bootstrap Resources +OpenShift will continue to use the same bootstrapping process, as described in the Installer +[Cluster Installation Process][install-overview]. The Bootstrap Machine is created like the other control plane nodes, by defining a CAPI Machine resource. Accordingly, the bootstrap machine can be deleted by simply deleting the object. This works for all platforms: @@ -392,20 +388,45 @@ to ensure they are aware of the changes and are able to review. ### Drawbacks +Users will be required to edit additional files if they are manually editing control-plane machine manifests. +Changes would need to be made to both the machine-api and cluster-api manifests. + #### External/Upstream dependencies -By depending on CAPI providers whose codebases live in a repository external to the Installer, -the process for developing features and delivering fixes is more complex than in a monolothic repo. -While the same could be true for the Installer Terraform dependency; the CAPI providers will -be more actively developed than their Terraform counterparts. Furthermore, it will be necessary -to ensure that the CAPI providers used by the Installer match the version of those in the payload. +As explained above, the Installer will embed binaries for each supported CAPI provider, as well +as `etcd` and `kube-apiserver` binaries. Initially, CAPI providers will be vendored and built in +the Installer repo. `etcd` and `kube-apiserver` will be copied from the release image. + +##### In-tree Dependency Vendoring + +For the initial implementation, CAPI providers will be vendored and built within the Installer repo: + +```bash +$ tree cluster-api/providers -L 2 +cluster-api/providers +├── aws +│   ├── go.mod +│   ├── go.sum +│   ├── tools.go +│   └── vendor +├── azure +│   ├── go.mod +│   ├── go.sum +│   ├── tools.go +│   └── vendor +... +``` + +This follows a similar pattern to the current Terraform provider implementation and build. This +pattern will be used initially due to its simplicity and existing support. This pattern has +drawbacks because changes to providers need to be merged upstream first and then vendored +to the Installer. This aspect will be particularly problematic once CAPI providers are GA +and we need to keep the Installer in-sync with other providers. Builds are also inefficient +in that providers are always rebuilt, even when unchanged. -While this external dependency is a significant drawback, it is not unique to this design -and is common throughout OpenShift (e.g. any time the API or library-go must be updated -before being vendored into a component). To minimize the devex friction, we will focus -on documenting a workflow for developing providers while working with the Installer. +##### Copying Dependencies from Container Images -Additionally, we will explore designs to solve or mitigate these issues. +[TODO] #### Disk space and memory @@ -511,8 +532,7 @@ regarding the open question for the log bundle). As the providers will be running in a control loop, it would be possible to resolve certain issues (e.g. fix missing permissions or delete resources taking up quota) during an installation, but this would -not be a documented procedure. Furthermore, it would be possible to make the installs re-entrant, but -it would not be a goal for simplicity's sake. +not be a documented procedure. ## Implementation History @@ -533,6 +553,11 @@ It would also be possible to implement the installation using direct SDK calls f to the reasons stated above, using individual SDK implementations would not present a common framework across various cloud platforms. +To mitigate the drawback of requiring additional editing of cluster-api manifests after changing machine-api manifests +it would be possible to create the cluster-api manifests based on the machine-api manifests, rather than generating +them in parallel based on the same inputs. Considering that we want to replace MAPI with CAPI in the long-term, it +seems more future proof not to create a dependency between CAPI & MAPI manifests. Furthermore, it would be more +user-friendly to keep all manifests within the same target (`manifests`). ## Infrastructure Needed [optional] @@ -555,3 +580,6 @@ started right away. [asset]: https://github.com/openshift/installer/blob/master/docs/design/assetgeneration.md [AWSMachines]: https://github.com/openshift/installer/blob/ba66fc691e67b9bfe04204c3ece98e1386f66057/pkg/asset/machines/aws/awsmachines.go#L57-L85 [CAPIMachines]: https://github.com/openshift/installer/blob/master/pkg/asset/machines/aws/awsmachines.go#L100-L118 +[controller-runtime]: https://github.com/kubernetes-sigs/controller-runtime +[envtestAPI]: [https://github.com/kubernetes-sigs/controller-runtime/tree/main/pkg/internal/testing/controlplane +[install-overview]: https://github.com/openshift/installer/blob/master/docs/user/overview.md#cluster-installation-process From 9ab58280f58d4532752694d47ea1f4b532e67950 Mon Sep 17 00:00:00 2001 From: Patrick Dillon Date: Fri, 2 Feb 2024 12:17:58 -0500 Subject: [PATCH 10/20] Add to summary. Add test plan. --- ...bootstrapping-clusters-with-capi-providers.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md index b6783011e7..d715c80aeb 100644 --- a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -42,7 +42,10 @@ without requiring access to an external management cluster or a local container By running a Kubernetes control plane and CAPI-provider controllers as subprocesses on the installer host, `openshift-install` can use CAPI and its providers in a similar manner to how Terraform and its providers are currently -being used. +being used. The outcome would be a removal of Terraform dependencies in +installer-provisioned installs as well as added the ability to produce +cluster-api manifests to `openshift-install`, which lay the foundation +for future OpenShift features. ## Motivation @@ -476,8 +479,15 @@ into the development process. ### Test Plan -As this is replacing existing functionality in the Installer, we can rely on existing -testing infrastructure. +The functionality described in this enhancement is gated by `FeatureGateClusterAPIInstall`. +In 4.15, the `installer-altinfra` image was introduced to serve as a Terraform-free variant of the +`installer` image until Terraform is removed from the `installer` image, at which point +`installer-altinfra` will be removed from the release image. + +CI testing will initially begin in the `installer-altinfra`image to avoid +build time issues associated with Terraform and to allow rapid introduction +of CI testing while working on the solution of opying Dependencies from Container Images + ### Graduation Criteria From 9a2d0db5ddf2500279595ec05f2b35a18fdb59a7 Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Fri, 2 Feb 2024 10:03:19 -0800 Subject: [PATCH 11/20] review comments Signed-off-by: Vince Prignano --- ...tstrapping-clusters-with-capi-providers.md | 81 +++++++++++++------ 1 file changed, 58 insertions(+), 23 deletions(-) diff --git a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md index d715c80aeb..968530ca05 100644 --- a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -74,8 +74,6 @@ practices will remove this duplication and become more efficient. - As an existing user of the installer, I want to continue to use the installer binary (e.g. `create cluster`) in the same environments and with existing automation. - As an advanced user or cluster administrator, I want to be able to edit the CAPI infrastructure manifests so that I can customize control-plane infrastructure. - - ### Goals - To provide a common experience across platforms for users and `openshift-install` developers @@ -95,6 +93,7 @@ practices will remove this duplication and become more efficient. - Non-goal: To change the machine bootstrapping process, e.g. implementing a CAPI bootstap provider - Future work: To use an existing management cluster to install OpenShift - Future work: To pivot the CAPI manifests to the newly-installed cluster to enable day-2 infrastructure management within the cluster. + - Collaborate with Assisted Installer and HIVE for any related changes required. - Future work: Replace Machine API (MAPI) with CAPI for day-2 machine management. This enhancement assumes we are still using MAPI Day 2. - Future work: To provide an extensible framework to plug-in new infrastructure cloud providers. @@ -193,7 +192,6 @@ configuration files and invokes Terraform using the `tf-exec` library. ![alt terraform diagram](terraform_embedded.jpg) - We can follow a similar pattern to run CAPI controllers locally on the Installer host. In addition to the CAPI controller binaries, `kube-apiserver` and `etcd` are embedded in order to run a local control plane, orchestrated with `envtest`. @@ -222,6 +220,7 @@ At a high level, the local control plane is responsible for: - For each process that the local control plane manages, a health check (ping to `/healthz`) is required to pass; similarly how, when running in a Deployment, a health probe is configured. - The health check is only ran once, once OK, the process can continue. + The [envtest APIs][envtestAPI] are a thin layer on top of running binaries and setting up flags or variables. The logic could be eventually moved into the installer, if warranted. @@ -383,11 +382,23 @@ Further work needs to be done to determine how to delete additional bootstrap re and the bootstrap ignition S3 bucket. These could be deleted either through updating the relevant manifests or created & deleted out-of-band using hooks. +##### Backward compatibility + +As covered in [OpenShift API compatibility](https://docs.openshift.com/container-platform/4.14/rest_api/understanding-compatibility-guidelines.html): + +> No assurances are made at this time that a new installation of a product minor release will have the same functional defaults as a version of the product that was installed with a prior minor release and upgraded to the equivalent version. For example, future versions of the product may provision cloud infrastructure with different defaults than prior minor versions. In addition, different default security choices may be made in future versions of the product than those made in past versions of the product. Past versions of the product will forward upgrade, but preserve legacy choices where appropriate specifically to maintain backwards compatibility. + +The changes proposed in this enhancement allow the OpenShift Installer to change the underlying mechanics on how an OpenShift cluster is created from an InstallConfig. The change of technology carries structural differences in how the infrastructure is provisioned, defaults, or the topology of the cluster. + +Given an InstallConfig to both systems the enhancement guarantees a functionally equivalent OpenShift cluster. + +In the best case scenario, OpenShift users rely on tags or labels attached to cloud resources when automating specific parts of their infrastructure. While this can be true in most cases, a goal of this proposal is to document in details the underlying structural differences. + ### Risks and Mitigations -While we do not expect these changes to introduce a significant security risk, we are working with product security teams -to ensure they are aware of the changes and are able to review. +While we do not expect these changes to introduce a significant security risk, we are working with product security teams to ensure they are aware of the changes and are able to review. +Each Cluster API provider's created infrastructure should be reviewed by product security and subject area experts to ensure the new infrastructure topologies considered are on par with today's standards. ### Drawbacks @@ -422,9 +433,9 @@ cluster-api/providers This follows a similar pattern to the current Terraform provider implementation and build. This pattern will be used initially due to its simplicity and existing support. This pattern has -drawbacks because changes to providers need to be merged upstream first and then vendored +drawbacks because changes to providers need to be merged upstream first and then vendored to the Installer. This aspect will be particularly problematic once CAPI providers are GA -and we need to keep the Installer in-sync with other providers. Builds are also inefficient +and we need to keep the Installer in-sync with other providers. Builds are also inefficient in that providers are always rebuilt, even when unchanged. ##### Copying Dependencies from Container Images @@ -469,22 +480,25 @@ updating: kube-apiserver (deflated 72%) ### Open Questions [optional] -1. UX design during install process as well as during failure (log collection). The Installer will dump +- UX design during install process as well as during failure (log collection). The Installer will dump (potentially prettified) controller logs. We expect that this question will become easier to answer further into the development process. -2. Whether to use downstream OpenShift-specific `kube-apiserver` and `etcd` dependencies and how to source them? +- Whether to use downstream OpenShift-specific `kube-apiserver` and `etcd` dependencies and how to source them? -3. When should the Installer declare infrastructure provisioning failed? +- When should the Installer declare infrastructure provisioning failed? + - Today we have different timeouts at different stages of the installation process; during the first phase of this enhancement + we'll keep the same values in place. Long term, we could allow upper bound customization of these values. ### Test Plan -The functionality described in this enhancement is gated by `FeatureGateClusterAPIInstall`. +The functionality described in this enhancement is gated by a new Feature Gate called `ClusterAPIInstall`. + In 4.15, the `installer-altinfra` image was introduced to serve as a Terraform-free variant of the `installer` image until Terraform is removed from the `installer` image, at which point `installer-altinfra` will be removed from the release image. -CI testing will initially begin in the `installer-altinfra`image to avoid +CI testing will initially begin in the `installer-altinfra` image to avoid build time issues associated with Terraform and to allow rapid introduction of CI testing while working on the solution of opying Dependencies from Container Images @@ -494,21 +508,31 @@ of CI testing while working on the solution of opying Dependencies from Containe #### Dev Preview -> Tech Preview -- Ability to utilize the enhancement end to end -- End user documentation, relative API stability +Users can opt-in to use a Cluster API based installation by including in the InstallConfig a custom feature set: + +``` +[...] +featureSet: CustomNoUpgrade +featureGates: +- ClusterAPIInstall=true +``` + +- Ability to utilize the enhancement end to end. +- End user documentation, relative API stability. #### Tech Preview -> GA -- More testing (upgrade, downgrade, scale) -- Sufficient time for feedback -- Available by default +- More testing (upgrade, downgrade, scale). +- Sufficient time for feedback. +- Available by default. - User facing documentation created in [openshift-docs](https://github.com/openshift/openshift-docs/) - + - Document detailed deltas in cluster infrastructure created by Terraform and Cluster API. +- Infrastructure topology security posture review for each provider. #### Removing a deprecated feature -- Announce deprecation and support policy of the existing feature -- Deprecate the feature +- Announce deprecation and support policy of the existing feature. +- Deprecate the feature gate. ### Upgrade / Downgrade Strategy @@ -551,18 +575,29 @@ History`. ## Alternatives + +#### MicroShift + +While we've considered using MicroShift for a local control plane, which can run in different platforms using tools like Podman Desktop or on RHEL directly, the requirement of having access to a RHEL Virtual Machine is a high bar to reach given the goal of not introducing any dependency on runtimes and being able to run in a variety of platforms, including CI systems. + +#### Infrastructure-as-code Tools + Using other infrastructure-as-code alternatives such as Pulumi, Ansible, or OpenTofu all have their own individual drawbacks. We prefer the CAPI solution over these alternatives because it: -* streamlines Installer development (we do not need to re-implement features for the control plane) -* lays the foundation for OpenShift to implement future CAPI features -* requires less development effort, as CAPI providers are already setup to provision infrastructure for a cluster +* Streamlines Installer development (we do not need to re-implement features for the control plane) +* Lays the foundation for OpenShift to implement future CAPI features +* Requires less development effort, as CAPI providers are already setup to provision infrastructure for a cluster + +#### Direct SDK calls It would also be possible to implement the installation using direct SDK calls for the cloud provider. In addition to the reasons stated above, using individual SDK implementations would not present a common framework across various cloud platforms. +#### Separate manifest creation targets for Cluster/Machine APIs (implementation detail) + To mitigate the drawback of requiring additional editing of cluster-api manifests after changing machine-api manifests it would be possible to create the cluster-api manifests based on the machine-api manifests, rather than generating them in parallel based on the same inputs. Considering that we want to replace MAPI with CAPI in the long-term, it From f28c8cb60dec88b091ea7362e0018d1fc55ff813 Mon Sep 17 00:00:00 2001 From: Patrick Dillon Date: Sat, 3 Feb 2024 17:13:17 -0500 Subject: [PATCH 12/20] Finish Test Plan --- ...tstrapping-clusters-with-capi-providers.md | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md index 968530ca05..7ecee314f1 100644 --- a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -493,14 +493,23 @@ into the development process. ### Test Plan The functionality described in this enhancement is gated by a new Feature Gate called `ClusterAPIInstall`. +A major goal of this enhancement is feature parity, which means we can leverage existing test job definitions +and infrastructure for testing. The initial round of testing will be running the standard `e2e--ovn` +tests with the feature gate enabled; and adding additional tests is as simple as copying an existing config and +adding the gate. -In 4.15, the `installer-altinfra` image was introduced to serve as a Terraform-free variant of the -`installer` image until Terraform is removed from the `installer` image, at which point -`installer-altinfra` will be removed from the release image. +In 4.15, the `installer-altinfra` image was introduced to serve as a Terraform-free alternative to the +`installer` image. CI testing will initially begin in this image (using a [variant](variant)) to enjoy the +benefits of a Terraform-free build and to avoid introducing temporary changes to the `installer` image Dockerfile, +which would be necessary while working on the solution for +[copying dependencies from container images](#dependencies-from-container-images). The `OPENSHIFT_CLUSTER_API` flag +will be used during the installer build to obtain the `kube-apiserver` and `etcd` binary dependencies from the internet; +the flag is enabled through Dockerfile args in the `installer-altinfra` image. Once the work of copying dependencies +from images is ready, we will be able to test that build functionality by running the CAPI-feature-gated installs +without the `OPENSHIFT_CLUSTER_API` envvar in the `installer` image. -CI testing will initially begin in the `installer-altinfra` image to avoid -build time issues associated with Terraform and to allow rapid introduction -of CI testing while working on the solution of opying Dependencies from Container Images +While we are using the `OPENSHIFT_CLUSTER_API` envvar, we are able to test in CI but the Installer +cannot be tested in nightlies or release candidates, due to egress lockdown in the OpenShift Build System. ### Graduation Criteria @@ -519,6 +528,7 @@ featureGates: - Ability to utilize the enhancement end to end. - End user documentation, relative API stability. +- Build using `OPENSHIFT_CLUSTER_API` envvar #### Tech Preview -> GA @@ -528,6 +538,11 @@ featureGates: - User facing documentation created in [openshift-docs](https://github.com/openshift/openshift-docs/) - Document detailed deltas in cluster infrastructure created by Terraform and Cluster API. - Infrastructure topology security posture review for each provider. +- Installer image is built by copying `kube-apiserver` & `etcd` binaries from release images + +#### Future Work +- Follow `kube-apiserver` & `etcd` pattern, and copy CAPI controller binaries from release images + #### Removing a deprecated feature @@ -628,3 +643,4 @@ started right away. [controller-runtime]: https://github.com/kubernetes-sigs/controller-runtime [envtestAPI]: [https://github.com/kubernetes-sigs/controller-runtime/tree/main/pkg/internal/testing/controlplane [install-overview]: https://github.com/openshift/installer/blob/master/docs/user/overview.md#cluster-installation-process +[variant]: https://docs.ci.openshift.org/docs/how-tos/contributing-openshift-release/#variants From 508df8d27de2a7834cd62675173a34ebe739f115 Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Tue, 6 Feb 2024 06:48:32 -0800 Subject: [PATCH 13/20] clarify mem/disk Signed-off-by: Vince Prignano --- .../installer/bootstrapping-clusters-with-capi-providers.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md index 7ecee314f1..6249b2abb1 100644 --- a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -448,12 +448,15 @@ in that providers are always rebuilt, even when unchanged. With the introduction of the Local Control Plane, new required components are being run during cluster creation. +Memory runtime: - `api-server` uses ~280MB and `etcd` ~52MB - Cluster API - Core controller uses ~28MB - Infrastructure controller (AWS, in testing) uses ~35MB -When compared to Terraform, the runtime memory footprint is well-within the current usare or limitations (TODO: provide Terraform benchmark); the disk footprint increases by what's required of `etcd` which is around 128MB while creating an OpenShift cluster on AWS. +When compared to Terraform, the runtime memory footprint is well-within the current usage or limitations (TODO: provide Terraform benchmark). + +The disk footprint increases by what's required for `etcd` which is around 128MB while creating an OpenShift cluster on AWS. #### Binary size From 56e53e353b0201936b687e4f0d1ada3897ddf201 Mon Sep 17 00:00:00 2001 From: Vince Prignano Date: Tue, 6 Feb 2024 06:50:22 -0800 Subject: [PATCH 14/20] clarify excluded cluster api binaries in size comparison Signed-off-by: Vince Prignano --- .../installer/bootstrapping-clusters-with-capi-providers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md index 6249b2abb1..9cb8f2bea1 100644 --- a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -462,7 +462,7 @@ The disk footprint increases by what's required for `etcd` which is around 128MB > NOTE: All tests are performed on a MacOS system at the time of writing. -The `openshift-install` resulting binary size, with Cluster API bundled binaries reaches ~515MB, of which, the bundled binaries account 228MB. By comparison, the binary available for download on `console.redhat.com` for MacOS, once upacked, is 732MB. +The `openshift-install` resulting binary size, with Cluster API bundled binaries (excluding alicloud, libvirt) reaches ~515MB, of which, the bundled binaries account 228MB. By comparison, the binary available for download on `console.redhat.com` for MacOS, once upacked, is 732MB. The binaries are stored in `zip` format within the installer, and unpacked at runtime; from the `zip` output, the space savings are quite substantial: @@ -508,7 +508,7 @@ which would be necessary while working on the solution for [copying dependencies from container images](#dependencies-from-container-images). The `OPENSHIFT_CLUSTER_API` flag will be used during the installer build to obtain the `kube-apiserver` and `etcd` binary dependencies from the internet; the flag is enabled through Dockerfile args in the `installer-altinfra` image. Once the work of copying dependencies -from images is ready, we will be able to test that build functionality by running the CAPI-feature-gated installs +from images is ready, we will be able to test that build functionality by running the CAPI-feature-gated installs without the `OPENSHIFT_CLUSTER_API` envvar in the `installer` image. While we are using the `OPENSHIFT_CLUSTER_API` envvar, we are able to test in CI but the Installer From 28a819b729c93233c04e50ee7ee6d687eff90b9c Mon Sep 17 00:00:00 2001 From: Patrick Dillon Date: Wed, 7 Feb 2024 16:45:01 -0500 Subject: [PATCH 15/20] update open questions --- .../installer/bootstrapping-clusters-with-capi-providers.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md index 9cb8f2bea1..df3dd837a9 100644 --- a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -487,8 +487,6 @@ updating: kube-apiserver (deflated 72%) (potentially prettified) controller logs. We expect that this question will become easier to answer further into the development process. -- Whether to use downstream OpenShift-specific `kube-apiserver` and `etcd` dependencies and how to source them? - - When should the Installer declare infrastructure provisioning failed? - Today we have different timeouts at different stages of the installation process; during the first phase of this enhancement we'll keep the same values in place. Long term, we could allow upper bound customization of these values. From 3e3b501003d14dff2bc02d05699592a2c5363059 Mon Sep 17 00:00:00 2001 From: Patrick Dillon Date: Wed, 7 Feb 2024 23:43:11 -0500 Subject: [PATCH 16/20] address feedback --- ...tstrapping-clusters-with-capi-providers.md | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md index df3dd837a9..87fa11469f 100644 --- a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -43,9 +43,8 @@ By running a Kubernetes control plane and CAPI-provider controllers as subprocesses on the installer host, `openshift-install` can use CAPI and its providers in a similar manner to how Terraform and its providers are currently being used. The outcome would be a removal of Terraform dependencies in -installer-provisioned installs as well as added the ability to produce -cluster-api manifests to `openshift-install`, which lay the foundation -for future OpenShift features. +installer-provisioned installs as well as the added ability to produce +cluster-api manifests, which lay the foundation for future OpenShift features. ## Motivation @@ -64,10 +63,9 @@ reduce the surface area for security vulnerabilities. Terraform and its provider constitutes over half a million lines of code in the Installer repo and is directly attributable for all (13) CVEs that have been fixed in the Installer repo. --Streamline Installer development: a common pattern for Installer development +- Streamline Installer development: a common pattern for Installer development has been to reimplement control-plane features in Terraform that have already been -delivered upstream. By utilizing CAPI providers for Day-0 provisioning, our development -practices will remove this duplication and become more efficient. +delivered upstream. By utilizing CAPI providers for Day-0 provisioning, our development practices will remove this duplication and become more efficient. ### User Stories @@ -89,7 +87,7 @@ practices will remove this duplication and become more efficient. - Non-goal: To maintain a consistent infrastructure footprint as clusters previously created with Terraform - Non-goal: Support openshift cluster creation by using any tools other than `openshift-install`, such as `clusterctl` -- Non-goal: To create a re-entrant installation process +- Non-goal: To add new functionality of having a reentrant installation - Non-goal: To change the machine bootstrapping process, e.g. implementing a CAPI bootstap provider - Future work: To use an existing management cluster to install OpenShift - Future work: To pivot the CAPI manifests to the newly-installed cluster to enable day-2 infrastructure management within the cluster. @@ -259,9 +257,9 @@ machines are provisioned based off of the cluster-api manifests, post-install th The manifests within the `cluster-api` directory won't be written to the resulting OpenShift cluster, or included in bootstrap ignition. In future work, we expect these manifests to be pivoted to the cluster to enable the target cluster to take over managing its own infrastructure. -The Cluster API manifests will be generated with `.spec` fields in the [manifest asset target][asset] with `.status` updated after cluster creation. +After installation, updated Cluster API manifests will be written to disk. These manifests can be used by post-install commands such as `openshift-install gather bootstrap` in order to determine the IP addresses of the -control-plane machines. The manifests would also be useful for general debugging tasks. +control-plane machines. The manifests would also be useful for debugging. #### Infrastructure Provisioning @@ -346,7 +344,9 @@ Control plane machines are provisioned by [AWSMachines][AWSMachines] & [CAPI Mac ##### Additional Infrastructure -The Installer generates any additional infrastructure that is needed but not handled by the CAPI provider, either because it is out of scope (e.g. IAM, DNS), or not adopted upstream (e.g. split-horizon load balancers). +The Installer generates any additional infrastructure that is needed but not handled by the CAPI provider, either because it is out of scope (e.g. IAM, DNS), or not adopted upstream (e.g. split-horizon load balancers). In the case of +Ignition support, the `Bootstrap` field of the CAPI Machine Spec allows +bootstrapping via the machine user-data. The Installer codebase provides hooks into the provisioning lifecycle that can be used to provision resources using direct SDK calls or other tooling. In most cases, teams are encouraged in discussing and building issues in the respective upstream repositories first, e.g. `cluster-api` or `cluster-api-provider-aws` and only @@ -440,7 +440,12 @@ in that providers are always rebuilt, even when unchanged. ##### Copying Dependencies from Container Images -[TODO] +When building, the `kube-apiserver` and `etcd` dependencies will be copied from container images in the Installer Dockerfile. For FIPS supported architectures +the dependencies will be copied from the release image, while others will +be copied from intermediary build images. During development, the dependencies +can be obtained from the internet via a script. + +The method would eventually be used for CAPI controllers. #### Disk space and memory @@ -491,6 +496,8 @@ into the development process. - Today we have different timeouts at different stages of the installation process; during the first phase of this enhancement we'll keep the same values in place. Long term, we could allow upper bound customization of these values. +- What is the best way to destroy bootstrap resources? + ### Test Plan The functionality described in this enhancement is gated by a new Feature Gate called `ClusterAPIInstall`. @@ -515,6 +522,7 @@ cannot be tested in nightlies or release candidates, due to egress lockdown in t ### Graduation Criteria +Graduation can happen per individual cloud platform. #### Dev Preview -> Tech Preview From bc5bb8bbad3d9b9867831fd343a31ed27b8b713a Mon Sep 17 00:00:00 2001 From: Patrick Dillon Date: Fri, 16 Feb 2024 14:15:51 -0500 Subject: [PATCH 17/20] build details, assisted installer --- ...tstrapping-clusters-with-capi-providers.md | 56 ++++++++++++++----- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md index 87fa11469f..3488b1eb84 100644 --- a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -4,6 +4,7 @@ authors: - "@patrickdillon" - "@vincepri" - "@JoelSpeed" + - "@r4f4" reviewers: - "@sdodson" - "@2uasimojo" @@ -14,7 +15,6 @@ reviewers: - "@rvanderp3" - "@jcpowermac" - "@enxebre" - - "@wking" - "@dhellmann" - "@avishayt" approvers: @@ -81,6 +81,7 @@ delivered upstream. By utilizing CAPI providers for Day-0 provisioning, our deve - To keep the user experience for day-zero operations unchanged or improved. - To not require any new runtime dependencies (e.g. containers). - To maintain compatibility for hive, particularly regarding `destroy` functionality +- To maintain compatibility with assisted installer, particularly allowing the ability to generate manifests without requiring access to cloud platform endpoints - To continue delivering `openshift-install` for supported os/architectures: linux/x86, linux/arm, linux/powerpc, linux/s390x, darwin/x86, darwin/arm ### Non-Goals / Future work @@ -91,7 +92,7 @@ delivered upstream. By utilizing CAPI providers for Day-0 provisioning, our deve - Non-goal: To change the machine bootstrapping process, e.g. implementing a CAPI bootstap provider - Future work: To use an existing management cluster to install OpenShift - Future work: To pivot the CAPI manifests to the newly-installed cluster to enable day-2 infrastructure management within the cluster. - - Collaborate with Assisted Installer and HIVE for any related changes required. +- Future work: Collaborate with Assisted Installer and HIVE for any related changes required. - Future work: Replace Machine API (MAPI) with CAPI for day-2 machine management. This enhancement assumes we are still using MAPI Day 2. - Future work: To provide an extensible framework to plug-in new infrastructure cloud providers. @@ -167,7 +168,6 @@ The following are CRD references for Installer-supported platforms: - AWS: [infrastructure.cluster.x-k8s.io/v1beta2][awsCRD] - Azure/AzureStack: [infrastructure.cluster.x-k8s.io/v1beta1][azureCRD] -- Baremetal: [infrastructure.cluster.x-k8s.io/v1beta1][metalCRD] - GCP: [infrastructure.cluster.x-k8s.io/v1beta1][gcpCRD] - IBMCloud/PowerVS: [infrastructure.cluster.x-k8s.io/v1beta2][ibmCRD] - Nutanix: [infrastructure.cluster.x-k8s.io/v1beta1][nutanixCRD] @@ -216,7 +216,7 @@ At a high level, the local control plane is responsible for: - Each controller manager will have its own `host:port` combination assigned. - Certificates are generated and injected in the server, and the client certs in the api-server webhook configuration. - For each process that the local control plane manages, a health check (ping to `/healthz`) is required to pass; similarly how, when running in a Deployment, a health probe is configured. - - The health check is only ran once, once OK, the process can continue. + - The health check is confirmed, the process can continue. The [envtest APIs][envtestAPI] are a thin layer on top of running binaries and setting up flags or variables. @@ -254,13 +254,24 @@ The cluster-api manifests are generated in parallel with all other manifests, pa any changes to the control-plane machines within the manifests will also need to be made in the cluster-api manifests. Although, the machines are provisioned based off of the cluster-api manifests, post-install the control plane will be managed by the machine-api operator. -The manifests within the `cluster-api` directory won't be written to the resulting OpenShift cluster, or included in bootstrap ignition. +The resources specified within the cluster-api manifests won't be created in the resulting OpenShift cluster (or included in bootstrap ignition), +but the manifest artifacts will be uploaded to the cluster as a configmap for reference (similarly to the install config). In future work, we expect these manifests to be pivoted to the cluster to enable the target cluster to take over managing its own infrastructure. After installation, updated Cluster API manifests will be written to disk. These manifests can be used by post-install commands such as `openshift-install gather bootstrap` in order to determine the IP addresses of the control-plane machines. The manifests would also be useful for debugging. +##### Manifest Generation and the Assisted Installer + +The Assisted Installer does not collect user credentials and therefore cannot access a cloud platform while generating manifests. `openshift-install` +on the other hand may use SDK calls to determine metadata which was not provided but can be determined based on user input. Specifically, for vSphere +the installer determines the full inventory path of the network name (port groups) based on the data from the install config. In order to maintain +compatibility with the assisted installer, `openshift-install` will leave any fields in the cluster-api manifests that require SDK access empty in the +case where SDK access to the cloud environment fails. It may be necessary to condition this functionality based on the `invoker` env var. The result +will be continued compabitility with assisted installer and the future possibility of the assisted installer developing a workflow to enable day-2 +infrastructure management. + #### Infrastructure Provisioning ##### CAPI Provisioning @@ -378,9 +389,8 @@ Accordingly, the bootstrap machine can be deleted by simply deleting the object. }); ``` -Further work needs to be done to determine how to delete additional bootstrap resources, such as SSH security group rules -and the bootstrap ignition S3 bucket. These could be deleted either through updating the relevant manifests or created & -deleted out-of-band using hooks. +The CAPI provider interface will be extended to allow deletion of additional resources that do not get destroyed by +this general pattern (e.g. SSH security rules on the bootstrap node). ##### Backward compatibility @@ -440,13 +450,29 @@ in that providers are always rebuilt, even when unchanged. ##### Copying Dependencies from Container Images -When building, the `kube-apiserver` and `etcd` dependencies will be copied from container images in the Installer Dockerfile. For FIPS supported architectures -the dependencies will be copied from the release image, while others will +The previously described vendoring pattern presents disadvantages: +* increase in the repo size; +* security issues/warnings in code we do not own; +* providers are rebuilt with every Installer change, whether or not the change is pertinent to the provider + +So as not to incur the same disadvantages, we opted to use a different approach for etcd and kube-apiserver needed for +the provisioning via CAPI: they will be built into intermediary container images. During the Installer container build, +those images are imported and the relevant binaries extracted. Because of that, etcd and kube-apiserver will have build +cadences decoupled from the Installer's, being rebuilt only when needed. +Because they run in the host machine, like the Installer, they will have to be built for all systems/arches supported, +including cross-compiled darwin amd64/arm64. + +This architecture has 2 opposing disadvantages: +* In CI: because there is no mechanism to detect and rebuild dependant images, Installer and etcd/KAS might temporarily +drift apart and cause job failures when the expected versions do not match. This issue is probably alleviated by the +frequent changes to the Installer repo and can be worked around by forcing an Installer rebuild. +* In the release: in this case, there is a mechanism to trigger rebuilds automatically. Which means that the Installer +image will be rebuilt with any changes to etcd/KAS, even if those changes don't necessarily require an Installer rebuild. + +For FIPS supported architectures the dependencies will be copied from the release image, while others will be copied from intermediary build images. During development, the dependencies can be obtained from the internet via a script. -The method would eventually be used for CAPI controllers. - #### Disk space and memory > NOTE: All tests are performed on a MacOS system at the time of writing. @@ -547,9 +573,11 @@ featureGates: - User facing documentation created in [openshift-docs](https://github.com/openshift/openshift-docs/) - Document detailed deltas in cluster infrastructure created by Terraform and Cluster API. - Infrastructure topology security posture review for each provider. -- Installer image is built by copying `kube-apiserver` & `etcd` binaries from release images +- Installer image is built by copying `kube-apiserver` & `etcd` binaries from release images. +- FIPS-compliance is confirmed, particularly in the build process and certificates for local control plane +- Stand-alone `openshift-install destroy bootstrap` command will be able to utilize CAPI system by reloading state from disk -#### Future Work +#### Post-GA - Follow `kube-apiserver` & `etcd` pattern, and copy CAPI controller binaries from release images From 167533d926c4882a734672219499360ce76a85fd Mon Sep 17 00:00:00 2001 From: Patrick Dillon Date: Fri, 16 Feb 2024 14:24:09 -0500 Subject: [PATCH 18/20] more small fixes --- .../bootstrapping-clusters-with-capi-providers.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md index 3488b1eb84..0c52f59775 100644 --- a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -251,11 +251,12 @@ install-dir/cluster-api/ ``` The cluster-api manifests are generated in parallel with all other manifests, particularly the machine-api manifests, which means that -any changes to the control-plane machines within the manifests will also need to be made in the cluster-api manifests. Although, the -machines are provisioned based off of the cluster-api manifests, post-install the control plane will be managed by the machine-api operator. +any changes to the control-plane machines within the manifests will also need to be made in the cluster-api manifests. Guidelines will +be provided in documentation to inform users of how to generally edit the new manifests. The resources specified within the cluster-api manifests won't be created in the resulting OpenShift cluster (or included in bootstrap ignition), -but the manifest artifacts will be uploaded to the cluster as a configmap for reference (similarly to the install config). +but the manifest artifacts will be uploaded to the cluster as a configmap for reference (similarly to the install config). Although, the +machines are provisioned based off of the cluster-api manifests, post-install the control plane will be managed by the machine-api operator. In future work, we expect these manifests to be pivoted to the cluster to enable the target cluster to take over managing its own infrastructure. After installation, updated Cluster API manifests will be written to disk. From 4ffc5cff33240805dce548a80ddcde8953a06571 Mon Sep 17 00:00:00 2001 From: Patrick Dillon Date: Fri, 16 Feb 2024 14:43:07 -0500 Subject: [PATCH 19/20] Credentials and log bundle --- .../bootstrapping-clusters-with-capi-providers.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md index 0c52f59775..25b3536907 100644 --- a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -572,11 +572,12 @@ featureGates: - Sufficient time for feedback. - Available by default. - User facing documentation created in [openshift-docs](https://github.com/openshift/openshift-docs/) - - Document detailed deltas in cluster infrastructure created by Terraform and Cluster API. + - Document detailed deltas in cluster infrastructure and credentials created by Terraform and Cluster API. - Infrastructure topology security posture review for each provider. - Installer image is built by copying `kube-apiserver` & `etcd` binaries from release images. - FIPS-compliance is confirmed, particularly in the build process and certificates for local control plane - Stand-alone `openshift-install destroy bootstrap` command will be able to utilize CAPI system by reloading state from disk +- Installer debug log bundle collects controller logs and capi manifests #### Post-GA - Follow `kube-apiserver` & `etcd` pattern, and copy CAPI controller binaries from release images @@ -604,13 +605,11 @@ N/A During a failed install, the controller logs will contain useful information. The status of the CAPI manifests may also contain useful information, in which case it would be important to display that to users and collect -for bugs and support cases. There is an open question about the best way to handle this UX, and we expect the answer to become more clear during development. +for bugs and support cases. -As the infrastructure will be reconciled by a controller, it will be possible to resolve issues during an ongoing -installation, although this would not necessarily be a feature we would call attention to for documented use cases. - -Finally, the Installer will need to be able to identify when infrastructure provisioning has failed during an installation. -Initially this will be achieved through a timeout. There is an open question about whether this can be done in a more sophisticated manner. +The Installer will need to be able to identify when infrastructure provisioning has failed during an installation. +Initially this will be achieved through a timeout. In the case of a failure, controller logs and cluster-api manifests +will be collected in the installer log bundle. #### Support Procedures From 59782adc13a8dbee7d87da0706b3953408369049 Mon Sep 17 00:00:00 2001 From: Patrick Dillon Date: Fri, 16 Feb 2024 14:50:37 -0500 Subject: [PATCH 20/20] minor updates --- .../installer/bootstrapping-clusters-with-capi-providers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md index 25b3536907..06720b98e5 100644 --- a/enhancements/installer/bootstrapping-clusters-with-capi-providers.md +++ b/enhancements/installer/bootstrapping-clusters-with-capi-providers.md @@ -572,7 +572,7 @@ featureGates: - Sufficient time for feedback. - Available by default. - User facing documentation created in [openshift-docs](https://github.com/openshift/openshift-docs/) - - Document detailed deltas in cluster infrastructure and credentials created by Terraform and Cluster API. + - Document detailed deltas in cluster infrastructure (including costs) and credentials created by Terraform and Cluster API. - Infrastructure topology security posture review for each provider. - Installer image is built by copying `kube-apiserver` & `etcd` binaries from release images. - FIPS-compliance is confirmed, particularly in the build process and certificates for local control plane @@ -605,7 +605,7 @@ N/A During a failed install, the controller logs will contain useful information. The status of the CAPI manifests may also contain useful information, in which case it would be important to display that to users and collect -for bugs and support cases. +for bugs and support cases. The Installer will need to be able to identify when infrastructure provisioning has failed during an installation. Initially this will be achieved through a timeout. In the case of a failure, controller logs and cluster-api manifests