4 changed files with 444 additions and 0 deletions
@ -0,0 +1,444 @@ |
|||
--- |
|||
title: "Installation et mise à jour d'un OpenShift en environnement déconnecté" |
|||
date: 2021-08-20T00:00:00+02:00 |
|||
opensource: |
|||
- OpenShift |
|||
topics: |
|||
- Containers |
|||
resources: |
|||
- '*.png' |
|||
- '*.svg' |
|||
--- |
|||
|
|||
Beaucoup de mes clients travaillent en environnement déconnecté. |
|||
C'est à dire que les environnements de production ne sont pas connecté à internet de manière directe: les flux entrants passent par un reverse proxy et les flux sortant sont souvent complètement interdits pour éviter l'exfiltration de données. |
|||
OpenShift peut être installé dans ces environnements déconnectés. |
|||
C'est même documenté par Red Hat. |
|||
La documentation pouvant être intimidante au premier abord, je propose ici un résumé "clé en main" de la marche à suivre. |
|||
|
|||
<!--more--> |
|||
|
|||
Dans cet article, nous installerons un OpenShift 4.7 et le mettrons à jour en 4.8 (dernière version disponible lors de l'écriture de cet article). |
|||
|
|||
Les étapes résumées ici s'appuient sur ces documentations : |
|||
|
|||
- [Mirroring images for a disconnected installation](https://docs.openshift.com/container-platform/4.8/installing/installing-mirroring-installation-images.html) |
|||
- [Using Operator Lifecycle Manager on restricted networks](https://docs.openshift.com/container-platform/4.8/operators/admin/olm-restricted-networks.html) |
|||
- [Updating a restricted network cluster](https://docs.openshift.com/container-platform/4.8/updating/updating-restricted-network-cluster.html) |
|||
- [Installing and configuring the OpenShift Update Service](https://docs.openshift.com/container-platform/4.7/updating/installing-update-service.html) |
|||
|
|||
Dans la suite de cet article, je pars du principe que la station de travail de l'administrateur (ou le serveur de rebond le cas échéant) est connecté à Internet. |
|||
Toutes les commandes sont exécutées depuis ce poste. |
|||
|
|||
Pour synchroniser les images, nous aurons besoin d'une registry docker privée, accessible depuis la station de travail de l'administrateur et depuis l'environnement de production. |
|||
Dans mon cas, c'est une simple instance [docker-distribution](https://docs.docker.com/registry/deploying/) déployée en conteneur. |
|||
|
|||
## Pré-requis |
|||
|
|||
Installer les outils ligne de commande d'OpenShift: **oc** et **opm**, ici en version 4.7. |
|||
|
|||
```sh |
|||
curl -s https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/ocp/stable-4.7/openshift-client-linux.tar.gz |sudo tar -zxv -C /usr/local/bin/ oc kubectl |
|||
curl -s https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/ocp/latest-4.7/opm-linux.tar.gz |sudo tar -zxv -C /usr/local/bin/ opm |
|||
``` |
|||
|
|||
Installer les outils habituels pour travailler avec les conteneurs: **skopeo**, **buildah** et **podman**. |
|||
|
|||
Installer **grpcurl**. |
|||
|
|||
```sh |
|||
curl -sL https://github.com/fullstorydev/grpcurl/releases/download/v1.8.1/grpcurl_1.8.1_linux_x86_64.tar.gz | tar -zxv -C /usr/local/bin grpcurl |
|||
``` |
|||
|
|||
Télécharger votre **pull secret** Red Hat depuis **cloud.redhat.com** et enregistrez le dans un fichier **rh-pull-secret.json**. |
|||
|
|||
Créer le pull secret permettant de s'authentifier sur votre registry docker privée. |
|||
Ma registry est **registry.itix.xyz** et je m'y authentifie avec l'utilisateur **admin** et le mot de passe **s3cr3t**. |
|||
|
|||
```sh |
|||
cat > my-pull-secret.json <<EOF |
|||
{ |
|||
"auths": { |
|||
"registry.itix.xyz": { |
|||
"auth": "$(echo -n 'admin:s3cr3t' | base64 -w0)", |
|||
"email": "nmasse@redhat.com" |
|||
} |
|||
} |
|||
} |
|||
EOF |
|||
``` |
|||
|
|||
Fusionner les deux pull secrets à l'aide de **jq**. |
|||
|
|||
```sh |
|||
jq -cs '.[0] * .[1]' rh-pull-secret.json my-pull-secret.json > pull-secret.json |
|||
``` |
|||
|
|||
## Installation d'un OpenShift 4.7 |
|||
|
|||
Dans l'exemple ci-dessous, je vais installer un OpenShift 4.7.10. |
|||
La liste de toutes les releases est disponible sur [quay.io](https://quay.io/repository/openshift-release-dev/ocp-release?tag=latest&tab=tags). |
|||
|
|||
Lancer la recopie des images de conteneur. |
|||
|
|||
```sh |
|||
OCP_RELEASE=4.7.10 |
|||
ARCHITECTURE=x86_64 |
|||
LOCAL_REGISTRY=registry.itix.xyz |
|||
LOCAL_REPOSITORY=openshift-mirror/ocp4 |
|||
LOCAL_SECRET_JSON=pull-secret.json |
|||
|
|||
oc adm release mirror -a ${LOCAL_SECRET_JSON} \ |
|||
--from=quay.io/openshift-release-dev/ocp-release:${OCP_RELEASE}-${ARCHITECTURE} \ |
|||
--to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \ |
|||
--to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}-release:${OCP_RELEASE}-${ARCHITECTURE}``` |
|||
``` |
|||
|
|||
Cette commande ira copier les images de la 4.7.10 vers **registry.itix.xyz/openshift-mirror/ocp4** (images des composants d'OpenShift) et vers **registry.itix.xyz/openshift-mirror/ocp4-release** (image "chapeau"). |
|||
|
|||
Elle affichera à l'écran, une fois terminé, une section **imageContentSources** qu'il faudra ajouter au fichier **install-config.yaml**. |
|||
Pensez à la copier/coller, nous en aurons besoin pour la suite. |
|||
|
|||
Exemple de sortie: |
|||
|
|||
``` |
|||
Success |
|||
Update image: registry.itix.xyz/openshift-mirror/ocp4-release:4.7.10-x86_64 |
|||
Mirror prefix: registry.itix.xyz/openshift-mirror/ocp4 |
|||
Mirror prefix: registry.itix.xyz/openshift-mirror/ocp4-release:4.7.10-x86_64 |
|||
|
|||
To use the new mirrored repository to install, add the following section to the install-config.yaml: |
|||
|
|||
imageContentSources: |
|||
- mirrors: |
|||
- registry.itix.xyz/openshift-mirror/ocp4 |
|||
- registry.itix.xyz/openshift-mirror/ocp4-release |
|||
source: quay.io/openshift-release-dev/ocp-release |
|||
- mirrors: |
|||
- registry.itix.xyz/openshift-mirror/ocp4 |
|||
- registry.itix.xyz/openshift-mirror/ocp4-release |
|||
source: quay.io/openshift-release-dev/ocp-v4.0-art-dev |
|||
|
|||
|
|||
To use the new mirrored repository for upgrades, use the following to create an ImageContentSourcePolicy: |
|||
|
|||
apiVersion: operator.openshift.io/v1alpha1 |
|||
kind: ImageContentSourcePolicy |
|||
metadata: |
|||
name: example |
|||
spec: |
|||
repositoryDigestMirrors: |
|||
- mirrors: |
|||
- registry.itix.xyz/openshift-mirror/ocp4 |
|||
- registry.itix.xyz/openshift-mirror/ocp4-release |
|||
source: quay.io/openshift-release-dev/ocp-release |
|||
- mirrors: |
|||
- registry.itix.xyz/openshift-mirror/ocp4 |
|||
- registry.itix.xyz/openshift-mirror/ocp4-release |
|||
source: quay.io/openshift-release-dev/ocp-v4.0-art-dev |
|||
``` |
|||
|
|||
Nous pouvons maintenant créer le binaire **openshift-install**, patché avec les bonnes références vers les images de la registry privée. |
|||
|
|||
```sh |
|||
oc adm release extract -a ${LOCAL_SECRET_JSON} --command=openshift-install "${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE}" |
|||
``` |
|||
|
|||
Pensez à stocker le fichier openshift-install généré dans un répertoire dédié et correctement nommé, afin de ne pas utiliser par mégarde une vieille version plus tard. |
|||
En effet, ce fichier openshift-install n'est valide que pour une install de **cette release** dans **cet environnement**. |
|||
|
|||
Créer le fichier install-config.yaml comme pour une installation connectée, en fonction de vos choix d'architecture et de votre environnement. |
|||
Ajouter la section **imageContentSources** comme indiqué ci-dessus. |
|||
|
|||
{{< highlight yaml "hl_lines=26-34" >}} |
|||
apiVersion: v1 |
|||
baseDomain: itix.xyz |
|||
compute: |
|||
- name: worker |
|||
hyperthreading: Enabled |
|||
replicas: 0 |
|||
controlPlane: |
|||
name: master |
|||
hyperthreading: Enabled |
|||
replicas: 3 |
|||
metadata: |
|||
name: secure |
|||
networking: |
|||
clusterNetworks: |
|||
- cidr: 10.128.0.0/14 |
|||
hostPrefix: 23 |
|||
serviceNetwork: |
|||
- 172.30.0.0/16 |
|||
networkType: OpenShiftSDN |
|||
platform: |
|||
none: {} |
|||
pullSecret: |
|||
'{"auths":{"cloud.openshift.com":{"auth":"REDACTED","email":"nmasse@redhat.com"},"quay.io":{"auth":"REDACTED","email":"nmasse@redhat.com"},"registry.connect.redhat.com":{"auth":"REDACTED","email":"nmasse@redhat.com"},"registry.redhat.io":{"auth":"REDACTED","email":"nmasse@redhat.com"},"registry.itix.xyz":{"auth":"REDACTED","email":"nmasse@redhat.com"}}}' |
|||
sshKey: | |
|||
ssh-ed25519 REDACTED nmasse@redhat.com |
|||
imageContentSources: |
|||
- mirrors: |
|||
- registry.itix.xyz/openshift-mirror/ocp4 |
|||
- registry.itix.xyz/openshift-mirror/ocp4-release |
|||
source: quay.io/openshift-release-dev/ocp-release |
|||
- mirrors: |
|||
- registry.itix.xyz/openshift-mirror/ocp4 |
|||
- registry.itix.xyz/openshift-mirror/ocp4-release |
|||
source: quay.io/openshift-release-dev/ocp-v4.0-art-dev |
|||
{{< / highlight >}} |
|||
|
|||
Puis lancer l'installation comme pour une installation connectée. |
|||
|
|||
```sh |
|||
./openshift-install create manifests --dir=. |
|||
./openshift-install create ignition-configs --dir=. |
|||
./openshift-install wait-for bootstrap-complete --dir=. |
|||
./openshift-install wait-for install-complete --dir=. |
|||
``` |
|||
|
|||
Notez l'utilisation du "./" devant la commande **openshift-install** pour utiliser la version générée précédemment. |
|||
|
|||
L'installation devrait normalement se terminer en 30 à 45 minutes. |
|||
|
|||
## Synchronisation des opérateurs en mode déconnecté |
|||
|
|||
Dans un environnement déconnecté, les opérateurs nécessitent une procédure spécifique pour fonctionner. |
|||
En effet, l'Operator Hub présent dans OpenShift récupère la liste des opérateurs disponibles depuis internet. |
|||
Les opérateurs sont téléchargés depuis internet et font appel à des images de conteneurs également téléchargées depuis internet. |
|||
|
|||
La procédure qui suit à pour objectif de sélectionner les opérateurs à rendre disponible dans l'environnement déconnecté et à répliquer localement toutes leurs images de conteneur ainsi que leurs dépendances. |
|||
|
|||
La première étape est dresser une liste de tous les opérateurs disponibles en standard. |
|||
|
|||
```sh |
|||
OCP_MAJOR_RELEASE=4.7 |
|||
|
|||
# Podman va s'authentifier avec le pull secret utilisé ci-dessus |
|||
mkdir -p ${XDG_RUNTIME_DIR}/containers |
|||
cp $LOCAL_SECRET_JSON ${XDG_RUNTIME_DIR}/containers/auth.json |
|||
|
|||
# On lance une copie de l'operator index |
|||
podman run -p 50051:50051 -d --rm --name rhoi registry.redhat.io/redhat/redhat-operator-index:v${OCP_MAJOR_RELEASE} |
|||
|
|||
# On sort la liste de tous les operateurs connus |
|||
grpcurl -plaintext localhost:50051 api.Registry/ListPackages | sed -E 's/.*"name": "([^"]+)".*/\1/; t; d' |
|||
|
|||
# On peut arrêter l'operator index |
|||
podman stop -l |
|||
``` |
|||
|
|||
Vous pouvez ensuite choisir dans cette liste les opérateurs que vous souhaitez répliquer localement. |
|||
Dans l'exemple ci-dessous, j'ai choisi d'en répliquer deux: l'opérateur OpenShift Pipelines et l'opérateur Cincinnati (je l'utilise dans la suite de l'article). |
|||
|
|||
```sh |
|||
# On construit un index contenant uniquement les opérateurs désirés |
|||
opm index prune -f registry.redhat.io/redhat/redhat-operator-index:v${OCP_MAJOR_RELEASE} -p openshift-pipelines-operator-rh,cincinnati-operator -t ${LOCAL_REGISTRY}/openshift-mirror/redhat-operator-index:v${OCP_MAJOR_RELEASE} |
|||
|
|||
# On le pousse dans notre registry locale |
|||
podman push ${LOCAL_REGISTRY}/openshift-mirror/redhat-operator-index:v${OCP_MAJOR_RELEASE} |
|||
|
|||
# On lance l'extraction des digests |
|||
oc adm catalog mirror -a ${LOCAL_SECRET_JSON} --manifests-only --index-filter-by-os='.*' ${LOCAL_REGISTRY}/openshift-mirror/redhat-operator-index:v${OCP_MAJOR_RELEASE} ${LOCAL_REGISTRY}/openshift-mirror |
|||
|
|||
# On lance la copie des images |
|||
oc image mirror --skip-multiple-scopes=true -a ${LOCAL_SECRET_JSON} --filter-by-os='.*' -f manifests-redhat-operator-index-*/mapping.txt |
|||
``` |
|||
|
|||
Une fois les images répliquées localement, il faut ensuite provisionner l'Operator Hub avec la liste des opérateurs disponibles localement. |
|||
|
|||
```sh |
|||
# On désactive les sources par défaut |
|||
oc patch OperatorHub cluster --type json -p '[{"op": "add", "path": "/spec/disableAllDefaultSources", "value": true}]' |
|||
|
|||
# Et on crée la content source policy |
|||
oc apply -f manifests-redhat-operator-index-*/imageContentSourcePolicy.yaml |
|||
|
|||
# Et enfin la catalog source |
|||
oc apply -f - <<EOF |
|||
apiVersion: operators.coreos.com/v1alpha1 |
|||
kind: CatalogSource |
|||
metadata: |
|||
name: local-catalog |
|||
namespace: openshift-marketplace |
|||
spec: |
|||
sourceType: grpc |
|||
image: ${LOCAL_REGISTRY}/openshift-mirror/redhat-operator-index:v${OCP_MAJOR_RELEASE} |
|||
displayName: Local Catalog |
|||
publisher: ITIX |
|||
updateStrategy: |
|||
registryPoll: |
|||
interval: 30m |
|||
EOF |
|||
``` |
|||
|
|||
## Installation de l'opérateur Cincinnati |
|||
|
|||
L'opérateur [Cincinnati](https://github.com/openshift/cincinnati), aussi appellé OpenShift Update Service permet à OpenShift de calculer un chemin de mise à jour supporté. |
|||
Par défaut OpenShift s'appuie sur l'OpenShift Update Service qui est sur internet. |
|||
Mais dans un environnement déconnecté, il est nécessaire de l'héberger localement pour bénéficier de cette fonctionnalité. |
|||
Il n'est toutefois pas nécessaire d'en exécuter une instance sur chaque cluster : une instance centrale peut suffire. |
|||
|
|||
Déployer l'opérateur Cincinnati. |
|||
|
|||
```sh |
|||
oc apply -f - <<EOF |
|||
apiVersion: v1 |
|||
kind: Namespace |
|||
metadata: |
|||
name: openshift-update-service |
|||
annotations: |
|||
openshift.io/node-selector: "" |
|||
labels: |
|||
openshift.io/cluster-monitoring: "true" |
|||
--- |
|||
apiVersion: operators.coreos.com/v1 |
|||
kind: OperatorGroup |
|||
metadata: |
|||
name: update-service-operator-group |
|||
namespace: openshift-update-service |
|||
spec: |
|||
targetNamespaces: |
|||
- openshift-update-service |
|||
--- |
|||
apiVersion: operators.coreos.com/v1alpha1 |
|||
kind: Subscription |
|||
metadata: |
|||
name: update-service-subscription |
|||
namespace: openshift-update-service |
|||
spec: |
|||
channel: v1 |
|||
installPlanApproval: "Automatic" |
|||
source: "local-catalog" |
|||
sourceNamespace: "openshift-marketplace" |
|||
name: "cincinnati-operator" |
|||
EOF |
|||
``` |
|||
|
|||
Créer un fichier **Dockerfile** avec le contenu suivant. |
|||
|
|||
{{< highlightFile "Dockerfile" "docker" "" >}} |
|||
FROM registry.access.redhat.com/ubi8/ubi:8.1 |
|||
RUN curl -L -o cincinnati-graph-data.tar.gz https://github.com/openshift/cincinnati-graph-data/archive/master.tar.gz |
|||
CMD exec /bin/bash -c "tar xvzf cincinnati-graph-data.tar.gz -C /var/lib/cincinnati/graph-data/ --strip-components=1" |
|||
{{< / highlightFile >}} |
|||
|
|||
Construire l'image correspondante et la pousser dans la registry privée. |
|||
|
|||
```sh |
|||
podman build -f ./Dockerfile -t ${LOCAL_REGISTRY}/openshift-mirror/graph-data:latest |
|||
podman push ${LOCAL_REGISTRY}/openshift-mirror/graph-data:latest |
|||
``` |
|||
|
|||
Cette image contient le graphe des chemins de mise à jour de toutes les versions d'OpenShift. |
|||
|
|||
Dans l'étape suivante, nous allons récupérer le certificat de l'Autorité de Certification de la registry privée et l'ajouter aux autorités de confiance. |
|||
Dans mon cas, le certificat de ma registry privée est signé par Let's Encrypt mais chez vous cela peut être différent. |
|||
|
|||
```sh |
|||
curl -Lo ca.crt https://letsencrypt.org/certs/isrgrootx1.pem |
|||
oc create configmap additional-trusted-ca -n openshift-config --from-file=updateservice-registry=ca.crt |
|||
oc patch image.config.openshift.io/cluster --type=merge -p '{"spec":{"additionalTrustedCA":{"name":"additional-trusted-ca"}}}' |
|||
``` |
|||
|
|||
Note: il est important de respecter le nom de la clé (**updateservice-registry**) dans la Config Map car c'est cette clé que cherche l'opérateur Cincinnati à l'installation. |
|||
|
|||
Déployer Cincinnati. |
|||
|
|||
```sh |
|||
oc apply -f - <<EOF |
|||
apiVersion: updateservice.operator.openshift.io/v1 |
|||
kind: UpdateService |
|||
metadata: |
|||
name: service |
|||
namespace: openshift-update-service |
|||
spec: |
|||
replicas: 1 |
|||
releases: ${LOCAL_REGISTRY}/openshift-mirror/ocp4-release |
|||
graphDataImage: ${LOCAL_REGISTRY}/openshift-mirror/graph-data:latest |
|||
EOF |
|||
``` |
|||
|
|||
Une fois déployé, patcher la configuration du cluster pour utiliser cette instance locale. |
|||
|
|||
```sh |
|||
POLICY_ENGINE_GRAPH_URI="$(oc -n openshift-update-service get -o jsonpath='{.status.policyEngineURI}/api/upgrades_info/v1/graph{"\n"}' updateservice service)" |
|||
oc patch clusterversion version -p "{\"spec\":{\"upstream\":\"${POLICY_ENGINE_GRAPH_URI}\"}}" --type merge |
|||
``` |
|||
|
|||
## Mise à jour en 4.8 |
|||
|
|||
Pour préparer la mise à jour, j'utilise le [Red Hat OpenShift Container Platform Update Graph](https://access.redhat.com/labs/ocpupgradegraph/update_path). |
|||
|
|||
{{< attachedFigure src="update-graph-1.png" title="Saisir la version source, la version cible et le canal de mise à jour." >}} |
|||
|
|||
Il m'a permis de découvrir que le channel **fast-4.8** me permet de passer de la 4.7.10 à la 4.8.5 avec une seule étape intermédiaire: la 4.7.24. |
|||
|
|||
{{< attachedFigure src="update-graph-2.png" title="En utilisant le canal fast-4.8, je peux passer de la 4.7.10 à la 4.7.24 à la 4.8.5." >}} |
|||
|
|||
L'outil génère aussi un graphe contenant toutes les versions disponibles et les chemins autorisés entre ces versions. |
|||
|
|||
{{< attachedFigure src="update-graph-3.png" title="Le graphe de mise à jour résultant." >}} |
|||
|
|||
Nous effectuerons donc une mise à jour en deux étapes: d'abord une mise à jour vers la 4.7.24, puis vers la 4.8.5. |
|||
|
|||
Première étape: passer sur le canal **fast-4.8**, qui est celui que j'ai choisi. |
|||
|
|||
```sh |
|||
oc patch clusterversion version --type merge -p '{"spec": {"channel": "fast-4.8"}}' |
|||
``` |
|||
|
|||
Ensuite, il faut télécharger et appliquer la clé publique permettant de valider les signatures des images de conteneur de la nouvelle version. |
|||
|
|||
```sh |
|||
OCP_RELEASE=4.7.24 |
|||
DIGEST="$(skopeo inspect docker://quay.io/openshift-release-dev/ocp-release:${OCP_RELEASE}-x86_64 | jq -r .Digest)" |
|||
DIGEST_ALGO="${DIGEST%%:*}" |
|||
DIGEST_ENCODED="${DIGEST#*:}" |
|||
SIGNATURE_BASE64="$(curl -s "https://mirror.openshift.com/pub/openshift-v4/signatures/openshift/release/${DIGEST_ALGO}=${DIGEST_ENCODED}/signature-1" | base64 -w0 && echo)" |
|||
oc apply -f - <<EOF |
|||
apiVersion: v1 |
|||
kind: ConfigMap |
|||
metadata: |
|||
name: release-image-${OCP_RELEASE} |
|||
namespace: openshift-config-managed |
|||
labels: |
|||
release.openshift.io/verification-signatures: "" |
|||
binaryData: |
|||
${DIGEST_ALGO}-${DIGEST_ENCODED}: ${SIGNATURE_BASE64} |
|||
EOF |
|||
``` |
|||
|
|||
Cette étape déclenche une reconfiguration des noeuds du cluster (noeud après noeud). |
|||
|
|||
```sh |
|||
oc get nodes -w |
|||
``` |
|||
|
|||
Attendez que tous les noeuds aient été reconfigurés. |
|||
|
|||
On peut ensuite lancer une recopie des images de conteneur de la nouvelle version (comme pour l'installation). |
|||
|
|||
```sh |
|||
oc adm release mirror -a ${LOCAL_SECRET_JSON} \ |
|||
--from=quay.io/openshift-release-dev/ocp-release:${OCP_RELEASE}-${ARCHITECTURE} \ |
|||
--to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \ |
|||
--to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}-release:${OCP_RELEASE}-${ARCHITECTURE} |
|||
``` |
|||
|
|||
Et lancer la mise à jour en tant que telle. |
|||
|
|||
```sh |
|||
oc adm upgrade --allow-explicit-upgrade --to-image ${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}-release@${DIGEST_ALGO}:${DIGEST_ENCODED} |
|||
``` |
|||
|
|||
Une fois le cluster mis à jour en 4.7.24, vous pouvez refaire la procédure de mise à jour vers la version 4.8.5. |
|||
|
|||
```sh |
|||
OCP_RELEASE=4.8.5 |
|||
... |
|||
``` |
|||
|
|||
## Conclusion |
|||
|
|||
Dans cet article nous avons installé un OpenShift 4.7, avons synchronisé les opérateurs, déployé l'OpenShift Update Service et enfin mis à jour OpenShift vers la version 4.8. |
|||
Tout ça dans un environnement déconnecté d'internet ! |
|||
|
After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 148 KiB |
Loading…
Reference in new issue