In un deployment multizona, le zone vengono aggiornate una alla volta e in modo indipendente l'una dall'altra. Non esiste un'orchestrazione globale degli upgrade tra le zone. Un IO deve eseguire un upgrade in ogni zona per l'organizzazione di cui vuole eseguire l'upgrade a una nuova versione. Di conseguenza, le organizzazioni in zone diverse possono utilizzare versioni diverse in un determinato momento.
L'ordine di upgrade descritto in questa pagina prevede l'upgrade dell'organizzazione principale e di tutte le organizzazioni tenant in una zona prima di passare a un'altra zona. Le risorse globali vengono aggiornate alla fine, dopo l'aggiornamento di tutte le zone.
Questa pagina descrive i passaggi per procedere con un upgrade air-gapped multizona di Google Distributed Cloud (GDC) fornendo i seguenti tipi di informazioni:
- Accesso richiesto e modi per ottenerlo.
- Gli strumenti di cui hai bisogno.
- Quali passaggi eseguire prima di eseguire un upgrade.
- Come e in quale sequenza eseguire gli upgrade per i vari componenti di Distributed Cloud.
Il seguente elenco definisce ciascuno dei componenti di un upgrade:
Versione di destinazione: utilizza la stessa versione di destinazione per tutte le zone.
Uno alla volta: esegui l'upgrade di una zona alla volta. Prima che venga attivato un upgrade in una zona, assicurati che in nessun'altra zona sia in corso un upgrade.
Risorse globali: definite come risorse Kubernetes di cui è stato eseguito il deployment su kube-apiserver globale, anziché risorse di zona che hanno una copia per zona. Le risorse globali seguono un ciclo di vita diverso. Tieni presente che devono essere aggiornati alla fine, una sola volta.
Preparazione
Gli URL vengono forniti per l'accesso al di fuori dell'ambiente isolato.
Prima di iniziare un upgrade, assicurati di disporre di quanto segue:
Il percorso del file
kubeconfigche hai ottenuto eseguendogdcloud auth loginnel cluster di amministrazione principale.I nuovi artefatti di rilascio, scaricati e trasferiti in modo sicuro sul tuo computer. Segui i passaggi descritti in Esegui il push degli artefatti nel registro dei container.
Una macchina host per l'esecuzione degli upgrade manuali, con un file
kubeconfigdel cluster di amministrazione root sulla macchina.Prima di iniziare l'upgrade, vengono risolti tutti i problemi noti relativi alla versione DA cui viene eseguito l'upgrade. Nello specifico, per l'upgrade dalla versione 1.13.1, assicurati che i seguenti problemi siano risolti:
Generare un report sulla conformità
Il report sulla conformità elenca le organizzazioni che:
- non sono più supportati
- mancano patch di sicurezza critiche
La generazione del report di conformità è un passaggio facoltativo e richiede un IO autenticato che disponga di organization-admin role. Per generare il report, esegui questo comando:
gdcloud system upgrade report-compliance
Per ulteriori informazioni sui requisiti di preparazione, consulta la sezione Prerequisiti.
Identity and Access Management
Prima di iniziare un upgrade, in ogni zona:
Ottieni un file kubeconfig eseguendo gdcloud auth login nel cluster di amministrazione principale e in tutti i cluster di amministrazione dell'organizzazione.
Segui le istruzioni nel runbook del processo di accesso e aumento dei privilegi IAM-R0005 per aggiungere:
ClusterRoleBindingcon cluster-adminClusterRolenel cluster di amministrazione principale di ogni zona- cluster di amministrazione dell'organizzazione in modo da ottenere l'accesso amministrativo temporaneo.
Metti in pausa gli upgrade delle risorse globali in tutte le zone
Utilizza il file kubeconfig ottenuto per sospendere tutti gli upgrade delle risorse globali in ogni zona.
# Pause upgrades to global root admin resources.
kubectl patch kubeapiserver global-root-admin -n global-kube-system -p='{"spec":{"deploymentPolicy":"LocalOnly"}}' --type=merge --kubeconfig=ROOT_ADMIN_KUBECONFIG
# Pause upgrades to global org admin resources.
kubectl patch kubeapiserver global-org-admin -n global-kube-system -p='{"spec":{"deploymentPolicy":"LocalOnly"}}' --type=merge --kubeconfig=ORG_MGMT_API_KUBECONFIG
Esegui l'upgrade dell'organizzazione principale globale
L'upgrade dell'organizzazione principale globale a livello generale include i seguenti passaggi:
Esegui l'upgrade dell'organizzazione principale in tutte le zone. Ogni zona viene aggiornata singolarmente.
Controlla se la zona attuale è la zona principale. Il seguente comando restituisce "true" nella zona primaria e non restituisce nulla nelle zone non primarie.
kubectl get ObjectStorageAdminNode -o jsonpath='{.items[*].status.isPrimary}' --kubeconfig=ROOT_ADMIN_KUBECONFIG; echoEsegui l'upgrade dei componenti che richiedono il coordinamento tra zone.
Esegui l'upgrade delle risorse di amministratore root globale.
Controllo pre-upgrade
Esegui l'upgrade delle zone una alla volta. Prima di avviare l'upgrade di un'organizzazione in una zona, connettiti a tutte le altre zone ed esegui il seguente comando per assicurarti che restituisca il valore ready in tutte le zone. Se una zona risulta non pronta, non procedere con l'upgrade. Controlla l'organizzazione in quella zona per diagnosticare il problema.
ORG_NAME=root
[[ $(kubectl --kubeconfig=ROOT_ADMIN_KUBECONFIG get org ${ORG_NAME} -n gpc-system -ojsonpath='{.status.conditions[?(@.type=="Ready")].status}') == 'True' ]] && echo ready || echo not ready
1. Scaricare e copiare il pacchetto di aggiornamento
Queste istruzioni descrivono come iniziare:
- Scarica un pacchetto di aggiornamento su un dispositivo accessibile a internet per copiarlo su un'unità USB.
- Copia il pacchetto di aggiornamento dall'unità USB all'ambiente isolato.
Per ulteriori informazioni, consulta Scaricare i file per scaricare i dettagli di una distribuzione Distributed Cloud e Trasferimento del download per informazioni sul dispositivo di archiviazione portatile che utilizzi per trasferire i file al tuo ambiente air-gap.
Collabora con il tuo punto di contatto Google per decidere se l'upgrade riguarda un deployment di Distributed Cloud gestito da un partner, quindi deve utilizzare i file di rilascio del modello del partner.
PARTNER_OPERATED="IS_PARTNER_OPERATED" if [[ ${PARTNER_OPERATED:?} == "true" ]]; then RELEASE_SUFFIX="_partner" export GCS_BUCKET=private-cloud-release-partner else RELEASE_SUFFIX="" export GCS_BUCKET=private-cloud-release fiScarica il pacchetto di aggiornamento sull'unità USB da un computer con accesso a internet. Utilizza i dettagli della versione e del digest forniti dal tuo punto di contatto Google.
- Esegui
gcloud auth loginper accedere al bucket Cloud Storage. Esegui lo script con
--skip-unzipper recuperare il pacchetto di aggiornamento e lo script di download nella directory corrente, ad esempio/home/download.VERSION=VERSION DOWNLOADER=gdch-downloader-prod${RELEASE_SUFFIX}-$VERSION.sh gcloud storage cp "gs://${GCS_BUCKET:-private-cloud-release}/$VERSION/$DOWNLOADER*" . PUBLIC_KEY=$(cat <<-PUBEND -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEn46iVSyFXsvuKLZ4dVOr2AqlXDnR 5cKztkpraexHDxn/ozq03EvrdkRmZkSACFfcaEFyitpraidgAx8sPjvzXQ== -----END PUBLIC KEY----- PUBEND ) echo "${PUBLIC_KEY}" > "key.pub" openssl dgst -sha256 -verify "key.pub" -signature "${DOWNLOADER}.sig" ${DOWNLOADER} && chmod +x $DOWNLOADER && ./$DOWNLOADER --skip-unzipSe esegui l'upgrade con i file di rilascio del modello partner, segui le istruzioni per preparare i pacchetti software per la distribuzione del modello partner.
- Esegui
Copia sia lo script di download sia la directory
gdchnell'unità USB.Copia l'aggiornamento sull'OCIT dall'unità USB. Inserisci i file in una posizione simile, ad esempio
/home/download/.Ridefinisci queste variabili nell'OCIT ed estrai l'aggiornamento:
cd /root VERSION=VERSION DOWNLOADER=gdch-downloader-prod${RELEASE_SUFFIX}-$VERSION.sh PUBLIC_KEY=$(cat <<-PUBEND -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEn46iVSyFXsvuKLZ4dVOr2AqlXDnR 5cKztkpraexHDxn/ozq03EvrdkRmZkSACFfcaEFyitpraidgAx8sPjvzXQ== -----END PUBLIC KEY----- PUBEND ) echo "${PUBLIC_KEY}" > "key.pub" openssl dgst -sha256 -verify "key.pub" -signature "${DOWNLOADER}.sig" ${DOWNLOADER} && chmod +x $DOWNLOADER && ./$DOWNLOADER --skip-downloadIl downloader avrà decompresso la release in
gdch/full-release-1.2.0-gdch.243(ad es./home/download/gdch/full-release-1.2.0-gdch.243). Assegna questa variabile al percorso completo:export ARTIFACTS_ROOT='/home/download/gdch/full-release-RELEASE_VERSION'-gdch.BUILD_NUMBER'
2. Configura l'upgrade di Artifact Registry
Per eseguire correttamente un upgrade, devi completare le seguenti operazioni:
Esegui il push degli artefatti nel container registry
Imposta
KUBECONFIGsul file kubeconfig per il cluster di amministrazione principale.export KUBECONFIG=ROOT_ADMIN_KUBECONFIGCrea il
ClusterRoleBindingsnecessario:kubectl create clusterrolebinding io-upgrade-admin --clusterrole=upgrade-admin-dc --user=USER_EMAIL kubectl create clusterrolebinding io-upgrade-debugger --clusterrole=upgrade-debugger --user=USER_EMAILCrea il
RoleBindingsnecessario:kubectl create rolebinding io-system-artifact-management-secrets-admin --role=system-artifact-management-secrets-admin --user=USER_EMAIL -n anthos-creds kubectl create rolebinding io-system-artifact-management-admin --role=system-artifact-management-admin --user=USER_EMAIL -n gpc-system kubectl create rolebinding io-dnssuffix-viewer --role=dnssuffix-viewer --user=USER_EMAIL -n gpc-systemCrea
RoleBindingsnecessari per eseguire il push del pacchetto OCI:kubectl create rolebinding infrastructure-operator-sar-harbor-admin --user=gdch-infra-operator-USER_EMAIL --role=sar-harbor-admin -n gpc-systemL'output è simile al seguente:
rolebinding.rbac.authorization.k8s.io/infrastructure-operator-sar-harbor-admin createdSegui le istruzioni riportate in Ridimensionare lo spazio di archiviazione di Artifact Registry per eseguire le seguenti operazioni:
- Controlla l'utilizzo dello spazio di archiviazione di Artifact Registry in un cluster di amministrazione e verifica che ci sia spazio sufficiente per gli artefatti che vuoi eseguire il push.
- Se devi aumentare lo spazio disponibile, segui i passaggi descritti in Ridimensionare lo spazio di archiviazione di Artifact Registry.
Configura le impostazioni di Docker:
cp ${ARTIFACTS_ROOT}/docker-credential-gdcloud /usr/binConfigura Docker in modo che consideri attendibile il bundle truststore.
REGISTRY=$(kubectl get harborcluster harbor -n harbor-system -o jsonpath='{.spec.externalURL}' 2>/dev/null); if [[ -z "$REGISTRY" ]]; then echo "Harbor external URL not found" >&2; exit 1; fi; HOST=$(echo "$REGISTRY" | sed 's#https://##'); if [[ -z "$HOST" ]]; then echo "Invalid registry URL" >&2; exit 1; fi; DIR="/etc/docker/certs.d/$HOST"; FILE="$DIR/ca.crt"; mkdir -p "$DIR"; chmod 755 "$DIR"; if [[ ! -f "$FILE" ]]; then CERT=$(kubectl get secret trust-store-internal-only -n istio-system -o jsonpath='{.data.ca\.crt}' 2>/dev/null); if [[ -z "$CERT" ]]; then echo "Certificate secret not found" >&2; exit 1; fi; echo "$CERT" | base64 -d > "$FILE"; chmod 644 "$FILE"; else echo "Certificate $FILE already exists"; fiCarica gli artefatti nel registro degli artefatti nel cluster di amministrazione principale:
export VERSION=VERSION export KUBECONFIG=KUBECONFIG_PATH export ARTIFACTS_ROOT=/home/download/gdch/full-release-VERSION export PACKAGE_VALIDATION_ROOT_CERT=PACKAGE_VALIDATION_ROOT_CERT_PATH ${ARTIFACTS_ROOT}/gdcloud auth configure-docker ${ARTIFACTS_ROOT}/gdcloud system container-registry load-oci ${ARTIFACTS_ROOT}/oci --pv-root-cert-path=PACKAGE_VALIDATION_ROOT_CERT_PATH --kubeconfig=KUBECONFIG_PATH --use-ip-port=true --show-progress=falseSostituisci quanto segue:
VERSION: la versione di rilascio di Distributed Cloud. Ad esempio,1.x.y-gdch.z.KUBECONFIG_PATH: il percorso del filekubeconfigche hai ottenuto eseguendogdcloud auth loginnel cluster di amministrazione principale.PACKAGE_VALIDATION_ROOT_CERT_PATH: il percorso del certificato radice di convalida del pacchetto. Devi utilizzare il percorso predefinito${ARTIFACTS_ROOT}/staging_root_ca_certificate.crt. L'inclusione di questo percorso convalida i certificati delle chiavi di rilascio utilizzati per la convalida dei pacchetti.
Se il comando è andato a buon fine, l'output finale sarà simile a questo esempio:
I0911 04:05:01.755927 3463529 monitor.go:94] Monitoring ManualDistribution 10.5.23.4-1.12.4.96-bg4ck, starting time: 04:05:01. │······· I0911 04:05:02.002637 3463529 monitor.go:100] [2/2] artifacts distributed and [0/0/0] inProgress/failed/stopped after 246.689693ms │······· I0911 04:05:02.002723 3463529 monitor.go:38] Monitoring DistributionPolicy 10.5.23.4-1.12.4.96-jv5p9, starting time: 04:05:02. │······· I0911 04:05:02.039545 3463529 monitor.go:44] Created after 36.820059ms. │······· I0911 04:05:02.039599 3463529 monitor.go:94] Monitoring ManualDistribution 10.5.23.4-1.12.4.96-jv5p9, starting time: 04:05:02. │······· I0911 04:05:02.045964 3463529 monitor.go:100] [3/3] artifacts distributed and [0/0/0] inProgress/failed/stopped after 6.360571ms │······· I0911 04:05:02.045997 3463529 monitor.go:38] Monitoring DistributionPolicy 10.5.23.4-1.12.4.96-bhckh, starting time: 04:05:02. │······· I0911 04:05:02.077418 3463529 monitor.go:44] Created after 31.408176ms. │······· I0911 04:05:02.077464 3463529 monitor.go:94] Monitoring ManualDistribution 10.5.23.4-1.12.4.96-bhckh, starting time: 04:05:02. │······· I0911 04:05:02.239086 3463529 monitor.go:100] [2/2] artifacts distributed and [0/0/0] inProgress/failed/stopped after 161.610475ms │······· I0911 04:05:02.239138 3463529 monitor.go:38] Monitoring DistributionPolicy 10.5.23.4-1.12.4.96-xvlbt, starting time: 04:05:02. │······· I0911 04:05:02.248366 3463529 monitor.go:44] Created after 9.220575ms. │······· I0911 04:05:02.248415 3463529 monitor.go:94] Monitoring ManualDistribution 10.5.23.4-1.12.4.96-xvlbt, starting time: 04:05:02. │······· I0911 04:05:02.532191 3463529 monitor.go:100] [1/1] artifacts distributed and [0/0/0] inProgress/failed/stopped after 283.756574ms │······· I0911 04:05:02.532236 3463529 monitor.go:38] Monitoring DistributionPolicy 10.5.23.4-1.12.4.96-7k4s4, starting time: 04:05:02. │······· I0911 04:05:02.544529 3463529 monitor.go:44] Created after 12.282657ms. │······· I0911 04:05:02.544579 3463529 monitor.go:94] Monitoring ManualDistribution 10.5.23.4-1.12.4.96-7k4s4, starting time: 04:05:02. │······· I0911 04:05:02.641252 3463529 monitor.go:100] [1/1] artifacts distributed and [0/0/0] inProgress/failed/stopped after 96.652179ms │······· I0911 04:05:02.641332 3463529 monitor.go:38] Monitoring DistributionPolicy 10.5.23.4-1.12.4.96-dpj7n, starting time: 04:05:02. │······· I0911 04:05:02.645509 3463529 monitor.go:44] Created after 4.169293ms. │······· I0911 04:05:02.645575 3463529 monitor.go:94] Monitoring ManualDistribution 10.5.23.4-1.12.4.96-dpj7n, starting time: 04:05:02. │······· I0911 04:05:02.839587 3463529 monitor.go:100] [3/3] artifacts distributed and [0/0/0] inProgress/failed/stopped after 194.004999ms │······· I0911 04:05:02.839639 3463529 monitor.go:38] Monitoring DistributionPolicy 10.5.23.4-1.12.4.96-fn94p, starting time: 04:05:02. │······· I0911 04:05:02.844001 3463529 monitor.go:44] Created after 4.361378ms. │······· I0911 04:05:02.844034 3463529 monitor.go:94] Monitoring ManualDistribution 10.5.23.4-1.12.4.96-fn94p, starting time: 04:05:02. │······· I0911 04:05:03.041615 3463529 monitor.go:100] [2/2] artifacts distributed and [0/0/0] inProgress/failed/stopped after 197.567981ms │······· I0911 04:05:03.041675 3463529 monitor.go:38] Monitoring DistributionPolicy 10.5.23.4-1.12.4.96-4cxxf, starting time: 04:05:03. │······· I0911 04:05:03.047192 3463529 monitor.go:44] Created after 5.499407ms. │······· I0911 04:05:03.047292 3463529 monitor.go:94] Monitoring ManualDistribution 10.5.23.4-1.12.4.96-4cxxf, starting time: 04:05:03. │······· I0911 04:05:03.241688 3463529 monitor.go:100] [76/76] artifacts distributed and [0/0/0] inProgress/failed/stopped after 194.395913msSe l'output non corrisponde a questo esempio, segui questi passaggi per risolvere i problemi più comuni:
- Se l'output include il messaggio
Package validation root certificate requires upgrade!, esegui la rotazione del certificato radice seguendo i passaggi descritti in Eseguire la rotazione del certificato di convalida del pacchetto. - Se
load-ocinon va a buon fine, esegui di nuovo l'operazione. Se l'errore persiste, controlla le altre soluzioni offerte in questo elenco. - Se l'output include il messaggio
Error: unable to create k8sclient: Unauthorized, devi eseguire nuovamente l'autenticazione. Ripeti il passaggio di preparazione per verificare il file kubeconfig o esegui il comando${ARTIFACTS_ROOT}/gdcloud auth logine riprova l'operazioneload-oci. - Se l'output include il messaggio
UNAUTHORIZED: unauthorized to access repository, non disponi delle autorizzazioni necessarie per eseguire il comandoload-oci. Riassegna questo problema per ottenere i ruoli necessari per eseguire questo comando oppure chiedi a un utente che dispone dei ruoli richiesti di eseguire questo comando per tuo conto.
Per l'upgrade con i file di rilascio del modello partner SOLO, segui le istruzioni per caricare i pacchetti software per la distribuzione del modello partner.
Verifica che l'oggetto
ReleaseMetadataper la nuova versione si trovi nel cluster di amministrazione principale:kubectl get releasemetadata.artifact.private.gdc.goog VERSIONSostituisci
VERSIONcon la versione di rilascio di Distributed Cloud. Ad esempio,1.x.y-gdch.z.Output di esempio:
NAME AGE 1.x.y-gdch.z 2mVerifica che la nuova versione sia presente nell'elenco degli upgrade disponibili per l'organizzazione principale da aggiornare:
ROOT_NAME=root kubectl get organization -n gpc-system ${ROOT_NAME} -ojsonpath='{.status.availableUpgrades}{"\n"}'Ad esempio, per
1.x.y-gdch.z, ci aspettiamo il seguente output:["1.x.y-gdch.z"]
Dopo l'upgrade dell'organizzazione principale a una nuova versione, questa diventa disponibile per gli upgrade per un'organizzazione tenant.
3. Esegui l'upgrade dell'organizzazione principale
3.1. Pre-upgrade
Imposta
KUBECONFIGsul file kubeconfig per il cluster di amministrazione principale.export KUBECONFIG=ROOT_ADMIN_KUBECONFIGCrea il
ClusterRoleBindingsnecessario:kubectl create clusterrolebinding io-organization-admin --clusterrole=organization-admin --user=USER_EMAILVerifica che l'organizzazione principale sia in stato integro, come indicato dalla risposta
True:kubectl get organization -n gpc-system root \ -ojsonpath='{.status.conditions[?(@.type=="Ready")].status}{"\n"}'Output di esempio:
TrueSegui le istruzioni del runbook HSM-P0003 per riavviare tutti gli HSM.
3.2. Eseguire upgrade automatici dell'organizzazione principale
L'upgrade deve essere sottoposto alla procedura IaC. L'upgrade viene attivato aggiornando il campo della versione nell'oggetto OrganizationZonalConfig corrispondente dell'organizzazione nella zona.
Aggiorna la versione nel file YAML
OrganizationZonalConfig. Elimina la sezionespec.capacities.workloadServersnel file, se presente.ORG_NAME=root ZONE=$(kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get controlplane cp -n mz-system -ojsonpath='{.spec.zone}') sed -i 's/version: .*$/version: VERSION/' IAC_REPO_PATH/iac/infrastructure/global/orgs/${ORG_NAME}/${ORG_NAME}-${ZONE}.yamlEsegui lo staging e il commit delle modifiche al file.
git add "IAC_REPO_PATH/iac/infrastructure" git commitCrea una richiesta di unione.
git checkout -b ${USERNAME1}-branch git -c http.sslVerify=false push -o merge_request.create origin ${USERNAME1}-branch
All'avvio dell'upgrade, viene creato un oggetto OrganizationUpgrade. Verifica che l'oggetto radice OrganizationUpgrade sia stato creato nel cluster di amministrazione radice nella zona.
kubectl get -n gpc-system organizationupgrade root -o yaml --kubeconfig ROOT_ADMIN_KUBECONFIG
Se non viene trovato OrganizationUpgrade, segui il runbook IAC-R0001 per la risoluzione dei problemi.
3.3. Controlli post-upgrade
Verifica i risultati dell'upgrade:
Controlla l'oggetto
Organizationper l'organizzazione principale. Verifica che la condizione di statoREADYsiaTrue:kubectl -n gpc-system get organization rootOutput di esempio:
NAME READY root TrueVerifica che
Organization.Status.Versionmostri la stringa esatta1.x.y-gdch.z:kubectl -n gpc-system get organization root -o jsonpath='{.status.version}{"\n"}'Output di esempio per la verifica:
1.13.3-gdch.5548
Controlla la presenza di errori nei sottocomponenti nell'organizzazione principale:
Controlla i sottocomponenti che mostrano lo stato
ReconciliationErroroReconciling. Indirizza kubeconfig aROOT_ADMIN_KUBECONFIG:export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig export CLUSTER_NAMESPACE=root echo "Subcomponents with failures" kubectl get subcomponent -n ${CLUSTER_NAMESPACE} -o json | jq -r '.items[] | select(.status.conditions[]?.reason == "ReconciliationError") | select(.status.featureDisabled != true) | "Sub-Component: \(.metadata.name) - \(.status.conditions[]?.message)"' echo "Subcomponents still reconciling" kubectl get subcomponent -n ${CLUSTER_NAMESPACE} -o json | jq -r '.items[] | select(.status.conditions[]?.reason == "Reconciling") | select(.status.featureDisabled != true) | select( "\(.status)" | contains("PreinstallPending") | not) | "Sub-Component: \(.metadata.name) - \(.status.conditions[]?.message)"'Per gli errori, controlla le note di rilascio e i problemi noti per una soluzione alternativa , altrimenti contatta Distributed Cloud per la risoluzione dei problemi.
Se il controllo preflight o postflight è stato ignorato, rimuovi le annotazioni al termine dell'upgrade:
Esempi:
export KUBECONFIG=ROOT_ADMIN_KUBECONFIG kubectl annotate -n gpc-system organization ORG_NAME \ upgrade.private.gdc.goog/skip-preflight-check-export KUBECONFIG=ROOT_ADMIN_KUBECONFIG kubectl annotate -n gpc-system organization ORG_NAME \ upgrade.private.gdc.goog/skip-postflight-check-
Completa l'upgrade dell'organizzazione principale in tutte le zone
Una volta completato l'upgrade in una zona, ti consigliamo di verificare che la zona funzioni ancora correttamente prima di procedere con l'upgrade della zona successiva.
Ripeti i passaggi da 1 a 3 per l'organizzazione principale nelle altre zone. Quando tutte le zone hanno eseguito l'upgrade dell'organizzazione principale, procedi con i passaggi successivi.
4. Esegui l'upgrade delle risorse globali
Le risorse globali devono trovarsi nella versione più bassa di tutte le zone. Avvia la procedura di upgrade delle risorse globali connettendoti alla zona di ancoraggio ed eseguendo i seguenti comandi.
# Annotate appropriate versions for all the operable components.
MAP=$(kubectl get kubeapiserver root-admin -n root -ojsonpath='{.metadata.annotations}' --kubeconfig ROOT_ADMIN_KUBECONFIG | jq -r 'to_entries | map("\(.key) \(.value)") | .[] | select(startswith("lcm.private.gdc.goog/oc-version-"))')
echo "${MAP}" | while read KV; do
SPLIT=(${KV}); KEY=${SPLIT[0]}; VALUE=${SPLIT[1]}
echo "Annotating global KubeAPIServer with ${KEY}: ${VALUE}"
kubectl annotate kubeapiserver global-root-admin -n global-kube-system --overwrite ${KEY}=${VALUE} --kubeconfig ROOT_ADMIN_KUBECONFIG
done
# Trigger the global resource upgrade on global root admin.
kubectl annotate kubeapiserver global-root-admin -n global-kube-system --overwrite lcm.private.gdc.goog/paused-remote=false --kubeconfig ROOT_ADMIN_KUBECONFIG
kubectl patch kubeapiserver global-root-admin -n global-kube-system -p='{"spec":{"deploymentPolicy":"AllowAll"}}' --type=merge --kubeconfig ROOT_ADMIN_KUBECONFIG
L'operazione potrebbe richiedere alcuni minuti. Verifica il completamento degli upgrade delle risorse globali eseguendo i seguenti comandi. Il comando non deve segnalare alcun errore.
# Verify that Components are all successfully rolled out on global root admin.
echo "${MAP}" | while read KV; do
SPLIT=(${KV}); VALUE=${SPLIT[1]}; OC=$(echo ${VALUE} | cut -d- -f1)
[[ -n ${OC} ]] || continue
ROLLOUT=$(kubectl get componentrollout ${OC} -n global-kube-system -o json --ignore-not-found --kubeconfig ROOT_ADMIN_KUBECONFIG)
[[ -n ${ROLLOUT} ]] || continue
if [[ $(echo ${ROLLOUT} | jq -r '.spec.componentRef.name') != ${VALUE} ]] ; then
echo "${OC} rollout trigger failed"; continue
fi
if [[ $(echo ${ROLLOUT} | jq -r '.status.allSubcomponentsReady') != 'true' ]] ; then
echo "${OC} rollout completion failed. Use 'kubectl describe componentrollout ${OC} -n global-kube-system --kubeconfig ROOT_ADMIN_KUBECONFIG' to check for error messages."
fi
done && echo "Global component rollout check finished."
5. Upgrade dei componenti tra zone
In un universo multizona GDC, determinati componenti operativi richiedono il coordinamento tra le zone per completare gli upgrade.
In questo passaggio viene eseguito l'upgrade dei seguenti componenti operabili.
| Ambito | Componenti azionabili |
|---|---|
| Infrastruttura | IAC |
| Infrastruttura | SIEM |
Per eseguire l'upgrade del componente operabile IAC, segui il runbook IAC-R0016.
Per eseguire l'upgrade del componente SIEM utilizzabile, segui il runbook SIEM-G0008.
6. Upgrade manuale per la subnet Anycast
Esegui questo script per aggiungere le etichette necessarie alle subnet anycast nel server API root globale:
#!/bin/bash
# Description:
# This script ensures that specific Subnet resources in Kubernetes have the
# correct label applied. This is necessary for anycast features to function correctly.
#
# The script is idempotent and can be run multiple times safely.
# It requires the path to a valid global root kubeconfig file as a command-line argument.
# --- Configuration ---
set -o nounset
# The names of the Subnet resources to update.
readonly SUBNET_NAMES=(
"infra-vpc-anycast-cidr"
"data-global-anycast-cidr"
"admin-global-anycast-cidr"
)
# The label that will be applied to the subnets.
readonly LABEL_KEY="ipam.gdc.goog/usage"
readonly LABEL_VALUE="global-anycast-root-range"
# The Kubernetes resource type for the subnets.
readonly SUBNET_RESOURCE_TYPE="subnets"
# Timeout for kubectl commands in seconds.
readonly KUBECTL_TIMEOUT="30s"
log_error() {
echo "[ERROR] $(date +'%Y-%m-%dT%H:%M:%S%z'): $*" >&2
}
main() {
# --- Argument Validation ---
if [[ $# -ne 1 ]]; then
echo "Usage: $0 <path-to-kubeconfig-file>"
echo "Example: $0 /root/release/root-admin/global-root-admin-kubeconfig"
exit 1
fi
local KUBECONFIG_PATH="$1"
if [[ ! -f "${KUBECONFIG_PATH}" ]]; then
log_error "Kubeconfig file not found at: ${KUBECONFIG_PATH}"
exit 1
fi
if ! command -v kubectl &> /dev/null; then
log_error "kubectl command not found. Please ensure it is installed and in your system's PATH."
exit 1
fi
if ! command -v timeout &> /dev/null; then
log_error "timeout command not found. Please ensure 'coreutils' is installed."
exit 1
fi
if ! command -v jq &> /dev/null; then
log_error "jq command not found. Please ensure it is installed and in your system's PATH."
exit 1
fi
echo "Starting Subnet labeling process using kubeconfig: ${KUBECONFIG_PATH}"
# --- Pre-flight Check and Data Fetch ---
echo "Verifying access and fetching all Subnet resources (timeout in ${KUBECTL_TIMEOUT})..."
local all_subnets_json
if ! all_subnets_json=$(timeout "${KUBECTL_TIMEOUT}" kubectl get --kubeconfig="${KUBECONFIG_PATH}" "${SUBNET_RESOURCE_TYPE}" --all-namespaces -o json 2>/dev/null); then
log_error "Failed to list Subnet resources. The command timed out or returned an error. Please check cluster connectivity and permissions."
exit 1
fi
if [[ -z "${all_subnets_json}" ]] || [[ $(jq '.items | length' <<< "${all_subnets_json}") -eq 0 ]]; then
echo "No subnet resources found in the cluster. Exiting."
exit 0
fi
echo "Access verified. Processing subnets..."
local processed_count=0
local found_count=0
local subnet_regex
subnet_regex=$(printf "|%s" "${SUBNET_NAMES[@]}")
subnet_regex="^(${subnet_regex:1})$"
# jq query to output: namespace name label_value (or null)
echo "${all_subnets_json}" | jq -r ".items[] | [.metadata.namespace, .metadata.name, (.metadata.labels | .[\"${LABEL_KEY}\"] // \"\")] | @tsv" |
while IFS=$'\t' read -r namespace name current_value; do
if [[ -z "${name}" ]]; then continue; fi
if [[ ! "${name}" =~ ${subnet_regex} ]]; then
continue
fi
((found_count++))
echo "Found target subnet: '${name}' in namespace '${namespace}'"
if [[ "${current_value}" == "${LABEL_VALUE}" ]]; then
echo " - Subnet already has the correct label. Skipping."
((processed_count++))
continue
fi
echo " - Applying label '${LABEL_KEY}=${LABEL_VALUE}'..."
if ! timeout "${KUBECTL_TIMEOUT}" kubectl label --kubeconfig="${KUBECONFIG_PATH}" --namespace="${namespace}" "${SUBNET_RESOURCE_TYPE}" "${name}" "${LABEL_KEY}=${LABEL_VALUE}" --overwrite > /dev/null; then
log_error "Failed to apply label to subnet '${name}' in namespace '${namespace}'. The command timed out or returned an error."
else
echo " - Successfully labeled subnet."
((processed_count++))
fi
done
# --- Final Summary ---
echo "---"
if [[ ${found_count} -eq 0 ]]; then
echo "No target anycast subnets were found in the cluster."
else
echo "Finished processing. Found ${found_count} and validated ${processed_count} target subnet(s)."
fi
echo "Subnet labeling process completed."
}
# Execute the main function with command-line arguments.
main "$@"
Dopo l'esecuzione corretta dello script, ripristina la soluzione alternativa manuale anycast se è stata applicata in precedenza.
7. Upgrade manuale per SyncServer
In questo passaggio viene eseguito l'upgrade dei seguenti componenti operabili.
| Ambito | Componenti azionabili |
|---|---|
| Infrastruttura | NTP |
Questo upgrade del firmware non ha dipendenze da altri passaggi e può essere eseguito in qualsiasi momento.
Il cluster ha un solo SyncServer, quindi non può operare in modalità ad alta disponibilità. L'upgrade causerà l'indisponibilità di SyncServer per un periodo di tempo. Il cluster continuerà a tenere il tempo utilizzando i propri orologi meno precisi, il che non avrà effetti evidenti.
È consigliabile completare questa procedura in una sola volta (non lasciarla durante la notte o nel fine settimana) per evitare la deriva temporale.
7.1. Procedura di upgrade di SyncServer
I seguenti comandi devono essere eseguiti dalla directory di release del pacchetto di aggiornamento estratto.
Individua il firmware più recente da estrarre:
${ARTIFACTS_ROOT}/gdcloud artifacts tree ${ARTIFACTS_ROOT}/oci/ | grep syncserver | grep -v .sig$Il nome file contiene la versione del firmware.
Output di esempio:
│ ├── gdch-syncserver-firmware/syncserver:5.1.2Copia solo i nomi dei file e assegnali a queste variabili:
export SYNCSERVER_VERSION=syncserver:5.1.2Estrai il firmware dall'immagine OCI:
${ARTIFACTS_ROOT}/gdcloud artifacts extract ${ARTIFACTS_ROOT}/oci syncserver_firmware --image-name=gdch-syncserver-firmware/${SYNCSERVER_VERSION:?}Estrai il firmware:
tar -xvzf syncserver_firmware/gdch-syncserver-firmware/syncserver.tar.gzNella directory di output devi vedere un file
*.date un file*updater.zip.Segui il runbook NTP-P0002 - Accesso all'interfaccia utente di SyncServer.
Vai a Guida -> Informazioni -> Versione software. Se il software installato è uguale o successivo al firmware fornito, il firmware non deve essere aggiornato e i passaggi successivi possono essere saltati.
Vai ad Amministrazione -> Upgrade nell'interfaccia utente di SyncServer. Carica
syncserver_s650_license.datinAuthorization Fileesyncserver_s650_updater.zipinUpgrade File. Poi fai clic su Installa.

Eseguire l'upgrade di un'organizzazione tenant globale
L'upgrade di un'organizzazione tenant globale a livello generale include i seguenti passaggi:
Esegui l'upgrade dell'organizzazione tenant in tutte le zone. Ogni zona viene aggiornata singolarmente.
Controlla se la zona attuale è la zona principale. Il seguente comando restituisce "true" nella zona primaria e non restituisce nulla nelle zone non primarie.
kubectl get ObjectStorageAdminNode -o jsonpath='{.items[*].status.isPrimary}' --kubeconfig=ROOT_ADMIN_KUBECONFIG; echoEsegui l'upgrade delle risorse dell'organizzazione tenant globale.
Controllo pre-upgrade
Esegui l'upgrade delle zone una alla volta. Prima di avviare l'upgrade di un'organizzazione in una zona, connettiti a tutte le altre zone ed esegui il seguente comando per assicurarti che restituisca il valore ready in tutte le zone. Se una zona risulta non pronta, non procedere con l'upgrade. Controlla l'organizzazione in quella zona per diagnosticare il problema.
ORG_NAME=ORG_NAME
[[ $(kubectl --kubeconfig=ROOT_ADMIN_KUBECONFIG get org ${ORG_NAME} -n gpc-system -ojsonpath='{.status.conditions[?(@.type=="Ready")].status}') == 'True' ]] && echo ready || echo not ready
Assicurati che tutti i cluster siano in esecuzione e che tutti i pool di nodi siano nello stato pronto. In caso contrario, correggili prima di iniziare l'upgrade.
ORG_NAME=ORG_NAME
kubectl get nodepools -n ${ORG_NAME} --kubeconfig ROOT_ADMIN_KUBECONFIG -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,READY:.status.conditions[?(@.type=="Ready")].status'
# Example output
# NAMESPACE NAME READY
# org1 admin-control-plane-node-pool True
# org1 data-plane-pool-o2-standard1-96-gdc-metal True
kubectl get cluster -n mks-system --kubeconfig ORG_MGMT_API_KUBECONFIG
# Example output
# NAME STATE K8S VERSION
# g-org1-perimeter Running 1.30.6-gke.300
# g-org1-shared-service Running 1.30.6-gke.300
kubectl get nodepool -A --kubeconfig ORG_INFRA_KUBECONFIG -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,READY:.status.conditions[?(@.type=="Ready")].status'
# Example output
# NAMESPACE NAME READY
# g-org1-perimeter-cluster control-plane-node-pool True
# g-org1-perimeter-cluster perimeter-admin-node-pool True
# g-org1-perimeter-cluster perimeter-data-node-pool True
# g-org1-shared-service-cluster control-plane-node-pool True
# g-org1-shared-service-cluster dbs-billing-system-billing-dbcluster-n2-standard-4-gdc True
# g-org1-shared-service-cluster shared-service-default-worker True
1. Eseguire l'upgrade di un'organizzazione tenant
Questo passaggio esegue l'upgrade della versione di Kubernetes, degli addon e dei componenti operabili sui cluster del management plane in un'organizzazione tenant: cluster org-admin, di sistema e di servizio.
La durata complessiva dell'upgrade dipende dal numero di fasi dell'upgrade. L'upgrade automatico dell'organizzazione tenant può essere interruttivo e richiede un periodo di manutenzione.
1.1. preparazione
Per configurare i periodi di manutenzione, segui la procedura descritta in Configurare i periodi di manutenzione per l'upgrade dell'organizzazione tenant.
Le istruzioni per avviare l'upgrade di un'organizzazione tenant vengono fornite per l'utilizzo dei comandi
kubectl CLI o dei comandi Infrastructure as Code (IaC). Per utilizzare
i comandi IaC, configura prima IaC:
- Configurazione di Infrastructure as Code (IaC).
Configura l'infrastruttura come codice.
Per utilizzare nomos per verificare lo stato come riferimento nei passaggi basati su IaC come opzione, devi aver installato lo strumento a riga di comando nomos. Per ottenere le istruzioni di installazione e utilizzo di nomos, visita
https://cloud.google.com/anthos-config-management/docs/how-to/nomos-commandda un computer con accesso a internet.
IaC
Imposta il clusterrolebinding prima di iniziare l'upgrade dell'organizzazione tenant utilizzando IAC
- Vai alla directory iac/infrastructure/zonal/zones/ZONE_NAME/{ORG}.
- Vai alla directory IO già creata. Se la directory non esiste, creane una nuova.
Aggiungi un file YAML per assegnare il ruolo del cluster
io-organization-adminall'IO. Ad esempio:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: iac-binding-$USER-io-organization-admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: io-organization-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: USER_EMAILAggiorna
kustomatization.yamlper includere il nuovo file creato. Se ilkustomatization.yamlnon esiste, crea un nuovo file:kind: Kustomization metadata: name: org-1-admin-kustomization resources: - FILE_NAME.yamlInvia le modifiche in IAC
kubectl
Imposta clusterrolebinding prima di avviare l'upgrade dell'organizzazione tenant utilizzando kubectl
Imposta
KUBECONFIGsul file kubeconfig per il cluster di amministrazione principale.export KUBECONFIG=ROOT_ADMIN_KUBECONFIG`Crea il
ClusterRoleBindingsnecessario:kubectl create clusterrolebinding io-organization-admin --clusterrole=organization-admin --user=USER_EMAIL`Prima di completare l'upgrade da una versione precedente di Distributed Cloud alla versione 1.13.x+, segui le istruzioni del runbook BIL-R0014 per generare manualmente una fattura per i costi di questo mese dall'inizio del mese all'inizio della data odierna. Perderai i dati di costo creati durante la procedura di upgrade dell'organizzazione Distributed Cloud.
1.2. Avvia l'upgrade
L'upgrade dell'organizzazione tenant viene attivato anche tramite IaC aggiornando il campo della versione nell'oggetto OrganizationZonalConfig corrispondente dell'organizzazione nella zona. Di seguito sono riportati i dettagli:
Aggiorna la versione nel file YAML
OrganizationZonalConfig.ORG_NAME=ORG_NAME ZONE=$(kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get controlplane cp -n mz-system -ojsonpath='{.spec.zone}') sed -i 's/version: .*$/version: VERSION/' IAC_REPO_PATH/iac/infrastructure/global/orgs/root/${ORG_NAME}-${ZONE}.yamlEsegui lo staging e il commit delle modifiche al file.
git add "IAC_REPO_PATH/iac/infrastructure" git commitCrea una richiesta di unione.
git checkout -b ${USERNAME1}-branch git -c http.sslVerify=false push -o merge_request.create origin ${USERNAME1}-branch
Se viene avviato l'upgrade, viene creato un oggetto OrganizationUpgrade. Verifica che l'oggetto OrganizationUpgrade sia stato creato nel cluster di amministrazione principale nella zona.
kubectl get -n gpc-system organizationupgrade ORG_NAME -o yaml --kubeconfig ROOT_ADMIN_KUBECONFIG
Se non viene trovato OrganizationUpgrade, segui il runbook IAC-R0001 per la risoluzione dei problemi.
1.3. Esegui l'upgrade
L'upgrade viene eseguito quando ha un
timeWindowche rientra nel periodo di manutenzione specificato da un utente amministratore, chiamato anche PA. Visualizza l'timeWindowprogrammato:kubectl -n gpc-system get organizationupgrade ORG_NAME -o yamlDi seguito è riportata una risposta tipica al comando precedente:
apiVersion: upgrade.private.gdc.goog/v1alpha1 kind: OrganizationUpgrade metadata: creationTimestamp: "2022-08-22T01:09:03Z" generation: 1 name: org-1 namespace: gpc-system ownerReferences: - apiVersion: resourcemanager.gdc.goog/v1alpha1 blockOwnerDeletion: true controller: true kind: Organization name: org-1 uid: 6998cfc1-bee4-4f6d-baf2-9c0a90ef93bb resourceVersion: "1214182" uid: 1affc1df-b9ac-4343-8e61-18736781a990 spec: currentVersion: 1.8.0-gdch.476 organizationRef: name: org-1 targetVersion: 1.8.1-gdch.0 timeWindow: end: "2022-08-28T04:00:00Z" start: "2022-08-28T00:00:00Z"Nell'esempio precedente, la pianificazione dell'upgrade a
1.8.1-gdch.0è tra"2022-08-28T00:00:00Z"e"2022-08-28T04:00:00Z".All'avvio dell'upgrade, viene creato un oggetto
OrganizationUpgrade, mostrato comekind: OrganizationUpgradenell'esempio di output precedente.kind: OrganizationUpgradeMonitora lo stato generale dell'upgrade utilizzando l'oggetto di upgrade corrispondente, aggiungendo il comando del passaggio 1 con
-w. Ad esempio, per eseguire query continue su ORG_NAME per lo stato dell'upgrade, esegui il comando seguente:export KUBECONFIG=ROOT_ADMIN_KUBECONFIG kubectl get -n gpc-system organizationupgrade ORG_NAME -o yaml -wLe fasi dell'upgrade e il relativo stato possono essere visualizzati utilizzando quanto segue:
export KUBECONFIG=ROOT_ADMIN_KUBECONFIG kubectl get -n gpc-system organizationupgrade ORG_NAME -o jsonpath='{.status.conditions}' | \ jq -r '["Stage", "Status", "Reason", "Message"], ["---", "---", "---", "---"], (.[] | [.type, .status, .reason, .message]) | @tsv' | column -ts $'\t'La fase
Succeededsi riferisce allo stato generale dell'upgrade. La faseExpiredviene utilizzata per indicare che l'upgrade è successivo all'ora pianificata originale. Tutte le altre fasi si riferiscono ai passaggi dell'upgrade in corso. StatoTruesi riferisce ai passaggi completati, mentre StatoUnknownsi riferisce al passaggio attuale dell'upgrade.Se un controllo preflight non è riuscito e hai la certezza che si tratti di un falso positivo, esegui l'override e salta le opzioni di controllo preflight:
export KUBECONFIG=ROOT_ADMIN_KUBECONFIG kubectl annotate -n gpc-system organization ORG_NAME \ upgrade.private.gdc.goog/skip-preflight-check=okSe un controllo post-volo non è andato a buon fine e sei certo che si tratti di un falso positivo, esegui l'override e salta i controlli post-volo:
export KUBECONFIG=ROOT_ADMIN_KUBECONFIG kubectl annotate -n gpc-system organization ORG_NAME \ upgrade.private.gdc.goog/skip-postflight-check=okSe IAC è stato utilizzato per l'upgrade dell'organizzazione tenant e lo stato
organizationupgrademostra Riuscito eOrganizationper l'organizzazione tenant non è nello stato Pronto, applica la seguente soluzione alternativa.Aggiungi questa annotazione:
configmanagement.gke.io/managed: disabledusing IAC all'organizzazione. Il monitoraggio dello stato diOrganizationè in stato Pronto.L'upgrade dell'organizzazione dovrebbe ora procedere alla fase successiva e lo stato del servizio o del nodo sarà completato:
Last Transition Time: 2024-08-27T22:44:09Z Message: observed the following reason: [JobRunning] Observed Generation: 614 Reason: Complete Status: True Type: service/NodeL'avanzamento dell'upgrade dell'organizzazione può richiedere 15 minuti.
1.4. Controlli post-upgrade
Controlla l'oggetto
Organizationper l'organizzazione. La condizioneREADYdeve essere visualizzata comeTrue.kubectl -n gpc-system get organization ORG_NAMEOutput di esempio:
NAME READY org-1 TrueControlla
Organization.Status.Version. Deve mostrare la stringa esatta della versione di destinazione:kubectl -n gpc-system get organization ORG_NAME -o jsonpath='{.status.version}{"\n"}'Output di esempio:
1.13.3-gdch.5548Per ripristinare l'annotazione in modo da ignorare i periodi di manutenzione:
kubectl annotate organization ORG_NAME -n=gpc-system \ "upgrade.private.gdc.goog/ignore-maintenance-window-" \ --kubeconfig=ROOT_ADMIN_KUBECONFIGControlla la presenza di errori nei sottocomponenti nell'organizzazione tenant aggiornata :
Controlla i sottocomponenti che mostrano lo stato
ReconciliationErroroReconciling. Indirizza kubeconfig aORG_MGMT_API_KUBECONFIG:export KUBECONFIG=ORG_MGMT_API_KUBECONFIG echo "Subcomponents with failures" kubectl get subcomponent -A -o json | jq -r '.items[] | select(.status.conditions[]?.reason == "ReconciliationError") | "Sub-Component: \(.metadata.name) - \(.status.conditions[]?.message)"' echo "Subcomponents still reconciling" kubectl get subcomponent -A -o json | jq -r '.items[] | select(.status.conditions[]?.reason == "Reconciling") | select( "\(.status)" | contains("PreinstallPending") | not) | "Sub-Component: \(.metadata.name) - \(.status.conditions[]?.message)"'Per gli errori, consulta le note di rilascio e i problemi noti per una soluzione alternativa, altrimenti contatta Distributed Cloud per la risoluzione dei problemi.
Se il controllo preflight o postflight è stato ignorato, rimuovi le annotazioni al termine dell'upgrade:
Esempi:
export KUBECONFIG=ROOT_ADMIN_KUBECONFIG kubectl annotate -n gpc-system organization ORG_NAME \ upgrade.private.gdc.goog/skip-preflight-check-export KUBECONFIG=ROOT_ADMIN_KUBECONFIG kubectl annotate -n gpc-system organization ORG_NAME \ upgrade.private.gdc.goog/skip-postflight-check-
1.5. Avviare un upgrade non pianificato
Attiva un upgrade istantaneo dell'organizzazione tenant al di fuori di un maintenanceWindow se
hai un'esigenza urgente, ad esempio un requisito urgente di patch di sicurezza. Questa operazione è necessaria solo nell'organizzazione tenant, poiché l'organizzazione principale attiva già l'upgrade istantaneamente.
Esegui questo comando utilizzando l'amministratore root kubeconfig. La risorsa personalizzata dell'organizzazione
che devi annotare è presente solo nel cluster root-admin. Non pianifichi
una finestra temporale per questo processo.
Applica una patch all'organizzazione
spec/versionper l'organizzazione tenant:export VERSION=$(kubectl get releasemetadata -ojson | jq -r '.items[] | select(.metadata.name | contains("1.13.3")) | .metadata.name') echo $VERSION # Example output # 1.13.3-gdch.5548 kubectl patch -n gpc-system organization ORG_NAME --type='json' \ -p='[{"op":"replace","path":"/spec/version","value":"'${VERSION}'"}]' \ --kubeconfig=ROOT_ADMIN_KUBECONFIGAvvia un
tenant-org upgradeistantaneo applicando l'annotazioneignore-maintenance-windowe riavviandoorganizationupgrade.Monitora lo stato dell'upgrade:
# kubectl -n gpc-system get organizationupgrade org-1 -o yamlEsegui i controlli post-upgrade.
Al termine dell'upgrade urgente, torna a utilizzare le finestre temporali pianificate:
kubectl annotate organization ORG_NAME -n=gpc-system \ "upgrade.private.gdc.goog/ignore-maintenance-window-" \ --kubeconfig=ROOT_ADMIN_KUBECONFIG
2. Aggiornamento DNS
2.1 Crea zone di inoltro
Esporta
kubeconfigper il cluster di amministrazione root:export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfigConfigura OCIT_DOMAIN utilizzando una zona di inoltro. Sostituisci OCIT_DOMAIN con il nome di dominio OCIT e gli endpoint con gli indirizzi IP DNS OC:
kubectl apply -f - <<EOF apiVersion: network.private.gdc.goog/v1alpha1 kind: DNSZone metadata: namespace: dns-system name: ocit-domain spec: domainName: OCIT_DOMAIN forwardingConfig: # Set to OC DNS IPs (the AD domain controllers) endpoints: - 192.0.2.0 - 192.0.2.1 replicateToTenantOrg: true EOFL'output è simile al seguente esempio:
dnszone.network.private.gdc.goog/ocit-domain createdSe le modifiche non vengono applicate, riavvia il deployment:
kubectl rollout restart deployment -n dns-system gpc-coredns-forwarderQuesta modifica del DNS viene propagata a tutti i cluster in GDC.
Con il file kubeconfig dell'amministratore principale, verifica che la risoluzione del dominio OCIT funzioni come previsto:
NAMESERVER=$(kubectl -n dns-system get service gpc-coredns-forwarder-udp | \ awk '/[0-9]\./ {print $4}') dig +short @${NAMESERVER} fs.OCIT_DOMAINEsporta
kubeconfigper il cluster di amministrazione dell'organizzazione:export KUBECONFIG=/root/release/org-admin/org-admin-kubeconfigApplica il file kubeconfig dell'amministratore dell'organizzazione e verifica che la risoluzione del dominio OCIT funzioni come previsto:
NAMESERVER=$(kubectl -n dns-system get service gpc-coredns-infra-forwarder | \ awk '/[0-9]\./ {print $4}') dig +short @${NAMESERVER} fs.OCIT_DOMAIN
2.2 Attiva il resolver ricorsivo
Abilita il resolver ricorsivo nel cluster di amministrazione dell'organizzazione solo per le organizzazioni v1 seguendo i passaggi descritti nel runbook DNS-R0027.
Termina l'upgrade dell'organizzazione tenant in tutte le zone
Una volta completato l'upgrade in una zona, ti consigliamo di verificare che la zona funzioni ancora correttamente prima di procedere con l'upgrade della zona successiva.
Ripeti i passaggi 1 e 2 per l'organizzazione tenant nelle altre zone. Quando tutte le zone hanno eseguito l'upgrade dell'organizzazione tenant, procedi con i passaggi successivi.
3. Esegui l'upgrade delle risorse globali
Le risorse globali devono trovarsi nella versione più bassa di tutte le zone. Avvia la procedura di upgrade delle risorse globali connettendoti alla zona di ancoraggio ed eseguendo i seguenti comandi.
# Annotate appropriate versions for all the operable components.
ORG_NAME=ORG_NAME
MAP=$(kubectl get kubeapiserver ${ORG_NAME}-admin -n ${ORG_NAME} -ojsonpath='{.metadata.annotations}' --kubeconfig ROOT_ADMIN_KUBECONFIG | jq -r 'to_entries | map("\(.key) \(.value)") | .[] | select(startswith("lcm.private.gdc.goog/oc-version-"))')
# Trigger the global resource upgrade on global org admin.
kubectl annotate kubeapiserver global-org-admin -n global-kube-system --overwrite lcm.private.gdc.goog/paused-remote=false --kubeconfig ORG_MGMT_API_KUBECONFIG
kubectl patch kubeapiserver global-org-admin -n global-kube-system -p='{"spec":{"deploymentPolicy":"AllowAll"}}' --type=merge --kubeconfig ORG_MGMT_API_KUBECONFIG
L'operazione potrebbe richiedere alcuni minuti. Verifica il completamento degli upgrade delle risorse globali eseguendo i seguenti comandi. Il comando non deve segnalare alcun errore.
# Verify that Components are all successfully rolled out on global org admin.
echo "${MAP}" | while read KV; do
SPLIT=(${KV}); VALUE=${SPLIT[1]}; OC=$(echo ${VALUE} | cut -d- -f1)
[[ -n ${OC} ]] || continue
ROLLOUT=$(kubectl get componentrollout ${OC} -n global-kube-system -o json --ignore-not-found --kubeconfig ORG_MGMT_API_KUBECONFIG)
[[ -n ${ROLLOUT} ]] || continue
if [[ $(echo ${ROLLOUT} | jq -r '.spec.componentRef.name') != ${VALUE} ]] ; then
echo "${OC} rollout trigger failed"; continue
fi
if [[ $(echo ${ROLLOUT} | jq -r '.status.allSubcomponentsReady') != 'true' ]] ; then
echo "${OC} rollout completion failed. Use 'kubectl describe componentrollout ${OC} -n global-kube-system --kubeconfig ORG_MGMT_API_KUBECONFIG' to check for error messages."
fi
done && echo "Global component rollout check finished."
4. Esegui l'upgrade di Tenable SC
Esegui GDCH doctor per determinare se è necessario un upgrade:
gdcloud system doctor diagnose instance --include-ocs=vuln --root-admin-kubeconfig=${ROOT_ADMIN_CLUSTER_KUBECONFIG:?}Nel caso in cui il validatore
tenable_sc_upgrade_readinessnon riesca a eseguire l'upgrade dell'immagine, segui questi passaggi per eseguire l'upgrade di Tenable SC nell'organizzazione dei servizi OI:Recupera il nome della macchina virtuale:
VIRTUAL_MACHINE_NAME=$(kubectl --kubeconfig ${OI_SERVICES_ORG_INFRA_KUBECONFIG:?} get virtualmachine -n tenablesc-system -o custom-columns=NAME:.metadata.name | sort -r -k 1 | head -1)Contrassegna il
runningStatedella macchina virtuale comeStopped:kubectl --kubeconfig ${OI_SERVICES_ORG_MGMT_KUBECONFIG:?} patch virtualmachines.virtualmachine.gdc.goog ${VIRTUAL_MACHINE_NAME:?} -n tenablesc-system --type merge --patch '{"spec":{"runningState":"Stopped"}}'Disinstalla il grafico Helm esistente per la VM:
VIRTUAL_MACHINE_NAME=$(kubectl --kubeconfig ${OI_SERVICES_ORG_INFRA_KUBECONFIG:?} get virtualmachine -n tenablesc-system -o custom-columns=NAME:.metadata.name | sort -r -k 1 | head -1) kubectl --kubeconfig ${OI_SERVICES_ORG_MGMT_KUBECONFIG:?} patch virtualmachines.virtualmachine.gdc.goog ${VIRTUAL_MACHINE_NAME:?} -n tenablesc-system --type merge --patch '{"spec":{"runningState":"Stopped"}}' helm uninstall tenablesc-vms -n tenablesc-system --kubeconfig ${ORG_MGMT_KUBECONFIG:?}Esegui una nuova configurazione di Tenable SC seguendo la procedura descritta in Installare Tenable.SC.
Pulizia post-upgrade
Rimuovi le risorse ClusterRoleBinding create nella sezione Identity and Access Management.
Configurare i periodi di manutenzione per l'upgrade dell'organizzazione tenant
Per eseguire l'upgrade di un'organizzazione tenant, verifica di aver assegnato i ruoli di visualizzatore e amministratore corretti, come descritto nelle pagine Descrizioni dei ruoli predefiniti e Definizioni dei ruoli per i progetti per accedere all'interfaccia a riga di comando (CLI) kubectl e all'interfaccia utente (UI) della console. Se non le hai, segui le istruzioni riportate nella pagina
Concedere l'accesso alle risorse del progetto
per concederle o richiedere che ti vengano concesse.
Per configurare il periodo di manutenzione, devi disporre dei ruoli necessari. Assicurati di avere assegnati i seguenti ruoli predefiniti:
- Amministratore dell'upgrade dell'organizzazione
- Visualizzatore upgrade organizzazione Nota: l'upgrade di un'organizzazione tenant a una versione secondaria inferiore a quella dell'organizzazione principale non è supportato.
Per impostazione predefinita, è presente un MaintenanceWindow per gli upgrade secondari e un MaintenanceWindow
per gli upgrade patch. Gli upgrade secondari migliorano la funzione o apportano modifiche rispetto
alla revisione precedente, che è un upgrade del pacchetto, ad esempio per correggere bug.
Gli upgrade delle patch risolvono problemi o vulnerabilità specifici. Configura la
patch predefinita MaintenanceWindow per avviare gli upgrade delle patch in base a una
pianificazione definita.
Per configurare la periodo di manutenzione, utilizza i comandi CLI e kubectl per
modificare i campi RRULE e TimeWindow delle risorse MaintenanceWindow.
In questo modo, gli upgrade vengono pianificati. Per informazioni su RRULE visita
https://pkg.go.dev/github.com/teambition/rrule-go.
Per utilizzare i comandi CLI kubectl, fai clic sulla scheda kubectl. Per visualizzare le istruzioni
basate sulla UI, fai clic sulla scheda Console.
Console
Modifica la pianificazione del periodo di manutenzione. Vai alla scheda Manutenzione e fai clic su Modifica.

Figura 1. Periodo di manutenzione
Viene visualizzata la schermata Modifica i periodi di manutenzione. Utilizza la finestra per riconfigurare le finestre temporali Patch e Minor:

Figura 2. Riconfigura la patch e gli aggiornamenti secondari
Specifica o modifica la Versione patch, l'Ora di inizio e la Durata, nonché il giorno della settimana.
Modifica Versione secondaria, Ora di inizio, Durata, Ricorrenza e Giorno.

Figura 3. Salvare la riconfigurazione
Fai clic su Salva per applicare le modifiche.
Se le modifiche salvate influiscono sulla ricorrenza, ad esempio se hai implementato una modifica al giorno della settimana o al mese, viene visualizzata una finestra di dialogo. Per confermare le modifiche, fai clic su CONTINUA.

Immagine 4. Fai clic su Continua
L'esempio seguente mostra gli upgrade pianificati aggiornati in base alle modifiche alla configurazione. Nota il link Salta accanto a ogni stato in attesa. Utilizza questa opzione per ignorare un upgrade in attesa pianificato.
Figura 5. Visualizzazione degli upgrade pianificati, con un'opzione di salto per ciascuno
kubectl
Accedi alla
kubectlCLI. Trova queste istruzioni nella scheda CLI. Prima di procedere, assicurati di disporre dell'accesso corretto al cluster di amministrazione dell'organizzazione.Puoi modificare tre campi in
MaintenanceWindowper configuraretimeWindowin cui viene eseguito l'upgrade dell'organizzazione tenant. I seguenti comandi mostrano una modifica alla periodo di manutenzione per l'upgrade delle patch. La modifica degli upgrade secondari è simile.# 1. The first change is to the RRULE # For patch-upgrades to happen, for example, every Thursday instead of Sunday: kubectl patch -n gpc-system maintenancewindow patch-upgrade \ --type='json' \ -p='[{"op":"replace","path":"/spec/recurrence","value":"FREQ=WEEKLY;BYDAY=TH"}]' # 2. Modify the start time of the upgrade in UTC. export S_TIME = 2022-04-03T04:00:00Z kubectl patch -n gpc-system maintenancewindow patch-upgrade \ --type='json' \ -p='[{"op":"replace","path":"/spec/timeWindow/start","value":"'${S_TIME}'"}]' # 3. Modify the end time of the upgrade in UTC. export E_TIME = 2022-04-03T04:00:00Z kubectl patch -n gpc-system maintenancewindow patch-upgrade \ --type='json' \ -p='[{"op":"replace","path":"/spec/timeWindow/end","value":"'${E_TIME}'"}]'L'ora di inizio e l'ora di fine,
/spec/timeWindow/starte/spec/timeWindow/end, rispettivamente, devono avere ciascuna una data/mese/anno che si sia verificata in passato. La finestra temporale viene calcolata in base ai valori inseriti.
Alloca almeno la durata minima mostrata per ciascun tipo di upgrade. Puoi allocare una durata maggiore come indicato nei seguenti consigli:
- Aggiornamenti secondari: richiedono almeno 12 ore in una finestra temporale continua di 32 giorni.
Upgrade delle patch: richiedono almeno 48 ore in una finestra temporale continua di 32 giorni, con uno o più blocchi di tempo. Sebbene la console mostri una specifica di finestra temporale minima di 4 ore, Google consiglia di allocare almeno 6 ore per ogni blocco temporale.
Upgrade manuale di Operations Suite Infrastructure Core
Questa procedura di upgrade si applica solo all'upgrade dalla versione 1.13.x alla 1.14.3.
Assicurati che tutti gli account locali e di dominio gestiti siano attivi con password non scadute. Gli account non in regola potrebbero causare errori in questo processo.
Eseguire i checkpoint delle VM e i backup delle directory
Esegui checkpoint della VM.
- Sull'host BM01, apri una console PS come amministratore.
Esegui questo comando per ogni host Hyper-V nel cluster.
$servername = "<*hyperv-server-name*>" Get-VM -CimSession $servername | ForEach-Object { $myargs = @{ VMName = $_.Name SnapshotName = "Checkpoint_$($_.Name)_$(Get-Date -Format 'yyyyMMddHHmmss')" ComputerName = $servername } Checkpoint-VM @myargs }Tieni aperta la finestra di PowerShell per i passaggi successivi.
Attivare i percorsi dei file lunghi
$path = 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' Set-ItemProperty -Path $path -Name 'LongPathsEnabled' -Value 1Esegui il backup dell'unità H:\operations_center. Questa azione supporta il rollback dell'upgrade.
Rename-Item -Path H:\operations_center -NewName operations_center_backupEsegui il backup delle directory di configurazione su CONFIG1. Questo backup fornisce un riferimento per la creazione della nuova configurazione config.ps1.
Sull'host BM01, utilizza Remote Desktop Protocol (RDP) per connetterti all'indirizzo IP della VM CONFIG1 e accedi con un account amministratore di sistema. Esempio:
mstsc /v 192.168.100.99Apri una console PS con Esegui come amministratore.
- Crea la cartella di backup
mkdir c:\config1_backup- Backup C:\dsc
Move-Item -Path "C:\dsc\" -Destination "C:\config1_backup"- Backup di C:\config
Move-Item -Path "C:\config\" -Destination "C:\config1_backup"- Backup C:\operations_center
Move-Item -Path "C:\release\operations_center\" -Destination "C:\config1_backup"- Assicurati che i percorsi dei file lunghi siano abilitati
$path = 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' Set-ItemProperty -Path $path -Name 'LongPathsEnabled' -Value 1
Caricare software di terze parti
Svolgi le attività descritte in software di terze parti.
Esegui l'upgrade delle macchine virtuali esistenti
Ottieni la directory di installazione.
Scarica il bundle di componenti OIC seguendo le istruzioni della sezione Scarica file.
Sull'host BM01, estrai la directory operations_center da prod_IT_component_bundle.tar.gz scaricato.
Set-Location H: tar -zxvf prod_IT_component_bundle.tar.gzL'estrazione del file TAR dovrebbe creare una cartella
releasenella radice di H:.Sposta
operations_centernella directory principale di H:Move-Item -Path H:\release\operations_center -Destination H:\
Aggiorna config.ps1 con dati specifici del sito
Il file di configurazione
config.ps1fornisce tutte le informazioni necessarie per creare e configurare l'ambiente Operations Suite Infrastructure (OI). Per aggiornare il file di configurazione, devi raccogliere tutte le seguenti informazioni. Il backup del file config.ps1 esistente è un buon riferimento per proteggere la sovrascrittura involontaria delle impostazioni esistenti. Importante: non procedere finchéconfig.ps1non è completato e corretto.- L'output della configurazione di rete dello strumento
occonfigtool, in particolare il fileocinfo.common.opscenter.local.txt. I nomi di rete, ad esempio OCCORE-SERVERS a cui si fa riferimento nei passaggi seguenti, fanno riferimento alla colonnaNamedel documento. - Il nome di dominio e l'indirizzo IP del server DNS di ogni cella GDC gestita da questo OI. Questi dati sono disponibili negli output del questionario di acquisizione dei clienti (CIQ).
Apporta tutte le modifiche all'host BM01 come
Administrator.- L'output della configurazione di rete dello strumento
Copia il codice di esempio di configurazione corretto per il tipo di deployment:
- Copia
H:\operations_center\dsc\config.example.ps1inH:\operations_center\config\config.ps1.
- Copia
Utilizzando VSCode o Powershell ISE, convalida e aggiorna i valori in
config.ps1.Se OIC viene implementato come multi-site:
- Trova i commenti con l'etichetta
### Multi-Site: - Esegui le azioni descritte nei commenti che hai trovato.
- Trova i commenti con l'etichetta
Aggiorna
HardwareVersiona meno che il valore predefinito (3.0) non sia corretto.Aggiorna
PrimarySiteCodea meno che il valore predefinito (DC1) non sia corretto.Il codice del sito viene utilizzato in molti nomi. Cerca e sostituisci tutte le istanze di
DC1con il codice del sito corretto. Utilizza la ricerca senza distinzione tra maiuscole e minuscole. Esamina ogni modifica, poiché alcune potrebbero non essere necessarie. Ad esempio, se il codice del sito èAB1, il nome hostDC1-DC1deve diventareAB1-DC1, nonAB1-AB1.Aggiorna
DnsDomainse il valore predefinito non è corretto. Se questo valore viene modificato, cerca e sostituisciopscenter.localin tutto il fileconfig.ps1. Esistono diverse posizioni in cui questo valore predefinito è codificato in modo permanente.Aggiorna gli oggetti in
DnsConditionalForwardercon informazioni specifiche del sito. Deve essere presente almeno un oggetto di inoltro. Rimuovi gli esempi non necessari.Questo passaggio può essere eseguito in WSL su CONFIG1 se è installata l'interfaccia a riga di comando
gdcloudekubectl.Per estrarre informazioni specifiche del sito dal cluster di amministrazione principale, utilizza:
export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig kubectl get -n dns-system service gpc-coredns-external-udp \ -o jsonpath='{.status.loadBalancer.ingress[0].ip}{"\n"}'Domain: il nome di dominio DNS della cella GDC, ad esempiodns.delegatedSubdomaininciq.yaml.Master: un elenco di IP del server DNS (di solito uno solo). Cerca incellcfgil tipoDNSReservation. Se la cella GDC è implementata, cerca nello spazio dei nomidns-systemdel cluster di amministrazione root l'EXTERNAL-IP del serviziogpc-coredns-external-udpe l'FQDN della cella bert.sesame.street.Nelle implementazioni multisede esiste un oggetto hashtable per cella.
Non modificare i contenuti degli oggetti
Users,GroupseGroupPolicy.Aggiorna
DNSServersin modo che contenga i due indirizzi IP assegnati ai controller di dominio principale e secondario, ad esempio<SITE>-DC1e<SITE>-DC2.Aggiorna
NTPServersin modo che sia un elenco degli indirizzi IP di SyncServer dalle risorse personalizzateTimeServerdell'amministratore root. Puoi recuperare questo insieme di indirizzi IP utilizzando:kubectl get timeserver -A -o json | jq '.items[].address'Devi formattare questi indirizzi IP in
NTPServerscome mostrato nell'esempio seguente:NtpServers = @( '10.251.80.2', '10.251.80.3', '10.251.80.4', '10.251.80.5' )Aggiorna il valore predefinito di
SubnetPrefix, ovvero24, con il valore del prefisso della subnet fornito dal cliente per la subnet OCCORE-SERVERS, se necessario.Aggiorna il valore predefinito di
DefaultGatewaycon il gateway predefinito fornito dal cliente per la subnet OCCORE-SERVERS.Trova e aggiorna il valore predefinito di
WorkstationCidercon il valore fornito dal cliente per la subnet OC-WORKSTATIONS nella notazione CIDR IPv4.Aggiorna il valore
WorkstationAllowRemotea$truese il cliente ha scelto di consentire l'accesso remoto alle proprie workstationTrova e sostituisci il prefisso di subnet di esempio
172.21.0.con il prefisso di subnet OCCORE-SERVERS fornito dal cliente.Trova e sostituisci il prefisso della subnet di esempio
172.21.2.con il prefisso della subnet OCCORE-JUMPHOSTS fornito dal cliente.Trova e sostituisci il prefisso della subnet di esempio
172.21.32.con il prefisso della subnet OC-WORKSTATIONS fornito dal cliente.Trova e sostituisci il valore del messaggio del giorno di esempio
legalnoticecaptiondiPref captioncon la didascalia fornita dal cliente.Trova e sostituisci il valore del messaggio del giorno di esempio
legalnoticetextdiPref textcon il testo fornito dal cliente.Convalida ogni oggetto "nodo" e aggiornalo, se necessario.
NodeName: assicurati che il nome host sia corretto. Alcuni nomi vengono utilizzati in molti luoghi, ad esempio i controller di dominio. Se modifichi un nome qui, controlla se deve essere modificato altrove nella configurazione.IPv4Addr: deve essere l'indirizzo IP dell'host. L'ultimo ottetto di solito può essere lasciato così com'è. Alcuni potrebbero essere stati aggiornati durante la ricerca e sostituzione della rete eseguita nei passaggi precedenti.HyperVHost: questo valore deve essere l'indirizzo IP del server Hyper-V che ospita questa VM. Puoi ottenere l'indirizzo IP per ogni serverBM??nella sezione "Server Hyper-V" della configurazione. Non modificare l'assegnazione dell'host Hyper-V in questo campo, in quanto non tutti gli host Hyper-V possono supportare ogni tipo di VM. Modifica solo il nome host Hyper-V con il relativo indirizzo IP.
Convalida i dettagli della seconda interfaccia di rete su tutti i nodi con
Role=jumphost. Utilizza i dettagli della subnet OCCORE-JUMPHOSTS per questa interfaccia. Controllo:JumphostIPv4CidrJumphostDefaultGateway
Aggiorna la sezione specifica di ADFS nel nodo in cui
Role=adfs.- Trova la riga
Name = 'SplunkTrust' # Must be unique to the farm. Append "Trust" - Sostituisci le tre occorrenze di
opscenter.localdopo questa riga con il tuo dominio DNS
- Trova la riga
Aggiorna gli ambiti DHCP in modo che corrispondano al piano IP del cliente, se necessario. Per ogni ambito, verifica che i seguenti valori siano corretti. I nomi degli ambiti corrispondono ai nomi utilizzati nel piano di rete
ocinfo.common.opscenter.local.txt, quindi utilizza i seguenti nella convalida:ScopeIdIpStartRangeIpEndRangeRouterSubnetMask
Conferma che i valori corrispondano a quelli in config1.ps1 di cui è stato eseguito il backup
Assicurati di salvare il file.
CONFIG1 VM Preparation
La preparazione di CONFIG1 viene eseguita su BM01. Tutti gli altri upgrade vengono eseguiti durante l'accesso alla VM CONFIG1.
Copia la directory operations_center nella VM CONFIG1
Sull'host BM01, apri una console PS come amministratore.
Copia
operations_centerper preparare i file necessari per la macchina virtuale (VM) CONFIG1.# Change name to match your config host $config = "DC1-CONFIG1" # Stage files for CONFIG1 VM Copy-Item -Path H:\operations_center -Destination "\\$config\c$\" -Recurse -ForceDisattivare la sincronizzazione dell'ora di Hyper-V
Accedi all'host BM01 come amministratore.
Apri PowerShell su Windows come amministratore ed esegui il seguente comando:
# Disabling Hyper-V Time Sync Disable-VMIntegrationService -VMName `<SITE>-CONFIG1` -Name 'Time Synchronization'Preparazione e convalida della VM CONFIG1
Dall'host BM01, accedi alla VM CONFIG1 con il tuo account
-SA. Connettiti all'indirizzo IP della VM utilizzando Remote Desktop (RDP). Esempio:mstsc /v 192.168.100.99Apri una finestra PowerShell utilizzando il menu "Esegui come utente diverso" per eseguire l'operazione come utente Marvin.
Nella nuova finestra di PowerShell, avvia una sessione amministrativa:
Start -Verb runas -FilePath powershell.exeChiudi la finestra PowerShell precedente, lasciando aperta la finestra dell'amministratore.
Verifica che la finestra amministrativa di PowerShell sia in esecuzione come Marvin
whoamiDisponi i file di cui è stato eseguito lo staging dall'host BM01.
Move-Item -Path c:\operations_center -Destination c:\release C:\release\operations_center\dsc\Initialize-ConfigHostFiles.ps1Verifica che
c:\dscec:\configesistano.Copiare i file di credenziali e certificati dal backup
Copy-Item -Path "C:\config1_backup\config\creds\" -Destination "C:\config\creds\" -Recurse Copy-Item -Path "C:\config1_backup\config\certs\" -Destination "C:\config\certs\" -RecurseCrea i dati MECM necessari per compilare i file MOF
C:\dsc\Build-MecmFiles.ps1Verifica che l'ambiente di compilazione sia pronto eseguendo
Build-Mof.ps1, che genera file MOF per tutti i computer OI.C:\dsc\Build-Mof.ps1
Compila le variabili delle credenziali
Queste variabili vengono utilizzate durante l'intero processo di upgrade. Compilali una volta nella finestra PowerShell di Marvin aperta come amministratore.
. 'c:\config\config.ps1' $da_creds = (Get-Credential -Message "Provide domain admin credentials") $sa_creds = (Get-Credential -Message "Provide system admin credentials") $sa_args = @{ Credential = $sa_creds SetLcm = $true RemoveExisting = $true CopyModules = $true } $da_args = @{ Credential = $da_creds SetLcm = $true RemoveExisting = $true CopyModules = $true }Verifica che DSC sia in esecuzione e che i server siano raggiungibili.
$role = 'domain_controller' $ca = 'ca_root' $dcs = $config.AllNodes | Where-Object {$_.role -eq $role} $non_dcs = $config.AllNodes | Where-Object {$_.role -ne $role -and $_.role -ne $ca -and $_.NodeName -ne "*"} $dcs | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $da_creds Get-DscConfigurationStatus -CimSession $session | select HostName,Status,NumberOfResources,ResourcesNotInDesiredState} $non_dcs | ForEach-Object { Write-Output "Checking $($_.NodeName)" $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session | select HostName,Status,NumberOfResources,ResourcesNotInDesiredState | ft -AutoSize}
Risolvi i problemi di connettività.
Se
New-CimSessionnon va a buon fine, verifica che il valore diNodeNamesia corretto inconfig.ps1. Verifica inoltre che il server sia online e raggiungibile.L'errore inizierà con
Get-CimSession: WinRM cannot process the request.
Esegui l'upgrade dei controller di dominio
Mentre hai eseguito l'accesso a CONFIG1, esegui l'upgrade del domain controller primario.
Compila le variabili, rimuovi i vecchi oggetti Criteri di gruppo e collega i nuovi oggetti Criteri di gruppo.
$dc2 = $dcs | Where-Object {$_.NodeName -like "*-DC2"} $dc1 = $dcs | Where-Object {$_.NodeName -like "*-DC1"} Invoke-Command -Computername $dc1.NodeName -Credential $da_creds -ScriptBlock { Remove-DscConfigurationDocument -Stage Current,Pending,Previous get-gpo -All | Where-Object { $_.DisplayName -like "OIC*" } | Remove-GPO get-gpo -All | Where-Object { $_.DisplayName -like "SITE*" -and $_.DisplayName -notlike "*SCCM*" } | Remove-GPO Get-Item "C:\config\domain_controller\oic_gpos"| Remove-Item -Recurse -Force Get-Item "C:\config\domain_controller\site_gpo*"| Remove-Item -Recurse -Force }Scollega gli oggetti Criteri di gruppo. Verranno collegati al termine dell'upgrade.
$gpolinks = (Get-Content C:\dsc\data\GpoLinkMapping.yaml -Raw).Replace("LinkEnabled: 'Yes'", "LinkEnabled: 'No'") $gpolinks | Out-File C:\dsc\data\GpoLinkMapping.yaml -ForceEsegui l'upgrade del domain controller primario.
.\Update-RemoteHost.ps1 @da_args -ComputerName $DC1.NodeNameNew-PSDrive -Name DC1 -PsProvider FileSystem -Root "\\$($DC1.NodeName)\c$" -Credential $da_creds Invoke-Command -ComputerName $DC1.NodeName -Credential $da_creds -Scriptblock {Remove-DscConfigurationDocument -Stage Current,Pending} Remove-Item -Path DC1:\config\domain_controller\site_gpos -Recurse -Force Remove-Item -Path DC1:\config\domain_controller\site_gpos_source -Recurse -Force Copy-Item -Path C:\config\domain_controller\ -Destination DC1:\config\ -Verbose -Force -Recurse C:\dsc\Build-Mof.ps1 -Computername $DC1.NodeName Start-DscConfiguration -ComputerName $DC1.NodeName -Path 'c:\config\mofs' -Credential $da_creds -Verbose -Wait -Force Remove-PsDrive -Name DC1Convalida la sincronizzazione dell'ora con SyncServer
Accedi a
DC1utilizzando RDP come amministratore di dominio.- Apri una finestra di
Powershellcome amministratore. Esegui questo comando per convalidare la configurazione dell'ora.
w32tm /query /status /verbose
- Apri una finestra di
Esegui i seguenti comandi per testare la risincronizzazione dell'ora:
# Testing time resyncronization w32tm /resync# Desired output Sending resync command to local computer The command completed successfully.Rivalida la configurazione dell'ora per assicurarti che sia corretta e non presenti errori.
w32tm /query /status /verbose
Esegui l'upgrade del secondo domain controller.
Utilizza la finestra PowerShell CONFIG1 esistente per eseguire il seguente script.
.\Update-RemoteHost.ps1 @da_args -ComputerName $dc2.NodeName
Convalida la replica di Active Directory.
Una volta che il secondo controller di dominio è attivo e operativo, esegui i seguenti comandi da uno dei controller di dominio per convalidare la replica di Active Directory:
repadmin /replsummaryL'output deve essere simile al seguente:
PS C:\Users\Administrator.OpsCenter> repadmin /replsummary Replication Summary Start Time: 2023-11-29 19:16:59 Beginning data collection for replication summary, this may take awhile: ...... Source DSA largest delta fails/total %% error OC1-DC1 01m:49s 0 / 5 0 Destination DSA largest delta fails/total %% error OC1-DC2 01m:49s 0 / 5 0
Esegui l'upgrade di CA-ISSUING1 e CA-WEB
Utilizza il terminale PowerShell esistente su
CONFIG1per eseguire l'upgrade diCA-ISSUING1.$ca_iss = $config.AllNodes | Where-Object {$_.role -eq "ca_issuing"} c:\dsc\Update-RemoteHost.ps1 @sa_args -ComputerName $ca_iss.NodeNameUtilizza il terminale PowerShell esistente su
CONFIG1per eseguire l'upgrade diCA-WEB.$ca_web = $config.AllNodes | Where-Object {$_.role -eq "ca_web"} c:\dsc\Update-RemoteHost.ps1 @sa_args -Computername $ca_web.NodeNameConvalidare l'upgrade
$ca_iss,$ca_web | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session}
Upgrade di CA-ROOT1
Utilizza il terminale PowerShell esistente su CONFIG1
Accendi
CA-ROOT1.$ca_root = $config.AllNodes | Where-Object {$_.role -eq "ca_root"} $session = New-CimSession -ComputerName $ca_root.HyperVHost -Credential $sa_creds Start-VM -CimSession $session -Name $ca_root.NodeNameAggiorna
CA-ROOT1.$caroot_cred = Get-GeccoCredential -Name "$($ca_root.NodeName)\caadmin" -CredStore "c:\config\creds" c:\dsc\Update-RemoteHost.ps1 -Computername $ca_root.NodeName -RemoteHost $ca_root.Ipv4Addr -Credential $caroot_credSe
CA_ROOT1non è stato riavviato dopo lo script precedente, riavvialo manualmente.Convalida l'upgrade.
$ca_root | ForEach-Object { $session = New-CimSession -ComputerName $_.Ipv4Addr -Credential $caroot_cred Get-DscConfigurationStatus -CimSession $session}Verifica che l'impostazione
Peersia<SITE>-DC1.<DNSDOMAIN>e cheStatesiaActive.Non procedere se l'ora non è sincronizzata correttamente.
w32tm /query /peers #Peers: 1 Peer: DC1-DC1.domain.local State: Active Time Remaining: 31.2997107s Mode: 3 (Client) Stratum: 1 (primary reference - syncd by radio clock) PeerPoll Interval: 6 (64s) HostPoll Interval: 6 (64s)Spegni
CA-Root.$session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Stop-VM -CimSession $session -Name $ca_root.NodeName
Esegui l'upgrade di ADFS
Utilizza il terminale PowerShell esistente su CONFIG1
Esegui l'upgrade della VM
ADFS1.$role = 'adfs' $adfs = $config.AllNodes | Where-Object {$_.role -eq $role} $adfs | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session} $adfs | ForEach-Object { c:\dsc\Update-RemoteHost.ps1 @sa_args -Computername $adfs.NodeName} 1. Validate the upgrade. $adfs | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session}
Esegui l'upgrade dei jumphost.
Utilizza il terminale PowerShell esistente su CONFIG1
Crea un array di jump host.
$role = 'jumphost' $jumps = $config.AllNodes | Where-Object {$_.role -eq $role}Esegui l'upgrade degli host di rimbalzo.
$jumps | ForEach-Object { c:\dsc\Update-RemoteHost.ps1 @sa_args -Computername $_.NodeName}Convalida l'upgrade.
$jumps | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session}
Esegui l'upgrade di Fileserver.
Utilizza il terminale PowerShell esistente su CONFIG1
Crea un array contenente i file server.
$role = 'file' $files = $config.AllNodes | Where-Object {$_.role -eq $role}Esegui l'upgrade dei file server.
$files | ForEach-Object { c:\dsc\Update-RemoteHost.ps1 @sa_args -Computername $_.NodeName}Convalida l'upgrade.
$files | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session}
Esegui l'upgrade dei server DHCP.
Utilizza il terminale PowerShell esistente su CONFIG1
Esegui l'upgrade di DHCP1.
$role = 'dhcp_primary' $dhcp1 = $config.AllNodes | Where-Object {$_.role -eq $role} c:\dsc\Update-RemoteHost.ps1 @sa_args -Computername $dhcp1.NodeNameConvalida l'upgrade.
$dhcp1 | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session}Esegui l'upgrade di DHCP2.
$role = 'dhcp_failover' $dhcp2 = $config.AllNodes | Where-Object {$_.role -eq $role} c:\dsc\Update-RemoteHost.ps1 @sa_args -Computername $dhcp2.NodeNameconvalidare l'upgrade.
$dhcp2 | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session}
Esegui l'upgrade dei server Userlock.
Utilizza il terminale PowerShell esistente su CONFIG1
Crea un array PowerShell contenente i server Userlock.
$role = 'userlock_primary' $ulock1 = $config.AllNodes | Where-Object {$_.role -eq $role} $role = 'userlock_backup' $ulock2 = $config.AllNodes | Where-Object {$_.role -eq $role}Rimuovi i file di marcatore dalla configurazione precedente.
Invoke-Command -ComputerName $ulock1.NodeName -Credential $sa_creds -Scriptblock { Remove-item "c:\config\userlock_primary\ServiceImpersonation.log" } Invoke-Command -ComputerName $ulock2.NodeName -Credential $sa_creds -Scriptblock { Remove-item "c:\config\userlock_backup\ServiceImpersonation.log" }Esegui l'upgrade del server Userlock principale.
c:\dsc\Update-RemoteHost.ps1 @sa_args -Computername $ulock1.NodeNameEsegui l'upgrade del server Userlock di backup.
c:\dsc\Update-RemoteHost.ps1 @sa_args -Computername $ulock2.NodeNameConvalida gli upgrade.
$ulock1,$ulock2 | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session}
Esegui l'upgrade dei server Nessus.
Utilizza il terminale PowerShell esistente su CONFIG1
Crea un array PowerShell contenente i server Nessus.
$role = 'nessus_' $nessus = $config.AllNodes | Where-Object {$_.role -match $role}Esegui l'upgrade dei server Nessus.
$nessus | ForEach-Object { c:\dsc\Update-RemoteHost.ps1 @sa_args -Computername $_.NodeName}Convalida l'upgrade.
$nessus | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session}
Esegui l'upgrade dei server Hyper-V.
Utilizza il terminale PowerShell esistente su CONFIG1
Crea un array PowerShell contenente i server Hyper-V.
$role = 'hyper_v' $hyper = $config.AllNodes | Where-Object {$_.role -eq $role}Esegui l'upgrade dei server Hyper-V.
$hyper | ForEach-Object { c:\dsc\Update-RemoteHost.ps1 @sa_args -Computername $_.NodeName}Convalida l'upgrade.
$hyper | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session}
Esegui l'upgrade di Toolbox
Utilizza il terminale PowerShell esistente su CONFIG1
Crea un array PowerShell contenente i server Toolbox.
$role = 'toolbox' $tools = $config.AllNodes | Where-Object {$_.role -eq $role}Crea un'unità aggiuntiva sul server TOOLBOX1
$tools | ForEach-Object { if ($_.ExtraDiskSize) { Invoke-Command -ComputerName $_.HyperVHost -Credential $sa_creds -ScriptBlock { $additional_disk_path = Join-Path -Path $using:_.ExtraDiskFolder -ChildPath "$($using:_.NodeName)-2.vhdx" New-VHD -Path $additional_disk_path -Dynamic -SizeBytes $using:_.ExtraDiskSize Add-VMHardDiskDrive -VMName $using:_.NodeName -Path $additional_disk_path Get-VMHardDiskDrive -VMName $using:_.NodeName | select VMName,ControllerLocation,Path }}}Verifica che l'output mostri due dischi assegnati alla VM. Esempio:
VMName ControllerLocation Path ------ ------------------ ---- DC1-TOOLBOX1 0 H:\Hyper-V\Virtual Hard Disks\DC1-TOOLBOX1.vhdx DC1-TOOLBOX1 1 Z:\Hyper-V\Virtual Hard Disks\DC1-TOOLBOX1-2.vhdxEsegui l'upgrade dei server di Toolbox.
$tools | ForEach-Object { c:\dsc\Update-RemoteHost.ps1 @sa_args -Computername $_.NodeName}Convalida l'upgrade.
$tools | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session}
Utilizza il terminale PowerShell esistente su CONFIG1 per convalidare l'upgrade.
Verifica che DSC sia in esecuzione senza errori.
$role = 'domain_controller' $ca = 'ca_root' $dcs = $config.AllNodes | Where-Object {$_.role -eq $role} $non_dcs = $config.AllNodes | Where-Object {$_.role -ne $role -and $_.role -ne $ca -and $_.NodeName -ne "*"} $dcs | ForEach-Object { $session = New-CimSession -ComputerName $_.NodeName -Credential $da_creds Get-DscConfigurationStatus -CimSession $session | select HostName,Status,NumberOfResources,ResourcesNotInDesiredState} $non_dcs | ForEach-Object { Write-Output "Checking $($_.NodeName)" $session = New-CimSession -ComputerName $_.NodeName -Credential $sa_creds Get-DscConfigurationStatus -CimSession $session | select HostName,Status,NumberOfResources,ResourcesNotInDesiredState | ft -AutoSize}
Esegui l'upgrade delle VM Splunk
Dalla finestra di PowerShell su CONFIG1, configura ed esegui la configurazione DSC:
Inserisci il codice sito. Esempio:
"DC1"$sitecode = Read-Host "Enter your site code" Set-Location c:\dscConfigura l'heavy forwarder:
$myargs = @{ Computername = "$sitecode-HEAVYFWD" Credential = $sa_creds SetLcm = $true RemoveExisting = $true } .\Update-RemoteHost.ps1 @myargsConfigura l'indicizzatore 1:
$myargs = @{ Computername = "$sitecode-INDEXER1" Credential = $sa_creds SetLcm = $true RemoveExisting = $true } .\Update-RemoteHost.ps1 @myargsConfigura l'indicizzatore 2:
$myargs = @{ Computername = "$sitecode-INDEXER2" Credential = $sa_creds SetLcm = $true RemoveExisting = $true } .\Update-RemoteHost.ps1 @myargsConfigura indicizzatore 3:
$myargs = @{ Computername = "$sitecode-INDEXER3" Credential = $sa_creds SetLcm = $true RemoveExisting = $true } .\Update-RemoteHost.ps1 @myargsConfigura il gestore:
$myargs = @{ Computername = "$sitecode-SPLUNKMGR" Credential = $sa_creds SetLcm = $true RemoveExisting = $true } .\Update-RemoteHost.ps1 @myargsConfigura l'head di ricerca:
$myargs = @{ Computername = "$sitecode-SEARCHHEAD" Credential = $sa_creds SetLcm = $true RemoveExisting = $true } .\Update-RemoteHost.ps1 @myargs
Dalla finestra di PowerShell su CONFIG1:
$servers = @() $config.AllNodes | Where-Object {$_.role -match "splunk_"} | Foreach { $servers += $_.NodeName } Invoke-Command -ComputerName $servers -Credential $sa_creds -ScriptBlock {Restart-Service -Name 'Splunkd'} -ErrorAction ContinueSegui SIEM-G0006 per impostare Pass4SymmKey globale e SIEM-G0007 per collegare ogni zona a Splunk in OIC.
Esegui l'upgrade dell'host CONFIG1
Dalla finestra di PowerShell su CONFIG1:
Start-DscConfiguration -ComputerName $env:COMPUTERNAME -Path c:\config\mofs -Verbose -Wait -ForceSe il computer si riavvia, accedi di nuovo e avvia di nuovo PowerShell come Marvin, quindi esegui l'elevazione a amministratore. Compila le variabili necessarie per le sezioni successive.
Set-Location c:\dsc . c:\config\config.ps1 $da_creds = (Get-Credential -Message "Provide domain admin credentials") $sa_creds = (Get-Credential -Message "Provide system admin credentials")
Microsoft Configuration Manager (MCM)
Poiché MCM non è un componente aggiornabile, l'unica opzione è eliminare gli host MCM esistenti e ripetere il deployment di MCM.
Assicurati che il software MCM attuale sia stato idratato in seguito all'IT-T0023.
La procedura di riesecuzione del deployment è descritta in IT-R0019.
Rimuovere i checkpoint delle VM
Una volta completati gli upgrade, i checkpoint devono essere rimossi. I checkpoint possono comportare un utilizzo eccessivo del disco nel tempo. Conservali solo se è necessario un ripristino al checkpoint a causa di un upgrade non riuscito.
Utilizza il terminale PowerShell esistente su CONFIG1
Rimuovi i checkpoint della VM.
$config.AllNodes | Where-Object {$_.Role -eq "hyper_v"} | Foreach-Object { Invoke-Command -ComputerName $_.NodeName -Credential $sa_creds -Scriptblock { Get-VM | Get-VMSnapshot | Where-Object {$_.Name -like "Checkpoint_*"} | Remove-VMSnapshot -Verbose }}
Riattivare gli oggetti Criteri di gruppo nel dominio
Utilizza il terminale PowerShell esistente su CONFIG1
Modifica la configurazione del ruolo del controller di dominio per attivare i link negli oggetti Criteri di gruppo gestiti
$gpolinks = (Get-Content C:\dsc\data\GpoLinkMapping.yaml -Raw).Replace("LinkEnabled: 'No'", "LinkEnabled: 'Yes'") $gpolinks | Out-File C:\dsc\data\GpoLinkMapping.yaml -ForceAggiorna il domain controller con il ruolo ObjectOwner:
c:\dsc\Update-RemoteHost.ps1 -Computername $config.AllNodes.DomainConfig.ObjectOwner -Credential $da_creds
Contatta il team di Google
Consulta la pagina Richiedi assistenza per scoprire come contattare Google per ulteriore supporto.