From 0bf6424053f55b89fbdda4db0e189182578bf997 Mon Sep 17 00:00:00 2001 From: Alexandra Molnar Date: Wed, 5 Jun 2024 09:40:54 +0100 Subject: [PATCH 01/11] Rename, remove IBU files and create dirs and symlinks --- .../preparing_for_image_based_upgrade/_attributes | 1 + .../image_based_upgrade/preparing_for_image_based_upgrade/images | 1 + .../preparing_for_image_based_upgrade/modules | 1 + .../preparing_for_image_based_upgrade/snippets | 1 + 4 files changed, 4 insertions(+) create mode 120000 edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/_attributes create mode 120000 edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/images create mode 120000 edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/modules create mode 120000 edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/snippets diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/_attributes b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/_attributes new file mode 120000 index 000000000000..bf7c2529fdb4 --- /dev/null +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/_attributes @@ -0,0 +1 @@ +../../../_attributes/ \ No newline at end of file diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/images b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/images new file mode 120000 index 000000000000..4399cbb3c0f3 --- /dev/null +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/images @@ -0,0 +1 @@ +../../../images/ \ No newline at end of file diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/modules b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/modules new file mode 120000 index 000000000000..7e8b50bee77a --- /dev/null +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/modules @@ -0,0 +1 @@ +../../../modules/ \ No newline at end of file diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/snippets b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/snippets new file mode 120000 index 000000000000..ce62fd7c41e2 --- /dev/null +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/snippets @@ -0,0 +1 @@ +../../../snippets/ \ No newline at end of file From 30b95768124dd7a0faa1af66493bf8d8d5bd435e Mon Sep 17 00:00:00 2001 From: Alexandra Molnar Date: Wed, 5 Jun 2024 09:45:40 +0100 Subject: [PATCH 02/11] Add Understanding assembly, modules, and diagrams --- _topic_maps/_topic_map.yml | 12 +- ...cnf-understanding-image-based-upgrade.adoc | 130 ++++++++++++++++++ .../preparing_for_ibu/_attributes | 1 - .../preparing_for_ibu/images | 1 - .../preparing_for_ibu/modules | 1 - .../preparing_for_ibu/snippets | 1 - .../696_OpenShift_Lifecycle_Agent_0624_0.png | Bin 0 -> 35793 bytes .../696_OpenShift_Lifecycle_Agent_0624_1.png | Bin 0 -> 38844 bytes .../696_OpenShift_Lifecycle_Agent_0624_2.png | Bin 0 -> 38206 bytes .../696_OpenShift_Lifecycle_Agent_0624_3.png | Bin 0 -> 39398 bytes .../696_OpenShift_Lifecycle_Agent_0624_4.png | Bin 0 -> 39921 bytes .../696_OpenShift_Lifecycle_Agent_0624_5.png | Bin 0 -> 38603 bytes .../cnf-image-based-upgrade-guidelines.adoc | 15 ++ modules/cnf-image-based-upgrade.adoc | 104 ++++++++++++++ .../ztp-image-based-upgrade-backup-guide.adoc | 81 +++++++++++ ...ed-upgrade-cluster-validated-software.adoc | 56 ++++++++ ...e-based-upgrade-extra-manifests-guide.adoc | 36 +++++ ...image-based-upgrade-hub-cluster-guide.adoc | 10 ++ ...-image-based-upgrade-seed-image-guide.adoc | 30 ++++ 19 files changed, 468 insertions(+), 10 deletions(-) create mode 100644 edge_computing/image_based_upgrade/cnf-understanding-image-based-upgrade.adoc delete mode 120000 edge_computing/image_based_upgrade/preparing_for_ibu/_attributes delete mode 120000 edge_computing/image_based_upgrade/preparing_for_ibu/images delete mode 120000 edge_computing/image_based_upgrade/preparing_for_ibu/modules delete mode 120000 edge_computing/image_based_upgrade/preparing_for_ibu/snippets create mode 100644 images/696_OpenShift_Lifecycle_Agent_0624_0.png create mode 100644 images/696_OpenShift_Lifecycle_Agent_0624_1.png create mode 100644 images/696_OpenShift_Lifecycle_Agent_0624_2.png create mode 100644 images/696_OpenShift_Lifecycle_Agent_0624_3.png create mode 100644 images/696_OpenShift_Lifecycle_Agent_0624_4.png create mode 100644 images/696_OpenShift_Lifecycle_Agent_0624_5.png create mode 100644 modules/cnf-image-based-upgrade-guidelines.adoc create mode 100644 modules/cnf-image-based-upgrade.adoc create mode 100644 modules/ztp-image-based-upgrade-backup-guide.adoc create mode 100644 modules/ztp-image-based-upgrade-cluster-validated-software.adoc create mode 100644 modules/ztp-image-based-upgrade-extra-manifests-guide.adoc create mode 100644 modules/ztp-image-based-upgrade-hub-cluster-guide.adoc create mode 100644 modules/ztp-image-based-upgrade-seed-image-guide.adoc diff --git a/_topic_maps/_topic_map.yml b/_topic_maps/_topic_map.yml index 91f8b0322db8..cb401f9f6fc6 100644 --- a/_topic_maps/_topic_map.yml +++ b/_topic_maps/_topic_map.yml @@ -3033,12 +3033,12 @@ Topics: File: ztp-sno-additional-worker-node - Name: Pre-caching images for single-node OpenShift deployments File: ztp-precaching-tool -#- Name: Image-based upgrade for single-node OpenShift clusters -# Dir: image_based_upgrade -# Distros: openshift-origin,openshift-enterprise -# Topics: -# - Name: Understanding the image-based upgrade for single-node OpenShift clusters -# File: cnf-understanding-image-based-upgrade +- Name: Image-based upgrade for single-node OpenShift clusters + Dir: image_based_upgrade + Distros: openshift-origin,openshift-enterprise + Topics: + - Name: Understanding the image-based upgrade for single-node OpenShift clusters + File: cnf-understanding-image-based-upgrade # - Name: Preparing for an image-based upgrade for single-node OpenShift clusters # Dir: preparing_for_image_based_upgrade # Distros: openshift-origin,openshift-enterprise diff --git a/edge_computing/image_based_upgrade/cnf-understanding-image-based-upgrade.adoc b/edge_computing/image_based_upgrade/cnf-understanding-image-based-upgrade.adoc new file mode 100644 index 000000000000..0a0babba56c9 --- /dev/null +++ b/edge_computing/image_based_upgrade/cnf-understanding-image-based-upgrade.adoc @@ -0,0 +1,130 @@ +:_mod-docs-content-type: ASSEMBLY +[id="understanding-image-based-upgrade-for-sno"] += Understanding the image-based upgrade for {sno} clusters +include::_attributes/common-attributes.adoc[] +:context: understanding-image-based-upgrade + +toc::[] + +:FeatureName: The Lifecycle Agent + +From {product-title} 4.14.13, the {lcao} provides you with an alternative way to upgrade the platform version of a {sno} cluster. +The image-based upgrade is faster than the standard upgrade method and allows you to directly upgrade from {product-title} <4.y> to <4.y+2>, and <4.y.z> to <4.y.z+n>. + +// Lifecycle Agent (LCAO) + +This upgrade method utilizes a generated OCI image from a dedicated seed cluster that is installed on the target {sno} cluster as a new `ostree` stateroot. +A seed cluster is a {sno} cluster deployed with the target {product-title} version, Day 2 Operators, and configurations that are common to all target clusters. + +You can use the seed image, which is generated from the seed cluster, to upgrade the platform version on any {sno} cluster that has the same combination of hardware, Day 2 Operators, and cluster configuration as the seed cluster. + +[IMPORTANT] +==== +The image-based upgrade uses custom images that are specific to the hardware platform that the clusters are running on. +Each different hardware platform requires a separate seed image. +==== + +The {lcao} uses two custom resources (CRs) on the participating clusters to orchestrate the upgrade: + +* On the seed cluster, the `SeedGenerator` CR allows for the seed image generation. This CR specifies the repository to push the seed image to. +* On the target cluster, the `ImageBasedUpgrade` CR specifies the seed image for the upgrade of the target cluster and the backup configurations for your workloads. + +.Example SeedGenerator CR +[source,yaml] +---- +apiVersion: lca.openshift.io/v1 +kind: SeedGenerator +metadata: + name: seedimage +spec: + seedImage: +---- + +.Example ImageBasedUpgrade CR +[source,yaml] +---- +apiVersion: lca.openshift.io/v1 +kind: ImageBasedUpgrade +metadata: + name: upgrade +spec: + stage: Idle <1> + seedImageRef: <2> + version: + image: + pullSecretRef: + name: + autoRollbackOnFailure: {} +# initMonitorTimeoutSeconds: 1800 <3> + extraManifests: <4> + - name: example-extra-manifests + namespace: openshift-lifecycle-agent + oadpContent: <5> + - name: oadp-cm-example + namespace: openshift-adp +---- +<1> Defines the desired stage for the `ImageBasedUpgrade` CR. The value can be `Idle`, `Prep`, `Upgrade`, or `Rollback`. +<2> Defines the target platform version, the seed image to be used, and the secret required to access the image. +<3> (Optional) Specify the time frame in seconds to roll back when the upgrade does not complete within that time frame after the first reboot. If not defined or set to `0`, the default value of `1800` seconds (30 minutes) is used. +<4> (Optional) Specify the list of `ConfigMap` resources that contain your custom catalog sources to retain after the upgrade, and your extra manifests to apply to the target cluster that are not part of the seed image. +<5> Specify the list of `ConfigMap` resources that contain the OADP `Backup` and `Restore` CRs. + +include::modules/cnf-image-based-upgrade.adoc[leveloffset=+1] + +//// +[role="_additional-resources"] +.Additional resources + +* xref:../../edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc#cnf-image-based-upgrade-for-sno[Performing an image-based upgrade with Lifecycle Agent] + +* xref:../../edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc#ztp-image-based-upgrade-for-sno[Performing an image-based upgrade with Lifecycle Agent and GitOps ZTP] + +* xref:../../edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc#ztp-image-based-upgrade-rollback_cnf-image-based-upgrade[(Optional) Moving to the Rollback stage of the image-based upgrade with Lifecycle Agent] + +* xref:../../edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc#ztp-image-based-upgrade-with-talm-rollback_ztp-image-based-upgrade[(Optional) Moving to the Rollback stage of the image-based upgrade with Lifecycle Agent and GitOps ZTP] +//// + +include::modules/cnf-image-based-upgrade-guidelines.adoc[leveloffset=+1] + +[role="_additional-resources"] +.Additional resources + +* xref:../../installing/disconnected_install/installing-mirroring-installation-images.adoc#installing-mirroring-installation-images[Mirroring images for a disconnected installation] + +include::modules/ztp-image-based-upgrade-cluster-validated-software.adoc[leveloffset=+2] + +include::modules/ztp-image-based-upgrade-hub-cluster-guide.adoc[leveloffset=+2] + +include::modules/ztp-image-based-upgrade-seed-image-guide.adoc[leveloffset=+2] + +//// +[role="_additional-resources"] +.Additional resources + +* xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc#cnf-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots] + +* xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc#ztp-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots when using GitOps ZTP] + +* xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-generate-seed.adoc#ztp-image-based-seed-image-config_generate-seed[Seed image configuration] +//// + +include::modules/ztp-image-based-upgrade-backup-guide.adoc[leveloffset=+2] + +include::modules/ztp-image-based-upgrade-extra-manifests-guide.adoc[leveloffset=+2] + +//// +[role="_additional-resources"] +.Additional resources + +* xref:../../edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc#cnf-image-based-upgrade-for-sno[Performing an image-based upgrade with Lifecycle Agent] + +* xref:../../edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc#ztp-image-based-upgrade-for-sno[Performing an image-based upgrade with Lifecycle Agent and GitOps ZTP] + +* xref:../../edge_computing/ztp-preparing-the-hub-cluster.adoc#ztp-preparing-the-hub-cluster[Preparing the hub cluster for ZTP] + +* xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-prep-resources.adoc#cnf-image-based-upgrade-creating-backup-oadp-resources_nongitops[Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent] + +* xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc#ztp-image-based-upgrade-creating-backup-resources-with-ztp_ztp-gitops[Creating ConfigMap objects for the image-based upgrade with GitOps ZTP] + +* xref:../../backup_and_restore/application_backup_and_restore/installing/about-installing-oadp.adoc#about-installing-oadp[About installing OADP] +//// \ No newline at end of file diff --git a/edge_computing/image_based_upgrade/preparing_for_ibu/_attributes b/edge_computing/image_based_upgrade/preparing_for_ibu/_attributes deleted file mode 120000 index bf7c2529fdb4..000000000000 --- a/edge_computing/image_based_upgrade/preparing_for_ibu/_attributes +++ /dev/null @@ -1 +0,0 @@ -../../../_attributes/ \ No newline at end of file diff --git a/edge_computing/image_based_upgrade/preparing_for_ibu/images b/edge_computing/image_based_upgrade/preparing_for_ibu/images deleted file mode 120000 index 4399cbb3c0f3..000000000000 --- a/edge_computing/image_based_upgrade/preparing_for_ibu/images +++ /dev/null @@ -1 +0,0 @@ -../../../images/ \ No newline at end of file diff --git a/edge_computing/image_based_upgrade/preparing_for_ibu/modules b/edge_computing/image_based_upgrade/preparing_for_ibu/modules deleted file mode 120000 index 7e8b50bee77a..000000000000 --- a/edge_computing/image_based_upgrade/preparing_for_ibu/modules +++ /dev/null @@ -1 +0,0 @@ -../../../modules/ \ No newline at end of file diff --git a/edge_computing/image_based_upgrade/preparing_for_ibu/snippets b/edge_computing/image_based_upgrade/preparing_for_ibu/snippets deleted file mode 120000 index ce62fd7c41e2..000000000000 --- a/edge_computing/image_based_upgrade/preparing_for_ibu/snippets +++ /dev/null @@ -1 +0,0 @@ -../../../snippets/ \ No newline at end of file diff --git a/images/696_OpenShift_Lifecycle_Agent_0624_0.png b/images/696_OpenShift_Lifecycle_Agent_0624_0.png new file mode 100644 index 0000000000000000000000000000000000000000..153ea58e597bb78a13a7ccb5613e67ad0cf599dc GIT binary patch literal 35793 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 N)-ipxVwIBt{|o+?quc-h literal 0 HcmV?d00001 diff --git a/images/696_OpenShift_Lifecycle_Agent_0624_1.png b/images/696_OpenShift_Lifecycle_Agent_0624_1.png new file mode 100644 index 0000000000000000000000000000000000000000..72fb94cc30efb91893fbfa53e3162e5f3a981c32 GIT binary patch literal 38844 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
  • 0j3xjZfNNFUrUtM|}zDBCB8t;d*3XUtk!~Cp# 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 literal 0 HcmV?d00001 diff --git a/images/696_OpenShift_Lifecycle_Agent_0624_3.png b/images/696_OpenShift_Lifecycle_Agent_0624_3.png new file mode 100644 index 0000000000000000000000000000000000000000..52db05e6726ec0c022f39c45ce1f4ebfb29b6ebb GIT binary patch literal 39398 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%0D48X@lWzT=C=-6v1Mt+1c5<*HT*zH~057JdW(= zfXC9WcLF>3>uLcd1qEX>kH!afhKi{e^v(O3jC!agI9wd(3}?-R&Tl3(Je_=+#+(;3k&CS5Br(x1Egw9aLrG%Us7E=296{c zec5W)<&40_skyni!^6rjznXaWx@CMpwe;j{z23`l1xdwSO#7NvSi1SX`7oW(>J5f5 z%<8ySpE*}{P#0gbzMdYEX?su2wCKGX>;A^flse0sk-XI^t^Bj_Q)xAOZ2QXHLjgDQ zf&L+Fd5+M?0`W5@b{ENN4lanvq3gVv*%UcP+?_X%#IE#7n&}{%~ z&=LEOk9pcNB<$d?-e> Wk=VqHW`q|*NQ%lm&l7&}_J0CmU=-AG8MbV%=W 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

    JxKNq&hE>6Hcnt$ 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 label and adds the `labelSelector.matchLabels.lca.openshift.io/backup: ` label selector to the specified resources when creating the `Backup` CRs. + +To use the `lca.openshift.io/apply-label` annotation for backing up specific resources, the resources listed in the annotation must also be included in the `spec` section. +If the `lca.openshift.io/apply-label` annotation is used in the `Backup` CR, only the resources listed in the annotation will be backed up, even if other resource types are specified in the `spec` section or not. + +.Example CR +[source,yaml] +---- +apiVersion: velero.io/v1 +kind: Backup +metadata: + name: acm-klusterlet + namespace: openshift-adp + annotations: + lca.openshift.io/apply-label: rbac.authorization.k8s.io/v1/clusterroles/klusterlet,apps/v1/deployments/open-cluster-management-agent/klusterlet <1> + labels: + velero.io/storage-location: default +spec: + includedNamespaces: + - open-cluster-management-agent + includedClusterScopedResources: + - clusterroles + includedNamespaceScopedResources: + - deployments +---- +<1> The value must be a list of comma-separated objects in `group/version/resource/name` format for cluster-scoped resources or `group/version/resource/namespace/name` format for namespace-scoped resources, and it must be attached to the related `Backup` CR. \ No newline at end of file diff --git a/modules/ztp-image-based-upgrade-cluster-validated-software.adoc b/modules/ztp-image-based-upgrade-cluster-validated-software.adoc new file mode 100644 index 000000000000..da6782fb915d --- /dev/null +++ b/modules/ztp-image-based-upgrade-cluster-validated-software.adoc @@ -0,0 +1,56 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-understanding-image-based-upgrade.adoc + +[id="ztp-image-based-upgrade-cluster-validated-software_{context}"] += Minimum software version of components + +Depending on your deployment method, the image-based upgrade requires the following minimum software versions. + +.Minimum software version of components +[cols=3*, width="80%", options="header"] +|==== +|Component +|Software version +|Required + +|{lcao} +|4.16 +|Yes + +|OADP Operator +|1.3.1 +|Yes + +|Managed cluster version +|4.14.13 +|Yes + +|Hub cluster version +|4.16 +|Yes, if using {rh-rhacm} + +|{rh-rhacm} +|2.10.2 +|Yes, if using {rh-rhacm} + +|{ztp} plugin +|4.16 +|Only for {ztp} deployment method + +|{gitops-title} +|1.12 +|Only for {ztp} deployment method + +|{cgu-operator-first} +|4.16 +|Only for {ztp} deployment method + +|Local Storage Operator ^[1]^ +|4.14 +|Yes + +|{lvms-first} ^[1]^ +|4.14.2 +|Yes +|==== +. The persistent storage must be provided by either the {lvms} or the Local Storage Operator, not both. diff --git a/modules/ztp-image-based-upgrade-extra-manifests-guide.adoc b/modules/ztp-image-based-upgrade-extra-manifests-guide.adoc new file mode 100644 index 000000000000..4b65963981b5 --- /dev/null +++ b/modules/ztp-image-based-upgrade-extra-manifests-guide.adoc @@ -0,0 +1,36 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-understanding-image-based-upgrade.adoc + +[id="ztp-image-based-upgrade-extra-manifests-guide_{context}"] += Extra manifest guidelines + +The {lcao} uses extra manifests to restore your target clusters after rebooting with the new default stateroot deployment and before restoring application artifacts. + +Different deployment methods require a different way to apply the extra manifests: + +{ztp}:: You use the `lca.openshift.io/target-ocp-version: ` label to mark the extra manifests that the {lcao} must extract and apply after the pivot. +You can specify the the number of manifests labeled with `lca.openshift.io/target-ocp-version` by using the `lca.openshift.io/target-ocp-version-manifest-count` annotation in the `ImageBasedUpgrade` CR. +If specified, the {lcao} verifies that the number of manifests extracted from policies matches the number provided in the annotation during the prep and upgrade stages. ++ +.Example for the lca.openshift.io/target-ocp-version-manifest-count annotation +[source,yaml] +---- +apiVersion: lca.openshift.io/v1 +kind: ImageBasedUpgrade +metadata: + annotations: + lca.openshift.io/target-ocp-version-manifest-count: "5" + name: upgrade +---- + +Non-Gitops:: You mark your extra manifests with the `lca.openshift.io/apply-wave` annotation to determine the apply order. The labeled extra manifests are wrapped in `ConfigMap` objects and referenced in the `ImageBasedUpgrade` CR that the {lcao} uses after the pivot. + +If the target cluster uses custom catalog sources, you must include them as extra manifests that point to the correct release version. + +[IMPORTANT] +==== +You cannot apply the following items as extra manifests: + +* `MachineConfig` objects +* OLM Operator subscriptions +==== \ No newline at end of file diff --git a/modules/ztp-image-based-upgrade-hub-cluster-guide.adoc b/modules/ztp-image-based-upgrade-hub-cluster-guide.adoc new file mode 100644 index 000000000000..5a2b9447fc1f --- /dev/null +++ b/modules/ztp-image-based-upgrade-hub-cluster-guide.adoc @@ -0,0 +1,10 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-understanding-image-based-upgrade.adoc + +[id="ztp-image-based-upgrade-hub-cluster-guide_{context}"] += Hub cluster guidelines + +If you are using {rh-rhacm-first}, your hub cluster needs to meet the following conditions: + +* 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. +* Your hub cluster must be upgraded at least to the target version before performing an image-based upgrade a target {sno} cluster. \ No newline at end of file diff --git a/modules/ztp-image-based-upgrade-seed-image-guide.adoc b/modules/ztp-image-based-upgrade-seed-image-guide.adoc new file mode 100644 index 000000000000..73a5a1eaeac6 --- /dev/null +++ b/modules/ztp-image-based-upgrade-seed-image-guide.adoc @@ -0,0 +1,30 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-understanding-image-based-upgrade.adoc + +[id="ztp-image-based-upgrade-seed-image-guide_{context}"] += Seed image guidelines + +The seed image targets a set of {sno} clusters with similar configuration. +This means that the seed cluster needs to have the same configuration as the target clusters for the following items: + +* Performance profile +* `MachineConfig` resources for the target cluster +* IP version ++ +[NOTE] +==== +Dual-stack networking is not supported in this release. +==== + +* Set of Day 2 Operators, including the {lcao} and the OADP Operator +* Disconnected registry +* FIPS configuration +* If the target cluster has multiple IPs and one of them belongs to the subnet that was used for creating the seed image, the upgrade fails if the target cluster's node IP does not belong to that subnet. + +The following configurations only have to partially match on the participating clusters: + +* If the target cluster has a proxy configuration, the seed cluster must have a proxy configuration too but the configuration does not have to be the same. +* A dedicated partition on the primary disk for container storage is required on all participating clusters. However, the size and start of the partition does not have to be the same. Only the `spec.config.storage.disks.partitions.label: varlibcontainers` label in the `MachineConfig` CR must match on both the seed and target clusters. +For more information about how to create the disk partition, see _Configuring a shared container directory between ostree stateroots_ or _Configuring a shared container directory between ostree stateroots when using GitOps ZTP_. + +For more information about what to include in the seed image, see _Seed image configuration_ and _Seed image configuration using the RAN DU profile_. \ No newline at end of file From 1dfa0bc05426626fbabee5125e0f41c7f324d272 Mon Sep 17 00:00:00 2001 From: Alexandra Molnar Date: Wed, 5 Jun 2024 09:53:31 +0100 Subject: [PATCH 03/11] Add Preparing/Configuring shared container dir --- ...-based-upgrade-shared-container-image.adoc | 16 ++++ ...sed-upgrade-share-container-directory.adoc | 68 +++++++++++++++ ...sed-upgrade-share-container-directory.adoc | 87 ++----------------- 3 files changed, 90 insertions(+), 81 deletions(-) create mode 100644 edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc create mode 100644 modules/cnf-image-based-upgrade-share-container-directory.adoc diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc new file mode 100644 index 000000000000..33247cf38a6a --- /dev/null +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc @@ -0,0 +1,16 @@ +:_mod-docs-content-type: ASSEMBLY +[id="cnf-image-based-upgrade-shared-varlibcontainers"] += Configuring a shared container directory for the image-based upgrade +include::_attributes/common-attributes.adoc[] +:context: shared-container-directory + +toc::[] + +Your {sno} clusters need to have a shared `var/lib/containers` partition for the image-based upgrade. +You can do this at install time. + +:FeatureName: The Lifecycle Agent + +include::modules/cnf-image-based-upgrade-share-container-directory.adoc[leveloffset=+1] + +include::modules/ztp-image-based-upgrade-share-container-directory.adoc[leveloffset=+1] \ No newline at end of file diff --git a/modules/cnf-image-based-upgrade-share-container-directory.adoc b/modules/cnf-image-based-upgrade-share-container-directory.adoc new file mode 100644 index 000000000000..5ef4d0b525b9 --- /dev/null +++ b/modules/cnf-image-based-upgrade-share-container-directory.adoc @@ -0,0 +1,68 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="cnf-image-based-upgrade-shared-container-directory_{context}"] += Configuring a shared container directory between `ostree` stateroots + +You must apply a `MachineConfig` to both the seed and the target clusters during installation time to create a separate partition and share the `/var/lib/containers` directory between the two `ostree` stateroots that will be used during the upgrade 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/ztp-image-based-upgrade-share-container-directory.adoc b/modules/ztp-image-based-upgrade-share-container-directory.adoc index 4c11c2b9b4cd..3ae080f2bd96 100644 --- a/modules/ztp-image-based-upgrade-share-container-directory.adoc +++ b/modules/ztp-image-based-upgrade-share-container-directory.adoc @@ -1,85 +1,11 @@ // Module included in the following assemblies: -// * scalability_and_performance/ztp-image-based-upgrade.adoc +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.adoc :_mod-docs-content-type: PROCEDURE [id="ztp-image-based-upgrade-shared-container-directory_{context}"] -= Sharing the container directory between `ostree` stateroots += Configuring a shared container directory between `ostree` stateroots when using GitOps ZTP -You must apply a `MachineConfig` to both the seed and the target clusters during installation time to create a separate partition and share the `/var/lib/containers` directory between the two `ostree` stateroots that will be used during the upgrade process. - -[id="ztp-image-based-upgrade-shared-container-directory-acm_{context}"] -== Sharing the container directory between `ostree` stateroots when using {rh-rhacm} - -When you are using {rh-rhacm}, you must apply a `MachineConfig` to both the seed and target clusters. - -[IMPORTANT] -==== -You must complete this procedure at installation time. -==== - -.Prerequisites - -* Log in as a user with `cluster-admin` privileges. - -.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 the size of the partition. If the value is too small, the deployments after installation will fail. - -[id="ztp-image-based-upgrade-shared-container-directory-ztp_{context}"] -== Sharing the container directory between `ostree` stateroots when using GitOps ZTP - -When you are using the GitOps ZTP workflow, you can do the following procedure to create a separate disk partition on both the seed and target cluster and to share the `/var/lib/containers` directory. +When you are using the GitOps ZTP workflow, you do the following procedure to create a separate disk partition on both the seed and target cluster and to share the `/var/lib/containers` directory. [IMPORTANT] ==== @@ -88,7 +14,6 @@ You must complete this procedure at installation time. .Prerequisites -* Log in as a user with `cluster-admin` privileges. * Install Butane. .Procedure @@ -105,8 +30,8 @@ storage: wipe_table: false partitions: - label: var-lib-containers - start_mib: <2> - size_mib: <3> + start_mib: <2> + size_mib: <3> filesystems: - path: /var/lib/containers device: /dev/disk/by-partlabel/var-lib-containers @@ -119,7 +44,7 @@ storage: ---- <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 the size of the partition. If the value is too small, the deployments after 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. . Convert the `storage.bu` to an Ignition file. + From 0bced9ce030efe83af1a1a4eb9e2c63eec7a1fd2 Mon Sep 17 00:00:00 2001 From: Alexandra Molnar Date: Wed, 5 Jun 2024 09:55:55 +0100 Subject: [PATCH 04/11] Add Preparing/Installing Operators --- _topic_maps/_topic_map.yml | 16 +- ...image-based-upgrade-install-operators.adoc | 32 ++ ...-installing-lifecycle-agent-using-cli.adoc | 111 ++++++ ...ing-lifecycle-agent-using-web-console.adoc | 36 ++ ...stalling-lifecycle-agent-using-gitops.adoc | 332 ++++++++++++++++++ 5 files changed, 519 insertions(+), 8 deletions(-) create mode 100644 edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-install-operators.adoc create mode 100644 modules/cnf-image-based-upgrade-installing-lifecycle-agent-using-cli.adoc create mode 100644 modules/cnf-image-based-upgrade-installing-lifecycle-agent-using-web-console.adoc create mode 100644 modules/ztp-image-based-upgrade-installing-lifecycle-agent-using-gitops.adoc diff --git a/_topic_maps/_topic_map.yml b/_topic_maps/_topic_map.yml index cb401f9f6fc6..f437e34bcf8d 100644 --- a/_topic_maps/_topic_map.yml +++ b/_topic_maps/_topic_map.yml @@ -3039,14 +3039,14 @@ Topics: Topics: - Name: Understanding the image-based upgrade for single-node OpenShift clusters File: cnf-understanding-image-based-upgrade -# - Name: Preparing for an image-based upgrade for single-node OpenShift clusters -# Dir: preparing_for_image_based_upgrade -# Distros: openshift-origin,openshift-enterprise -# Topics: -# - Name: Configuring a shared container directory for the image-based upgrade -# File: cnf-image-based-upgrade-shared-container-image -# - Name: Installing Operators for the image-based upgrade -# File: cnf-image-based-upgrade-install-operators + - Name: Preparing for an image-based upgrade for single-node OpenShift clusters + Dir: preparing_for_image_based_upgrade + Distros: openshift-origin,openshift-enterprise + Topics: + - Name: Configuring a shared container directory for the image-based upgrade + File: cnf-image-based-upgrade-shared-container-image + - Name: Installing Operators for the image-based upgrade + File: cnf-image-based-upgrade-install-operators # - Name: Generating a seed image for the image-based upgrade with Lifecycle Agent # File: cnf-image-based-upgrade-generate-seed # - Name: Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-install-operators.adoc b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-install-operators.adoc new file mode 100644 index 000000000000..2e41b834822f --- /dev/null +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-install-operators.adoc @@ -0,0 +1,32 @@ +:_mod-docs-content-type: ASSEMBLY +[id="cnf-image-based-upgrade-install-operators"] += Installing Operators for the image-based upgrade +include::_attributes/common-attributes.adoc[] +:context: install-operators + +toc::[] + +You need to prepare your clusters for the upgrade by installing the {lcao} and the OADP Operator. + +To install the OADP Operator with the non-GitOps method, see _Additional resources_. + +:FeatureName: The Lifecycle Agent + +//// +[role="_additional-resources"] +.Additional resources + +* xref:../../../backup_and_restore/application_backup_and_restore/installing/oadp-installing-operator.adoc[Installing the OADP Operator] + +* xref:../../../backup_and_restore/application_backup_and_restore/installing/installing-oadp-ocs.adoc#oadp-about-backup-snapshot-locations_installing-oadp-ocs[About backup and snapshot locations and their secrets] + +* xref:../../../backup_and_restore/application_backup_and_restore/backing_up_and_restoring/oadp-creating-backup-cr.adoc[Creating a Backup CR] + +* xref:../../../backup_and_restore/application_backup_and_restore/backing_up_and_restoring/restoring-applications.adoc#oadp-creating-restore-cr_restoring-applications[Creating a Restore CR] +//// + +include::modules/cnf-image-based-upgrade-installing-lifecycle-agent-using-cli.adoc[leveloffset=+1] + +include::modules/cnf-image-based-upgrade-installing-lifecycle-agent-using-web-console.adoc[leveloffset=+1] + +include::modules/ztp-image-based-upgrade-installing-lifecycle-agent-using-gitops.adoc[leveloffset=+1] \ No newline at end of file diff --git a/modules/cnf-image-based-upgrade-installing-lifecycle-agent-using-cli.adoc b/modules/cnf-image-based-upgrade-installing-lifecycle-agent-using-cli.adoc new file mode 100644 index 000000000000..94d54aee1844 --- /dev/null +++ b/modules/cnf-image-based-upgrade-installing-lifecycle-agent-using-cli.adoc @@ -0,0 +1,111 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="installing-lcao-using-cli_{context}"] += Installing the {lcao} by using the CLI + +You can use the OpenShift CLI (`oc`) to install the {lcao}. + +.Prerequisites + +* Install the OpenShift CLI (`oc`). +* Log in as a user with `cluster-admin` privileges. + +.Procedure + +. Create a `Namespace` object YAML file for the {lcao}, for example `lcao-namespace.yaml`. ++ +[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 `OperatorGroup` object YAML file for the {lcao}, for example `lcao-operatorgroup.yaml`. ++ +[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: + +.. Create the `Subscription` object YAML file for the {lcao}, for example, `lcao-subscription.yaml`: ++ +[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/cnf-image-based-upgrade-installing-lifecycle-agent-using-web-console.adoc b/modules/cnf-image-based-upgrade-installing-lifecycle-agent-using-web-console.adoc new file mode 100644 index 000000000000..b0827f9abf25 --- /dev/null +++ b/modules/cnf-image-based-upgrade-installing-lifecycle-agent-using-web-console.adoc @@ -0,0 +1,36 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="installing-lifecycle-agent-using-web-console_{context}"] += Installing the {lcao} by using the web console + +You can use the {product-title} web console to install the {lcao}. + +.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/ztp-image-based-upgrade-installing-lifecycle-agent-using-gitops.adoc b/modules/ztp-image-based-upgrade-installing-lifecycle-agent-using-gitops.adoc new file mode 100644 index 000000000000..813958e4982b --- /dev/null +++ b/modules/ztp-image-based-upgrade-installing-lifecycle-agent-using-gitops.adoc @@ -0,0 +1,332 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="zp-image-based-upgrade-installing-operators-with-gitops_{context}"] += Installing {lcao} and the OADP Operator with ZTP GitOps + +You need both the {lcao} and the OADP Operator to do an image-based upgrade with ZTP GitOps. + +[id="zp-image-based-upgrade-installing-lcao-with-gitops_{context}"] +== Installing the {lcao} with GitOps ZTP + +Install the {lcao} with GitOps ZTP to do an image-based upgrade. + +.Prerequisites + +* Create a directory called `custom-crs` in the `source-crs` directory. The `source-crs` directory must be located in the same location as `kustomization.yaml` file. + +.Procedure + +. Create the following CRs in the `openshift-lifecycle-agent` namespace and push them to the `source-crs/custom-crs` directory. ++ +-- +.LcaSubscriptionNS.yaml +[source,yaml] +---- +apiVersion: v1 +kind: Namespace +metadata: + name: openshift-lifecycle-agent + annotations: + workload.openshift.io/allowed: management + ran.openshift.io/ztp-deploy-wave: "2" + labels: + kubernetes.io/metadata.name: openshift-lifecycle-agent +---- + +.LcaSubscriptionOperGroup.yaml +[source,yaml] +---- +apiVersion: operators.coreos.com/v1 +kind: OperatorGroup +metadata: + name: lifecycle-agent-operatorgroup + namespace: openshift-lifecycle-agent + annotations: + ran.openshift.io/ztp-deploy-wave: "2" +spec: + targetNamespaces: + - openshift-lifecycle-agent +---- + +.LcaSubscription.yaml +[source,yaml] +---- +apiVersion: operators.coreos.com/v1 +kind: Subscription +metadata: + name: lifecycle-agent + namespace: openshift-lifecycle-agent + annotations: + ran.openshift.io/ztp-deploy-wave: "2" +spec: + channel: "stable" + name: lifecycle-agent + source: redhat-operators + sourceNamespace: openshift-marketplace + installPlanApproval: Manual +---- + +.Example directory structure +[source,terminal] +---- +├── kustomization.yaml +├── sno +│ ├── example-cnf.yaml +│ ├── common-ranGen.yaml +│ ├── group-du-sno-ranGen.yaml +│ ├── group-du-sno-validator-ranGen.yaml +│ └── ns.yaml +├── source-crs +│ ├── custom-crs +│ │ ├── LcaSubscriptionNS.yaml +│ │ ├── LcaSubscriptionOperGroup.yaml +│ │ ├── LcaSubscription.yaml +---- +-- + +. Add the CRs to your common `PolicyGenTemplate`. ++ +.Example directory structure +[source,yaml] +---- +apiVersion: ran.openshift.io/v1 +kind: PolicyGenTemplate +metadata: + name: "example-common-latest" + namespace: "ztp-common" +spec: + bindingRules: + common: "true" + du-profile: "latest" + sourceFiles: + - fileName: custom-crs/LcaSubscriptionNS.yaml + policyName: "subscriptions-policy" + - fileName: custom-crs/LcaSubscriptionOperGroup.yaml + policyName: "subscriptions-policy" + - fileName: custom-crs/LcaSubscription.yaml + policyName: "subscriptions-policy" +[...] +---- + +[id="zp-image-based-upgrade-installing-oadp-with-gitops_{context}"] +== Installing and configuring the OADP Operator with GitOps ZTP + +You can install and configure the OADP Operator with GitOps ZTP well before you want to start the upgrade. + +.Prerequisites + +* Create a directory called `custom-crs` in the `source-crs` directory. The `source-crs` directory must be located in the same location as `kustomization.yaml` file. + +.Procedure + +. Create the following CRs in the `openshift-adp` namespace and push them to the `source-crs/custom-crs` directory. ++ +-- +.OadpSubscriptionNS.yaml +[source,yaml] +---- +apiVersion: v1 +kind: Namespace +metadata: + name: openshift-adp + annotations: + workload.openshift.io/allowed: management + ran.openshift.io/ztp-deploy-wave: "2" + labels: + kubernetes.io/metadata.name: openshift-adp +---- + +.OadpSubscriptionOperGroup.yaml +[source,yaml] +---- +apiVersion: operators.coreos.com/v1 +kind: OperatorGroup +metadata: + name: redhat-oadp-operator + namespace: openshift-adp + annotations: + ran.openshift.io/ztp-deploy-wave: "2" +spec: + targetNamespaces: + - openshift-adp +---- + +.OadpSubscription.yaml +[source,yaml] +---- +apiVersion: operators.coreos.com/v1 +kind: Subscription +metadata: + name: redhat-oadp-operator + namespace: openshift-adp + annotations: + ran.openshift.io/ztp-deploy-wave: "2" +spec: + channel: stable-1.3 + name: redhat-oadp-operator + source: redhat-operators + sourceNamespace: openshift-marketplace + installPlanApproval: Manual +status: + state: AtLatestKnown +---- + +.Example directory structure +[source,terminal] +---- +├── kustomization.yaml +├── sno +│ ├── example-cnf.yaml +│ ├── common-ranGen.yaml +│ ├── group-du-sno-ranGen.yaml +│ ├── group-du-sno-validator-ranGen.yaml +│ └── ns.yaml +├── source-crs +│ ├── custom-crs +│ │ ├── OadpSubscriptionNS.yaml +│ │ ├── OadpSubscriptionOperGroup.yaml +│ │ ├── OadpSubscription.yaml +---- +-- + +. Add the CRs to your common `PolicyGenTemplate`. ++ +.Example directory structure ++ +[source,yaml] +---- +apiVersion: ran.openshift.io/v1 +kind: PolicyGenTemplate +metadata: + name: "example-common-latest" + namespace: "ztp-common" +spec: + bindingRules: + common: "true" + du-profile: "latest" + sourceFiles: + - fileName: custom-crs/OadpSubscriptionNS.yaml + policyName: "subscriptions-policy" + - fileName: custom-crs/OadpSubscriptionOperGroup.yaml + policyName: "subscriptions-policy" + - fileName: custom-crs/OadpSubscription.yaml + policyName: "subscriptions-policy" +[...] +---- + +. Create the `DataProtectionApplication` CR and the S3 secret. + +.. Create the following CRs in your `source-crs/custom-crs` directory: ++ +-- +.DataProtectionApplication.yaml +[source,yaml] +---- +apiVersion: oadp.openshift.io/v1 +kind: DataProtectionApplication +metadata: + name: dataprotectionapplication + namespace: openshift-adp + annotations: + ran.openshift.io/ztp-deploy-wave: "100" +spec: + configuration: + restic: + enable: false <1> + velero: + defaultPlugins: + - aws + - openshift + resourceTimeout: 10m + backupLocations: + - velero: + config: + profile: "default" + region: minio + s3Url: $url + insecureSkipTLSVerify: "true" + s3ForcePathStyle: "true" + provider: aws + default: true + credential: + key: cloud + name: cloud-credentials + objectStorage: + bucket: $bucketName + prefix: $prefixName +status: + conditions: + - reason: Complete + status: "True" + type: Reconciled +---- +<1> The `spec.configuration.restic.enable` field must be set to `false` for an image-based upgrade because persistent volume contents are retained and reused after the upgrade. + +.OadpSecret.yaml +[source,yaml] +---- +apiVersion: v1 +kind: Secret +metadata: + name: cloud-credentials + namespace: openshift-adp + annotations: + ran.openshift.io/ztp-deploy-wave: "100" +type: Opaque +---- + +.OadpBackupStorageLocationStatus.yaml +[source,yaml] +---- +apiVersion: velero.io/v1 +kind: BackupStorageLocation +metadata: + namespace: openshift-adp + annotations: + ran.openshift.io/ztp-deploy-wave: "100" +status: + phase: Available +---- + +The `OadpBackupStorageLocationStatus.yaml` CR verifies the availability of backup storage locations created by OADP. +-- + +.. Add the CRs to your site `PolicyGenTemplate` with overrides. ++ +[source,yaml] +---- +apiVersion: ran.openshift.io/v1 +kind: PolicyGenTemplate +metadata: + name: "example-cnf" + namespace: "ztp-site" +spec: + bindingRules: + sites: "example-cnf" + du-profile: "latest" + mcp: "master" + sourceFiles: + ... + - fileName: OadpSecret.yaml + policyName: "config-policy" + data: + cloud: <1> + - fileName: DataProtectionApplication.yaml + policyName: "config-policy" + spec: + backupLocations: + - velero: + config: + region: minio + s3Url: <2> + objectStorage: + bucket: <3> + prefix: <3> + - fileName: OadpBackupStorageLocationStatus.yaml + policyName: "config-policy" +---- +<1> Specify your credentials for your S3 storage backend. +<2> Specify the URL for your S3-compatible bucket. +<3> The `bucket` defines the bucket name that is created in S3 backend. The `prefix` defines the name of the subdirectory that will be automatically created in the `bucket`. The combination of `bucket` and `prefix` must be unique for each target cluster to avoid interference between them. To ensure a unique storage directory for each target cluster, you can use the {rh-rhacm} hub template function, for example, `prefix: {{hub .ManagedClusterName hub}}`. \ No newline at end of file From edeb1ea8eb973812461b436177413f945e3cdb4f Mon Sep 17 00:00:00 2001 From: Alexandra Molnar Date: Wed, 5 Jun 2024 09:57:27 +0100 Subject: [PATCH 05/11] Add Preparing/Generate seed image --- _topic_maps/_topic_map.yml | 4 +- ...cnf-image-based-upgrade-generate-seed.adoc | 25 +++ ...age-based-upgrade-generate-seed-image.adoc | 184 ++++++++++++++++++ ...image-based-upgrade-seed-image-config.adoc | 129 ++++++++++++ 4 files changed, 340 insertions(+), 2 deletions(-) create mode 100644 edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-generate-seed.adoc create mode 100644 modules/cnf-image-based-upgrade-generate-seed-image.adoc create mode 100644 modules/cnf-image-based-upgrade-seed-image-config.adoc diff --git a/_topic_maps/_topic_map.yml b/_topic_maps/_topic_map.yml index f437e34bcf8d..c57e03cad1de 100644 --- a/_topic_maps/_topic_map.yml +++ b/_topic_maps/_topic_map.yml @@ -3047,8 +3047,8 @@ Topics: File: cnf-image-based-upgrade-shared-container-image - Name: Installing Operators for the image-based upgrade File: cnf-image-based-upgrade-install-operators -# - Name: Generating a seed image for the image-based upgrade with Lifecycle Agent -# File: cnf-image-based-upgrade-generate-seed + - Name: Generating a seed image for the image-based upgrade with Lifecycle Agent + File: cnf-image-based-upgrade-generate-seed # - Name: Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent # File: cnf-image-based-upgrade-prep-resources # - Name: Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent using GitOps ZTP diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-generate-seed.adoc b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-generate-seed.adoc new file mode 100644 index 000000000000..546d19cc2524 --- /dev/null +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-generate-seed.adoc @@ -0,0 +1,25 @@ +:_mod-docs-content-type: ASSEMBLY +[id="cnf-image-based-upgrade-seed-image"] += Generating a seed image for the image-based upgrade with {lcao} +include::_attributes/common-attributes.adoc[] +:context: generate-seed + +toc::[] + +Use the {lcao} to generate the seed image with the `SeedGenerator` CR. + +:FeatureName: The Lifecycle Agent + + +include::modules/cnf-image-based-upgrade-seed-image-config.adoc[leveloffset=+1] + +include::modules/cnf-image-based-upgrade-generate-seed-image.adoc[leveloffset=+1] + +//// +[role="_additional-resources"] +.Additional resources + +* xref:../../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image##cnf-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots] + +* xref:../../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image#ztp-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots when using GitOps ZTP] +//// \ No newline at end of file diff --git a/modules/cnf-image-based-upgrade-generate-seed-image.adoc b/modules/cnf-image-based-upgrade-generate-seed-image.adoc new file mode 100644 index 000000000000..aa1a21690e5c --- /dev/null +++ b/modules/cnf-image-based-upgrade-generate-seed-image.adoc @@ -0,0 +1,184 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.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 updating the `SeedGenerator` CR on the seed cluster + +.Prerequisites + +* Configure a shared container directory on the seed cluster. +* Install the OADP Operator and the {lcao} on the seed cluster. + +.Procedure + +. Detach the cluster from the hub to delete any cluster-specific resources from the seed cluster that must not be in the seed image: + +.. If you are using {rh-rhacm}, 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. + +.. If you are using GitOps ZTP, detach your cluster by removing the seed cluster's `SiteConfig` CR from the `kustomization.yaml`: + +... Remove your seed cluster's `SiteConfig` CR from the `kustomization.yaml`. ++ +[source,yaml] +---- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +generators: +#- example-seed-sno1.yaml +- example-target-sno2.yaml +- example-target-sno3.yaml +---- + +... Commit the `kustomization.yaml` changes in your Git repository and push the changes. + ++ +The ArgoCD pipeline detects the changes and removes the managed cluster. + +. 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 the `Secret` YAML file 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] +==== +The cluster reboots and loses API capabilities while the {lcao} generates the seed image. +Applying the `SeedGenerator` CR stops the `kubelet` and the CRI-O operations, then it starts the image generation. +==== + +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/cnf-image-based-upgrade-seed-image-config.adoc b/modules/cnf-image-based-upgrade-seed-image-config.adoc new file mode 100644 index 000000000000..71c2584cbcbe --- /dev/null +++ b/modules/cnf-image-based-upgrade-seed-image-config.adoc @@ -0,0 +1,129 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ztp-image-based-seed-image-config_{context}"] += Seed image configuration + +The seed image targets a set of {sno} clusters with similar configuration. +This means that the seed image must have all the components and configuration that the seed cluster shares with the target clusters. +Therefore, the seed image generated from the seed cluster cannot contain any cluster-specific configuration. + +The following table lists the components, resources, and configurations that you must and must not include in your seed image: + +.Seed image configuration +[cols=2*, width="80%", options="header"] +|==== +|Cluster configuration +|Include in seed image + +|Performance profile +|Yes + +|`MachineConfig` resources for the target cluster +|Yes + +|IP version ^[1]^ +|Yes + +|Set of Day 2 Operators, including the {lcao} and the OADP Operator +|Yes + +|Disconnected registry configuration +|Yes + +|Valid proxy configuration ^[2]^ +|Yes + +|FIPS configuration +|Yes + +|Dedicated partition on the primary disk for container storage that matches the size of the target clusters +|Yes + +a|Local volumes + +* `StorageClass` used in `LocalVolume` for LSO +* `LocalVolume` for LSO +* `LVMCluster` CR for LVMS +|No + +|OADP `DataProtectionApplication` CR +|No +|==== +. Dual-stack networking is not supported in this release. +. The proxy configuration does not have to be the same. + +[id="ztp-image-based-upgrade-seed-image-config-ran_{context}"] +== Seed image configuration using the RAN DU profile + +The following table lists the components, resources, and configurations that you must and must not include in the seed image when using the RAN DU profile: + +.Seed image configuration with RAN DU profile +[cols=2*, width="80%", options="header"] +|==== +|Resource +|Include in seed image + +|All extra manifests that are applied as part of Day 0 installation +|Yes + +|All Day 2 Operator subscriptions +|Yes + +|`ClusterLogging.yaml` +|Yes + +|`DisableOLMPprof.yaml` +|Yes + +|`TunedPerformancePatch.yaml` +|Yes + +|`PerformanceProfile.yaml` +|Yes + +|`SriovOperatorConfig.yaml` +|Yes + +|`DisableSnoNetworkDiag.yaml` +|Yes + +|`StorageClass.yaml` +|No, if it is used in `StorageLV.yaml` + +|`StorageLV.yaml` +|No + +|`StorageLVMCluster.yaml` +|No +|==== + +.Seed image configuration with RAN DU profile for extra manifests +[cols=2*, width="80%", options="header"] +|==== +|Resource +|Apply as extra manifest + +|`ClusterLogForwarder.yaml` +|Yes + +|`ReduceMonitoringFootprint.yaml` +|Yes + +|`SriovFecClusterConfig.yaml` +|Yes + +|`PtpOperatorConfigForEvent.yaml` +|Yes + +|`DefaultCatsrc.yaml` +|Yes + +|`PtpConfig.yaml` +|If the interfaces of the target cluster are common with the seed cluster, you can include them in the seed image. Otherwise, apply it as extra manifests. + +a|`SriovNetwork.yaml` +`SriovNetworkNodePolicy.yaml` +|If the configuration, including namespaces, is exactly the same on both the seed and target cluster, you can include them in the seed image. Otherwise, apply them as extra manifests. +|==== \ No newline at end of file From 5b8a57585ac609874d8c256bbc2280a0fe6daca7 Mon Sep 17 00:00:00 2001 From: Alexandra Molnar Date: Wed, 5 Jun 2024 10:04:06 +0100 Subject: [PATCH 06/11] Add Preparing/ConfigMap objects nonGitOps --- _topic_maps/_topic_map.yml | 4 +- ...nf-image-based-upgrade-prep-resources.adoc | 26 +++++++ ...mage-based-upgrade-prep-catalogsource.adoc | 46 ++++++++++++ ...age-based-upgrade-prep-extramanifests.adoc | 64 ++++++++++++++++ .../cnf-image-based-upgrade-prep-oadp.adoc | 73 +++++++++++++++++++ snippets/ibu-ApplicationBackupRestoreLso.adoc | 40 ++++++++++ .../ibu-ApplicationBackupRestoreLvms.adoc | 48 ++++++++++++ ...ApplicationClusterScopedBackupRestore.adoc | 35 +++++++++ snippets/ibu-PlatformBackupRestore.adoc | 39 ++++++++++ snippets/ibu-PlatformBackupRestoreLvms.adoc | 31 ++++++++ 10 files changed, 404 insertions(+), 2 deletions(-) create mode 100644 edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-prep-resources.adoc create mode 100644 modules/cnf-image-based-upgrade-prep-catalogsource.adoc create mode 100644 modules/cnf-image-based-upgrade-prep-extramanifests.adoc create mode 100644 modules/cnf-image-based-upgrade-prep-oadp.adoc create mode 100644 snippets/ibu-ApplicationBackupRestoreLso.adoc create mode 100644 snippets/ibu-ApplicationBackupRestoreLvms.adoc create mode 100644 snippets/ibu-ApplicationClusterScopedBackupRestore.adoc create mode 100644 snippets/ibu-PlatformBackupRestore.adoc create mode 100644 snippets/ibu-PlatformBackupRestoreLvms.adoc diff --git a/_topic_maps/_topic_map.yml b/_topic_maps/_topic_map.yml index c57e03cad1de..616c3399ba58 100644 --- a/_topic_maps/_topic_map.yml +++ b/_topic_maps/_topic_map.yml @@ -3049,8 +3049,8 @@ Topics: File: cnf-image-based-upgrade-install-operators - Name: Generating a seed image for the image-based upgrade with Lifecycle Agent File: cnf-image-based-upgrade-generate-seed -# - Name: Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent -# File: cnf-image-based-upgrade-prep-resources + - Name: Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent + File: cnf-image-based-upgrade-prep-resources # - Name: Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent using GitOps ZTP # File: ztp-image-based-upgrade-prep-resources # - Name: Performing an image-based upgrade for single-node OpenShift clusters diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-prep-resources.adoc b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-prep-resources.adoc new file mode 100644 index 000000000000..a60130e98657 --- /dev/null +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-prep-resources.adoc @@ -0,0 +1,26 @@ +:_mod-docs-content-type: ASSEMBLY +[id="cnf-image-based-upgrade-prep-resources"] += Creating ConfigMap objects for the image-based upgrade with {lcao} +include::_attributes/common-attributes.adoc[] +:context: nongitops + +toc::[] + +The {lcao} needs all your OADP resources, extra manifests, and custom catalog sources wrapped in a `ConfigMap` object to process them for the image-based upgrade. + +:FeatureName: The Lifecycle Agent + +include::modules/cnf-image-based-upgrade-prep-oadp.adoc[leveloffset=+1] + +include::modules/cnf-image-based-upgrade-prep-extramanifests.adoc[leveloffset=+1] + +include::modules/cnf-image-based-upgrade-prep-catalogsource.adoc[leveloffset=+1] + +//// +[role="_additional-resources"] +.Additional resources + +* xref:../../../backup_and_restore/application_backup_and_restore/installing/about-installing-oadp.adoc[About installing OADP] + +* xref:../../../edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc#cnf-image-based-upgrade-for-sno[Performing an image-based upgrade with Lifecycle Agent] +//// \ No newline at end of file diff --git a/modules/cnf-image-based-upgrade-prep-catalogsource.adoc b/modules/cnf-image-based-upgrade-prep-catalogsource.adoc new file mode 100644 index 000000000000..cfeafee5e8c5 --- /dev/null +++ b/modules/cnf-image-based-upgrade-prep-catalogsource.adoc @@ -0,0 +1,46 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="cnf-image-based-upgrade-creating-backup-custom-catalog-sources_{context}"] += (Optional) Creating ConfigMap objects of custom catalog sources for the image-based upgrade with {lcao} + +You can keep your custom catalog sources after the upgrade by generating a `ConfigMap` object for your catalog sources and adding them to the `spec.extraManifest` field in the `ImageBasedUpgrade` CR. +For more information about catalog sources, see xref:https://access.redhat.com/documentation/en-us/openshift_container_platform/4.15/html-single/operators/index#olm-catalogsource_olm-understanding-olm[Catalog source]. + +.Procedure + +. Create a YAML file that contains the `CatalogSource` CR. ++ +-- +[source,yaml] +---- +apiVersion: operators.coreos.com/v1 +kind: CatalogSource +metadata: + name: example-catalogsources + namespace: openshift-marketplace +spec: + sourceType: grpc + displayName: disconnected-redhat-operators + image: quay.io/example-org/example-catalog:v1 +---- +-- + +. Create the `ConfigMap` object: ++ +[source,terminal] +---- +$ oc create configmap example-catalogsources-cm --from-file=example-catalogsources.yaml= -n openshift-lifecycle-agent +---- + +. Patch the `ImageBasedUpgrade` CR: ++ +[source,terminal] +---- +$ oc patch imagebasedupgrades.lca.openshift.io upgrade \ +-p='{"spec": {"extraManifests": [{"name": "example-catalogsources-cm", "namespace": "openshift-lifecycle-agent"}]}}' \ +--type=merge -n openshift-lifecycle-agent +---- + +To use the `ConfigMap` objects in the upgrade, see the _Performing an image-based upgrade with {lcao}_ section. \ No newline at end of file diff --git a/modules/cnf-image-based-upgrade-prep-extramanifests.adoc b/modules/cnf-image-based-upgrade-prep-extramanifests.adoc new file mode 100644 index 000000000000..1b6a05f5076f --- /dev/null +++ b/modules/cnf-image-based-upgrade-prep-extramanifests.adoc @@ -0,0 +1,64 @@ + +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="cnf-image-based-upgrade-creating-backup-extra-manifests_{context}"] += (Optional) Creating ConfigMap objects of extra manifests for the image-based upgrade with {lcao} + +Create your additional manifests that you want to apply to the target cluster. + +.Procedure + +. Create a YAML file that contains your extra manifests. ++ +[source,yaml] +---- +apiVersion: sriovnetwork.openshift.io/v1 +kind: SriovNetworkNodePolicy +metadata: + name: "pci-sriov-net-e5l" + namespace: openshift-sriov-network-operator +spec: + deviceType: vfio-pci + isRdma: false + nicSelector: + pfNames: [ens1f0] + nodeSelector: + node-role.kubernetes.io/master: "" + mtu: 1500 + numVfs: 8 + priority: 99 + resourceName: pci_sriov_net_e5l +--- +apiVersion: sriovnetwork.openshift.io/v1 +kind: SriovNetwork +metadata: + name: "networking-e5l" + namespace: openshift-sriov-network-operator +spec: + ipam: |- + { + } + linkState: auto + networkNamespace: sriov-namespace + resourceName: pci_sriov_net_e5l + spoofChk: "on" + trust: "off" +---- + +. Create the `ConfigMap` object: ++ +[source,terminal] +---- +$ oc create configmap example-extra-manifests-cm --from-file=example-extra-manifests.yaml= -n openshift-lifecycle-agent +---- + +. Patch the `ImageBasedUpgrade` CR: ++ +[source,terminal] +---- +$ oc patch imagebasedupgrades.lca.openshift.io upgrade \ +-p='{"spec": {"extraManifests": [{"name": "example-extra-manifests-cm", "namespace": "openshift-lifecycle-agent"}]}}' \ +--type=merge -n openshift-lifecycle-agent +---- \ No newline at end of file diff --git a/modules/cnf-image-based-upgrade-prep-oadp.adoc b/modules/cnf-image-based-upgrade-prep-oadp.adoc new file mode 100644 index 000000000000..be29c1cb93ea --- /dev/null +++ b/modules/cnf-image-based-upgrade-prep-oadp.adoc @@ -0,0 +1,73 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="cnf-image-based-upgrade-creating-backup-oadp-resources_{context}"] += Creating OADP ConfigMap objects for the image-based upgrade with {lcao} + +Create your OADP resources that are used to back up and restore your resources during the upgrade. + +.Prerequisites + +* Generate a seed image from a compatible seed cluster. +* Create backup and restore resources. +* Create a separate partition on the target cluster for the container images that is shared between stateroots. For more information about, see _Additional resources_. +* Deploy a version of {lcao} that is compatible with the version used with the seed image. +* Install the OADP Operator, the `DataProtectionApplication` CR and its secret on the target cluster. +* Create an S3-compatible storage solution and a ready-to-use bucket with proper credentials configured. For more information, see _Additional resources_. + +.Procedure + +. Create the OADP `Backup` and `Restore` CRs for platform artifacts in the same namespace where the OADP Operator is installed, which is `openshift-adp`. + +.. If the target cluster is managed by {rh-rhacm}, add the following YAML file for backing up and restoring {rh-rhacm} artifacts: ++ +-- +.PlatformBackupRestore.yaml for {rh-rhacm} +include::snippets/ibu-PlatformBackupRestore.adoc[] +-- + +.. If you created persistent volumes on your cluster through {lvms}, add the following YAML file for {lvms} artifacts: ++ +.PlatformBackupRestoreLvms.yaml for {lvms} +include::snippets/ibu-PlatformBackupRestoreLvms.adoc[] + +. (Optional) If you need to restore applications over the upgrade, create the OADP `Backup` and `Restore` CRs for your application in the `openshift-adp` namespace. + +.. Create the OADP CRs for cluster-scoped application artifacts in the `openshift-adp` namespace. ++ +.Example OADP CRs for cluster-scoped application artifacts for LSO and {LVMS} +include::snippets/ibu-ApplicationClusterScopedBackupRestore.adoc[] + +.. Create the OADP CRs for your namespace-scoped application artifacts. ++ +-- +.Example OADP CRs namespace-scoped application artifacts when LSO is used +include::snippets/ibu-ApplicationBackupRestoreLso.adoc[] + +.Example OADP CRs namespace-scoped application artifacts when {lvms} is used +include::snippets/ibu-ApplicationBackupRestoreLvms.adoc[] + +[IMPORTANT] +==== +The same version of the applications must function on both the current and the target release of {product-title}. +==== +-- + +. Generate a `ConfigMap` object for your OADP CRs. + +.. Create the `ConfigMap` object: ++ +[source,terminal] +---- +$ oc create configmap oadp-cm-example --from-file=example-oadp-resources.yaml= -n openshift-adp +---- + +. Patch the `ImageBasedUpgrade` CR: ++ +[source,terminal] +---- +$ oc patch imagebasedupgrades.lca.openshift.io upgrade \ +-p='{"spec": {"oadpContent": [{"name": "oadp-cm-example", "namespace": "openshift-adp"}]}}' \ +--type=merge -n openshift-lifecycle-agent +---- \ No newline at end of file diff --git a/snippets/ibu-ApplicationBackupRestoreLso.adoc b/snippets/ibu-ApplicationBackupRestoreLso.adoc new file mode 100644 index 000000000000..17b5a67176ac --- /dev/null +++ b/snippets/ibu-ApplicationBackupRestoreLso.adoc @@ -0,0 +1,40 @@ +[source,yaml] +---- +apiVersion: velero.io/v1 +kind: Backup +metadata: + labels: + velero.io/storage-location: default + name: backup-app + namespace: openshift-adp +spec: + includedNamespaces: + - test + includedNamespaceScopedResources: + - secrets + - persistentvolumeclaims + - deployments + - statefulsets + - configmaps + - cronjobs + - services + - job + - poddisruptionbudgets + - <1> + excludedClusterScopedResources: + - persistentVolumes +--- +apiVersion: velero.io/v1 +kind: Restore +metadata: + name: test-app + namespace: openshift-adp + labels: + velero.io/storage-location: default + annotations: + lca.openshift.io/apply-wave: "4" +spec: + backupName: + backup-app +---- +<1> Define custom resources for your application. \ No newline at end of file diff --git a/snippets/ibu-ApplicationBackupRestoreLvms.adoc b/snippets/ibu-ApplicationBackupRestoreLvms.adoc new file mode 100644 index 000000000000..90a1a5b20d78 --- /dev/null +++ b/snippets/ibu-ApplicationBackupRestoreLvms.adoc @@ -0,0 +1,48 @@ +[source,yaml] +---- +apiVersion: velero.io/v1 +kind: Backup +metadata: + labels: + velero.io/storage-location: default + name: backup-app + namespace: openshift-adp +spec: + includedNamespaces: + - test + includedNamespaceScopedResources: + - secrets + - persistentvolumeclaims + - deployments + - statefulsets + - configmaps + - cronjobs + - services + - job + - poddisruptionbudgets + - <1> + includedClusterScopedResources: + - persistentVolumes <2> + - logicalvolumes.topolvm.io <2> + - volumesnapshotcontents <3> +--- +apiVersion: velero.io/v1 +kind: Restore +metadata: + name: test-app + namespace: openshift-adp + labels: + velero.io/storage-location: default + annotations: + lca.openshift.io/apply-wave: "4" +spec: + backupName: + backup-app + restorePVs: true + restoreStatus: <2> + includedResources: <2> + - logicalvolumes <2> +---- +<1> Define custom resources for your application. +<2> Required field. +<3> Optional if you use {lvms} volume snapshots. \ No newline at end of file diff --git a/snippets/ibu-ApplicationClusterScopedBackupRestore.adoc b/snippets/ibu-ApplicationClusterScopedBackupRestore.adoc new file mode 100644 index 000000000000..6a5e202d7be0 --- /dev/null +++ b/snippets/ibu-ApplicationClusterScopedBackupRestore.adoc @@ -0,0 +1,35 @@ +[source,yaml] +---- +apiVersion: velero.io/v1 +kind: Backup +metadata: + annotations: + lca.openshift.io/apply-label: "apiextensions.k8s.io/v1/customresourcedefinitions/test.example.com,security.openshift.io/v1/securitycontextconstraints/test,rbac.authorization.k8s.io/v1/clusterroles/test-role,rbac.authorization.k8s.io/v1/clusterrolebindings/system:openshift:scc:test" <1> + name: backup-app-cluster-resources + labels: + velero.io/storage-location: default + namespace: openshift-adp +spec: + includedClusterScopedResources: + - customresourcedefinitions + - securitycontextconstraints + - clusterrolebindings + - clusterroles + excludedClusterScopedResources: + - Namespace +--- +apiVersion: velero.io/v1 +kind: Restore +metadata: + name: test-app-cluster-resources + namespace: openshift-adp + labels: + velero.io/storage-location: default + annotations: + lca.openshift.io/apply-wave: "3" <2> +spec: + backupName: + backup-app-cluster-resources +---- +<1> Replace the example resource name with your actual resources. +<2> The `lca.openshift.io/apply-wave` value must be higher than what the value in the platform `Restore` CRs and lower than the value in the application namespace-scoped `Restore` CR. \ No newline at end of file diff --git a/snippets/ibu-PlatformBackupRestore.adoc b/snippets/ibu-PlatformBackupRestore.adoc new file mode 100644 index 000000000000..037c9fc00908 --- /dev/null +++ b/snippets/ibu-PlatformBackupRestore.adoc @@ -0,0 +1,39 @@ +[source,yaml] +---- +apiVersion: velero.io/v1 +kind: Backup +metadata: + name: acm-klusterlet + annotations: + lca.openshift.io/apply-label: "apps/v1/deployments/open-cluster-management-agent/klusterlet,v1/secrets/open-cluster-management-agent/bootstrap-hub-kubeconfig,rbac.authorization.k8s.io/v1/clusterroles/klusterlet,v1/serviceaccounts/open-cluster-management-agent/klusterlet,scheduling.k8s.io/v1/priorityclasses/klusterlet-critical,rbac.authorization.k8s.io/v1/clusterroles/open-cluster-management:klusterlet-admin-aggregate-clusterrole,rbac.authorization.k8s.io/v1/clusterrolebindings/klusterlet,operator.open-cluster-management.io/v1/klusterlets/klusterlet,apiextensions.k8s.io/v1/customresourcedefinitions/klusterlets.operator.open-cluster-management.io,v1/secrets/open-cluster-management-agent/open-cluster-management-image-pull-credentials" <1> + labels: + velero.io/storage-location: default + namespace: openshift-adp +spec: + includedNamespaces: + - open-cluster-management-agent + includedClusterScopedResources: + - klusterlets.operator.open-cluster-management.io + - clusterroles.rbac.authorization.k8s.io + - clusterrolebindings.rbac.authorization.k8s.io + - priorityclasses.scheduling.k8s.io + includedNamespaceScopedResources: + - deployments + - serviceaccounts + - secrets + excludedNamespaceScopedResources: [] +--- +apiVersion: velero.io/v1 +kind: Restore +metadata: + name: acm-klusterlet + namespace: openshift-adp + labels: + velero.io/storage-location: default + annotations: + lca.openshift.io/apply-wave: "1" +spec: + backupName: + acm-klusterlet +---- +<1> If your `multiclusterHub` CR does not have `.spec.imagePullSecret` defined and the secret does not exist on the `open-cluster-management-agent` namespace in your hub cluster, remove the `v1/secrets/open-cluster-management-agent/open-cluster-management-image-pull-credentials`. \ No newline at end of file diff --git a/snippets/ibu-PlatformBackupRestoreLvms.adoc b/snippets/ibu-PlatformBackupRestoreLvms.adoc new file mode 100644 index 000000000000..51ba1ec5b17a --- /dev/null +++ b/snippets/ibu-PlatformBackupRestoreLvms.adoc @@ -0,0 +1,31 @@ +[source,yaml] +---- +apiVersion: velero.io/v1 +kind: Backup +metadata: + labels: + velero.io/storage-location: default + name: lvmcluster + namespace: openshift-adp +spec: + includedNamespaces: + - openshift-storage + includedNamespaceScopedResources: + - lvmclusters + - lvmvolumegroups + - lvmvolumegroupnodestatuses +--- +apiVersion: velero.io/v1 +kind: Restore +metadata: + name: lvmcluster + namespace: openshift-adp + labels: + velero.io/storage-location: default + annotations: + lca.openshift.io/apply-wave: "2" <1> +spec: + backupName: + lvmcluster +---- +<1> The `lca.openshift.io/apply-wave` value must be lower than the values specified in the application `Restore` CRs. \ No newline at end of file From 980c518ed11ec48d8202cb5ab1ea2fc5cecb3e35 Mon Sep 17 00:00:00 2001 From: Alexandra Molnar Date: Wed, 5 Jun 2024 10:05:51 +0100 Subject: [PATCH 07/11] Add Preparing/ConfigMap objects GitOps --- _topic_maps/_topic_map.yml | 4 +- ...tp-image-based-upgrade-prep-resources.adoc | 25 ++++ ...sed-upgrade-prep-label-extramanifests.adoc | 96 +++++++++++++ .../ztp-image-based-upgrade-prep-oadp.adoc | 136 ++++++++++++++++++ 4 files changed, 259 insertions(+), 2 deletions(-) create mode 100644 edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc create mode 100644 modules/ztp-image-based-upgrade-prep-label-extramanifests.adoc create mode 100644 modules/ztp-image-based-upgrade-prep-oadp.adoc diff --git a/_topic_maps/_topic_map.yml b/_topic_maps/_topic_map.yml index 616c3399ba58..873f2f369b8e 100644 --- a/_topic_maps/_topic_map.yml +++ b/_topic_maps/_topic_map.yml @@ -3051,8 +3051,8 @@ Topics: File: cnf-image-based-upgrade-generate-seed - Name: Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent File: cnf-image-based-upgrade-prep-resources -# - Name: Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent using GitOps ZTP -# File: ztp-image-based-upgrade-prep-resources + - Name: Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent using GitOps ZTP + File: ztp-image-based-upgrade-prep-resources # - Name: Performing an image-based upgrade for single-node OpenShift clusters # File: cnf-image-based-upgrade-base # - Name: Performing an image-based upgrade for single-node OpenShift clusters using GitOps ZTP diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc new file mode 100644 index 000000000000..7953653ac27a --- /dev/null +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc @@ -0,0 +1,25 @@ +:_mod-docs-content-type: ASSEMBLY +[id="ztp-image-based-upgrade-prep-resources"] += Creating ConfigMap objects for the image-based upgrade with {lcao} using {ztp} +include::_attributes/common-attributes.adoc[] +:context: ztp-gitops + +toc::[] + +The {lcao} needs all your OADP resources, extra manifests, and custom catalog sources wrapped in a `ConfigMap` object to process them for the image-based upgrade. + +:FeatureName: The Lifecycle Agent + +include::modules/ztp-image-based-upgrade-prep-oadp.adoc[leveloffset=+1] + + +include::modules/ztp-image-based-upgrade-prep-label-extramanifests.adoc[leveloffset=+1] + +//// +[role="_additional-resources"] +.Additional resources + +* xref:../../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc#ztp-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots when using GitOps ZTP] + +* xref:../../../edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc#ztp-image-based-upgrade-for-sno[Performing an image-based upgrade with Lifecycle Agent and GitOps ZTP] +//// \ No newline at end of file diff --git a/modules/ztp-image-based-upgrade-prep-label-extramanifests.adoc b/modules/ztp-image-based-upgrade-prep-label-extramanifests.adoc new file mode 100644 index 000000000000..367dc651e4d7 --- /dev/null +++ b/modules/ztp-image-based-upgrade-prep-label-extramanifests.adoc @@ -0,0 +1,96 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ztp-image-based-upgrade-labeling-extramanifests-with-ztp_{context}"] += Labeling extra manifests for the image-based upgrade with GitOps ZTP + +The {lcao} only extracts extra manifests that are labeled with the `lca.openshift.io/target-ocp-version: ` label. + +.Prerequisites + +* Provision one or more managed clusters with GitOps ZTP. +* Log in as a user with `cluster-admin` privileges. +* Generate a seed image from a compatible seed cluster. +* Create a separate partition on the target cluster for the container images that is shared between stateroots. For more information about, see _Additional resources_. +* Deploy a version of {lcao} that is compatible with the version used with the seed image. + +.Procedure + +. If you have manifests that you want to be extracted and applied during the upgrade, label them with the `lca.openshift.io/target-ocp-version: ` label in your existing `PolicyGenTemplate` CR: ++ +[source,yaml] +---- +apiVersion: ran.openshift.io/v1 +kind: PolicyGenTemplate +metadata: + name: example-sno +spec: + bindingRules: + sites: "example-sno" + du-profile: "4.15" + mcp: "master" + sourceFiles: + - fileName: SriovNetwork.yaml + policyName: "config-policy" + metadata: + name: "sriov-nw-du-fh" + labels: + lca.openshift.io/target-ocp-version: "4.15" <1> + spec: + resourceName: du_fh + vlan: 140 + - fileName: SriovNetworkNodePolicy.yaml + policyName: "config-policy" + metadata: + name: "sriov-nnp-du-fh" + labels: + lca.openshift.io/target-ocp-version: "4.15" <1> + spec: + deviceType: netdevice + isRdma: false + nicSelector: + pfNames: ["ens5f0"] + numVfs: 8 + priority: 10 + resourceName: du_fh + - fileName: SriovNetwork.yaml + policyName: "config-policy" + metadata: + name: "sriov-nw-du-mh" + labels: + lca.openshift.io/target-ocp-version: "4.15" <1> + spec: + resourceName: du_mh + vlan: 150 + - fileName: SriovNetworkNodePolicy.yaml + policyName: "config-policy" + metadata: + name: "sriov-nnp-du-mh" + labels: + lca.openshift.io/target-ocp-version: "4.15" <1> + spec: + deviceType: vfio-pci + isRdma: false + nicSelector: + pfNames: ["ens7f0"] + numVfs: 8 + priority: 10 + resourceName: du_mh + - fileName: DefaultCatsrc.yaml <2> + policyName: "config-policy" + metadata: + name: default-cat-source + namespace: openshift-marketplace + labels: + lca.openshift.io/target-ocp-version: "4.15" <1> + spec: + displayName: default-cat-source + image: quay.io/example-org/example-catalog:v1 +---- +<1> Ensure that the `lca.openshift.io/target-ocp-version` label matches either the y-stream or the z-stream of the target {product-title} version that is specified in the `spec.seedImageRef.version` field of the `ImageBasedUpgrade` CR. The {lcao} only applies the CRs that match the specified version. +<2> (Optional) If you do not want to use custom catalog sources, remove this entry. + +. Push the changes to your Git repository. + +To start the upgrade process, see the _Performing an image-based upgrade with {lcao} and GitOps ZTP_ section. \ No newline at end of file diff --git a/modules/ztp-image-based-upgrade-prep-oadp.adoc b/modules/ztp-image-based-upgrade-prep-oadp.adoc new file mode 100644 index 000000000000..34ecaae1ba1c --- /dev/null +++ b/modules/ztp-image-based-upgrade-prep-oadp.adoc @@ -0,0 +1,136 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-preparing-for-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ztp-image-based-upgrade-creating-backup-resources-with-ztp_{context}"] += Creating OADP resources for the image-based upgrade with GitOps ZTP + +You need to prepare your OADP resources to restore your application after an upgrade. + +.Prerequisites + +* Provision one or more managed clusters with GitOps ZTP. +* Log in as a user with `cluster-admin` privileges. +* Generate a seed image from a compatible seed cluster. +* Create a separate partition on the target cluster for the container images that is shared between stateroots. For more information about, see _Additional resources_. +* Deploy a version of {lcao} that is compatible with the version used with the seed image. +* Install the OADP Operator, the `DataProtectionApplication` CR and its secret on the target cluster. +* Create an S3-compatible storage solution and a ready-to-use bucket with proper credentials configured. For more information, see Additional resources. + +.Procedure + +. Ensure that your Git repository that you use with the ArgoCD policies application contains the following directory structure: ++ +-- +[source,terminal] +---- +├── source-crs/ +│ ├── ibu/ +│ │ ├── ImageBasedUpgrade.yaml +│ │ ├── PlatformBackupRestore.yaml +│ │ ├── PlatformBackupRestoreLvms.yaml +├── ... +├── ibu-upgrade-ranGen.yaml +├── kustomization.yaml +---- + +[IMPORTANT] +==== +The `kustomization.yaml` file must be located in the same directory structure as shown above to reference the `PlatformBackupRestore.yaml` manifest. +==== + +The `source-crs/ibu/PlatformBackupRestore.yaml` file is provided in the ZTP container image. + +.PlatformBackupRestore.yaml +include::snippets/ibu-PlatformBackupRestore.adoc[] + +If you use {lvms} to create persistent volumes, you can use the `source-crs/ibu/PlatformBackupRestoreLvms.yaml` provided in the ZTP container image to back up your {lvms} resources. + +.PlatformBackupRestoreLvms.yaml +include::snippets/ibu-PlatformBackupRestoreLvms.adoc[] +-- + +. (Optional) If you need to restore applications over the upgrade, create the OADP `Backup` and `Restore` CRs for your application in the `openshift-adp` namespace. + +.. Create the OADP CRs for cluster-scoped application artifacts in the `openshift-adp` namespace. ++ +.Example OADP CRs for cluster-scoped application artifacts for LSO and {LVMS} +include::snippets/ibu-ApplicationClusterScopedBackupRestore.adoc[] + +.. Create the OADP CRs for your namespace-scoped application artifacts in the `source-crs/custom-crs` directory. ++ +-- +.Example OADP CRs namespace-scoped application artifacts when LSO is used +include::snippets/ibu-ApplicationBackupRestoreLso.adoc[] + +.Example OADP CRs namespace-scoped application artifacts when {lvms} is used +include::snippets/ibu-ApplicationBackupRestoreLvms.adoc[] + +[IMPORTANT] +==== +The same version of the applications must function on both the current and the target release of {product-title}. +==== +-- + +. Create the `oadp-cm` `ConfigMap` object through the `oadp-cm-policy` in a new `PolicyGenTemplate` called `ibu-upgrade-ranGen.yaml`. ++ +[source,yaml] +---- +apiVersion: ran.openshift.io/v1 +kind: PolicyGenTemplate +metadata: + name: example-group-ibu + namespace: "ztp-group" +spec: + bindingRules: + group-du-sno: "" + mcp: "master" + evaluationInterval: + compliant: 10s + noncompliant: 10s + sourceFiles: + - fileName: ConfigMapGeneric.yaml + complianceType: mustonlyhave + policyName: "oadp-cm-policy" + metadata: + name: oadp-cm + namespace: openshift-adp +---- + +. Create a `kustomization.yaml` with the following content: ++ +[source,yaml] +---- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +generators: <1> +- ibu-upgrade-ranGen.yaml + +configMapGenerator: <2> +- files: + - source-crs/ibu/PlatformBackupRestore.yaml + #- source-crs/custom-crs/ApplicationClusterScopedBackupRestore.yaml + #- source-crs/custom-crs/ApplicationApplicationBackupRestoreLso.yaml + name: oadp-cm + namespace: ztp-group +generatorOptions: + disableNameSuffixHash: true + + +patches: <3> +- target: + group: policy.open-cluster-management.io + version: v1 + kind: Policy + name: group-ibu-oadp-cm-policy + patch: |- + - op: replace + path: /spec/policy-templates/0/objectDefinition/spec/object-templates/0/objectDefinition/data + value: '{{hub copyConfigMapData "ztp-group" "oadp-cm" hub}}' +---- +<1> Generates the `oadp-cm-policy`. +<2> Creates the `oadp-cm` `ConfigMap` object on the hub cluster with `Backup` and `Restore` CRs. +<3> Overrides the data field of `ConfigMap` added in `oadp-cm-policy`. A hub template is used to propagate the `oadp-cm` `ConfigMap` to all target clusters. + +. Push the changes to your Git repository. \ No newline at end of file From 80596b09de8db79e4fa49faecaa6d55d20bdc47e Mon Sep 17 00:00:00 2001 From: Alexandra Molnar Date: Wed, 5 Jun 2024 10:06:49 +0100 Subject: [PATCH 08/11] Add Performing upgrade non-GitOps --- _topic_maps/_topic_map.yml | 4 +- .../cnf-image-based-upgrade-base.adoc | 29 ++ modules/cnf-image-based-upgrade-prep.adoc | 119 ++++++++ modules/cnf-image-based-upgrade-rollback.adoc | 55 ++++ ...f-image-based-upgrade-troubleshooting.adoc | 289 ++++++++++++++++++ .../cnf-image-based-upgrade-with-backup.adoc | 175 +++++++++++ 6 files changed, 669 insertions(+), 2 deletions(-) create mode 100644 edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc create mode 100644 modules/cnf-image-based-upgrade-prep.adoc create mode 100644 modules/cnf-image-based-upgrade-rollback.adoc create mode 100644 modules/cnf-image-based-upgrade-troubleshooting.adoc create mode 100644 modules/cnf-image-based-upgrade-with-backup.adoc diff --git a/_topic_maps/_topic_map.yml b/_topic_maps/_topic_map.yml index 873f2f369b8e..faad3829034c 100644 --- a/_topic_maps/_topic_map.yml +++ b/_topic_maps/_topic_map.yml @@ -3053,8 +3053,8 @@ Topics: File: cnf-image-based-upgrade-prep-resources - Name: Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent using GitOps ZTP File: ztp-image-based-upgrade-prep-resources -# - Name: Performing an image-based upgrade for single-node OpenShift clusters -# File: cnf-image-based-upgrade-base + - Name: Performing an image-based upgrade for single-node OpenShift clusters + 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 --- diff --git a/edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc b/edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc new file mode 100644 index 000000000000..58af772df685 --- /dev/null +++ b/edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc @@ -0,0 +1,29 @@ +:_mod-docs-content-type: ASSEMBLY +[id="cnf-image-based-upgrade-for-sno"] += Performing an image-based upgrade for {sno} clusters +include::_attributes/common-attributes.adoc[] +:context: cnf-image-based-upgrade + +toc::[] + +You can use the {lcao} to do a manual image-based upgrade of a {sno} cluster. + +When you deploy the {lcao} on a cluster, an `ImageBasedUpgrade` CR is automatically created. +You update this CR to specify the image repository of the seed image and to move through the different stages. + +:FeatureName: The Lifecycle Agent + +include::modules/cnf-image-based-upgrade-prep.adoc[leveloffset=+1] + +//// +[role="_additional-resources"] +.Additional resources + +* xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc#ztp-image-based-upgrade-creating-backup-resources-with-ztp_ztp-gitops[Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent] +//// + +include::modules/cnf-image-based-upgrade-with-backup.adoc[leveloffset=+1] + +include::modules/cnf-image-based-upgrade-rollback.adoc[leveloffset=+1] + +include::modules/cnf-image-based-upgrade-troubleshooting.adoc[leveloffset=+1] \ No newline at end of file diff --git a/modules/cnf-image-based-upgrade-prep.adoc b/modules/cnf-image-based-upgrade-prep.adoc new file mode 100644 index 000000000000..a3c570637981 --- /dev/null +++ b/modules/cnf-image-based-upgrade-prep.adoc @@ -0,0 +1,119 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-image-based-upgrade-base.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ztp-image-based-upgrade-prep_{context}"] += Moving to the Prep stage of the image-based upgrade with {lcao} + +Once you have created all the resources that you need during the upgrade, you can move on to the `Prep` stage. +For more information, see the _Creating ConfigMap objects for the image-based upgrade with {lcao}_ section. + +.Prerequisites + +* Created resources to back up and restore your clusters. + +.Procedure + +. Check that you have patched your `ImageBasedUpgrade` CR: ++ +[source,yaml] +---- +apiVersion: lca.openshift.io/v1 +kind: ImageBasedUpgrade +metadata: + name: upgrade +spec: + stage: Idle + seedImageRef: + version: 4.15.2 <1> + image: <2> + pullSecretRef: <3> + autoRollbackOnFailure: {} +# initMonitorTimeoutSeconds: 1800 <4> + extraManifests: <5> + - name: example-extra-manifests-cm + namespace: openshift-lifecycle-agent + - name: example-catalogsources-cm + namespace: openshift-lifecycle-agent + oadpContent: <6> + - name: oadp-cm-example + namespace: openshift-adp +---- +<1> Specify the target platform version. The value must match the version of the seed image. +<2> Specify the URL of the repository where the target cluster can pull the seed image from. +<3> Specify the reference to a secret with credentials to pull container images if the images are in a private registry. +<4> (Optional) Specify the time frame in seconds to roll back if the upgrade does not complete within that time frame after the first reboot. If not defined or set to `0`, the default value of `1800` seconds (30 minutes) is used. +<5> (Optional) Specify the list of `ConfigMap` resources that contain your custom catalog sources to retain after the upgrade, and your extra manifests to apply to the target cluster that are not part of the seed image. +<6> Add the `oadpContent` section with the OADP `ConfigMap` information. + +. When you are ready to start the `Prep` stage, change the value of the `stage` field to `Prep` in the `ImageBasedUpgrade` CR: ++ +-- +[source,terminal] +---- +$ oc patch imagebasedupgrades.lca.openshift.io upgrade -p='{"spec": {"stage": "Prep"}}' --type=merge -n openshift-lifecycle-agent +---- + +If you provide `ConfigMap` objects for OADP resources and extra manifests, {lcao} validates the specified `ConfigMap` objects during the `Prep` stage. +You may encounter the following issues: + +* validation warnings or errors if the {lcao} detects any issues with `extraManifests` +* validation errors if the {lcao} detects any issues with with `oadpContent` + +Validation warnings do not block the `Upgrade` stage but you must decide if it is safe to proceed with the upgrade. +These warnings, for example missing CRDs, namespaces, or dry run failures, update the `status.conditions` for the `Prep` stage and `annotation` fields in the `ImageBasedUpgrade` CR with details about the warning. + +.Example validation warning +[source,yaml] +---- +[...] +metadata: +annotations: + extra-manifest.lca.openshift.io/validation-warning: '...' +[...] +---- + +However, validation errors, such as adding `MachineConfig` or Operator manifests to extra manifests, cause the `Prep` stage to fail and block the `Upgrade` stage. + +When the validations pass, the cluster creates a new `ostree` stateroot, which involves pulling and unpacking the seed image, and running host level commands. +Finally, all the required images are precached on the target cluster. +-- + +.Verification + +. Check the status of the `ImageBasedUpgrade` CR. ++ +-- +[source,terminal] +---- +$ oc get ibu -oyaml +---- + +.Example output +[source,yaml] +---- + conditions: + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: In progress + observedGeneration: 13 + reason: InProgress + status: "False" + type: Idle + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: Prep completed + observedGeneration: 13 + reason: Completed + status: "False" + type: PrepInProgress + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: Prep stage completed successfully + observedGeneration: 13 + reason: Completed + status: "True" + type: PrepCompleted + observedGeneration: 13 + validNextStages: + - Idle + - Upgrade +---- +-- \ No newline at end of file diff --git a/modules/cnf-image-based-upgrade-rollback.adoc b/modules/cnf-image-based-upgrade-rollback.adoc new file mode 100644 index 000000000000..c6f8bf9bf6c3 --- /dev/null +++ b/modules/cnf-image-based-upgrade-rollback.adoc @@ -0,0 +1,55 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-image-based-upgrade-base.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ztp-image-based-upgrade-rollback_{context}"] += (Optional) Moving to the Rollback stage of the image-based upgrade with {lcao} + +You can manually roll back the changes if you encounter unresolvable issues after an upgrade. + +An automatic rollback is initiated if the upgrade does not complete within the time frame specified in the `initMonitorTimeoutSeconds` field after rebooting. + +.Example ImageBasedUpgrade CR +[source,yaml] +---- +apiVersion: lca.openshift.io/v1 +kind: ImageBasedUpgrade +metadata: + name: upgrade +spec: + stage: Idle + seedImageRef: + version: 4.15.2 + image: + autoRollbackOnFailure: {} +# initMonitorTimeoutSeconds: 1800 <1> +[...] +---- +<1> (Optional) Specify the time frame in seconds to roll back if the upgrade does not complete within that time frame after the first reboot. If not defined or set to `0`, the default value of `1800` seconds (30 minutes) is used. + +.Prerequisites + +* Log in to the hub cluster as a user with `cluster-admin` privileges. + +.Procedure + +. Move to the rollback stage by changing the value of the `stage` field to `Rollback` in the `ImageBasedUpgrade` CR. ++ +[source,terminal] +---- +$ oc patch imagebasedupgrades.lca.openshift.io upgrade -p='{"spec": {"stage": "Rollback"}}' --type=merge +---- + +. The {lcao} reboots the cluster with the previously installed version of {product-title} and restores the applications. + +. When you are satisfied with the changes and ready to finalize the rollback, change the value of the `stage` field to `Idle` in the `ImageBasedUpgrade` CR: ++ +[source,terminal] +---- +$ oc patch imagebasedupgrades.lca.openshift.io upgrade -p='{"spec": {"stage": "Idle"}}' --type=merge -n openshift-lifecycle-agent +---- + +[WARNING] +==== +If you move to the `Idle` stage after a rollback, the {lcao} cleans up resources that can be used to troubleshoot a failed upgrade. +==== \ No newline at end of file diff --git a/modules/cnf-image-based-upgrade-troubleshooting.adoc b/modules/cnf-image-based-upgrade-troubleshooting.adoc new file mode 100644 index 000000000000..f1f1515575dd --- /dev/null +++ b/modules/cnf-image-based-upgrade-troubleshooting.adoc @@ -0,0 +1,289 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-image-based-upgrade-base.adoc +// * edge_computing/image-based-upgrade/ztp-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ztp-image-based-upgrade-troubleshooting_{context}"] += Troubleshooting image-based upgrades with {lcao} + +You can encounter issues during the image-based upgrade. + +[id="ztp-image-based-upgrade-troubleshooting-must-gather_{context}"] +== Collecting logs + +You can use the `oc adm must-gather` CLI to collect information for debugging and troubleshooting. + +.Procedure + +. Collect data about the Operators by running the following command: ++ +[source,terminal] +---- +$ oc adm must-gather \ +--dest-dir=must-gather/tmp \ +--image=$(oc -n openshift-lifecycle-agent get deployment.apps/lifecycle-agent-controller-manager -o jsonpath='{.spec.template.spec.containers[?(@.name == "manager")].image}') \ +--image=quay.io/konveyor/oadp-must-gather:latest \ <1> +--image=quay.io/openshift/origin-must-gather:latest <1> +---- +<1> (Optional) You can add these options if you need to gather more information from the OADP and the SR-IOV Operators. + +[id="ztp-image-based-upgrade-troubleshooting-manual-cleanup_{context}"] +== AbortFailed or FinalizeFailed error + +Issue:: +During the finalize stage or when you stop the process at the `Prep` stage, normally, {lcao} cleans up the following resources: + +* Stateroot that is no longer required +* Precaching resources +* OADP CRs +* `ImageBasedUpgrade` CR + +If the {lcao} fails to perform the above steps, it transitions to the `AbortFailed` or `FinalizeFailed` states. +The condition message and log show which steps failed. + +.Example error message +[source,yaml] +---- +message: failed to delete all the backup CRs. Perform cleanup manually then add 'lca.openshift.io/manual-cleanup-done' annotation to ibu CR to transition back to Idle + observedGeneration: 5 + reason: AbortFailed + status: "False" + type: Idle +---- + +Resolution:: + +. Inspect the logs to determine why the failure occurred. + +. To prompt {lcao} to retry the cleanup, add the `lca.openshift.io/manual-cleanup-done` annotation to the `ImageBasedUpgrade` CR. + +After observing this annotation, {lcao} retries the cleanup and if it is successful, the `ImageBasedUpgrade` stage transitions to `Idle`. + +If the cleanup fails again, you can manually clean up the resources. + +[id="ztp-image-based-upgrade-troubleshooting-stateroot_{context}"] +=== Cleaning up stateroot manually + +Issue:: + +Normally, the {lcao} cleans up the new stateroot when you stop at the `Prep` stage or the {lcao} cleans up the old stateroot when you finalize after a successful upgrade or a rollback. +If this step fails, it is recommended that you inspect the logs to determine why the failure occurred. + +Resolution:: + +. Check if there are any existing deployments in the stateroot by running the following command directly on the node being upgraded: ++ +[source,terminal] +---- +$ ostree admin status +---- + +. Clean up the existing deployment: ++ +[source,terminal] +---- +$ ostree admin undeploy +---- + +. After cleaning up all the deployments of the stateroot, wipe the stateroot directory: ++ +-- +[WARNING] +==== +Ensure that the booted deployment is not in this stateroot. +==== + +[source,terminal] +---- +$ stateroot="" +$ unshare -m /bin/sh -c "mount -o remount,rw /sysroot && rm -rf /sysroot/ostree/deploy/${stateroot}" +---- +-- + +[id="ztp-image-based-upgrade-troubleshooting-oadp-resources_{context}"] +=== Cleaning up OADP resources manually + +Issue:: + +This step can fail due to connection issues between {lcao} and the S3 backend. By restoring the connection and adding the `lca.openshift.io/manual-cleanup-done` annotation, the {lcao} can successfully cleanup backup resources. + +Resolution:: + +. Check the backend connectivity by running the following command: ++ +-- +[source,terminal] +---- +$ oc get backupstoragelocations.velero.io -n openshift-adp +---- + +.Example output +[source,terminal] +---- +NAME PHASE LAST VALIDATED AGE DEFAULT +dataprotectionapplication-1 Available 33s 8d true +---- +-- + +. Remove all backup resources and then add the `lca.openshift.io/manual-cleanup-done` annotation to the `ImageBasedUpgrade` CR. + +[id="ztp-image-based-upgrade-troubleshooting-lvms_{context}"] +== {lvms} volume contents not restored + +When {lvms} is used to provide dynamic persistent volume storage, {lvms} might not restore the persistent volume contents if it is configured incorrectly. + +[id="ztp-image-based-upgrade-troubleshooting-lvms-backup_{context}"] +=== Missing {lvms}-related fields in Backup CR + +Issue:: +Your `Backup` CRs might be missing fields that are needed to restore your persistent volumes. +You have the following output when you check for events in your application pod: ++ +-- +[source,terminal] +---- +$ oc describe pod +---- + +.Example +[source,terminal] +---- +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Warning FailedScheduling 58s (x2 over 66s) default-scheduler 0/1 nodes are available: pod has unbound immediate PersistentVolumeClaims. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.. + Normal Scheduled 56s default-scheduler Successfully assigned default/db-1234 to sno1.example.lab + Warning FailedMount 24s (x7 over 55s) kubelet MountVolume.SetUp failed for volume "pvc-1234" : rpc error: code = Unknown desc = VolumeID is not found +---- +-- + +Resolution:: +You must include `logicalvolumes.topolvm.io` in the application `Backup` CR. +Without this resource, the application restores its persistent volume claims and persistent volume manifests correctly, however, the `logicalvolume` associated with this persistent volume is not restored properly after pivot. ++ +.Example Backup CR +[source,yaml] +---- +apiVersion: velero.io/v1 +kind: Backup +metadata: + labels: + velero.io/storage-location: default + name: small-app + namespace: openshift-adp +spec: + includedNamespaces: + - test + includedNamespaceScopedResources: + - secrets + - persistentvolumeclaims + - deployments + - statefulsets + includedClusterScopedResources: + - persistentVolumes <1> + - volumesnapshotcontents <1> + - logicalvolumes.topolvm.io <1> +---- +<1> Required to restore the persistent volumes for your application. + +[id="ztp-image-based-upgrade-troubleshooting-lvms-restore_{context}"] +=== Missing {lvms}-related fields in Restore CR + +Issue:: +The expected resources for the applications are restored but the persistent volume contents are not preserved after upgrading. ++ +-- +.Example output before pivot +[source,terminal] +---- +$ oc get pv,pvc,logicalvolumes.topolvm.io -A +---- + +[source,terminal] +---- +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE +persistentvolume/pvc-1234 1Gi RWO Retain Bound default/pvc-db lvms-vg1 4h45m + +NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +default persistentvolumeclaim/pvc-db Bound pvc-1234 1Gi RWO lvms-vg1 4h45m + +NAMESPACE NAME AGE + logicalvolume.topolvm.io/pvc-1234 4h45m +---- + +.Example output after pivot +[source,terminal] +---- +$ oc get pv,pvc,logicalvolumes.topolvm.io -A +---- + +[source,terminal] +---- +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE +persistentvolume/pvc-1234 1Gi RWO Delete Bound default/pvc-db lvms-vg1 19s + +NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE +default persistentvolumeclaim/pvc-db Bound pvc-1234 1Gi RWO lvms-vg1 19s + +NAMESPACE NAME AGE + logicalvolume.topolvm.io/pvc-1234 18s +---- +-- + +Resolution:: +The reason for this issue is that the `logicalvolume` status is not preserved in the `Restore` CR. +This status is important because it is required for Velero to reference the volumes that must be preserved after pivoting. +You must include the following fields in the application `Restore` CR: ++ +.Example Restore CR +[source,yaml] +---- +apiVersion: velero.io/v1 +kind: Restore +metadata: + name: sample-vote-app + namespace: openshift-adp + labels: + velero.io/storage-location: default + annotations: + lca.openshift.io/apply-wave: "3" +spec: + backupName: + sample-vote-app + restorePVs: true <1> + restoreStatus: <1> + includedResources: <1> + - logicalvolumes <1> +---- +<1> Required to preserve the persistent volumes for your application. + +[id="ztp-image-based-upgrade-troubleshooting-debugging-oadp-crs_{context}"] +== Debugging failed Backup and Restore CRs + +Issue:: +The backup or restore of artifacts failed. + +Resolution:: +You can debug `Backup` and `Restore` CRs and retrieve logs with the Velero CLI tool. +The Velero CLI tool provides more detailed information than the OpenShift CLI tool. + +. Describe the `Backup` CR that contains errors: ++ +[source,terminal] +---- +$ oc exec -n openshift-adp velero-7c87d58c7b-sw6fc -c velero -- ./velero describe backup -n openshift-adp backup-acm-klusterlet --details +---- + +. Describe the `Restore` CR that contains errors: ++ +[source,terminal] +---- +$ oc exec -n openshift-adp velero-7c87d58c7b-sw6fc -c velero -- ./velero describe restore -n openshift-adp restore-acm-klusterlet --details +---- + +. Download the backed up resources to a local directory: ++ +[source,terminal] +---- +$ oc exec -n openshift-adp velero-7c87d58c7b-sw6fc -c velero -- ./velero backup download -n openshift-adp backup-acm-klusterlet -o ~/backup-acm-klusterlet.tar.gz +---- \ No newline at end of file diff --git a/modules/cnf-image-based-upgrade-with-backup.adoc b/modules/cnf-image-based-upgrade-with-backup.adoc new file mode 100644 index 000000000000..66e6988cf767 --- /dev/null +++ b/modules/cnf-image-based-upgrade-with-backup.adoc @@ -0,0 +1,175 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/cnf-image-based-upgrade-base.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ztp-image-based-upgrading-with-backup_{context}"] += Moving to the Upgrade stage of the image-based upgrade with {lcao} + +Once you generated the seed image and completed the `Prep` stage, you can upgrade the target cluster. +During the upgrade process, the OADP Operator creates a backup of the artifacts specified in the OADP CRs, then the {lcao} upgrades the cluster. + +If the upgrade fails or stops, an automatic rollback is initiated. +If you have an issue after the upgrade, you can initiate a manual rollback. +For more information about manual rollback, see "(Optional) Initiating a rollback with {lcao}". + +.Prerequisites + +* Complete the `Prep` stage. + +.Procedure + +. When you are ready, move to the upgrade stage by changing the value of the `stage` field to `Upgrade` in the `ImageBasedUpgrade` CR. ++ +[source,terminal] +---- +$ oc patch imagebasedupgrades.lca.openshift.io upgrade -p='{"spec": {"stage": "Upgrade"}}' --type=merge +---- + +. Check the status of the `ImageBasedUpgrade` CR: ++ +-- +[source,terminal] +---- +$ oc get ibu -oyaml +---- + +.Example output +[source,yaml] +---- +status: + conditions: + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: In progress + observedGeneration: 5 + reason: InProgress + status: "False" + type: Idle + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: Prep completed + observedGeneration: 5 + reason: Completed + status: "False" + type: PrepInProgress + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: Prep completed successfully + observedGeneration: 5 + reason: Completed + status: "True" + type: PrepCompleted + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: |- + Waiting for system to stabilize: one or more health checks failed + - one or more ClusterOperators not yet ready: authentication + - one or more MachineConfigPools not yet ready: master + - one or more ClusterServiceVersions not yet ready: sriov-fec.v2.8.0 + observedGeneration: 1 + reason: InProgress + status: "True" + type: UpgradeInProgress + observedGeneration: 1 + rollbackAvailabilityExpiration: "2024-05-19T14:01:52Z" + validNextStages: + - Rollback +---- +-- + +. The OADP Operator creates a backup of the data specified in the OADP `Backup` and `Restore` CRs. + +. The target cluster reboots. + +. Monitor the status of the CR: ++ +[source,terminal] +---- +$ oc get ibu -oyaml +---- + +. The cluster reboots. + +. Once you are satisfied with the upgrade, commit to the changes by changing the value of the `stage` field to `Idle` in the `ImageBasedUpgrade` CR: ++ +-- +[source,terminal] +---- +$ oc patch imagebasedupgrades.lca.openshift.io upgrade -p='{"spec": {"stage": "Idle"}}' --type=merge +---- + +[IMPORTANT] +==== +You cannot roll back the changes once you move to the `Idle` stage after an upgrade. +==== + +The {lcao} deletes all resources created during the upgrade process. +-- + +.Verification + +. Check the status of the `ImageBasedUpgrade` CR: ++ +-- +[source,terminal] +---- +$ oc get ibu -oyaml +---- + +.Example output +[source,yaml] +---- +status: + conditions: + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: In progress + observedGeneration: 5 + reason: InProgress + status: "False" + type: Idle + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: Prep completed + observedGeneration: 5 + reason: Completed + status: "False" + type: PrepInProgress + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: Prep completed successfully + observedGeneration: 5 + reason: Completed + status: "True" + type: PrepCompleted + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: Upgrade completed + observedGeneration: 1 + reason: Completed + status: "False" + type: UpgradeInProgress + - lastTransitionTime: "2024-01-01T09:00:00Z" + message: Upgrade completed + observedGeneration: 1 + reason: Completed + status: "True" + type: UpgradeCompleted + observedGeneration: 1 + rollbackAvailabilityExpiration: "2024-01-01T09:00:00Z" + validNextStages: + - Idle + - Rollback +---- +-- + +. Check the status of the cluster restoration: ++ +-- +[source,terminal] +---- +$ oc get restores -n openshift-adp -o custom-columns=NAME:.metadata.name,Status:.status.phase,Reason:.status.failureReason +---- + +.Example output +[source,terminal] +---- +NAME Status Reason +acm-klusterlet Completed <1> +apache-app Completed +localvolume Completed +---- +<1> The `acm-klusterlet` is specific to {rh-rhacm} environments only. +-- \ No newline at end of file From 9def6a8bc3f9029c7f553bc3a702b4ce02fc356c Mon Sep 17 00:00:00 2001 From: Alexandra Molnar Date: Wed, 5 Jun 2024 10:09:04 +0100 Subject: [PATCH 09/11] Add Performing upgrade GitOps --- _topic_maps/_topic_map.yml | 4 +- .../ztp-image-based-upgrade.adoc | 41 ++++ .../ztp-image-based-upgrade-talm-prep.adoc | 194 ++++++++++++++++++ ...ztp-image-based-upgrade-talm-rollback.adoc | 106 ++++++++++ .../ztp-image-based-upgrade-talm-upgrade.adoc | 125 +++++++++++ 5 files changed, 468 insertions(+), 2 deletions(-) create mode 100644 edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc create mode 100644 modules/ztp-image-based-upgrade-talm-prep.adoc create mode 100644 modules/ztp-image-based-upgrade-talm-rollback.adoc create mode 100644 modules/ztp-image-based-upgrade-talm-upgrade.adoc diff --git a/_topic_maps/_topic_map.yml b/_topic_maps/_topic_map.yml index faad3829034c..576d3de11e02 100644 --- a/_topic_maps/_topic_map.yml +++ b/_topic_maps/_topic_map.yml @@ -3055,8 +3055,8 @@ Topics: File: ztp-image-based-upgrade-prep-resources - Name: Performing an image-based upgrade for single-node OpenShift clusters 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: Performing an image-based upgrade for single-node OpenShift clusters using GitOps ZTP + File: ztp-image-based-upgrade --- Name: Reference design specifications Dir: telco_ref_design_specs diff --git a/edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc b/edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc new file mode 100644 index 000000000000..28d3101878fc --- /dev/null +++ b/edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc @@ -0,0 +1,41 @@ +:_mod-docs-content-type: ASSEMBLY +[id="ztp-image-based-upgrade-for-sno"] += Performing an image-based upgrade for {sno} clusters using GitOps ZTP +:context: ztp-image-based-upgrade +include::_attributes/common-attributes.adoc[] + +toc::[] + +You can upgrade your managed {sno} cluster with the image-based upgrade through GitOps ZTP. + +When you deploy the {lcao} on a cluster, an `ImageBasedUpgrade` CR is automatically created. +You update this CR to specify the image repository of the seed image and to move through the different stages. + +:FeatureName: The Lifecycle Agent + +// Lifecycle Agent (LCAO) + +include::modules/ztp-image-based-upgrade-talm-prep.adoc[leveloffset=+1] + +//// +[role="_additional-resources"] +.Additional resources + +* xref:../../edge_computing/ztp-preparing-the-hub-cluster.adoc#ztp-preparing-the-ztp-git-repository-ver-ind_ztp-preparing-the-hub-cluster[Preparing the GitOps ZTP site configuration repository for version independence] + +* xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc[Preparing for the image-based upgrade for single-node OpenShift clusters] + +* xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc#ztp-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots when using GitOps ZTP] + +* xref:../../backup_and_restore/application_backup_and_restore/installing/installing-oadp-ocs.adoc#oadp-about-backup-snapshot-locations_installing-oadp-ocs[About backup and snapshot locations and their secrets] + +* xref:../../backup_and_restore/application_backup_and_restore/backing_up_and_restoring/oadp-creating-backup-cr.adoc[Creating a Backup CR] + +* xref:../../backup_and_restore/application_backup_and_restore/backing_up_and_restoring/restoring-applications.adoc#oadp-creating-restore-cr_restoring-applications[Creating a Restore CR] +//// + +include::modules/ztp-image-based-upgrade-talm-upgrade.adoc[leveloffset=+1] + +include::modules/ztp-image-based-upgrade-talm-rollback.adoc[leveloffset=+1] + +include::modules/cnf-image-based-upgrade-troubleshooting.adoc[leveloffset=+1] \ No newline at end of file diff --git a/modules/ztp-image-based-upgrade-talm-prep.adoc b/modules/ztp-image-based-upgrade-talm-prep.adoc new file mode 100644 index 000000000000..4c6c3405b9b5 --- /dev/null +++ b/modules/ztp-image-based-upgrade-talm-prep.adoc @@ -0,0 +1,194 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/ztp-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ztp-image-based-upgrade-prep-gitops_{context}"] += Moving to the Prep stage of the image-based upgrade with {lcao} and GitOps ZTP + +When you deploy the {lcao} on a cluster, an `ImageBasedUpgrade` CR is automatically created. You update this CR to specify the image repository of the seed image and to move through the different stages. + +.Prerequisites + +* Create policies and `ConfigMap` objects for resources used in the image-based upgrade. For more information, see _Creating ConfigMap objects for the image-based upgrade with GitOps ZTP_ + +.Procedure + +. Add policies for the `Prep`, `Upgrade`, and `Idle` stages to your existing group `PolicyGenTemplate` called `ibu-upgrade-ranGen.yaml`. ++ +[source,yaml] +---- +apiVersion: ran.openshift.io/v1 +kind: PolicyGenTemplate +metadata: + name: example-group-ibu + namespace: "ztp-group" +spec: + bindingRules: + group-du-sno: "" + mcp: "master" + evaluationInterval: <1> + compliant: 10s + noncompliant: 10s + sourceFiles: + - fileName: ConfigMapGeneric.yaml + complianceType: mustonlyhave + policyName: "oadp-cm-policy" + metadata: + name: oadp-cm + namespace: openshift-adp + - fileName: ibu/ImageBasedUpgrade.yaml + policyName: "prep-policy" + spec: + stage: Prep + seedImageRef: <2> + version: "4.15.0" + image: "quay.io/user/lca-seed:4.15.0" + pullSecretRef: + name: "" + oadpContent: <3> + - name: "oadp-cm" + namespace: "openshift-adp" + status: + conditions: + - reason: Completed + status: "True" + type: PrepCompleted + message: "Prep stage completed successfully" + - fileName: ibu/ImageBasedUpgrade.yaml + policyName: "upgrade-policy" + spec: + stage: Upgrade + status: + conditions: + - reason: Completed + status: "True" + type: UpgradeCompleted + - fileName: ibu/ImageBasedUpgrade.yaml + policyName: "finalize-stage-policy" + complianceType: mustonlyhave + spec: + stage: Idle + - fileName: ibu/ImageBasedUpgrade.yaml + policyName: "finalize-stage-policy" + status: + conditions: + - reason: Idle + status: "True" + type: Idle +---- +<1> The policy evaluation interval for compliant and non-compliant policies. Set them to `10s` to ensure that the policies status accurately reflects the current upgrade status. +<2> Define the seed image, OpenShift Container Platform version, and pull secret for the upgrade in the Prep stage. +<3> Define the OADP `ConfigMap` resources required for backup and restore. + +. Verify that the policies required for an image-based upgrade are created: ++ +-- +[source,terminal] +---- +$ oc get policies -n spoke1 | grep -E "example-group-ibu" +---- + +.Example output +[source,terminal] +---- +ztp-group.example-group-ibu-oadp-cm-policy inform NonCompliant 31h +ztp-group.example-group-ibu-prep-policy inform NonCompliant 31h +ztp-group.example-group-ibu-upgrade-policy inform NonCompliant 31h +ztp-group.example-group-ibu-finalize-policy inform NonCompliant 31h +ztp-group.example-group-ibu-rollback-policy inform NonCompliant 31h +---- +-- + +. Update the `du-profile` cluster label to the target platform version or the corresponding policy-binding label in the `SiteConfig` CR. ++ +-- +[source,yaml] +---- +apiVersion: ran.openshift.io/v1 +kind: SiteConfig +[...] +spec: + [...] + clusterLabels: + du-profile: "4.15.0" +---- + +[IMPORTANT] +==== +Updating the labels to the target platform version unbinds the existing set of policies. +==== +-- + +. Commit and push the updated `SiteConfig` CR to the Git repository. + +. When you are ready to move to the `Prep` stage, create the `ClusterGroupUpgrade` CR with the `Prep` and OADP `ConfigMap` policies: ++ +[source,yaml] +---- +apiVersion: ran.openshift.io/v1alpha1 +kind: ClusterGroupUpgrade +metadata: + name: cgu-ibu-prep + namespace: default +spec: + clusters: + - spoke1 + enable: true + managedPolicies: + - example-group-oadp-cm-policy + - example-group-ibu-prep-policy + remediationStrategy: + canaries: + - spoke1 + maxConcurrency: 1 + timeout: 240 +---- + +. Apply the `Prep` policy: ++ +-- +[source,terminal] +---- +$ oc apply -f cgu-ibu-prep.yml +---- + +If you provide `ConfigMap` objects for OADP resources and extra manifests, {lcao} validates the specified `ConfigMap` objects during the `Prep` stage. +You may encounter the following issues: + +* validation warnings or errors if the {lcao} detects any issues with `extraManifests` +* validation errors if the {lcao} detects any issues with with `oadpContent` + +Validation warnings do not block the `Upgrade` stage but you must decide if it is safe to proceed with the upgrade. +These warnings, for example missing CRDs, namespaces or dry run failures, update the `status.conditions` in the `Prep` stage and `annotation` fields in the `ImageBasedUpgrade` CR with details about the warning. + +.Example validation warning +[source,yaml] +---- +[...] +metadata: +annotations: + extra-manifest.lca.openshift.io/validation-warning: '...' +[...] +---- + +However, validation errors, such as adding `MachineConfig` or Operator manifests to extra manifests, cause the `Prep` stage to fail and block the `Upgrade` stage. + +When the validations pass, the cluster creates a new `ostree` stateroot, which involves pulling and unpacking the seed image, and running host level commands. +Finally, all the required images are precached on the target cluster. +-- + +. Monitor the status and wait for the `cgu-ibu-prep` `ClusterGroupUpgrade` to report `Completed`. ++ +-- +[source,terminal] +---- +$ oc get cgu -n default +---- + +.Example output +[source,terminal] +---- +NAME AGE STATE DETAILS +cgu-ibu-prep 31h Completed All clusters are compliant with all the managed policies +---- +-- \ No newline at end of file diff --git a/modules/ztp-image-based-upgrade-talm-rollback.adoc b/modules/ztp-image-based-upgrade-talm-rollback.adoc new file mode 100644 index 000000000000..1b2a54f5dd16 --- /dev/null +++ b/modules/ztp-image-based-upgrade-talm-rollback.adoc @@ -0,0 +1,106 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/ztp-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ztp-image-based-upgrade-with-talm-rollback_{context}"] += (Optional) Moving to the Rollback stage with {lcao} and GitOps ZTP + +If you encounter an issue after upgrade, you can start a manual rollback. + +.Procedure + +. Revert the `du-profile` or the corresponding policy-binding label to the original platform version in the `SiteConfig` CR: ++ +[source,yaml] +---- +apiVersion: ran.openshift.io/v1 +kind: SiteConfig +[...] +spec: + [...] + clusterLabels: + du-profile: "4.14.x" +---- + +. When you are ready to initiate the rollback, add the `Rollback` policy to your existing `PolicyGenTemplate` CR: ++ +[source,yaml] +---- +[...] +- fileName: ibu/ImageBasedUpgrade.yaml + policyName: "rollback-policy" + spec: + stage: Rollback + status: + conditions: + - message: Rollback completed + reason: Completed + status: "True" + type: RollbackCompleted +---- + +. Create a `ClusterGroupUpgrade` CR that references the `Rollback` policy: ++ +[source,yaml] +---- +apiVersion: ran.openshift.io/v1alpha1 +kind: ClusterGroupUpgrade +metadata: + name: cgu-ibu-rollback + namespace: default +spec: + actions: + beforeEnable: + removeClusterAnnotations: + - import.open-cluster-management.io/disable-auto-import + clusters: + - spoke1 + enable: true + managedPolicies: + - example-group-ibu-rollback-policy + remediationStrategy: + canaries: + - spoke1 + maxConcurrency: 1 + timeout: 240 +---- + +. Apply the `Rollback` policy: ++ +[source,terminal] +---- +$ oc apply -f cgu-ibu-rollback.yml +---- + +. When you are satisfied with the changes and you are ready to finalize the rollback, create a `ClusterGroupUpgrade` CR that references the policy that finalizes the upgrade: ++ +[source,yaml] +---- +apiVersion: ran.openshift.io/v1alpha1 +kind: ClusterGroupUpgrade +metadata: + name: cgu-ibu-finalize + namespace: default +spec: + actions: + beforeEnable: + removeClusterAnnotations: + - import.open-cluster-management.io/disable-auto-import + clusters: + - spoke1 + enable: true + managedPolicies: + - example-group-ibu-finalize-policy + remediationStrategy: + canaries: + - spoke1 + maxConcurrency: 1 + timeout: 240 +---- + +. Apply the policy: ++ +[source,terminal] +---- +$ oc apply -f cgu-ibu-finalize.yml +---- \ No newline at end of file diff --git a/modules/ztp-image-based-upgrade-talm-upgrade.adoc b/modules/ztp-image-based-upgrade-talm-upgrade.adoc new file mode 100644 index 000000000000..c2411ab658d7 --- /dev/null +++ b/modules/ztp-image-based-upgrade-talm-upgrade.adoc @@ -0,0 +1,125 @@ +// Module included in the following assemblies: +// * edge_computing/image-based-upgrade/ztp-image-based-upgrade.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ztp-image-based-upgrade-upgrade-gitops_{context}"] += Moving to the Upgrade stage of the image-based upgrade with {lcao} and GitOps ZTP + +After you completed the `Prep` stage, you can upgrade the target cluster. During the upgrade process, the OADP Operator creates a backup of the artifacts specified in the OADP CRs, then the {lcao} upgrades the cluster. + +If the upgrade fails or stops, an automatic rollback is initiated. If you have an issue after the upgrade, you can initiate a manual rollback. For more information about manual rollback, see "(Optional) Initiating a rollback with Lifecycle Agent and GitOps ZTP". + +.Prerequisites + +* Complete the `Prep` stage. + +.Procedure + +. When you are ready to move to the `Upgrade` stage, create the `ClusterGroupUpgrade` CR that references the `Upgrade` policy: ++ +[source,yaml] +---- +apiVersion: ran.openshift.io/v1alpha1 +kind: ClusterGroupUpgrade +metadata: + name: cgu-ibu-upgrade + namespace: default +spec: + actions: + beforeEnable: + addClusterAnnotations: + import.open-cluster-management.io/disable-auto-import: "true" <1> + afterCompletion: + removeClusterAnnotations: + - import.open-cluster-management.io/disable-auto-import <2> + clusters: + - spoke1 + enable: true + managedPolicies: + - example-group-ibu-upgrade-policy + remediationStrategy: + canaries: + - spoke1 + maxConcurrency: 1 + timeout: 240 +---- +<1> Applies the `disable-auto-import` annotation to the managed cluster before starting the upgrade. This annotation ensures the automatic importing of managed cluster is disabled during the upgrade stage until the cluster is ready. +<2> Removes the `disable-auto-import` annotation after the upgrade is complete. + +. Apply the `Upgrade` policy: ++ +[source,terminal] +---- +$ oc apply -f cgu-ibu-upgrade.yml +---- + +.. Monitor the status and wait for the `cgu-ibu-upgrade` `ClusterGroupUpgrade` to report `Completed`. ++ +-- +[source,terminal] +---- +$ oc get cgu -n default +---- + +.Example output +[source,terminal] +---- +NAME AGE STATE DETAILS +example-group-ibu-prep 31h Completed All clusters are compliant with all the managed policies +example-group-ibu-upgrade 31h Completed All clusters are compliant with all the managed policies +---- +-- + +. When you are satisfied with the changes and ready to finalize the upgrade, create a `ClusterGroupUpgrade` CR that references the policy that finalizes the upgrade: ++ +-- +[source,yaml] +---- +apiVersion: ran.openshift.io/v1alpha1 +kind: ClusterGroupUpgrade +metadata: + name: cgu-ibu-finalize + namespace: default +spec: + clusters: + - spoke1 + enable: true + managedPolicies: + - example-group-ibu-finalize-policy + remediationStrategy: + canaries: + - spoke1 + maxConcurrency: 1 + timeout: 240 +---- + +[IMPORTANT] +==== +Ensure that no other `ClusterGroupUpgrade` CRs are in progress because this causes {cgu-operator} to continuously reconcile them. Delete all `"In-Progress"` `ClusterGroupUpgrade` CRs before applying the `cgu-ibu-finalize.yaml`. +==== +-- + +. Apply the policy: ++ +[source,terminal] +---- +$ oc apply -f cgu-ibu-finalize.yaml +---- + +.. Monitor the status and wait for the `cgu-ibu-upgrade` `ClusterGroupUpgrade` to report `Completed`. ++ +-- +[source,terminal] +---- +$ oc get cgu -n default +---- + +.Example output +[source,terminal] +---- +NAME AGE STATE DETAILS +cgu-ibu-finalize 30h Completed All clusters are compliant with all the managed policies +cgu-ibu-prep 31h Completed All clusters are compliant with all the managed policies +cgu-ibu-upgrade 31h Completed All clusters are compliant with all the managed policies +---- +-- \ No newline at end of file From f3e30fcebb710b0e5727a56f76fb2248d8ae627f Mon Sep 17 00:00:00 2001 From: Alexandra Molnar Date: Wed, 5 Jun 2024 10:12:02 +0100 Subject: [PATCH 10/11] Add xrefs --- .../image_based_upgrade/cnf-image-based-upgrade-base.adoc | 2 -- .../cnf-understanding-image-based-upgrade.adoc | 8 +------- .../cnf-image-based-upgrade-generate-seed.adoc | 6 ++---- .../cnf-image-based-upgrade-install-operators.adoc | 2 -- .../cnf-image-based-upgrade-prep-resources.adoc | 4 +--- .../ztp-image-based-upgrade-prep-resources.adoc | 4 +--- .../image_based_upgrade/ztp-image-based-upgrade.adoc | 6 ++---- 7 files changed, 7 insertions(+), 25 deletions(-) diff --git a/edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc b/edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc index 58af772df685..2db81597fd44 100644 --- a/edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc +++ b/edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc @@ -15,12 +15,10 @@ You update this CR to specify the image repository of the seed image and to move include::modules/cnf-image-based-upgrade-prep.adoc[leveloffset=+1] -//// [role="_additional-resources"] .Additional resources * xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc#ztp-image-based-upgrade-creating-backup-resources-with-ztp_ztp-gitops[Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent] -//// include::modules/cnf-image-based-upgrade-with-backup.adoc[leveloffset=+1] diff --git a/edge_computing/image_based_upgrade/cnf-understanding-image-based-upgrade.adoc b/edge_computing/image_based_upgrade/cnf-understanding-image-based-upgrade.adoc index 0a0babba56c9..6c40c7022a91 100644 --- a/edge_computing/image_based_upgrade/cnf-understanding-image-based-upgrade.adoc +++ b/edge_computing/image_based_upgrade/cnf-understanding-image-based-upgrade.adoc @@ -71,7 +71,6 @@ spec: include::modules/cnf-image-based-upgrade.adoc[leveloffset=+1] -//// [role="_additional-resources"] .Additional resources @@ -82,7 +81,6 @@ include::modules/cnf-image-based-upgrade.adoc[leveloffset=+1] * xref:../../edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc#ztp-image-based-upgrade-rollback_cnf-image-based-upgrade[(Optional) Moving to the Rollback stage of the image-based upgrade with Lifecycle Agent] * xref:../../edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc#ztp-image-based-upgrade-with-talm-rollback_ztp-image-based-upgrade[(Optional) Moving to the Rollback stage of the image-based upgrade with Lifecycle Agent and GitOps ZTP] -//// include::modules/cnf-image-based-upgrade-guidelines.adoc[leveloffset=+1] @@ -97,7 +95,6 @@ include::modules/ztp-image-based-upgrade-hub-cluster-guide.adoc[leveloffset=+2] include::modules/ztp-image-based-upgrade-seed-image-guide.adoc[leveloffset=+2] -//// [role="_additional-resources"] .Additional resources @@ -106,13 +103,11 @@ include::modules/ztp-image-based-upgrade-seed-image-guide.adoc[leveloffset=+2] * xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc#ztp-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots when using GitOps ZTP] * xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-generate-seed.adoc#ztp-image-based-seed-image-config_generate-seed[Seed image configuration] -//// include::modules/ztp-image-based-upgrade-backup-guide.adoc[leveloffset=+2] include::modules/ztp-image-based-upgrade-extra-manifests-guide.adoc[leveloffset=+2] -//// [role="_additional-resources"] .Additional resources @@ -126,5 +121,4 @@ include::modules/ztp-image-based-upgrade-extra-manifests-guide.adoc[leveloffset= * xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc#ztp-image-based-upgrade-creating-backup-resources-with-ztp_ztp-gitops[Creating ConfigMap objects for the image-based upgrade with GitOps ZTP] -* xref:../../backup_and_restore/application_backup_and_restore/installing/about-installing-oadp.adoc#about-installing-oadp[About installing OADP] -//// \ No newline at end of file +* xref:../../backup_and_restore/application_backup_and_restore/installing/about-installing-oadp.adoc#about-installing-oadp[About installing OADP] \ No newline at end of file diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-generate-seed.adoc b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-generate-seed.adoc index 546d19cc2524..dfd6ed37e5e5 100644 --- a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-generate-seed.adoc +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-generate-seed.adoc @@ -15,11 +15,9 @@ include::modules/cnf-image-based-upgrade-seed-image-config.adoc[leveloffset=+1] include::modules/cnf-image-based-upgrade-generate-seed-image.adoc[leveloffset=+1] -//// [role="_additional-resources"] .Additional resources -* xref:../../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image##cnf-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots] +* xref:../../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc#cnf-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots] -* xref:../../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image#ztp-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots when using GitOps ZTP] -//// \ No newline at end of file +* xref:../../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image#ztp-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots when using GitOps ZTP] \ No newline at end of file diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-install-operators.adoc b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-install-operators.adoc index 2e41b834822f..2a3118fc6c87 100644 --- a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-install-operators.adoc +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-install-operators.adoc @@ -12,7 +12,6 @@ To install the OADP Operator with the non-GitOps method, see _Additional resourc :FeatureName: The Lifecycle Agent -//// [role="_additional-resources"] .Additional resources @@ -23,7 +22,6 @@ To install the OADP Operator with the non-GitOps method, see _Additional resourc * xref:../../../backup_and_restore/application_backup_and_restore/backing_up_and_restoring/oadp-creating-backup-cr.adoc[Creating a Backup CR] * xref:../../../backup_and_restore/application_backup_and_restore/backing_up_and_restoring/restoring-applications.adoc#oadp-creating-restore-cr_restoring-applications[Creating a Restore CR] -//// include::modules/cnf-image-based-upgrade-installing-lifecycle-agent-using-cli.adoc[leveloffset=+1] diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-prep-resources.adoc b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-prep-resources.adoc index a60130e98657..5bde2a0bcb84 100644 --- a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-prep-resources.adoc +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-prep-resources.adoc @@ -16,11 +16,9 @@ include::modules/cnf-image-based-upgrade-prep-extramanifests.adoc[leveloffset=+1 include::modules/cnf-image-based-upgrade-prep-catalogsource.adoc[leveloffset=+1] -//// [role="_additional-resources"] .Additional resources * xref:../../../backup_and_restore/application_backup_and_restore/installing/about-installing-oadp.adoc[About installing OADP] -* xref:../../../edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc#cnf-image-based-upgrade-for-sno[Performing an image-based upgrade with Lifecycle Agent] -//// \ No newline at end of file +* xref:../../../edge_computing/image_based_upgrade/cnf-image-based-upgrade-base.adoc#cnf-image-based-upgrade-for-sno[Performing an image-based upgrade with Lifecycle Agent] \ No newline at end of file diff --git a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc index 7953653ac27a..9ccfba9b9122 100644 --- a/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc +++ b/edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc @@ -15,11 +15,9 @@ include::modules/ztp-image-based-upgrade-prep-oadp.adoc[leveloffset=+1] include::modules/ztp-image-based-upgrade-prep-label-extramanifests.adoc[leveloffset=+1] -//// [role="_additional-resources"] .Additional resources * xref:../../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc#ztp-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots when using GitOps ZTP] -* xref:../../../edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc#ztp-image-based-upgrade-for-sno[Performing an image-based upgrade with Lifecycle Agent and GitOps ZTP] -//// \ No newline at end of file +* xref:../../../edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc#ztp-image-based-upgrade-for-sno[Performing an image-based upgrade with Lifecycle Agent and GitOps ZTP] \ No newline at end of file diff --git a/edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc b/edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc index 28d3101878fc..3a483a2bc5e6 100644 --- a/edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc +++ b/edge_computing/image_based_upgrade/ztp-image-based-upgrade.adoc @@ -17,22 +17,20 @@ You update this CR to specify the image repository of the seed image and to move include::modules/ztp-image-based-upgrade-talm-prep.adoc[leveloffset=+1] -//// [role="_additional-resources"] .Additional resources * xref:../../edge_computing/ztp-preparing-the-hub-cluster.adoc#ztp-preparing-the-ztp-git-repository-ver-ind_ztp-preparing-the-hub-cluster[Preparing the GitOps ZTP site configuration repository for version independence] -* xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc[Preparing for the image-based upgrade for single-node OpenShift clusters] +* xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/ztp-image-based-upgrade-prep-resources.adoc#ztp-image-based-upgrade-prep-resources[Creating ConfigMap objects for the image-based upgrade with Lifecycle Agent using GitOps ZTP] * xref:../../edge_computing/image_based_upgrade/preparing_for_image_based_upgrade/cnf-image-based-upgrade-shared-container-image.adoc#ztp-image-based-upgrade-shared-container-directory_shared-container-directory[Configuring a shared container directory between ostree stateroots when using GitOps ZTP] * xref:../../backup_and_restore/application_backup_and_restore/installing/installing-oadp-ocs.adoc#oadp-about-backup-snapshot-locations_installing-oadp-ocs[About backup and snapshot locations and their secrets] -* xref:../../backup_and_restore/application_backup_and_restore/backing_up_and_restoring/oadp-creating-backup-cr.adoc[Creating a Backup CR] +* xref:../../backup_and_restore/application_backup_and_restore/backing_up_and_restoring/oadp-creating-backup-cr.adoc#oadp-creating-backup-cr-doc[Creating a Backup CR] * xref:../../backup_and_restore/application_backup_and_restore/backing_up_and_restoring/restoring-applications.adoc#oadp-creating-restore-cr_restoring-applications[Creating a Restore CR] -//// include::modules/ztp-image-based-upgrade-talm-upgrade.adoc[leveloffset=+1] From 6979fb2104ceac52475306cae6687857b56b4425 Mon Sep 17 00:00:00 2001 From: Alexandra Molnar Date: Tue, 18 Jun 2024 11:41:31 +0100 Subject: [PATCH 11/11] Update Installing Operators via GitOps --- ...stalling-lifecycle-agent-using-gitops.adoc | 55 +++++++++++++++++-- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/modules/ztp-image-based-upgrade-installing-lifecycle-agent-using-gitops.adoc b/modules/ztp-image-based-upgrade-installing-lifecycle-agent-using-gitops.adoc index 813958e4982b..fe00d085cc60 100644 --- a/modules/ztp-image-based-upgrade-installing-lifecycle-agent-using-gitops.adoc +++ b/modules/ztp-image-based-upgrade-installing-lifecycle-agent-using-gitops.adoc @@ -66,6 +66,8 @@ spec: source: redhat-operators sourceNamespace: openshift-marketplace installPlanApproval: Manual + status: + state: AtLatestKnown ---- .Example directory structure @@ -173,6 +175,36 @@ status: state: AtLatestKnown ---- +.OadpOperatorStatus.yaml +[source,yaml] +---- +apiVersion: operators.coreos.com/v1 +kind: Operator +metadata: + name: redhat-oadp-operator.openshift-adp + annotations: + ran.openshift.io/ztp-deploy-wave: "2" +status: + components: + refs: + - kind: Subscription + namespace: openshift-adp + conditions: + - type: CatalogSourcesUnhealthy + status: "False" + - kind: InstallPlan + namespace: openshift-adp + conditions: + - type: Installed + status: "True" + - kind: ClusterServiceVersion + namespace: openshift-adp + conditions: + - type: Succeeded + status: "True" + reason: InstallSucceeded +---- + .Example directory structure [source,terminal] ---- @@ -188,6 +220,7 @@ status: │ │ ├── OadpSubscriptionNS.yaml │ │ ├── OadpSubscriptionOperGroup.yaml │ │ ├── OadpSubscription.yaml +│ │ ├── OadpOperatorStatus.yaml ---- -- @@ -213,6 +246,8 @@ spec: policyName: "subscriptions-policy" - fileName: custom-crs/OadpSubscription.yaml policyName: "subscriptions-policy" + - fileName: custom-crs/OadpOperatorStatus.yaml + policyName: "subscriptions-policy" [...] ---- @@ -254,8 +289,8 @@ spec: key: cloud name: cloud-credentials objectStorage: - bucket: $bucketName - prefix: $prefixName + bucket: $bucketName <2> + prefix: $prefixName <2> status: conditions: - reason: Complete @@ -263,6 +298,7 @@ status: type: Reconciled ---- <1> The `spec.configuration.restic.enable` field must be set to `false` for an image-based upgrade because persistent volume contents are retained and reused after the upgrade. +<2> The bucket defines the bucket name that is created in S3 backend. The prefix defines the name of the subdirectory that will be automatically created in the bucket. The combination of bucket and prefix must be unique for each target cluster to avoid interference between them. To ensure a unique storage directory for each target cluster, you can use the {rh-rhacm} hub template function, for example, prefix: {{hub .ManagedClusterName hub}}. .OadpSecret.yaml [source,yaml] @@ -309,22 +345,31 @@ spec: mcp: "master" sourceFiles: ... - - fileName: OadpSecret.yaml + - fileName: custom-crs/OadpSecret.yaml policyName: "config-policy" data: cloud: <1> - - fileName: DataProtectionApplication.yaml + - fileName: custom-crs/DataProtectionApplication.yaml policyName: "config-policy" spec: backupLocations: - velero: + config: config: region: minio s3Url: <2> + profile: "default" + insecureSkipTLSVerify: "true" + s3ForcePathStyle: "true" + provider: aws + default: true + credential: + key: cloud + name: cloud-credentials objectStorage: bucket: <3> prefix: <3> - - fileName: OadpBackupStorageLocationStatus.yaml + - fileName: custom-crs/OadpBackupStorageLocationStatus.yaml policyName: "config-policy" ---- <1> Specify your credentials for your S3 storage backend.