Article écrit par Nicolas Desombre
Lorsque que l’on gère de multiples clusters Kubernetes, Rancher devient vite un outil de choix pour centraliser l’accès, l’administration ainsi que le provisionnement de nos clusters.
Le provisionnement des clusters via Rancher à un côté bien pratique, celui de pouvoir déployer via un provider Terraform unique, des clusters utilisant différentes distributions Kubernetes ainsi que différent hyperviseur/cloud public.
Mais voilà, il entraîne une limitation qui finit par poser problème, il n’est pas possible de dé-enregistrer de l’instance Rancher des clusters ainsi provisionnés sans les détruire.
Cette limitation n’est pas présente pour les clusters importés, pour lequel une procédure de Rancher est disponible.
Attention : cet article ne constitue pas une procédure officielle, mais plutôt un partage d’expérience, je vous invite vivement à vérifier vos backups avant de faire quoique ce soit. Et je ne peux d’ailleurs, à ce sujet, que vous conseiller l’excellent Velero sur lequel nous reviendrons sans doute en détail à l’occasion d’un prochain article.
État des lieux
Notre histoire est je pense assez banale, une instance Rancher ancienne reposant sur un cluster RKE, que nous souhaitons dé-provisionner depuis déjà un certain temps.
Nous avons jusque-là réussi à retirer progressivement les clusters y étant rattaché au gré des décommissionnements, mais il y reste 2 clusters Azure AKS dit “Rancher-Owned” (provisionné via Rancher) pour lequel aucune décommission n’est prévue dans un futur proche.
S’agissant d’environnements de production sensibles et anciens, nous souhaitions éviter au maximum une reconstruction de la plateforme.
Mode opératoire utilisé
Comme évoqué ci-dessus, nos clusters sont ici de type Azure AKS. Mais cette procédure devrait être applicable sans aucun souci pour les autres types de cluster, dès lors qu’il est possible de générer un KUBECONFIG indépendant de Rancher.
Génération d’un KUBECONFIG
La première étape est donc de générer un KUBECONFIG local, qui va nous permettre de reprendre le contrôle directement via l’api du cluster, sans passer par Rancher.
Pour un cluster AKS, cela passe par l’utilisation de la CLI Azure :
➜  ~ export KUBECONFIG=~/.kube/tmp-aks.yaml
➜  ~ az aks get-credentials --resource-group MyRG --name MyCluster
The behavior of this command has been altered by the following extension: aks-preview
Merged "MyCluster" as current context in /Users/nicolas/.kube/tmp-aks.yaml
➜  ~ kubectl get nodes
NAME                              STATUS   ROLES   AGE    VERSION
aks-default-12345678-vmss000000   Ready    agent   143d   v1.2x.x
aks-default-12345678-vmss000001   Ready    agent   143d   v1.2x.x
aks-default-12345678-vmss000002   Ready    agent   143d   v1.2x.x
Rancher Cleanup
Nous allons ensuite supprimer l’agent, ainsi que d’une manière générale, toutes traces de Rancher sur le cluster à l’aide de l’outil Rancher Cleanup :
➜  ~ git clone https://github.com/rancher/rancher-cleanup.git
➜  ~ kubectl create -f deploy/rancher-cleanup.yaml
Comme indiqué dans le README.md du dépôt, vous pouvez suivre l’avancement de l’opération via la commande kubectl -n kube-system logs -l job-name=cleanup-job -f
Une fois le job Completed n’oubliez pas de le supprimer via la commande kubectl delete -f deploy/rancher-cleanup.yaml, ceci afin d’éviter une exécution accidentelle ultérieurement.
Il n’y a désormais plus aucune trace de Rancher sur le cluster, qui est redevenu un cluster Azure AKS standard.
Suppression du cluster dans Rancher
À ce stade, dans l’UI de l’ancienne instance Rancher, vous devez être face à de nombreux messages d’erreur indiquant une impossibilité de communiquer avec le cluster.
- lastUpdateTime: "2023-11-22T07:06:04Z"
    message: 'Error while applying agent YAML, it will be retried automatically: exit
      status 1, Error from server (InternalError): an error on the server ("unable
      to create impersonator account: error getting service account token: service
      account is not ready") has prevented the request from succeeding '
    reason: Error
    status: "False"
    type: AgentDeployed
- lastUpdateTime: "2023-11-22T07:05:31Z"
    message: Cluster agent is not connected
  reason: Disconnected
  status: "False"
  type: Ready
Ce qui est parfaitement normal puisque l’agent ainsi que le compte RBAC utilisé par Rancher ont été supprimés.
Néanmoins, il n’est pas encore possible de supprimer le cluster via l’UI, Rancher souhaitera toujours le détruire dans ce cas de figure.
Pour éviter cela, nous allons donc devoir éditer la configuration du cluster dans Rancher. Celle-ci étant stockée sous forme d’objet Kubernetes, nous allons donc simplement utiliser kubectl sur le cluster support de l’instance.
Il faut tout d’abord récupérer l’id du cluster, celui-ci est visible dans l’url https://rancher.mydomain.com/dashboard/c/c-12345/explorer#cluster-events, ici c-12345.
Ensuite, nous allons supprimer les finalizers chargé du dé-provisionnement complet du cluster en cas de suppression de celui-ci :
➜  rancher-cleanup git:(main) kubectl get clusters.management.cattle.io
NAME      AGE
c-12345   525d
local     609d
➜  rancher-cleanup git:(main) kubectl patch clusters.management.cattle.io c-12345 -p '{"metadata":{"finalizers":null}}' --type=merge
cluster.management.cattle.io/c-flhkm patched
Il ne reste plus qu’à revenir dans l’UI, puis à se rendre dans Cluster Management et Delete.
Réintégration dans le Rancher de destination
À ce stade, on peut suivre la procédure habituelle d’import d’un cluster AKS dans Rancher.
Avec Terraform, l’on peut reprendre son code existant et y ajouter le switch ìmported = true, attention néanmoins aux drifts éventuels.
resource "rancher2_cluster" "my-aks-to-import" {
  name        = "my-aks-to-import"
  description = "Terraform AKS Cluster"
  aks_config_v2 {
    cloud_credential_id = rancher2_cloud_credential.aks.id
    name                = var.aws_aks_name
    region              = var.aws_region
    imported            = true
  }
}
Au bout de quelques minutes, votre cluster doit désormais être disponible dans la nouvelle instance Rancher.
À lire aussi
                                Challenge technique inter-agences spécial Halloween
                                Bitcoin, fonctionnement et technologies
                                Atlassian Team’25 Europe
                                

