====== Kubernetes ======
===== Commandes =====
* Activer l'auto-complétion dans bash : source <(kubectl completion bash) && echo "source <(kubectl completion bash)" >> ~/.bashrc
* Activer l'auto-complétion en utilisant un alias : # Dans .bash_aliases
alias k='kubectl'
complete -F __start_kubectl k
* Créer un Port-forward pour service : kubectl port-forward svc/mon-service port-local:port-service
* Se connecter dans un pod: kubectl exec -it nom-container -- /bin/bash
* Se connecter dans un container spécifique :kubectl exec -ti nom-pod -c nom-container -- bash
* Sauvegarder la conf d'une ressource dans un fichier yaml :kubectl get pvc mon-pvc-0 -o yaml > pvc0.yml
* Copier un fichier dans un pod et un container spécifique : kubectl cp archive.tar.gz namespace/mon-pod:/foo/ -c mon-container
* Supprimer tous les pods evicted : kubectl get pod | grep Evicted | awk '{print $1}' | xargs kubectl delete pod
* Supprimer tous les pods bloqués en statut Terminating : kubectl get po| grep Terminating | awk '{print $1}' | xargs kubectl delete pod --force
* Supprimer un namespace bloqué en statut Terminating : kubectl get namespace "MYNAMESPACE" -o json | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" | kubectl replace --raw /api/v1/namespaces/MYNAMESPACE/finalize -f -
* Drainer un node : kubectl drain --ignore-daemonsets --delete-emptydir-data mon-node
* Restaurer un dump SQL dans un pod MariaDB :gzcat dump.sql.gz | kubectl exec -i pod-mariadb-0 -- mysql -u root -pPASSWORD ma_db
==== Diagnostic ====
* Voir les metrics d'un pod ou node : kubectl top [node|pod] nom-pod-node
* Voir les metrics de tous les nodes d'un cluster : kubectl get no | kubectl top no
* Lister tous les pods d'un node : kubectl get pod -A -o wide|grep NODE
* Lister les ip des pods d'un cluster : kubectl get pod -A -o wide
* Voir l'espace disque restant dans un pod : kubectl exec nom-pod -- df -h
===== Ressources de test =====
==== Pod ====
apiVersion: v1
kind: Pod
metadata:
name: debian-test
spec:
containers:
- name: debian
image: debian:stable-slim
command:
- "sleep"
- "86400"
volumeMounts:
- name: data
mountPath: /mnt/data
volumes:
- name: data
persistentVolumeClaim:
claimName: data-debian-test-0
==== Volume ====
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-debian-test-0
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 50Gi
storageClassName: csi-cinder-classic
===== Debug =====
==== Gérer un conflit de versions API de ressources ====
Suite à une mise à jour du cluster, des ressources peuvent être dans une version API obsolète.
Exemple :
Error: UPGRADE FAILED: unable to build kubernetes objects from current release manifest: [resource mapping not found for name: "XXXXXXXX" namespace: "" from "": no matches for kind "PodDisruptionBudget" in version "policy/v1beta1"
ensure CRDs are installed first, resource mapping not found for name: "XXXXXXXX" namespace: "" from "": no matches for kind "PodDisruptionBudget" in version "policy/v1beta1"
La solution consiste à faire tourner Mapkubeapis :
- helm plugin install https://github.com/helm/helm-mapkubeapis
- helm mapkubeapis RELEASE
==== Supprimer une namespace bloqué en statut terminating ====
- kubectl get namespace -o json > .json
- # Supprimer le finalizer: kubernetes
vim .json
- kubectl replace --raw "/api/v1/namespaces//finalize" -f ./.json
source : [[https://stackoverflow.com/questions/52369247/namespace-stuck-as-terminating-how-i-removed-it]]
==== Augmenter la taille d'un volume déclaré dans un statefulset ====
Ce processus n'a été testé que chez AWS avec gp2 pour storageclass
- Supprimer le statefulset : k delete sts MON-STS
- Modifier la taille du PVC : k edit pvc MON-PVC
- Appliquer la modification de taille dans le chart Helm du déploiement
- Pousser et déployer la modification
=== Méthode alternative ===
- Unscale le statefulset
- Modifier le pv pour mettre reclaimpolicy à Retain
- Supprimer le pvc
- Modifier le pv pour supprimer le claimref
- Supprimer le statefulet
- Relancer le deploiement
Méthode chez OVH : https://support.us.ovhcloud.com/hc/en-us/articles/1500005033982-How-to-Resize-Persistent-Volumes
===== Minikube =====
* Accéder au dashboard : minikube dashboard
* Connaître l'url pour accéder à un service : minikube service service-name --url
* Démarrer Minikube en intégrant un volume : minikube start --mount-string=":" --mount
* Importer des fichiers dans la VM Minikube : rsync -arv -e "ssh -i $(minikube ssh-key)" --rsync-path="sudo rsync" /path/to/source/files/ docker@$(minikube ip):/data/
Ressources de commandes essentielles :
* [[https://www.tutorialspoint.com/kubernetes/kubernetes_kubectl_commands]]
* [[https://kubernetes.io/docs/reference/kubectl/cheatsheet/]]
* [[https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/]]