Aide-mémoire kubectl
Cette annexe rassemble les commandes utilisées dans le cours, classées par besoin. Dans tout le cours, k est un alias de kubectl. Les majuscules (POD, NOM) sont à remplacer par vos valeurs.
Préparation du poste
alias k = kubectl
source <( kubectl completion bash)
complete -o default -F __start_kubectl k
Ajoutez ces lignes à ~/.bashrc pour les conserver. L'autocomplétion (touche Tab) fonctionne alors aussi avec k.
Contexte et namespace
Besoin
Commande
Voir les contextes
k config get-contexts
Changer de contexte
k config use-context NOM
Fixer le namespace par défaut
k config set-context --current --namespace=tp-k8s
Revenir au namespace default
k config set-context --current --namespace=default
Lister les namespaces
k get namespaces
Agir sur un autre namespace
-n NAMESPACE (ou -A pour tous)
Lire l'état du cluster
Besoin
Commande
Lister les nœuds
k get nodes -o wide
Lister les Pods
k get pods, k get pods -o wide, k get pods -A
Plusieurs types à la fois
k get deploy,svc,pods
Tout ce qui est courant
k get all (ne couvre pas ConfigMap, Secret, PVC, Ingress…)
Détail d'un objet
k describe TYPE NOM (lire la section Events en bas)
Manifeste complet
k get TYPE NOM -o yaml
Filtrer par label
k get pods -l app=web
Afficher les labels
k get pods --show-labels
Suivre les changements
k get pods -w (arrêt : Ctrl+C)
Événements récents
k get events --sort-by=.lastTimestamp
Types d'objets disponibles
k api-resources
Documentation d'un champ
k explain pod.spec.containers
Types ajoutés (CRD)
k get crd
Format
Exemple
Colonnes supplémentaires
k get pods -o wide
YAML ou JSON
k get pod POD -o yaml
Une valeur précise
k get svc NOM -o jsonpath='{.spec.clusterIP}'
Une liste de valeurs
k get pods -o jsonpath='{.items[*].metadata.name}'
Colonnes choisies
k get nodes -o custom-columns=NOM:.metadata.name,CPU:.status.allocatable.cpu
Noms seuls
k get pods -o name
Créer, modifier, supprimer
Besoin
Commande
Appliquer un fichier
k apply -f FICHIER.yaml
Appliquer un dossier
k apply -f DOSSIER/
Voir les différences avant d'appliquer
k diff -f FICHIER.yaml
Valider sans créer
k apply -f FICHIER.yaml --dry-run=server
Générer un manifeste de départ
k create deployment web --image=nginx:1.26-alpine --dry-run=client -o yaml > web.yaml
Créer un namespace
k create namespace NOM
Créer un Pod jetable
k run tmp --rm -it --image=busybox:1.36 --restart=Never -- sh
Créer un ConfigMap
k create configmap NOM --from-literal=CLE=valeur ou --from-file=FICHIER
Créer un Secret
k create secret generic NOM --from-literal=CLE=valeur
Créer un Secret TLS
k create secret tls NOM --cert=app.crt --key=app.key
Exposer un Deployment
k expose deployment NOM --port=80
Modifier un champ
k patch TYPE NOM --type=merge -p '{"spec":{"replicas":3}}'
Éditer dans un éditeur
k edit TYPE NOM
Ajouter un label ou une annotation
k label TYPE NOM cle=valeur, k annotate TYPE NOM cle=valeur
Retirer un label
k label TYPE NOM cle- (le tiret final retire le label)
Supprimer par fichier
k delete -f FICHIER.yaml
Supprimer par nom
k delete TYPE NOM
Supprimer tout un type
k delete pods --all
Supprimer un namespace et son contenu
k delete namespace NOM
Attendre une condition
k wait --for=condition=Ready pod/POD --timeout=60s
Suppression forcée
k delete pod POD --grace-period=0 --force retire l'objet de l'API sans attendre l'arrêt du conteneur. Dernier recours uniquement : vérifiez d'abord pourquoi le Pod reste en Terminating.
Déploiements et mises à jour
Besoin
Commande
Changer d'image
k set image deployment/NOM CONTENEUR=image:tag
Suivre un déploiement
k rollout status deployment/NOM
Historique
k rollout history deployment/NOM
Revenir en arrière
k rollout undo deployment/NOM
Revenir à une révision précise
k rollout undo deployment/NOM --to-revision=N
Redémarrer les Pods
k rollout restart deployment/NOM
Changer le nombre de réplicas
k scale deployment NOM --replicas=N
Autoscaling
k get hpa, k describe hpa NOM
Journaux et accès aux conteneurs
Besoin
Commande
Journaux d'un Pod
k logs POD
Suivre en continu
k logs -f POD
Conteneur précédent (après un crash)
k logs POD --previous
Un conteneur précis
k logs POD -c CONTENEUR
Journaux par label
k logs -l app=web --tail=20
Journaux d'un Deployment
k logs deploy/NOM
Lancer une commande
k exec POD -- COMMANDE
Shell interactif
k exec -it POD -- sh
Un conteneur précis
k exec -it POD -c CONTENEUR -- sh
Redirection de port
k port-forward svc/NOM 8080:80 ou k port-forward pod/POD 8080:80
Copier un fichier
k cp POD:/chemin/fichier ./fichier
Ressources et métriques
Besoin
Commande
Consommation des nœuds
k top nodes
Consommation des Pods
k top pods, k top pods --containers
Quotas d'un namespace
k describe resourcequota, k get limitrange
Ressources allouables d'un nœud
k describe node NŒUD (sections Allocatable et Allocated resources)
Réseau
Besoin
Commande
Services et leurs endpoints
k get svc, k get endpoints NOM
Ingress
k get ingress, k describe ingress NOM
NetworkPolicies
k get networkpolicy, k describe networkpolicy NOM
Tester un nom DNS interne
k run tmp --rm -it --image=busybox:1.36 --restart=Never -- nslookup NOM
Stockage
Besoin
Commande
Volumes et réclamations
k get pv, k get pvc
Classes de stockage
k get storageclass
Un PVC reste Pending
k describe pvc NOM
Sécurité
Besoin
Commande
Tester un droit
k auth can-i list pods -n tp-k8s
Tester en tant qu'un ServiceAccount
k auth can-i list pods --as=system:serviceaccount:NAMESPACE:COMPTE -n NAMESPACE
Lister les droits d'un compte
k auth can-i --list --as=system:serviceaccount:NAMESPACE:COMPTE -n NAMESPACE
Rôles et liaisons
k get role,rolebinding, k get clusterrole,clusterrolebinding
ServiceAccounts
k get serviceaccount
Décoder un Secret
k get secret NOM -o jsonpath='{.data.CLE}' \| base64 -d
Nœuds, placement et maintenance
Besoin
Commande
Interdire de nouveaux Pods sur un nœud
k cordon NŒUD
Vider un nœud
k drain NŒUD --ignore-daemonsets --delete-emptydir-data
Réautoriser le nœud
k uncordon NŒUD
Étiqueter un nœud
k label node NŒUD cle=valeur
Poser un taint
k taint nodes NŒUD cle=valeur:NoSchedule
Retirer un taint
k taint nodes NŒUD cle=valeur:NoSchedule-
Afficher une étiquette en colonne
k get nodes -L topology.kubernetes.io/zone
Budgets de disruption
k get pdb
Helm et Kustomize
Besoin
Commande
Ajouter un dépôt
helm repo add NOM URL, puis helm repo update
Chercher un chart
helm search repo MOT, helm search repo CHART --versions
Voir les values d'un chart
helm show values CHART --version VERSION
Installer
helm install RELEASE CHART --version VERSION -f values.yaml -n NAMESPACE
Mettre à jour
helm upgrade RELEASE CHART -f values.yaml -n NAMESPACE
Lister, historique
helm list -A, helm history RELEASE -n NAMESPACE
Revenir en arrière
helm rollback RELEASE REVISION -n NAMESPACE
Désinstaller
helm uninstall RELEASE -n NAMESPACE
Vérifier un chart
helm lint CHART, helm template RELEASE CHART -f values.yaml
Empaqueter
helm package CHART
Valeurs fournies, ou toutes
helm get values RELEASE, helm get values RELEASE --all
Rendre un overlay Kustomize
k kustomize DOSSIER
Appliquer, supprimer un overlay
k apply -k DOSSIER, k delete -k DOSSIER
Spécifique à k3s
Besoin
Commande ou emplacement
Fichier kubeconfig
/etc/rancher/k3s/k3s.yaml (lisible par root)
État du service
sudo systemctl status k3s (serveur) ou k3s-agent (agent)
Journaux du service
sudo journalctl -u k3s -n 50 (ou -u k3s-agent)
Jeton pour joindre un nœud
sudo cat /var/lib/rancher/k3s/server/node-token
Snapshot etcd
sudo k3s etcd-snapshot save --name NOM, sudo k3s etcd-snapshot ls
Emplacement des snapshots
/var/lib/rancher/k3s/server/db/snapshots/
Composants intégrés
k get pods -n kube-system (Traefik, CoreDNS, metrics-server…)
Désinstaller k3s
/usr/local/bin/k3s-uninstall.sh (serveur), /usr/local/bin/k3s-agent-uninstall.sh (agent)
Depuis le poste Windows
Besoin
Commande
Tester une URL
curl.exe -i http://app.k3s.local
Ignorer la vérification TLS (TP uniquement)
curl.exe -k https://app.k3s.local
Faire confiance à une autorité locale
curl.exe --ssl-no-revoke --cacert ca.crt https://app.k3s.local
Tester un port
Test-NetConnection IP -Port 6443 (PowerShell)
curl.exe et non curl
Dans PowerShell, curl est un alias d'une autre commande. Écrivez toujours curl.exe.
Modèles minimaux de manifestes
Objet
apiVersion
kind
Pod, Service, ConfigMap, Secret, PVC, Namespace, ServiceAccount
v1
Pod, Service, ConfigMap, Secret, PersistentVolumeClaim, Namespace, ServiceAccount
Deployment, StatefulSet, DaemonSet
apps/v1
Deployment, StatefulSet, DaemonSet
Job, CronJob
batch/v1
Job, CronJob
Ingress, NetworkPolicy
networking.k8s.io/v1
Ingress, NetworkPolicy
Role, RoleBinding, ClusterRole, ClusterRoleBinding
rbac.authorization.k8s.io/v1
Role, RoleBinding, ClusterRole, ClusterRoleBinding
HorizontalPodAutoscaler
autoscaling/v2
HorizontalPodAutoscaler
PodDisruptionBudget
policy/v1
PodDisruptionBudget
StorageClass
storage.k8s.io/v1
StorageClass
CustomResourceDefinition
apiextensions.k8s.io/v1
CustomResourceDefinition
Pour retrouver la bonne version d'un objet : k api-resources (colonnes APIVERSION et KIND), ou k explain TYPE.
Squelette d'un Deployment :
apiVersion : apps/v1
kind : Deployment
metadata :
name : web
spec :
replicas : 2
selector :
matchLabels :
app : web
template :
metadata :
labels :
app : web
spec :
containers :
- name : web
image : nginx:1.26-alpine
ports :
- containerPort : 80
resources :
requests :
cpu : 20m
memory : 16Mi
limits :
cpu : 100m
memory : 64Mi
Retenir la relation clé
Le selector.matchLabels du Deployment doit correspondre aux labels du gabarit de Pod (template.metadata.labels) ; le selector d'un Service doit correspondre aux labels des Pods.
États d'un Pod et premier réflexe
État
Signification
Premier réflexe
Pending
Pas encore placé ou volume non lié
k describe pod POD : Events
ContainerCreating
Image en cours de téléchargement, volume en cours de montage
Attendre, puis k describe pod POD
ImagePullBackOff, ErrImagePull
Image introuvable ou inaccessible
Nom, tag, registre, accès Internet
CrashLoopBackOff
Le conteneur démarre puis s'arrête en boucle
k logs POD --previous
Running mais READY 0/1
Sonde readiness en échec
k describe pod POD, chemin et port de la sonde
Terminating bloqué
Nœud injoignable, finalizer, arrêt lent
k describe pod POD, état du nœud
Evicted, OOMKilled
Mémoire insuffisante ou limite dépassée
k describe pod POD, limits mémoire
Completed
Fin normale d'un Job
Rien à faire