From 3a9b0f5ca02b9abeb3b837b8a6d75039ad624cd0 Mon Sep 17 00:00:00 2001 From: Ronan Hennessy Date: Wed, 24 Apr 2024 11:33:15 +0100 Subject: [PATCH] TELCODOCS-1779: Adding section for IBI factory install Add nmstateconfig example Add note about NIC name must match actual name in OS --- _topic_maps/_topic_map.yml | 11 + edge_computing/image-base-install/_attributes | 1 + .../ibi-edge-image-based-install.adoc | 76 +++++ .../ibi-factory-image-based-install.adoc | 21 ++ ...ibi-preparing-for-image-based-install.adoc | 23 ++ ...ibi-understanding-image-based-install.adoc | 114 +++++++ edge_computing/image-base-install/images | 1 + edge_computing/image-base-install/modules | 1 + edge_computing/image-base-install/snippets | 1 + ...Shift_IBI_Installation_high-level_0624.png | Bin 0 -> 91668 bytes modules/ibi-create-config-iso.adoc | 307 ++++++++++++++++++ modules/ibi-create-iso-for-seed-image.adoc | 98 ++++++ modules/ibi-generate-seed-image.adoc | 175 ++++++++++ modules/ibi-ib-cli-reference.adoc | 83 +++++ ...ibi-image-based-install-cluster-guide.adoc | 17 + modules/ibi-install-ibi-operator.adoc | 55 ++++ modules/ibi-install-lcao-cli.adoc | 114 +++++++ modules/ibi-install-lcao-console.adoc | 37 +++ modules/ibi-install-shared-partition.adoc | 70 ++++ modules/ibi-validated-software-versions.adoc | 28 ++ 20 files changed, 1233 insertions(+) create mode 120000 edge_computing/image-base-install/_attributes create mode 100644 edge_computing/image-base-install/ibi-edge-image-based-install.adoc create mode 100644 edge_computing/image-base-install/ibi-factory-image-based-install.adoc create mode 100644 edge_computing/image-base-install/ibi-preparing-for-image-based-install.adoc create mode 100644 edge_computing/image-base-install/ibi-understanding-image-based-install.adoc create mode 120000 edge_computing/image-base-install/images create mode 120000 edge_computing/image-base-install/modules create mode 120000 edge_computing/image-base-install/snippets create mode 100644 images/711_OpenShift_IBI_Installation_high-level_0624.png create mode 100644 modules/ibi-create-config-iso.adoc create mode 100644 modules/ibi-create-iso-for-seed-image.adoc create mode 100644 modules/ibi-generate-seed-image.adoc create mode 100644 modules/ibi-ib-cli-reference.adoc create mode 100644 modules/ibi-image-based-install-cluster-guide.adoc create mode 100644 modules/ibi-install-ibi-operator.adoc create mode 100644 modules/ibi-install-lcao-cli.adoc create mode 100644 modules/ibi-install-lcao-console.adoc create mode 100644 modules/ibi-install-shared-partition.adoc create mode 100644 modules/ibi-validated-software-versions.adoc diff --git a/_topic_maps/_topic_map.yml b/_topic_maps/_topic_map.yml index b15b62c8669d..272de8249653 100644 --- a/_topic_maps/_topic_map.yml +++ b/_topic_maps/_topic_map.yml @@ -3113,6 +3113,17 @@ Topics: File: cnf-image-based-upgrade-base - Name: Performing an image-based upgrade for single-node OpenShift clusters using GitOps ZTP File: ztp-image-based-upgrade +- Name: Image-based installation for single-node OpenShift clusters + Dir: image-base-install + Topics: + - Name: Understanding an image-based installation for single-node OpenShift clusters + File: ibi-understanding-image-based-install + - Name: Preparing for an image-based installation for single-node OpenShift clusters + File: ibi-preparing-for-image-based-install + - Name: Performing an image-based installation for single-node OpenShift clusters + File: ibi-factory-image-based-install + - Name: Performing an image-based deployment for single-node OpenShift clusters + File: ibi-edge-image-based-install --- Name: Reference design specifications Dir: telco_ref_design_specs diff --git a/edge_computing/image-base-install/_attributes b/edge_computing/image-base-install/_attributes new file mode 120000 index 000000000000..f27fd275ea6b --- /dev/null +++ b/edge_computing/image-base-install/_attributes @@ -0,0 +1 @@ +../_attributes/ \ No newline at end of file diff --git a/edge_computing/image-base-install/ibi-edge-image-based-install.adoc b/edge_computing/image-base-install/ibi-edge-image-based-install.adoc new file mode 100644 index 000000000000..62c68be4caf4 --- /dev/null +++ b/edge_computing/image-base-install/ibi-edge-image-based-install.adoc @@ -0,0 +1,76 @@ +:_mod-docs-content-type: ASSEMBLY +[id="ibi-image-based-install_{context}"] += About image-based deployments for {sno} clusters +include::_attributes/common-attributes.adoc[] +:context: ibi-edge-image-based-install + +toc::[] + +When a host preinstalled with {sno} using an image-based installation arrives at a remote site, a technician can easily reconfigure and deploy the host in a matter of minutes. + +To complete the deployment of a preinstalled host, you must first define site-specific configuration resources on the hub cluster for each host. These resources contain configuration information such as the properties of the bare-metal host, authentication details, and other deployment and networking information. + +The Image Based Install (IBI) Operator creates a configuration ISO from these resources, and then boots the host with the configuration ISO attached. The host mounts the configuration ISO and runs the reconfiguration process. When the reconfiguration completes, the {sno} cluster is ready. + +[NOTE] +==== +You must create distinct configuration resources for each bare-metal host. +==== + +See the following high-level steps to deploy a preinstalled host: + +* Install the IBI Operator on the hub cluster. +* Create site-specific configuration resources in the hub cluster for each host. +* Apply these resources in the hub cluster. +* The IBI Operator creates a configuration ISO from these resources and boots the target host with the configuration ISO attached. +* The host mounts the configuration ISO and runs the reconfiguration process. When the reconfiguration completes, the {sno} cluster is ready. + +include::modules/ibi-install-ibi-operator.adoc[leveloffset=+1] + +== Cluster configuration resources for deploying a preinstalled host +To complete a deployment for a preinstalled host at a remote site, you must configure the following site-specifc cluster configuration resources in the hub cluster for each bare-metal host. + +.Cluster configuration resources reference +[cols="1,3", options="header"] +|=== + +| Resource | Description + +|`Namespace` +|Namespace for the managed {sno} cluster. + +|`BareMetalHost` +|Describes the physical host and its properties, such as the provisioning and hardware configuration. + +|`Secret` for the bare-metal host +|Credentials for the host BMC. + +|`Secret` for the image registry +|Credentials for the image registry. The secret for the image registry must be of type `kubernetes.io/dockerconfigjson`. + +|`ImageClusterInstall` +|References the bare-metal host, deployment, and image set resources. + +|`ClusterImageSet` +|Describes the release images to use for the cluster. + +|`ClusterDeployment` +|Describes networking, authentication, and platform-specific settings. + +|`ManagedCluster` +|Describes cluster details to enable {rh-rhacm-first} to register and manage. + +|`ConfigMap` +|Describes networking setting, such as static networking and routing information. This is resource is optional. + +|=== + +include::modules/ibi-create-config-iso.adoc[leveloffset=+1] + +[role="_additional-resources"] +== Additional resources + +* link:https://docs.openshift.com/container-platform/4.15/post_installation_configuration/bare-metal-configuration.html#about-the-baremetalhost-resource_post-install-bare-metal-configuration[About the BareMetalHost resource] + +* link:https://docs.openshift.com/container-platform/4.15/openshift_images/managing_images/using-image-pull-secrets.html[Using image pull secrets] + diff --git a/edge_computing/image-base-install/ibi-factory-image-based-install.adoc b/edge_computing/image-base-install/ibi-factory-image-based-install.adoc new file mode 100644 index 000000000000..fa7a5d210396 --- /dev/null +++ b/edge_computing/image-base-install/ibi-factory-image-based-install.adoc @@ -0,0 +1,21 @@ +:_mod-docs-content-type: ASSEMBLY +[id="ibi-image-based-install_{context}"] += Performing an image-based installation for {sno} clusters +include::_attributes/common-attributes.adoc[] +:context: ibi-factory-image-based-install + +toc::[] + +Use the `ib-cli` CLI tool to create a live installation ISO for preinstalling {sno} on bare-metal hosts. You can extract the `ib-cli` CLI tool from the {lcao}. + +The `ib-cli` CLI tool takes a seed image URL, and other inputs such as a URL for an instance of {op-system-first}, and creates a live installation ISO that references these installation artifacts. You can then restart the host using the live installation ISO to begin the preinstallation of the host. When the preinstallation is complete, the host is ready to ship to a remote site for the final site-specific configuration and deployment. + +The following are the high-level steps to preinstall a {sno} cluster to a host using an image-based installation: + +* Generate a seed image. +* Create a live installation ISO using the `ib-cli` CLI tool. +* Restart the host using the live installation ISO to preinstall the host. + +include::modules/ibi-ib-cli-reference.adoc[leveloffset=+1] + +include::modules/ibi-create-iso-for-seed-image.adoc[leveloffset=+1] diff --git a/edge_computing/image-base-install/ibi-preparing-for-image-based-install.adoc b/edge_computing/image-base-install/ibi-preparing-for-image-based-install.adoc new file mode 100644 index 000000000000..691dd9cffa55 --- /dev/null +++ b/edge_computing/image-base-install/ibi-preparing-for-image-based-install.adoc @@ -0,0 +1,23 @@ +:_mod-docs-content-type: ASSEMBLY +[id="ibi-preparing-for-image-based-install_{context}"] += Preparing for an image-based installation for {sno} clusters +include::_attributes/common-attributes.adoc[] +:context: ibi-understanding-image-based-install + +toc::[] +To prepare for an image-based installation for {sno} clusters, you must complete the following tasks: + +* Create a seed image by using the {lcao}. +* Verify that all software components meet the required versions. + +== Installing the {lcao} + +Use the {lcao} to generate a seed image from a seed cluster. You can install the {lcao} using the {product-title} CLI or the web console. + +include::modules/ibi-install-lcao-console.adoc[leveloffset=+2] + +include::modules/ibi-install-lcao-cli.adoc[leveloffset=+2] + +include::modules/ibi-install-shared-partition.adoc[leveloffset=+1] + +include::modules/ibi-generate-seed-image.adoc[leveloffset=+1] diff --git a/edge_computing/image-base-install/ibi-understanding-image-based-install.adoc b/edge_computing/image-base-install/ibi-understanding-image-based-install.adoc new file mode 100644 index 000000000000..6bb97105450e --- /dev/null +++ b/edge_computing/image-base-install/ibi-understanding-image-based-install.adoc @@ -0,0 +1,114 @@ +:_mod-docs-content-type: ASSEMBLY +[id="ibi-image-based-install_{context}"] += Understanding an image-based installation for {sno} clusters +include::_attributes/common-attributes.adoc[] +:context: ibi-understanding-image-based-install + +toc::[] + +Image-based installations streamline the deployment process for {sno} clusters, reducing both installation and deployment times. By leveraging an image-based approach, you can preinstall configured and validated instances of {sno} on target hosts. These prepared hosts can be rapidly reconfigured and deployed at the far edge of the network with minimal intervention. + +== Understanding an image-based installation and deployment for {sno} clusters + +Service providers continue to deploy their infrastructure at the far edge of the network. However, this presents challenges in terms of the cost, time, and expertise needed for installing and deploying {sno} clusters at remote sites on an enterprise scale. + +At the far edge of the network, challenges such as low bandwidth and high latency can increase installation times and complicate {sno} cluster deployments. These circumstances require experienced technicans to spend considerable time at remote sites, overseeing the installation and deployment of a {sno} cluster. + +An image-based installation and deployment overcomes the deficiencies of this workflow by separating the installation and deployment stages for {sno} clusters. Using an image-based installation, you can preinstall multiple hosts with {sno} at a central site, such as a service depot or a factory. +You can also validate the base configuration for these hosts and leverage the image-based approach to perform reproducible factory installs at scale using a single container image. +The preinstalled and validated hosts are shipped to a remote site where they can be rapidly reconfigured and deployed in a matter of minutes. + +.Overview of an image-based installation and deployment for {sno} clusters +image::../images/711_OpenShift_IBI_Installation_high-level_0624.png[][Overview of an image-based installation and deployment] + +=== Image-based installation for {sno} clusters +Using the {lcao}, you can generate an OCI container image that encapsulates an instance of a {sno} cluster. This image is derived from a dedicated cluster that you can configure with the target {product-title} version. + +You can reference this image in a live installation ISO to consistently preinstall configured and validated instances of {sno} to multiple hosts. This approach enables the preparation of hosts at a central location, for example in a factory or service depot, before shipping the preinstalled hosts to a remote site for rapid reconfiguration and deployment. + +The following is a high-level overview of the image-based installation process: + +* Generate an image from a {sno} cluster. +* Use the {lcao} to embed the seed image URL, and other installation artifacts, in a live installation ISO. +* Restart the host using the live installation ISO to preinstall the host. ++ +During this process, the installation program installs {op-system-first} to the disk, pulls the image you generated, and precaches release container images to the disk. + +* When the installation completes, the host is ready to ship to the remote site for rapid reconfiguration and deployment. + +=== Imaged-based deployment for {sno} clusters +{rh-rhacm-first} and the multicluster engine for Kubernetes operator (MCE) use a hub-and-spoke approach to manage and deploy {sno} clusters across multiple sites. Using this approach, the hub cluster serves as a central control plane that manages the spoke clusters, which are often remote {sno} clusters deployed at the far edge of the network. + +The hub cluster is responsible for defining and distributing configuration resources, policies, and updates to the spoke clusters. The configuration resources defined in the hub cluster ensure consistency and compliance across all spoke clusters from a single point of administration. + +An image-based installation and deployment combines the benefits of the hub-and-spoke approach with an image-based approach. Preinstalled hosts from an image-based installation require minimal configuration details to deploy a managed {sno} cluster at a remote site. This approach is especially beneficial for telecommunications providers and other service providers with extensive, distributed infrastructures, where manual installation would be time-consuming and costly. + +The following is a high-level overview of the image-based deployment process for hosts preinstalled with an imaged-based installation: + +* Define the site-specific configuration resources for the preinstalled host in the hub cluster. +* Apply these resources in the hub cluster. This initiates the deployment process. +* The IBI Operator creates a configuration ISO. +* The IBI Operator boots the target preinstalled host with the configuration ISO attached. +* The host mounts the configuration ISO and begins the reconfiguration process. +* When the reconfiguration completes, the {sno} cluster is ready. + +As the host is already preinstalled using an image-based installation, a technician can reconfigure and deploy the host in a matter of minutes. + +== Image-based installation and deployment key components + +The following content describes key components in image-based installation and deployments. + +Seed image:: A seed image is an OCI container image generated from a dedicated cluster with the target {product-title} version. + +Seed cluster:: A seed cluster is a dedicated {sno} cluster that you use to create a seed image and is deployed with the target {product-title} version. + +{lcao}:: In image-based installations, you can use the {lcao} to generate a seed image, embed the seed image URL in a live installation ISO, and reconfigure the host during a deployment at a remote site. + +`ib-cli` CLI tool:: Extract the binary for the `ib-cli` CLI tool from the {lcao}. Use the `ib-cli` CLI tool to create a live installation ISO for preinstalling {sno} on bare-metal hosts. + +Image Based Install (IBI) Operator:: The IBI Operator creates a configuration ISO from the site-specific resources you define in the hub cluster, attaches the configuration ISO to the remote host using a bare-metal provisioning service. + +include::modules/ibi-image-based-install-cluster-guide.adoc[leveloffset=+1] + + +include::modules/ibi-validated-software-versions.adoc[leveloffset=+1] + +//// +Possibly repeating myself with the below content, so I've commented it out for now. Perhaps I could add more detail to the above sections instead. + +== Image-based installation with zero touch configuration end-to-end workflow + +The following steps details the high-level workflow from installation at a core location to final configuration at a remote site. + +.Generate a seed image +Image-based installations require a seed image generated from a seed cluster with the target {product-title} version. + +The seed image provides a reproducible version of a {sno} cluster that you can use to preinstall {sno} to hosts. You can adjust the seed image by adjusting the seed cluster. You can use this approach to validate the instance of {sno} based on a desired cluster configuration before creating the seed image. + +.Embed the seed image URL in an installation ISO +To boot the host with the seed image, you must create a live installation ISO. The {lcao} features the `ib-cli` CLI tool binary, which you can use to create the live installation ISO. `ib-cli` takes the seed image URL and other inputs and creates a live ISO featuring {op-system} that you can attach to a specific disk on the host. + +.Boot the ISO to target hosts +Using you're preferred method, you can attach the ISO to the target hosts. When you boot the host from the installation ISO, the {lcao} completes the following tasks: + +* Installs {op-system} to disk +* An extra partition is created to store precached release images +* Grows the specified partition to occupy all available space on the disk +* Mounts the filesystem to the partition to enable access to {op-system} +* Pulls the seed image and creates a state root with its content +* Optional: precaches the release images on the disk + +The host is then ready for deployment at the remote site. + +.Deploy the cluster at a remote site with zero touch configuration +Create configuration resources on the hub cluster containing the site-specific cluster configuration details for the host. These include the `BareMetalHost`, `ImageClusterInstall`, and `ClusterDeployment` resources. + +The IBI Operator creates a configuration ISO from these configuration resources. The Operator then boots the host with the configuration ISO attached. The node mounts the configuration ISO and runs the reconfiguration process. When the reconfiguration completes, the {sno} cluster is ready. As the host is already preinstalled using an image-based installation, a technician can deploy the host using ZTC in a matter of minutes. +//// + +[role="_additional-resources"] +.Additional resources + +* link:https://access.redhat.com/documentation/en-us/red_hat_advanced_cluster_management_for_kubernetes/2.7/html/about/welcome-to-red-hat-advanced-cluster-management-for-kubernetes#multicluster-architecture[Multicluster architecture] + +* link:https://docs.openshift.com/container-platform/4.16/edge_computing/image_based_upgrade/cnf-understanding-image-based-upgrade.html[Understanding the image-based upgrade for single-node OpenShift clusters] \ No newline at end of file diff --git a/edge_computing/image-base-install/images b/edge_computing/image-base-install/images new file mode 120000 index 000000000000..e4c5bd02a10a --- /dev/null +++ b/edge_computing/image-base-install/images @@ -0,0 +1 @@ +../images/ \ No newline at end of file diff --git a/edge_computing/image-base-install/modules b/edge_computing/image-base-install/modules new file mode 120000 index 000000000000..43aab75b53c9 --- /dev/null +++ b/edge_computing/image-base-install/modules @@ -0,0 +1 @@ +../modules/ \ No newline at end of file diff --git a/edge_computing/image-base-install/snippets b/edge_computing/image-base-install/snippets new file mode 120000 index 000000000000..9d58b92e5058 --- /dev/null +++ b/edge_computing/image-base-install/snippets @@ -0,0 +1 @@ +../snippets/ \ No newline at end of file diff --git a/images/711_OpenShift_IBI_Installation_high-level_0624.png b/images/711_OpenShift_IBI_Installation_high-level_0624.png new file mode 100644 index 0000000000000000000000000000000000000000..bd337fbce1892839c22e7a161f0c07dff18fc6f5 GIT binary patch literal 91668 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
    g6bW;02YO` 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%0A&_B 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 GkN*$7$ <1> +type: kubernetes.io/dockerconfigjson +---- +<1> You must provide base64-encoded credential details. See the _Additional resources_ section for more information about using image pull secrets. + +.. Create the `Secret` resource for your image registry by running the following command: ++ +[source,terminal] +---- +$ oc create -f secret-image-registry.yaml +---- + +. Create the `BareMetalHost` and `Secret` resources: + +.. Create a YAML file that defines the `BareMetalHost` and `Secret` resources: ++ +.Example `ibi-bmh.yaml` file +[source,yaml] +---- +apiVersion: metal3.io/v1alpha1 +kind: BareMetalHost +metadata: + name: ibi-bmh <1> + namespace: openshift-machine-api +spec: + online: true <2> + bootMACAddress: 00:a5:12:55:62:64 <3> + bmc: + address: redfish-virtualmedia+http://192.168.111.1:8000/redfish/v1/Systems/8a5babac-94d0-4c20-b282-50dc3a0a32b5 <4> + credentialsName: ibi-bmh-bmc-secret <5> +--- +apiVersion: v1 +kind: Secret +metadata: + name: ibi-bmh-secret <6> + namespace: openshift-machine-api +type: Opaque +data: + username: <7> + password: <8> +---- +<1> Specify the name for the `BareMetalHost` resource. +<2> Specify if the host should be online. +<3> Specify the host boot MAC address. +<4> Specify the BMC address. You can only use bare-metal host drivers that support virtual media networking booting, for example redfish-virtualmedia and idrac-virtualmedia. +<5> Specify the name of the bare-metal host `Secret` resource. +<6> Specify the name for the `Secret` resource. +<7> Specify the username. +<8> Specify the password. + +.. Create the `BareMetalHost` and `Secret` resources by running the following command: ++ +[source,terminal] +---- +$ oc create -f ibi-bmh.yaml +---- + +. Create the `ClusterImageSet` resource: + +.. Create a YAML file that defines the `ClusterImageSet` resource: ++ +.Example `ibi-cluster-image-set.yaml` file +[source,yaml] +---- +apiVersion: hive.openshift.io/v1 +kind: ClusterImageSet +metadata: + name: ibi-img-version-arch <1> +spec: + releaseImage: ibi.example.com:path/to/release/images:version-arch <2> +---- +<1> Specify the name for the `ClusterImageSet` resource. +<2> Specify the address for the release image to use for the deployment. If you use a different image registry compared to the image registry used during seed image generation, ensure that the {product-title} version for the release image remains the same. + +.. Create the `ClusterImageSet` resource by running the following command: ++ +[source,terminal] +---- +$ oc apply -f ibi-cluster-image-set.yaml +---- + +. Optional. Create a `ConfigMap` object for your networking setting. + +.. Create a YAML file named `network-cm.yaml`: ++ +.Example `network-cm.yaml` file +[source,yaml] +---- +apiVersion: v1 +data: + network-config: | + interfaces: + - name: enp1s0 <1> + type: ethernet + state: up + identifier: mac-address + mac-address: + ipv4: + dhcp: false <2> + address: + - ip: + prefix-length: "24" + enabled: true + ipv6: + enabled: false + routes: + config: + - destination: 0.0.0.0/0 + next-hop-address: + next-hop-interface: enp1s0 + dns-resolver: + config: + server: + - +kind: ConfigMap +metadata: + name: target-nmstate-config + namespace: target +---- +<1> The name of the interface must match the actual NIC name as shown in the operating system. +<2> When using static IP, ensure that you set the `dhcp: false` configuration. Otherwise, the installation fails while waiting for DHCP. + +.. Create the `ConfigMap` object by running the following command: ++ +[source,terminal] +---- +$ oc apply -f network-cm.yaml +---- + +. Create the `ImageClusterInstall` resource: + +.. Create a YAML file that defines the `ImageClusterInstall` resource: ++ +.Example `ibi-image-cluster-install.yaml` file +[source,yaml] +---- +apiVersion: extensions.hive.openshift.io/v1alpha1 +kind: ImageClusterInstall +metadata: + name: ibi-image-install <1> + namespace: ibi-ns +spec: + bareMetalHostRef: + name: ibi-bmh <2> + namespace: openshift-machine-api + clusterDeploymentRef: + name: ibi-cluster-deployment <3> + hostname: ibi-host <4> + imageSetRef: + name: ibi-image-install <5> + machineNetwork: 10.0.0.0/24 <6> + networkConfigRef: + name: -nmstate-config <7> + proxy: <8> + httpProxy: "http://proxy.example.com:8080" + #httpsProxy: "http://proxy.example.com:8080" + #noProxy: "no_proxy.example.com" +---- +<1> Specify the name for the `ImageClusterInstall` resource. +<2> Specify the `BareMetalHost` resource that you want to target for the image-based installation. +<3> Specify the name of the `ClusterDeployment` resource that you want to use for the image-based installation of the target host. +<4> Specify the hostname for the cluster. +<5> Specify the name of the `ClusterImageSet` resource you used to define the container release images to use for deployment. +<6> Specify the public CIDR (Classless Inter-Domain Routing) of the external network. +<7> Optional. Specify the `ConfigMap` object that contains the network configuration files. +<8> Specify a proxy to use for the cluster deployment. ++ +[IMPORTANT] +==== +If your cluster deployment requires a proxy configuration, you must create a seed image from a seed cluster featuring a proxy configuration. The proxy configurations do not have to match. +==== + +.. Create the `ClusterDeployment` resource by running the following command: ++ +[source,terminal] +---- +$ oc create -f ibi-image-cluster-install.yaml +---- + +. Create the `ClusterDeployment` resource: + +.. Create a YAML file that defines the `ClusterDeployment` resource: ++ +.Example `ibi-cluster-deployment.yaml` file +[source,yaml] +---- +apiVersion: hive.openshift.io/v1 +kind: ClusterDeployment +metadata: + name: ibi-cluster-deployment <1> + namespace: ibi-ns <2> +spec: + baseDomain: example.com <3> + clusterInstallRef: + group: extensions.hive.openshift.io + kind: ImageClusterInstall + name: ibi-image-install <4> + version: v1alpha1 + clusterName: ibi-cluster <5> + platform: + none: {} + pullSecretRef: + name: pull-secret <6> +---- +<1> Specify the name for the `ClusterDeployment` resource. +<2> Specify the namespace for the `ClusterDeployment` resource. +<3> Specify the base domain that the cluster should belong to. +<4> Specify the name of the `ImageClusterInstall` in which you defined the container images to use for the image-based installation of the target host. +<5> Specify a name for the cluster. +<6> Specify the deployment platform for the cluster. + +.. Create the `ClusterDeployment` resource by running the following command: ++ +[source,terminal] +---- +$ oc apply -f ibi-cluster-deployment.yaml +---- + +. Create the `ManagedCluster` resource: + +.. Create a YAML file that defines the `ManagedCluster` resource: ++ +.Example `ibi-managed.yaml` file +[source,yaml] +---- +apiVersion: cluster.open-cluster-management.io/v1 +kind: ManagedCluster +metadata: + name: sno-ibi <1> +spec: + hubAcceptsClient: true <2> +---- +<1> Specify the name for the `ManagedCluster` resource. +<2> Specify `true` to enable {rh-rhacm} to mange the cluster. + +.. Create the `ManagedCluster` resource by running the following command: ++ +[source,terminal] +---- +$ oc apply -f ibi-managed.yaml +---- + +.Verification + +. Check the status of the `ImageClusterInstall` in the hub cluster to monitor the progress of the target host installation by running the following command: ++ +[source,terminal] +---- +$ oc get imageclusterinstall +---- ++ +.Example output +[source,terminal] +---- +NAME REQUIREMENTSMET COMPLETED CONFIGURATIONIMAGEURL BAREMETALHOSTREF +target-0 HostValidationSucceeded ClusterInstallationSucceeded https://configuration-image-url/config.iso ibi-bmh +---- diff --git a/modules/ibi-create-iso-for-seed-image.adoc b/modules/ibi-create-iso-for-seed-image.adoc new file mode 100644 index 000000000000..e4763bbf7dc5 --- /dev/null +++ b/modules/ibi-create-iso-for-seed-image.adoc @@ -0,0 +1,98 @@ +// Module included in the following assemblies: +// +// * edge_computing/ibi-image-based-install.adoc + +:_content-type: PROCEDURE +[id="embed-sno-to-live-iso_{context}"] += Embedding the installation artifacts in a live installation ISO + +You can embed your {sno} seed image URL, and other installation artifacts, in a live installation ISO by using the `ib-cli` CLI tool. Extract the `ib-cli` CLI tool binary from the {lcao}. + +For further information about the command line arguments for the `ib-cli` CLI tool, see the _ib-cli CLI tool reference_ section. + +.Prerequisites +* You generated a seed image from a {sno} seed cluster. +* You installed Podman. +* The target host has network access to the seed image URL and all other installation artifacts. + +.Procedure + +. Extract the `ib-cli` CLI tool from the {lcao}: + +.. Create a temporary container for the {lcao} image by running the following command: ++ +[source,terminal] +---- +$ podman create --name temp_container quay.io/openshift-kni/lifecycle-agent-operator:4.16 +---- + +.. Copy the `ib-cli` CLI tool from the container to the local host by running the following command: ++ +[source,terminal] +---- +$ podman cp temp_container:/usr/local/bin/ib-cli . +---- + +. Create an installation ISO and embed your {sno} seed image URL and other installation artifacts + +.. Create a working directory by running the following: ++ +[source,terminal] +---- +$ mkdir ibi-iso-workdir +---- + +.. Create a YAML file called `image-based-install-iso.yaml` in your working directory to define the installation artifacts: ++ +.Example `image-based-install-iso.yaml` file +[source,yaml] +---- +seedImage: quay.io/repo-id/seed:latest +seedVersion: 4.16.0 +pullSecret: | + {"auths": ...} +installationDisk: /dev/disk/by-id/wwn-0x62c... +sshKey: 'ssh-ed25519 AAAA...' +---- + +.. Create the installation ISO by running the following command: ++ +[source,terminal] +---- +$ ib-cli create-iso --dir ibi-iso-workdir +---- ++ +.Example output +[source,terminal] +---- +ib-cli assists Image Based Install (IBI). + + Find more information at: https://github.com/openshift-kni/lifecycle-agent/blob/main/ib-cli/README.md + +INFO[2024-02-12 15:58:09] Installation ISO creation has started +INFO[2024-02-12 15:58:09] Creating IBI installation ISO +INFO[2024-02-12 15:58:09] Generating Ignition Config +INFO[2024-02-12 15:58:09] Executing podman with args [run -v ./ibi-iso-workdir:/data:rw,Z --rm quay.io/coreos/butane:release --pretty --strict -d /data /data/config.bu] +INFO[2024-02-12 15:58:10] Downloading live ISO +INFO[2024-02-12 15:59:24] Executing podman with args [run -v ./ibi-iso-workdir:/data:rw,Z quay.io/coreos/coreos-installer:latest iso ignition embed -i /data/ibi-ignition.json -o /data/rhcos-ibi.iso /data/rhcos-live.x86_64.iso] +INFO[2024-02-12 15:59:24] installation ISO created at: ibi-iso-workdir/rhcos-ibi.iso +INFO[2024-02-12 15:59:24] Installation ISO created successfully! +---- + +.Verification + +* View the output in the working directory: ++ +[source,text] +---- +ibi-iso-workdir/ + ├── ibi-ignition.json + ├── image-based-install-iso.yaml + ├── rhcos-ibi.iso + └── rhcos-live.x86_64.iso +---- + +[discrete] +.Provisioning the live installation ISO to a host + +* Boot the `rhcos-ibi.iso` live installation ISO to a bare-metal host, using your preferred method, to preinstall {sno} on the machine. \ No newline at end of file diff --git a/modules/ibi-generate-seed-image.adoc b/modules/ibi-generate-seed-image.adoc new file mode 100644 index 000000000000..953fe2d1f914 --- /dev/null +++ b/modules/ibi-generate-seed-image.adoc @@ -0,0 +1,175 @@ +// Module included in the following assemblies: +// * edge_computing/ztp-image-based-upgrade.adoc +// * edge_computing/factory-image-based-install.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ztp-image-based-upgrade-seed-generation_{context}"] += Generating a seed image with the {lcao} + +Use the {lcao} to generate the seed image with the `SeedGenerator` CR. The Operator checks for required system configurations, performs any necessary system cleanup before generating the seed image, and launches the image generation. The seed image generation includes the following tasks: + +* Stopping cluster operators +* Preparing the seed image configuration +* Generating and pushing the seed image to the image repository specified in the `SeedGenerator` CR +* Restoring cluster operators +* Expiring seed cluster certificates +* Generating new certificates for the seed cluster +* Restoring and updates the `SeedGenerator` CR on the seed cluster + +[NOTE] +==== +The generated seed image does not include any site-specific data. + +To avoid including any {rh-rhacm-first} resources in your seed image, you need to disable all optional {rh-rhacm} add-ons for seed image generation. +==== + +.Prerequisites + +* You have deployed a managed {sno} cluster with a DU profile. +* Install the {lcao} in the hub cluster. +* Log in as a user with `cluster-admin` privileges. +* Review the required versions of software components in the section _Software prerequisites for an image-based installation_. +* If you use {rh-rhacm-first}, review the hub cluster guidelines in the section _Hub cluster guidelines_. +* You created an extra partition in the seed cluster. See _Configuring a shared container directory between `ostree` stateroots_ for further information. + +.Procedure + +. Detach the cluster to delete any cluster-specific resources from the seed cluster that must not be in the seed image: + +.. Manually detach the seed cluster by running the following command: ++ +[source,terminal] +---- +$ oc delete managedcluster sno-worker-example +---- + +... Wait until the `ManagedCluster` CR is removed. Once the CR is removed, create the proper `SeedGenerator` CR. The {lcao} cleans up the {rh-rhacm} artifacts. + +. Create the `Secret`. + +.. Create the authentication file by running the following command: ++ +-- +.Authentication file +[source,terminal] +---- +$ MY_USER=myuserid +$ AUTHFILE=/tmp/my-auth.json +$ podman login --authfile ${AUTHFILE} -u ${MY_USER} quay.io/${MY_USER} +---- + +[source,terminal] +---- +$ base64 -w 0 ${AUTHFILE} ; echo +---- +-- + +.. Copy the output into the `seedAuth` field in a `Secret` CR named `seedgen` in the `openshift-lifecycle-agent` namespace. ++ +-- +[source,yaml] +---- +apiVersion: v1 +kind: Secret +metadata: + name: seedgen <1> + namespace: openshift-lifecycle-agent +type: Opaque +data: + seedAuth: <2> +---- +<1> The `Secret` resource must have the `name: seedgen` and `namespace: openshift-lifecycle-agent` fields. +<2> Specifies a base64-encoded authfile for write-access to the registry for pushing the generated seed images. +-- + +.. Apply the `Secret`. ++ +[source,terminal] +---- +$ oc apply -f secretseedgenerator.yaml +---- + +. Create the `SeedGenerator` CR: ++ +-- +[source,yaml] +---- +apiVersion: lca.openshift.io/v1 +kind: SeedGenerator +metadata: + name: seedimage <1> +spec: + seedImage: <2> +---- +<1> The `SeedGenerator` CR must be named `seedimage`. +<2> Specify the container image URL, for example, `quay.io/example/seed-container-image:`. It is recommended to use the `:` format. +-- + +. Generate the seed image by running the following command: ++ +[source,terminal] +---- +$ oc apply -f seedgenerator.yaml +---- + ++ +[IMPORTANT] +==== +During the seed generation process, the cluster temporarily loses API capabilities because {lcao} stops {product-title} and shuts down all running Operators and pods. When the process completes, {lcao} restarts {product-title}, which triggers the recovery of the Operators. +==== + +If you want to generate further seed images, you must provision a new seed cluster with the version you want to generate a seed image from. + +.Verification + +. Once the cluster recovers and it is available, you can check the status of the `SeedGenerator` CR: ++ +-- +[source,terminal] +---- +$ oc get seedgenerator -oyaml +---- + +.Example output +[source,yaml] +---- +status: + conditions: + - lastTransitionTime: "2024-02-13T21:24:26Z" + message: Seed Generation completed + observedGeneration: 1 + reason: Completed + status: "False" + type: SeedGenInProgress + - lastTransitionTime: "2024-02-13T21:24:26Z" + message: Seed Generation completed + observedGeneration: 1 + reason: Completed + status: "True" + type: SeedGenCompleted <1> + observedGeneration: 1 +---- +<1> The seed image generation is complete. +-- + +. Verify that the {sno} cluster is running and is attached to the {rh-rhacm} hub cluster: ++ +-- +[source,terminal] +---- +$ oc get managedclusters sno-worker-example +---- + +.Example output +[source,terminal] +---- +NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE +sno-worker-example true https://api.sno-worker-example.example.redhat.com True True 21h <1> +---- +<1> The cluster is attached if you see that the value is `True` for both `JOINED` and `AVAILABLE`. + +[NOTE] +==== +The cluster requires time to recover after restarting the `kubelet` operation. +==== +-- \ No newline at end of file diff --git a/modules/ibi-ib-cli-reference.adoc b/modules/ibi-ib-cli-reference.adoc new file mode 100644 index 000000000000..36d8665d1e01 --- /dev/null +++ b/modules/ibi-ib-cli-reference.adoc @@ -0,0 +1,83 @@ +// Module included in the following assemblies: +// +// * edge_computing/ibi-image-based-install.adoc + +:_content-type: REFERENCE +[id="ibi-ib-cli-reference_{context}"] += ib-cli CLI tool API specifications + +The `ib-cli` CLI tool uses the `image-based-install-iso.yaml` file to create a live installation ISO. The following content describes the specifications for the `image-based-install-iso.yaml`. + +.Required specifications +[options="header"] +[cols="2a,1a,4a"] +|==== +|Specification|Type|Description +|`seedImage`|`string`|Specifies the seed image to use in the ISO generation process. +|`seedVersion`|`string`|Specifies the {product-title} release version of the seed image. +|`installationDisk`|`string`|Specifies the disk that will be used for the installation process. + +Because the disk discovery order is not guaranteed, the kernel name of the disk can change across booting options for machines with multiple disks. For example, `/dev/sda` becomes `/dev/sdb` and vice versa. To avoid this issue, you must use a persistent disk attribute, such as the disk World Wide Name (WWN), for example: `/dev/disk/by-id/wwn-`. + +|`pullSecret`|`string`|Specifies the pull secret to use during the precache process. The pull secret contains authentication credentials for pulling the release payload images from the container registry. + +If the seed image requires a separate private registry authentication, add the authentication details to the pull secret. + +|==== + +.Optional specifications +[options="header"] +[cols="2a,1a,4a"] +|==== +|Specification|Type|Description +|`shutdown`|`boolean`|Specifies if the host shuts down after the installation process completes. +|`extraPartitionStart`|`string`|Specifies the start of the extra partition used for `/var/lib/containers`. The partition will expand until the end of the disk. Uses sgdisk notation. +|`extraPartitionLabel`|`string`|The label of the extra partition you use for `/var/lib/containers`. The default label is `varlibcontainers`. +|`extraPartitionNumber`|`unsigned integer`|The number of the extra partition you use for `/var/lib/containers`. The default number is `5`. +|`skipDiskCleanup`|`boolean`|The installation process formats the disk on the host. Set this specification to 'true' to skip this step. The default is `false`. +|`rhcosLiveIso`|`string`|Specifies the URL for the {op-system} live ISO image used for generating the installation ISO. The default value is `https://mirror.openshift.com/pub/openshift-v4/amd64/dependencies/rhcos/latest/rhcos-live.x86_64.iso`. +|`nmStateConfig`|`string`|Specifies networking configurations for the host, for example: +[source,yaml] +---- +nmStateConfig: \| + interfaces: + - name: ens1f0 + type: ethernet + state: up + ... +---- +For further information about defining network configurations using `nmstate`, see link:https://nmstate.io/[nmstate.io]. +[IMPORTANT] +==== +The name of the interface must match the actual NIC name as shown in the operating system. +==== +|`proxy`|`string`|Specifies proxy settings to use during the installation ISO generation, for example: +[source,yaml] +---- +proxy: + httpProxy: "http://proxy.example.com:8080" + httpsProxy: "http://proxy.example.com:8080" + noProxy: "no_proxy.example.com" +---- +|`imageDigestSources`|`string`|Specifies the sources or repositories for the release-image content, for example: +[source,yaml] +---- +imageDigestSources: + - mirrors: + - ":/ocp4/openshift4" + source: "quay.io/openshift-release-dev/ocp-release" +---- +|`additionalTrustBundle`|`string`|Specifies the PEM-encoded X.509 certificate bundle. The installation program copies this to `/etc/pki/ca-trust/source/anchors/` in the installation ISO. +[source,yaml] +---- +additionalTrustBundle: \| + -----BEGIN CERTIFICATE----- + MIICLDCCAdKgAwIBAgIBADAKBggqhkjOPQQDAjB9MQswCQYDVQQGE + ... + l4wOuDwKQa+upc8GftXE2C//4mKANBC6It01gUaTIpo= + -----END CERTIFICATE----- +---- +|`sshKey`|`string`|Specifies the SSH key to authenticate access to the host. + + +|==== diff --git a/modules/ibi-image-based-install-cluster-guide.adoc b/modules/ibi-image-based-install-cluster-guide.adoc new file mode 100644 index 000000000000..3ac9cd21a40e --- /dev/null +++ b/modules/ibi-image-based-install-cluster-guide.adoc @@ -0,0 +1,17 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-install/ibi-understanding-image-based-install.adoc + +[id="ztp-image-based-install-hub-cluster-guide_{context}"] += Cluster guidelines for an image-based installation and deployment + +For a successful image-based installation and deployment, see the following guidelines. + +== Hub cluster guidelines + +* If you are using {rh-rhacm-first}, to avoid including any {rh-rhacm} resources in your seed image, you need to disable all optional {rh-rhacm} add-ons before generating the seed image. + +== Seed cluster guidelines + +* If your cluster deployment at the edge of the network requires a proxy configuration, you must create a seed image from a seed cluster featuring a proxy configuration. The proxy configurations do not have to match. + +* Your {sno} seed cluster must have a shared `var/lib/containers` directory for precaching images during an image-based installation. For more information see the section _Configuring a shared container directory between ostree stateroots_. \ No newline at end of file diff --git a/modules/ibi-install-ibi-operator.adoc b/modules/ibi-install-ibi-operator.adoc new file mode 100644 index 000000000000..4bebd855d2f7 --- /dev/null +++ b/modules/ibi-install-ibi-operator.adoc @@ -0,0 +1,55 @@ +// Module included in the following assemblies: +// +// * edge_computing/ibi-edge-image-based-install.adoc + +:_content-type: PROCEDURE +[id="ibi-install-ibi-operator_{context}"] += Installing the Image Based Install Operator + +The Image Based Install (IBI) Operator is part of the image-based deployment workflow for bare-metal hosts preinstalled with {sno}. + +[NOTE] +==== +The IBI Operator is part of the multicluster engine for Kubernetes operator (MCE) from MCE version 2.10. +==== + +.Prerequisites + +* You logged in as a user with `cluster-admin` privileges. +* You deployed a {rh-rhacm-first} hub cluster or you deployed the multicluster engine for Kubernetes operator (MCE). +* You reviewed the required versions of software components in the section _Software prerequisites for an image-based installation_. + +.Procedure +. Edit the `MultiClusterEngine` resource by running the following command: ++ +[source,terminal] +---- +$ oc edit multiclusterengine +---- + +. Set the `enabled` specification to `true` for the `image-based-install-operator-preview` component: ++ +[source,text] +---- +... + - enabled: true + name: image-based-install-operator-preview +... +---- + +. Save the file. + +.Verification + +* Check that the Image Based Install Operator pod is running: ++ +[source,terminal] +---- +$ oc get pods -A | grep image-based +---- ++ +.Example output +[source,terminal] +---- +multicluster-engine image-based-install-operator-57fb8sc423-bxdj8 2/2 Running 0 5m +---- diff --git a/modules/ibi-install-lcao-cli.adoc b/modules/ibi-install-lcao-cli.adoc new file mode 100644 index 000000000000..dc02e3053bfb --- /dev/null +++ b/modules/ibi-install-lcao-cli.adoc @@ -0,0 +1,114 @@ +// Module included in the following assemblies: +// * edge_computing/ibi-image-based-install.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ibi-install-lcao-cli_{context}"] += Installing the {lcao} by using the CLI + +You can use the OpenShift CLI (`oc`) to install the {lcao} from the 4.15 Operator catalog. + +.Prerequisites + +* Install the OpenShift CLI (`oc`). +* Log in as a user with `cluster-admin` privileges. + +.Procedure + +. Create a namespace for the {lcao}: ++ +.Example `lcao-namespace.yaml` file +[source,yaml] +---- +apiVersion: v1 +kind: Namespace +metadata: + name: openshift-lifecycle-agent + annotations: + workload.openshift.io/allowed: management +---- + +.. Create the `Namespace` CR: ++ +[source,terminal] +---- +$ oc create -f lcao-namespace.yaml +---- + +. Create an Operator group for the {lcao}. ++ +.Example `lcao-operatorgroup.yaml` file +[source,yaml] +---- +apiVersion: operators.coreos.com/v1 +kind: OperatorGroup +metadata: + name: openshift-lifecycle-agent + namespace: openshift-lifecycle-agent +spec: + targetNamespaces: + - openshift-lifecycle-agent +---- + +.. Create the `OperatorGroup` CR: ++ +[source,terminal] +---- +$ oc create -f lcao-operatorgroup.yaml +---- + +. Create a `Subscription` CR: + +.. Define the `Subscription` CR and save the YAML file, for example, `lcao-subscription.yaml`: ++ +.Example `lcao-subscription.yaml` file +[source,yaml] +---- +apiVersion: operators.coreos.com/v1 +kind: Subscription +metadata: + name: openshift-lifecycle-agent-subscription + namespace: openshift-lifecycle-agent +spec: + channel: "stable" + name: lifecycle-agent + source: redhat-operators + sourceNamespace: openshift-marketplace +---- + +.. Create the `Subscription` CR by running the following command: ++ +[source,terminal] +---- +$ oc create -f lcao-subscription.yaml +---- + +.Verification + +. Verify that the installation succeeded by inspecting the CSV resource: ++ +[source,terminal] +---- +$ oc get csv -n openshift-lifecycle-agent +---- ++ +.Example output +[source,terminal,subs="attributes+"] +---- +NAME DISPLAY VERSION REPLACES PHASE +lifecycle-agent.v{product-version}.0 Openshift Lifecycle Agent {product-version}.0 Succeeded +---- + +. Verify that the {lcao} is up and running: ++ +[source,terminal] +---- +$ oc get deploy -n openshift-lifecycle-agent +---- + ++ +.Example output +[source,terminal] +---- +NAME READY UP-TO-DATE AVAILABLE AGE +lifecycle-agent-controller-manager 1/1 1 1 14s +---- \ No newline at end of file diff --git a/modules/ibi-install-lcao-console.adoc b/modules/ibi-install-lcao-console.adoc new file mode 100644 index 000000000000..0eac8afb3f7e --- /dev/null +++ b/modules/ibi-install-lcao-console.adoc @@ -0,0 +1,37 @@ +// Module included in the following assemblies: +// +// * edge_computing/ibi-image-based-install.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ibi-install-lcao-console_{context}"] += Installing the {lcao} by using the web console + +You can use the {product-title} web console to install the {lcao} from the 4.15 Operator catalog. + +.Prerequisites + +* Log in as a user with `cluster-admin` privileges. + +.Procedure + +. In the {product-title} web console, navigate to *Operators* → *OperatorHub*. +. Search for the *{lcao}* from the list of available Operators, and then click *Install*. +. On the *Install Operator* page, under *A specific namespace on the cluster* select *openshift-lifecycle-agent*. Then, click Install. +. Click *Install*. + +.Verification + +To confirm that the installation is successful: + +. Navigate to the *Operators* → *Installed Operators* page. +. Ensure that the {lcao} is listed in the *openshift-lifecycle-agent* project with a *Status* of *InstallSucceeded*. + +[NOTE] +==== +During installation an Operator might display a *Failed* status. If the installation later succeeds with an *InstallSucceeded* message, you can ignore the *Failed* message. +==== + +If the Operator is not installed successfully: + +. Go to the *Operators* → *Installed Operators* page and inspect the *Operator Subscriptions* and *Install Plans* tabs for any failure or errors under *Status*. +. Go to the *Workloads* → *Pods* page and check the logs for pods in the *openshift-lifecycle-agent* project. \ No newline at end of file diff --git a/modules/ibi-install-shared-partition.adoc b/modules/ibi-install-shared-partition.adoc new file mode 100644 index 000000000000..536efb6c6ef4 --- /dev/null +++ b/modules/ibi-install-shared-partition.adoc @@ -0,0 +1,70 @@ +// Module included in the following assemblies: +// * edge_computing/ibi-image-based-install.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ibi-install-shared-partition_{context}"] += Configuring a shared container directory between `ostree` stateroots + +Your {sno} seed cluster must have a shared `var/lib/containers` directory for precaching images during an image-based installation. + +You must apply a `MachineConfig` to the seed cluster to create a separate partition and share the `/var/lib/containers` directory between the two `ostree` stateroots that will be used during the installation process. + +[IMPORTANT] +==== +You must complete this procedure at installation time. +==== + +.Procedure + +. Apply a `MachineConfig` to create a separate partition. ++ +[source,yaml] +---- +apiVersion: machineconfiguration.openshift.io/v1 +kind: MachineConfig +metadata: + labels: + machineconfiguration.openshift.io/role: master + name: 98-var-lib-containers-partitioned +spec: + config: + ignition: + version: 3.2.0 + storage: + disks: + - device: /dev/disk/by-id/wwn- <1> + partitions: + - label: varlibcontainers + startMiB: <2> + sizeMiB: <3> + filesystems: + - device: /dev/disk/by-partlabel/varlibcontainers + format: xfs + mountOptions: + - defaults + - prjquota + path: /var/lib/containers + wipeFilesystem: true + systemd: + units: + - contents: |- + # Generated by Butane + [Unit] + Before=local-fs.target + Requires=systemd-fsck@dev-disk-by\x2dpartlabel-varlibcontainers.service + After=systemd-fsck@dev-disk-by\x2dpartlabel-varlibcontainers.service + + [Mount] + Where=/var/lib/containers + What=/dev/disk/by-partlabel/varlibcontainers + Type=xfs + Options=defaults,prjquota + + [Install] + RequiredBy=local-fs.target + enabled: true + name: var-lib-containers.mount +---- +<1> Specify the root disk. +<2> Specify the start of the partition in MiB. If the value is too small, the installation will fail. +<3> Specify a minimum size for the partition of 500GB to ensure adequate disk space for precached images. If the value is too small, the deployments after installation will fail. \ No newline at end of file diff --git a/modules/ibi-validated-software-versions.adoc b/modules/ibi-validated-software-versions.adoc new file mode 100644 index 000000000000..fe259cb47c84 --- /dev/null +++ b/modules/ibi-validated-software-versions.adoc @@ -0,0 +1,28 @@ +// Module included in the following assemblies: +// * scalability_and_performance/ztp-image-based-upgrade.adoc + +:_mod-docs-content-type: CONCEPT +[id="ztp-image-based-upgrade-prereqs_{context}"] += Software prerequisites for an image-based installation + +The image-based installation has been tested for developer preview with the following software versions. + +.Tested software components +[cols=2*, width="80%", options="header"] +|==== +|Component +|Software version + +|Managed cluster version +|4.14.13 or later + +|Hub cluster version +|4.16 + +|{rh-rhacm-first} +|2.11 + +|{lcao} +|4.16 + +|====