Aller au contenu

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-1 et svc-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

Exemple : Silences dans karma

À 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).

Connexion à Grafana avec Keycloak

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-1 et svc-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

Exemple : Silences dans karma

À 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 :

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 :

export.sh
#!/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"

import.py
#! /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()
update_compatibility.sh
#!/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_success et 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_CLIENT et 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.
...