Cheat-sheet kubectl¶
k9s va vite, mais kubectl reste indispensable (scripts, CI, ce que k9s ne fait pas).
Lecture¶
kubectl get pods # pods du namespace courant
kubectl get pods -A # tous les namespaces
kubectl get pods -o wide # + IP et nœud
kubectl get pods -w # watch (temps réel)
kubectl get all -n mon-ns # tout dans un namespace
kubectl describe pod mon-pod # détails + events (debug !)
kubectl get pod mon-pod -o yaml # YAML complet
kubectl api-resources # liste des types de ressources
Logs & exec¶
kubectl logs mon-pod # logs
kubectl logs mon-pod -f # suivre (follow)
kubectl logs mon-pod --previous # logs du conteneur précédent (crash)
kubectl logs deploy/web # logs d'un deployment
kubectl exec -it mon-pod -- sh # shell dans le pod
kubectl cp mon-pod:/chemin ./local # copier un fichier
Créer / modifier¶
kubectl create deployment web --image nginx:1.27-alpine --replicas 3
kubectl apply -f manifest.yaml # appliquer (idempotent)
kubectl delete -f manifest.yaml
kubectl get -f manifest.yaml # vérifier ce que le fichier a produit
kubectl edit deploy web # éditer en live
kubectl scale deploy web --replicas 5
kubectl rollout restart deploy web # redémarrer les pods
kubectl rollout status deploy web
kubectl rollout undo deploy web # rollback
Écrire un manifeste (module 3y)¶
# ① le squelette - on ne part jamais de la page blanche
kubectl create deployment web --image nginx:1.27-alpine --dry-run=client -o yaml > web.yaml
kubectl run mon-pod --image nginx:1.27-alpine --dry-run=client -o yaml > pod.yaml
kubectl create configmap reglages --from-literal COULEUR=bleu --dry-run=client -o yaml
kubectl expose deploy/web --port 80 --dry-run=client -o yaml # le Service qui va devant
# ② nettoyer : supprimer « status: {} » et les rubriques vides ({}), garder ce qu'on comprend
# ③ compléter
kubectl explain deployment.spec # tous les champs possibles, expliqués
kubectl api-resources # les types d'objets et leur apiVersion
# ④ vérifier AVANT d'appliquer
kubectl apply -f web.yaml --dry-run=server # l'API valide pour de vrai, sans rien créer
kubectl diff -f web.yaml # ce que l'apply CHANGERAIT sur le cluster
La famille kubectl set - modifier sans éditer¶
kubectl set image deploy/web web=nginx:1.27 # changer l'image (rolling update)
kubectl set env deploy/web MODE=run # poser une variable d'environnement
kubectl set env deploy/web --from configmap/app-config # injecter TOUT un ConfigMap en variables
kubectl set selector svc/web app=web # corriger le selector d'un service
kubectl set resources deploy/web --requests memory=32Mi --limits memory=64Mi
kubectl patch deploy web -p '{"spec":{"replicas":4}}' # modifier un champ précis (scriptable)
Et l'équivalent déclaratif de l'injection de config, dans un manifeste :
containers:
- name: web
image: nginx:1.27-alpine
envFrom: # toutes les clés du ConfigMap deviennent des variables
- configMapRef:
name: app-config
env: # ou clé par clé
- name: MESSAGE
valueFrom:
configMapKeyRef: { name: app-config, key: MESSAGE }
Debug¶
kubectl get events --sort-by .lastTimestamp
kubectl describe pod mon-pod # cause d'un CrashLoop / Pending
kubectl top pods # conso CPU/mémoire (metrics-server requis)
kubectl get pod mon-pod -o jsonpath='{.status.phase}'
kubectl run debug --rm -it --image busybox:1.36 -- sh # pod jetable de debug
kubectl debug -it mon-pod --image busybox:1.36 # conteneur éphémère DANS le pod (images distroless)
Réseau¶
kubectl port-forward svc/web 8080:80 # exposer un service en local (puis navigateur)
kubectl get svc # services + ClusterIP
kubectl get ingress
kubectl get endpoints web # à quels pods pointe le service
# tester un service de l'intérieur, par son NOM (DNS interne) - sans port-forward :
kubectl run ping --rm -it --image curlimages/curl:8.11.1 --restart Never -- curl -s http://web
RBAC & contexte¶
kubectl auth can-i create pods # ai-je le droit ?
kubectl auth can-i '*' '*' --as system:serviceaccount:default:monsa
kubectl config get-contexts
kubectl config use-context mon-cluster
kubectl config set-context --current --namespace mon-ns
Raccourcis bien pratiques¶
alias k=kubectl
kubectl explain pod.spec.containers # doc intégrée d'un champ
kubectl get pods --field-selector status.phase=Running
kubectl label pod mon-pod env=test # poser un label après coup
kubectl get pods --show-labels # voir les labels
kubectl get pods -l app=web # filtrer par label (la sélection d'un Service)
kubectl get pods -l app=web -w # … et suivre en temps réel