Renommage des zones d'un client NGOT#
Warning
Cette documentation a été réalisée pour un cas client spécifique le 28/12/2023 :
- zone avec routage alertinghub ;
- suppression de la zone loki effectuée en même temps ;
- ...
Si vous utilisez cette documentation, il faudra :
- vérifier qu'elle est valable et encore à jour ;
- l'adapter.
Préparatifs#
export OLD_CLIENT=...
export NEW_CLIENT=...
export CLUSTER=...
export VAULT_FORMAT=json
export ENVS_NG=... # exemple : ~/git/caascad/terraform/envs-ng
Aller sur Grafana et faire une capture d'écran des ressources dépoloyées (métrique probe_success, alertes, dashboards) :
xdg-open https://grafana.obs-${OLD_CLIENT}.cloudservicesfactory.com
Déploiement nouvelles zones#
Création des habilitations#
Pour pouvoir déployer complètement Grafana, il faut créer les habilitations.
Pour ${NEW_CLIENT}, suivre la documentation ici.
Une fois les habilitations créées, demander à l'équipe support de reporter les utilisateurs des habilitations.
Copie des secrets Vault#
Copier les secrets des anciennes zones vers les nouvelles :
export VAULT_ADDR=https://vault.infra-prd.caascad.com/
vault token lookup > /dev/null 2>&1 || vault login -method oidc
vault read secret/zones/fe/svc-monitoring-stack-client-${OLD_CLIENT}/alertmanager-auth/ | jq '.data' | vault write secret/zones/fe/svc-monitoring-stack-client-${NEW_CLIENT}/alertmanager-auth -
for i in $(vault list "secret/zones/fe/svc-monitoring-stack-client-${OLD_CLIENT}/prometheus-ingress/" | jq -r '.[]'); do touch "$i.json" ; vault read "secret/zones/fe/svc-monitoring-stack-client-${OLD_CLIENT}/prometheus-ingress/$i" | jq '.data' > "$i.json"; vault write "secret/zones/fe/svc-monitoring-stack-client-${NEW_CLIENT}/prometheus-ingress/$i" @"$i.json"; rm "$i.json";done
vault read secret/zones/fe/svc-monitoring-stack-client-${OLD_CLIENT}/thanos-sidecar-certificate/ | jq '.data' | vault write secret/zones/fe/svc-monitoring-stack-client-${NEW_CLIENT}/thanos-sidecar-certificate/ -
vault read secret/zones/fe/svc-monitoring-stack-client-${OLD_CLIENT}/thanos-store-gateway-certificate/ | jq '.data' | vault write secret/zones/fe/svc-monitoring-stack-client-${NEW_CLIENT}/thanos-store-gateway-certificate/ -
for i in $(vault list "secret/applications/nginx-alertreceiver/${OLD_CLIENT}/" | jq -r '.[]'); do touch "$i.json" ; vault read "secret/applications/nginx-alertreceiver/${OLD_CLIENT}/$i" | jq '.data' > "$i.json"; vault write "secret/applications/nginx-alertreceiver/${NEW_CLIENT}/$i" @"$i.json"; rm "$i.json";done
Configuration des zones#
Créer la MR :
cd ${ENVS_NG}
nix-shell
export OLD_CLIENT=...
export NEW_CLIENT=...
export CLUSTER=...
cd zones/ngot_zones
git switch master && git pull
git switch -c "rename-${OLD_CLIENT}-to-${NEW_CLIENT}"
cp client-${OLD_CLIENT}.cue client-${NEW_CLIENT}.cue
sed -i s/${OLD_CLIENT}/${NEW_CLIENT}/g client-${NEW_CLIENT}.cue
# Suppression des références à loki
generate-static-zones-files
git add ../../gen client-${NEW_CLIENT}.cue
git commit -m "rename ${OLD_CLIENT} to ${NEW_CLIENT}"
git push
Silences#
Afin d'éviter d'alerter pendant la période de provisionning 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")"' Provisioning NGOT client CLIENT (silence to remove before client delivery)"}' | sed -e "s/CLIENT/${NEW_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=$NEW_CLIENT; - commentaire :
Provisioning nouvelle zone NGOT; - durée : 7 jours
À la fin du provisioning il sera nécessaire de supprimer les silences mis en place.
Déploiement zones#
cd ${ENVS_NG}/contexts/ngot
trackbone apply -z "obs-${NEW_CLIENT}" -t bootstrap=true --non-interactive -n 8
trackbone apply -z "svc-monitoring-stack-client-${NEW_CLIENT}" --non-interactive -n 8
trackbone apply -z svc-signon-prd -c keycloak_k8s_openid_clients
trackbone apply -z "svc-grafana-client-${NEW_CLIENT}" --non-interactive -n 8 -t bootstrap=true
Mise à jour des configurations#
trackbone apply -z svc-monitoring-stack-corp-prd-1 -c prometheus-rules -c blackbox-exporter-core -t blackbox_exporter_refresh_cache=true --non-interactive
trackbone apply -z svc-monitoring-stack-corp-prd-2 -c prometheus-rules -c blackbox-exporter-core --non-interactive
trackbone apply -z "${CLUSTER}" -c fe_loadbalancer_v3 --non-interactive
trackbone apply -z "${CLUSTER}" -c ingress_controller_v2_public --non-interactive
trackbone apply -z "${CLUSTER}" -c ingress_controller_v2_private --non-interactive
trackbone apply -z "${CLUSTER}" -c fe_whitelist --non-interactive
trackbone apply -z "${CLUSTER}" -c prometheus-rules-dashboards-upstream --non-interactive
Rédéploiement nginx-alertreceiver#
Ajouter ${NEW_CLIENT} dans la configuration ${ENVS_NG}/contexts/pf/nginx-alertreceiver.cue et redéployer :
cd ${ENVS_NG}/contexts/pf
trackbone apply -c nginx-alertreceiver -z prdcasa
exit
Vérifications#
Grafana#
Se connecter à Grafana (xdg-open "https://grafana.obs-${NEW_CLIENT}.cloudservicesfactory.com") avec son compte Keycloak/Caascad (Sign-in with Keycloak > caascad).
Pour valider la connexion à Keycloak/Caascad, il faut constater :
- que l'on peut se connecter ;
- que l'on a les droits attendus.
Lancer les tests de conformité#
Lancer les tests de conformité :
git clone git@git.corp.caascad.com:caascad/applications/poc_check_functional_tests_monitoring.git /tmp/poc_check_functional_tests_monitoring && cd /tmp/poc_check_functional_tests_monitoring/ngot
./func_tests_kub.sh "${CLUSTER}" # example : ./func_tests_kub.sh kub-1
./func_tests_svc_grafana_client.sh "${NEW_CLIENT}" # example : ./func_tests_svc_grafana_client.sh pf
./func_tests_svc_monitoring_stack_client.sh "${NEW_CLIENT}" # example : ./func_tests_svc_monitoring_stack_client.sh pf
Configuration Alertmanager#
On vérifie que le routage vers alertinghub est bien présent dans la configuration d'alertmanager.
kswitch ${CLUSTER}
kubectl exec -it -c alertmanager -n monitoring-stack-client-obs-${OLD_CLIENT} alertmanager-0 -- cat /tmp/alertmanager/alertmanager.yml > /tmp/${OLD_CLIENT}_alertmanager
kubectl exec -it -c alertmanager -n monitoring-stack-client-obs-${NEW_CLIENT} alertmanager-0 -- cat /tmp/alertmanager/alertmanager.yml > /tmp/${NEW_CLIENT}_alertmanager
echo "contenu de ${OLD_CLIENT}_alertmanager :"
cat /tmp/${OLD_CLIENT}_alertmanager
echo "différence :"
diff /tmp/${OLD_CLIENT}_alertmanager /tmp/${NEW_CLIENT}_alertmanager
Résultat attendu: le fichier est non vide et aucune différence n'est renvoyée.
Finalisation#
- Merger la MR envs-ng
-
Dans Karma infra-prd :
- supprimez tous les silences mis en place pendant le provisioning de la zone ;
- vérifiez qu'aucune alerte n'est active pour les nouvelles zones de service.
Communication au client#
Bonjour XXX
La zone avec le nouveau nom (obs-rsh) est disponible, vous pouvez modifier vos URLs prometheus dans la configuration de vos agents : https://prometheus-<0|1>.ocb-mws.cloudservicesfactory.com deviennent https://remote-write-<0|1>.obs-rsh.cloudservicesfactory.com.
La zone est en cours de finalisation, nous travaillons sur le Gitops Workflow et la copie de vos anciennes métriques.
Nous reviendrons vers vous lorsque ces étapes seront terminées.
...
Copie des données dans le bucket S3#
wget https://oss.eu-west-0.prod-cloud-ocb.orange-business.com/obsutil/obsutil_ocb_linux_amd64_5.3.4.tar.gz
tar -xzvf obsutil_ocb_linux_amd64_5.3.4.tar.gz
cd obsutil_linux_amd64_5.3.4/
# configure obsutil with the wizard
vault read secret/zones/fe/api-OCB0005119-aksk | jq '.data'
#endpoint="oss.eu-west-0.prod-cloud-ocb.orange-business.com"
./obsutil config -interactive
./obsutil sync obs://thanos-storage-svc-monitoring-stack-client-${OLD_CLIENT} obs://thanos-storage-svc-monitoring-stack-client-${NEW_CLIENT}
Vérifications
./obsutil stat obs://thanos-storage-svc-monitoring-stack-client-${OLD_CLIENT}
./obsutil stat obs://thanos-storage-svc-monitoring-stack-client-${NEW_CLIENT}
Résultat attendu: même nombre d'objets et même taille.
Vérifier la présence d'anciennes métriques sur un historique de 48 heures.
Suppression anciennes zones#
Silences#
Afin d'éviter d'alerter pendant la période de suppression de l'ancienne zone NGOT, il est important de poser un silence sur toute la zone.
Pour cela 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=$OLD_CLIENT; - commentaire :
Suppression ancienne zone NGOT; - durée : 7 jours
À la fin de la suppression il sera nécessaire de supprimer les silences mis en place.
Démantèlement#
cd ${ENVS_NG}
git switch master
git pull
nix-shell
export OLD_CLIENT=...
export NEW_CLIENT=...
export CLUSTER=...
export ENVS_NG=... # exemple : ~/git/caascad/terraform/envs-ng
cd contexts/ngot
trackbone destroy -t purge=true -z "svc-monitoring-stack-client-${OLD_CLIENT}" --non-interactive --detailed-exitcode -n 8
trackbone destroy -t purge=true -z "svc-grafana-client-${OLD_CLIENT}" --non-interactive --detailed-exitcode -n 8
trackbone destroy -t purge=true -z "svc-loki-client-${OLD_CLIENT}" --non-interactive --detailed-exitcode -n 8
trackbone destroy -z "obs-${OLD_CLIENT}" -t purge=true --non-interactive --detailed-exitcode -n 8
Configuration des zones#
Créer la MR :
git switch -c "delete-${OLD_CLIENT}"
git rm ${ENVS_NG}/zones/ngot_zones/client-${OLD_CLIENT}.cue
generate-static-zones-files
git add -u
git commit -m "delete ${OLD_CLIENT}"
git push
Suppression des anciens secrets dans Vault#
for i in $(vault list secret/zones/fe/svc-monitoring-stack-client-${OLD_CLIENT}/ | jq -r '.[]'); do vault delete secret/zones/fe/svc-monitoring-stack-client-${OLD_CLIENT}/$i; done
for i in $(vault list secret/zones/fe/svc-monitoring-stack-client-${OLD_CLIENT}/prometheus-ingress/ | jq -r '.[]'); do vault delete secret/zones/fe/svc-monitoring-stack-client-${OLD_CLIENT}/prometheus-ingress/$i; done
for i in $(vault list secret/zones/fe/svc-grafana-client-${OLD_CLIENT} | jq -r '.[]'); do vault delete secret/zones/fe/svc-grafana-client-${OLD_CLIENT}/$i; done
for i in $(vault list secret/zones/fe/svc-loki-client-${OLD_CLIENT} | jq -r '.[]'); do vault delete secret/zones/fe/svc-loki-client-${OLD_CLIENT}/$i; done
for i in $(vault list secret/applications/nginx-alertreceiver/${OLD_CLIENT} | jq -r '.[]'); do vault delete secret/applications/nginx-alertreceiver/${OLD_CLIENT}/$i; done
Mise à jour des configurations#
trackbone apply -z svc-monitoring-stack-corp-prd-1 -c prometheus-rules -c blackbox-exporter-core -t blackbox_exporter_refresh_cache=true --non-interactive
trackbone apply -z svc-monitoring-stack-corp-prd-2 -c prometheus-rules -c blackbox-exporter-core --non-interactive
trackbone apply -z svc-signon-prd -c keycloak_k8s_openid_clients
trackbone apply -z "${CLUSTER}" -c fe_loadbalancer_v3 --non-interactive
trackbone apply -z "${CLUSTER}" -c ingress_controller_v2_public --non-interactive
trackbone apply -z "${CLUSTER}" -c ingress_controller_v2_private --non-interactive
trackbone apply -z "${CLUSTER}" -c fe_whitelist --non-interactive
trackbone apply -z "${CLUSTER}" -c prometheus-rules-dashboards-upstream --non-interactive
Rédéploiement nginx-alertreceiver#
Supprimer ${OLD_CLIENT} dans la configuration ${ENVS_NG}/contexts/pf/nginx-alertreceiver.cue et redéployer :
trackbone apply -c nginx-alertreceiver -z prdcasa
exit
Cleanup sur le cluster#
-
vérifier la non-présence de PVC (si présent les supprimer):
kswitch ${CLUSTER} kubectl -n grafana-client-obs-${OLD_CLIENT} get pvc kubectl -n monitoring-stack-client-obs-n${OLD_CLIENT} get pvc kubectl -n loki-client-obs-n${OLD_CLIENT} get pvc -
supprimer les namespaces :
kubectl get ns | grep "${OLD_CLIENT}"S'il y en a, supprimer tous les namespaces ci-dessus.
Suppression dossier dans loki-rules#
Créer une MR :
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 remove_${OLD_CLIENT}
git rm -r obs-${OLD_CLIENT}
git commit -m "remove ${OLD_CLIENT}"
git push
Suppression habilitations#
Pour ${OLD_CLIENT}, suivre la documentation ici.
Confluence#
Déréférencer le client dans Confluence :
-
dans cette page :
- modifier le nom
- modifier
Log management-> non
-
modifier les contacts client
Finalisation#
- Merger la MR envs-ng
-
Dans Karma infra-prd :
- supprimez tous les silences mis en place pendant la suppression de la zone ;
- vérifiez qu'aucune alerte n'est active pour les anciennes zones de service.
Gitops Workflow#
Migration#
export TOKEN=$(vault read secret/zones/dtstore/cs-factory/ | jq -r .data.api_token)
export CUID=$(vault read secret/zones/dtstore/cs-factory/ | jq -r .data.cuid)
export EMAIL=$(vault read secret/zones/dtstore/cs-factory/ | jq -r .data.mail)
Ensemble de scripts :
#!/bin/bash
OLD_CLIENT="$1"
TOKEN="${TOKEN?Missing token}"
if [ "${OLD_CLIENT}" = "" ]; then
echo "Usage: $0 <client name>"
echo "Example: $0 pf # for obs-pf"
exit 1
fi
# Get project id
PROJECT_ID=$(curl -XGET -H "Content-Type: application/json" --header "PRIVATE-TOKEN: $TOKEN" "https://sourcehub.orange-business.com/api/v4/projects?search=obs-$OLD_CLIENT" | jq .[].id)
if [ "${PROJECT_ID}" == null ] || [ -z "${PROJECT_ID}" ]; then
echo "PROJECT_ID is empty"
exit 1
fi
# Export projet Angel
curl --request POST --header "PRIVATE-TOKEN: $TOKEN" "https://sourcehub.orange-business.com/api/v4/projects/${PROJECT_ID}/export"
# Vérification status export
export_status="started"
while [ "${export_status}" != "finished" ]; do
export_status=$(curl --header "PRIVATE-TOKEN: $TOKEN" "https://sourcehub.orange-business.com/api/v4/projects/${PROJECT_ID}/export" | jq -r .export_status)
echo "export not finished yet"
done
# Download export
curl --header "PRIVATE-TOKEN: $TOKEN" -o download.tar.gz "https://sourcehub.orange-business.com/api/v4/projects/${PROJECT_ID}/export/download"
#! /usr/bin/env nix-shell
#! nix-shell -i python
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
import os
import requests
import sys
def main():
if len(sys.argv) == 1:
print(f'Usage: {sys.argv[0]} <client>', file=sys.stderr)
sys.exit()
url = 'https://sourcehub.orange-business.com/api/v4/projects/import'
files = { "file": open("download.tar.gz", "rb") }
client = sys.argv[1]
token = os.getenv("TOKEN")
data = {
"path": "obs-{}".format(client),
"namespace": "cs-factory/cs-factory-environments"
}
headers = {
'Private-Token': token
}
response = requests.post(url, headers=headers, data=data, files=files)
print(response.content)
if __name__ == "__main__":
main()
#!/bin/bash
OLD_CLIENT="$1"
NEW_CLIENT="$2"
# CUID and TOKEN mandatory only for https method
CUID="${CUID?Missing user}"
EMAIL="${EMAIL?Missing email}"
TOKEN="${TOKEN?Missing token}"
if [ "${OLD_CLIENT}" = "" ]; then
echo "Usage: $0 <old_client name> <new_client name>"
echo "Example: $0 avant apres # for ocb-avant"
exit 1
fi
if [ "${NEW_CLIENT}" = "" ]; then
echo "Usage: $0 <old_client name> <new_client name>"
echo "Example: $0 avant apres # for ocb-avant"
exit 1
fi
if [ -d "/tmp/obs-${NEW_CLIENT}" ]; then
rm -rf /tmp/obs-${NEW_CLIENT}
fi
git clone https://$CUID:$TOKEN@sourcehub.orange-business.com/cs-factory-stg/cs-factory-environments/obs-${NEW_CLIENT} /tmp/obs-${NEW_CLIENT}
if ! [ -d "/tmp/obs-${NEW_CLIENT}" ]; then
echo "git clone failed"
exit 1
fi
cd "/tmp/obs-${NEW_CLIENT}"
OLD_CLIENT_UPPER=${OLD_CLIENT^^}
NEW_CLIENT_UPPER=${NEW_CLIENT^^}
sed -i "s/OBS-"${OLD_CLIENT_UPPER}"/OBS-"${NEW_CLIENT_UPPER}"/g" README.md
sed -i "s/blackbox-exporter-obs-"${OLD_CLIENT}".monitoring-stack-client-obs-"${OLD_CLIENT}".svc/blackbox-exporter-obs-"${NEW_CLIENT}".monitoring-stack-client-obs-"${NEW_CLIENT}".svc/g" probes/*
git add README.md probes/* && git -c "user.name=${CUID}" -c "user.email=${EMAIL}" commit -m "Update environement name"
git push
-
Lancer les scripts :
./export.sh ${OLD_CLIENT} python import.py ${NEW_CLIENT} -
Importer les members :
sur le repo :
manage -> members -> import from a project -> chose the old project -
Modifier template-ci :
git clone git@git.corp.caascad.com:caascad/applications/gitops-tools.git /tmp/gitops-tools && cd /tmp/gitops-tools nix-shell ./client_repo_set_credentials.py -a prometheus -c configs/comet-prd.yaml -C obs-${NEW_CLIENT} ./update-template-ci.py -c configs/comet-prd.yaml -C obs-${NEW_CLIENT} -
Lancer le script :
./update_compatibility.sh ${OLD_CLIENT} ${NEW_CLIENT}
Vérifications#
Vérification dans Grafana#
- vérifier les rules dans
Alerting - vérifier si les dashboards sont présents
- vérifier la métrique
probe_successet ses labels
Réultat attendu: on doit avoir les mêmes resources que sur l'ancienne zone.
Gitops Workflow et creds Prometheus#
Vérifier la cohérence Login/Password de Vault/sourcehub et la connexion à Prometheus avec les credentials communiqués au client.
Pré-requis : il faut un token Gitlab(ext) avec au minimum les permissions api,write_repository : https://sourcehub.orange-business.com/-/profile/personal_access_tokens?scopes=api,write_repository.
export GITLAB_TOKEN=xxxxx
git clone git@git.corp.caascad.com:caascad/applications/check_ngot_credentials.git && cd check_ngot_credentials
./check_prometheus_creds_in_vault_and_gitlab.sh "${NEW_CLIENT}" 2>/dev/null && echo OK
Archivage ancien projet du client#
Créer un ticket SUPIT pour
- supprimer les utilisateurs non gérés par MyPortal
- archiver le projet
Description du ticket :
| Rubrique | Contenu |
|---|---|
| Projet | Support IT (SUPIT) |
| Type de ticket | Support Request |
| Résumé | Projet Gitlab : suppression de membres + archivage |
| Priorité | P2-Major |
| RBY | N/A |
Bonjour,
Dans le cadre du ticket PF-xxxx,
pour le Projet Gitlab https://sourcehub.orange-business.com/cs-factory/cs-factory-environments/obs-${OLD_CLIENT},
pouvez-vous
- supprimer tous les membres "Direct member by"
- puis archiver le projet
Merci par avance
- modifier le numéro du ticket PF-xxxx
Modification 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.
Communication au client#
Bonjour XXX
Le renommage de votre cluster est finalisé. Le Gitops workflow est opérationnel et la copie des anciennes métriques est effectuée.
Par ailleurs, lors de notre opération nous avons constaté un disfonctionnement sur le déploiement de vos dashboards, deux de vos dashboards (OS_Monitoring_Windows_Latest et OS_Monitoring_Windows_Prod) ont le même nom, la valeur de la clé `title` doit être utilisée qu'une seule fois pour tous vos dashboards.
...


