Démantèlement des zones d'un client NGOT#
Préparatifs#
Warning
Attention de les garder pour les avoir après le lancement de nix-shell.
CLIENT=xxxx # pour obs-pf : CLIENT=pf
ENVS_NG=xxx # exemple : ENVS_NG=$HOME/git/caascad/terraform/envs-ng
CLUSTER=xxx # pour obs-pf : CLUSTER=kub-9
export VAULT_ADDR=https://vault.infra-prd.caascad.com/
export VAULT_FORMAT=json
vault token lookup > /dev/null 2>&1 || vault login -method oidc
Prévenir sur #Opérations et incidents.
Gestion des silences#
Afin d'éviter d'alerter pendant la période de démantèlement d'une nouvelle zone NGOT, il est important de poser un silence sur toute la zone.
Depuis cette URL :
xdg-open 'https://karma-infra.infra-prd.caascad.com/?m='$(echo '{"am":[{"label":"svc-monitoring-stack-corp-prd-1","value":["svc-monitoring-stack-corp-prd-1"]},{"label":"svc-monitoring-stack-corp-prd-2","value":["svc-monitoring-stack-corp-prd-2"]}],"m":[{"n":"obs_client","r":false,"e":true,"v":["CLIENT"]}],"d":10080,"c":"silence_cop '"$(date "+%d%m%Y" -d "8 day")"' Decom NGOT client CLIENT (silence to remove after decom)"}' | sed -e "s/CLIENT/${CLIENT}/g" | base64 -w0)
Ancienne méthode : dans Karma mettez un silence :
- il faut poser les silences sur les deux alertmanagers de Prod :
svc-monitoring-stack-corp-prd-1etsvc-monitoring-stack-corp-prd-2; - filtre dans Karma le nom de la zone :
obs_client=${CLIENT}; - commentaire :
Decom NGOT client ${CLIENT}; - durée : 7 jours
À la fin du démantèlement il sera nécessaire de supprimer les silences mis en place.
Zone grafana-client#
cd ${ENVS_NG}
nix-shell
cd contexts/ngot
trackbone destroy -t purge=true -z "svc-grafana-client-${CLIENT}" --non-interactive --detailed-exitcode -n 8 --add-services
Note
Vérifier INFO Trackbone Stats: Succeeded=x Skipped=x Failed=x Disabled=x Total=x.
Si la valeur Failed est plus grande que 0, identifier les configurations en échec et lancer trackbone destroy -t purge=true avec ces configurations.
for i in "$(vault list secret/zones/fe/svc-grafana-client-${CLIENT} | jq -r '.[]')"; do echo "vault delete secret/zones/fe/svc-grafana-client-${CLIENT}/${i}"; done
for i in "$(vault list secret/zones/fe/svc-grafana-client-${CLIENT} | jq -r '.[]')"; do echo "vault delete secret/zones/fe/svc-grafana-client-${CLIENT}/${i}"; done
Note
Il est possible que les secrets Vault aient déjà tous été supprimés.
Suppression du PV à faire seulement si la suppression a échouée avec la commande trackbone :
kswitch ${CLUSTER}
pv=$(kubectl get pv -o json | jq -r --arg client "${CLIENT}" '.items[] | select(.spec.claimRef.name == "grafana-obs-"+$client) | .metadata.name')
kubectl get pv "${pv}" -o json | jq '[.metadata.name, .status.phase,.spec.claimRef.name,.spec.persistentVolumeReclaimPolicy]'
kubectl delete pv "${pv}"
Suppression des backups#
Lister les backups
kubectl get backup -n velero -l velero.io/schedule-name=grafana-obs-${CLIENT}
Delete des backup
velero backup delete --selector=velero.io/schedule-name=grafana-obs-${CLIENT}
Vérification (aucune ligne doit sortir des cmds suivantes)
velero backup get -l velero.io/schedule-name=grafana-obs-${CLIENT}
kubectl get backup -n velero | grep grafana | grep $CLIENT
Restart de Velero et vérification que le pod running et ready
kubectl rollout restart -n velero deploy/velero
kubectl get pod -n velero
Zone monitoring-stack-client#
trackbone destroy#
trackbone destroy -t purge=true -z "svc-monitoring-stack-client-${CLIENT}" --non-interactive --detailed-exitcode -n 8 --add-services
Note
Vérifier INFO Trackbone Stats: Succeeded=x Skipped=x Failed=x Disabled=x Total=x.
Si la valeur Failed est plus grande que 0, identifier les configurations en échec et lancer trackbone destroy -t purge=true avec ces configurations.
Suppression des secrets dans Vault#
On récupère la liste des commandes de suppression à lancer :
for i in $(vault list secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/ | jq -r '.[]'); do echo "vault delete secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/$i"; done
for i in $(vault list secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/prometheus-ingress/ | jq -r '.[]'); do echo "vault delete secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/prometheus-ingress/$i"; done
for i in $(vault list secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/cloudeye-exporter-client | jq -r '.[]'); do echo "vault delete secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/cloudeye-exporter-client/$i"; done
for i in $(vault list secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/stackdriver-exporter-client | jq -r '.[]'); do echo "vault delete secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/stackdriver-exporter-client/$i"; done
for i in $(vault list secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/yace-client | jq -r '.[]'); do echo "vault delete secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/yace-client/$i"; done
for i in $(vault list secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/promitor-client | jq -r '.[]'); do echo "vault delete secret/zones/fe/svc-monitoring-stack-client-${CLIENT}/promitor-client/$i"; done
On vérifie la liste des secrets supprimés et on lance les commandes.
Gitops workflow#
Projet du client#
Se connecter à https://sourcehub.orange-business.com/cs-factory/cs-factory-environments/obs-XXXX, avec le compte robot :
- supprimer les utilisateurs non gérés par MyPortal ("Direct member by")
- archiver le projet
Projets communs#
Dans cs-factory/templates-ci déplier la section Variables .
- éditer la variable
LIST_CLIENTet supprimer la ligne contenant l'ID du projet du client ; - supprimer les variables mentionnant le nom du client (
CLIENT_grafana_roleid,CLIENT_grafana_secretid,CLIENT_monitoring_roleid,CLIENT_monitoring_secretid) ; - supprimer les branches mentionnant le nom du client s'il en existe.
Tip
Si l'ID du projet du client a été perdu, il est possible de le retrouver dans la variable LIST_CLIENT qui contient la liste des ID et des noms des clients.
Alertinghub#
Redéploiement de nginx-alertreceiver#
Supprimer la zone dans contexts/pf/nginx-alertreceiver.cue :
#ZonesMonitoredByTruesight: ["lrdm", ..., "$old_client"]
Lancer la configuration nginx-alertreceiver (on s'attend à avoir seulement des suppressions pour le client) :
cd ${ENVS_NG}/contexts/pf
trackbone apply -c nginx-alertreceiver -z prdcasa
Suppression de l'api key#
Suivre la procédure request-an-internal-api-key, avec deux différences notables à prendre en compte :
- ce n'est pas nécéssaire d'attacher un dictionnaire
- la description de l'opération :
Hello, I would like to request the deletion of an API key for the xxx project. The key is: xxxx. Thank you.
Dans Confluence :
- déplacer la page client AlertingHUB dans la section ToDelete/Deleted
- indiquer dans cette page, le numéro de la demande de la suppression d'api key
Suppression du secret dans Vault#
Aller dans Vault :
xdg-open https://vault.infra-prd.caascad.com/ui/vault/secrets/secret/list/applications/nginx-alertreceiver/${CLIENT}
Supprimer le secret correspondant au client.
Zone loki-client#
trackbone destroy#
On supprime la zone Loki :
cd ${ENVS_NG}/contexts/ngot
trackbone destroy -t purge=true -z "svc-loki-client-${CLIENT}" --non-interactive --detailed-exitcode -n 8 --add-services
Note
Vérifier INFO Trackbone Stats: Succeeded=x Skipped=x Failed=x Disabled=x Total=x.
Si la valeur Failed est plus grande que 0, identifier les configurations en échec et lancer trackbone destroy -t purge=true avec ces configurations.
Suppression des secrets dans Vault#
La commande suivante ne doit rien retourner :
for i in $(vault list secret/zones/fe/svc-loki-client-${CLIENT}/ | jq -r '.[]'); do
echo "vault delete secret/zones/fe/svc-loki-client-${CLIENT}/$i";
done
Si cela retourne des lignes de commande, il est nécessaire de les exécuter.
Git : repo loki-rules#
Suppression du dossier client dans le repo git loki rules.
git clone git@sourcehub.orange-business.com:cs-factory/loki-client-rules.git /tmp/loki-client-rules
cd /tmp/loki-client-rules
git switch -c decom-obs-${CLIENT}
git rm -r obs-${CLIENT}
git commit -m "Removing Loki Rules Directory for obs-${CLIENT}"
git push origin decom-obs-${CLIENT}
Soumettre la MR pour validation et merger.
Note
Ce repo n'est pas accessible aux clients. On peut utiliser notre compte nominatif.
Zone contract#
trackbone destroy -z "obs-${CLIENT}" -t purge=true --non-interactive --detailed-exitcode -n 8
Si la commande échoue, supprimer la zone DNS directement dans AWS.
Se connecter à la console avec le compte Account: ngot (678661912090) en tant que cscd-administrator: URL login.
Aller sur Route 53 -> Zones hébergées et chercher la zone avec le nom du client.
Supprimer la zone (si besoin cliquer dans la zone et supprimer les enregistrements dans la zone avant de supprimer la zone).
Post-démantèlement#
-
Créer une MR avec toutes les suppression.
cd ${ENVS_NG} git switch -c decom-obs-${CLIENT} git rm zones/ngot_zones/client-${CLIENT}.cue git rm zones/ngot_zones/promitor-${CLIENT}.cue # échec si Promitor n'est pas déployé -
Rechercher des traces de la zone dans
contextsSi des traces sont trouvées, il faut les comprendre, comprendre également la suppression de ces traces, puis supprimer effectivement ces traces.grep -ri "${CLIENT}" contexts -
Cas d'une zone pointée par un Grafana Mutualisé
Si la zone est référencée dans un fichiergrep -r "${CLIENT}" zones/ngot_zonesclient-xxx.cuecorrespondant à un grafana mutualisé, il faut :- supprimer cette référence
- noter qu'il y a du ménage supplémentaire à faire au niveau du grafana mutualisé (cf plus loin)
-
Finaliser la création de la MR
generate-static-zones-files git add gen/ zones/ git commit -m "Decom ${CLIENT}" git push --set-upstream origin decom-obs-${CLIENT} -
Faire valider la MR. Puis la merger.
-
Après le merge :
git switch master && git pull cd contexts/ngot trackbone apply -z svc-monitoring-stack-corp-prd-1 -c prometheus-rules -c blackbox-exporter-core -t blackbox_exporter_refresh_cache=true --non-interactive --add-services trackbone apply -z svc-monitoring-stack-corp-prd-2 -c prometheus-rules -c blackbox-exporter-core --non-interactive --add-services trackbone apply -z svc-signon-prd -c keycloak_k8s_openid_clients trackbone apply -z "${CLUSTER}" -c ingress_nginx_public --non-interactive -
Si le client avait une connexion à Alertinghub, il faut la supprimer :
cd ${ENVS_NG}/contexts/pf trackbone apply -z prdcasa -c nginx-alertreceiver --add-services -
Vérifier qu'il n'y a pas d'alertes liées à la zone démantelée.
-
Supprimer les silences sur la zone démantelée.
-
Supprimer les namespaces :
kubectl get ns | grep "${CLIENT}"Supprimer tous les namespaces ci-dessus.
-
Supprimer les PVs Released :
kubectl get pv | grep ${CLIENT} | grep ReleasedS'il y en a, supprimer les :
for pv in $(kubectl get pv | grep ${CLIENT} | grep Released | awk '$1 {print$1}'); do kubectl delete pv ${pv} done -
Supprimer les pipelines Concourse:
Pour supprimer les pipelines liées à la zone, suivre la doc de gestion des drifts.
Suppression du cluster#
La suppression du cluster peut être effectuée en suivant la documentation de démantèlement d'une zone cluster.
Cependant, en fonction des besoins, il peut être préférable de garder le cluster pour une réutilisation future.
Cas d'une zone pointée par un Grafana mutualisé#
Mise à jour des certificats#
Si la zone était pointée par un Grafana mutualisé, il faut exécuter les opérations suivantes.
GRAFANA_MUTUALISE=xxx # exemples: GRAFANA_MUTUALISE=rsc ou GRAFANA_MUTUALISE=monitoring
trackbone apply -c grafana -c thanos-query -c thanos_certificates -z svc-grafana-client-${GRAFANA_MUTUALISE}
kswitch svc-grafana-client-${GRAFANA_MUTUALISE}
kubectl -n grafana-client-obs-${GRAFANA_MUTUALISE} get pod
Les pods doivent avoir redémarré dans les secondes qui précèdent. Sinon :
# Redémarrer les pods.
kubectl -n grafana-client-obs-$GRAFANA_MUTUALISE rollout restart deploy thanos-querier
# Supprimer une éventuelle annotation qui pourrait générer du drift.
trackbone apply -c thanos-query -z svc-grafana-client-${GRAFANA_MUTUALISE} # pour supprimer une éventuelle annotation qui pourrait générer du drift.
# Attendre un peu...
sleep 10
# Les pods ont-ils bien redémarré ?
kubectl -n grafana-client-obs-${GRAFANA_MUTUALISE} get pod
Les pods doivent avoir redémarré depuis quelques secondes.
Suppression de la datasource dans Grafana#
Se connecter à https://grafana.obs-<GRAFANA_MUTUALISE>.cloudservicesfactory.com.
Aller dans l'onglet Alerting -> Active notifications.
En haut à droite, un menu déroulant Choose Alertmanager contient des datasources. Il faut s'attendre à retrouver celle de la zone démantelée.
kswitch svc-grafana-client-${GRAFANA_MUTUALISE}
kubectl -n grafana-client-obs-${GRAFANA_MUTUALISE} edit cm grafana-obs-${GRAFANA_MUTUALISE}
Il faut repérer une section data -> datasources.yaml -> deleteDatasources. Si la zone décommisionnée n'est pas déjà là, il faut l'ajouter ainsi :
data:
datasource.yaml:
deleteDatasources:
- name: alertmanager-<CLIENT>
orgId: 1
Puis :
-
Redémarrer ensuite Grafana
kubectl -n grafana-client-obs-${GRAFANA_MUTUALISE} delete pod grafana-obs-${GRAFANA_MUTUALISE}-0 -
Dans Grafana, vérifier que la source de données a bien disparu.
- Exécuter à nouveau la commande suivante pour restaurer la ConfigMap (et supprimer la source de données de la section deleteDatasources).
trackbone apply -c grafana -z svc-grafana-client-${GRAFANA_MUTUALISE} - Redémarrer une nouvelle fois Grafana.
- Dans Grafana, vérifier que la source de données a bien été supprimée.
Habilitations#
Suppression des habilitations : suivre cette procédure.
Confluence#
Déréférencer le client dans Confluence.
- Déplacer la page client dans la section Deleted (or to delete)
- Supprimer les informations de contacts du client de la liste Contacts clients NGOT
- Remplacer la référence client par
NEXTdans la page Mutualisation des zones
Points de contrôle (démantèlement de zone sans suppression du cluster)#
Les points à contrôler sont définis dans le modèle Jira. Voici quelques précisions :
(x) aucune référence aux zones
* (x) dans envs-ng
* (x) dans Vault
** (x) path : applications/nginx-alertreceiver
** (x) path : applications/alertmanager/receivers
** (x) path : zones/fe
* (x) dans la documentation
* (x) dans Concourse
(x) gitops
* (x) repo archivé
* (x) aucune référence à la zone dans loki-rules
* (x) aucune référence dans les variables de templates-ci
(x) Dans la console FE¹ , aucune ressource liée aux zones
* (x) Buckets s3
(x) Absence d'habilitations (demander au support)
(x) Absence de silences dans Karma
(x) Dans le cluster, absence de PV avec le status {{Released}}
Points de contrôle (démantèlement de zone avec suppression du cluster)#
Les points à contrôler sont définis dans le modèle Jira. Voici quelques précisions :
(x) aucune référence aux zones et au cluster
* (x) dans envs-ng
* (x) dans Vault
** (x) path : applications/nginx-alertreceiver
** (x) path : applications/alertmanager/receivers
** (x) path : zones/fe
* (x) dans Rancher²
* (x) dans la documentation
* (x) dans Concourse
(x) gitops
* (x) repo archivé
* (x) aucune référence à la zone dans loki-rules
* (x) aucune référence dans les variables de templates-ci
(x) Dans la console FE¹ , aucune ressource liée aux zones et au cluster
* (x) VMs
* (x) Buckets s3
* (x) ELB
* (x) CCE
(x) Absence d'habilitations (demander au support)
(x) Absence de silences dans Karma

