Aller au contenu

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