1. Configuration et contextes #
Où suis-je connecté ?
Contextes et namespaces #
kubectl version --short 2>/dev/null || kubectl version
kubectl config get-contexts
kubectl config current-context
kubectl config use-context prod-eu
kubectl config set-context --current --namespace=production # namespace par défaut
alias k=kubectl; source <(kubectl completion bash); complete -o default -F __start_kubectl k
# Utiliser un fichier kubeconfig spécifique
export KUBECONFIG=~/.kube/config:~/.kube/cluster2
kubectl --kubeconfig=./staging.yaml get nodes2. Lire l'état du cluster #
get, describe, top, events.
Afficher les ressources #
logs et describe.kubectl get pods|svc|deploy|ing|pvc|cm|secret|nodes|ns -A # -A = tous les namespaces
kubectl get pods -o wide # IP et nœud
kubectl get pods -o yaml # manifeste complet
kubectl get pods --show-labels
kubectl get pods -l app=web,env=prod # sélecteur de labels
kubectl get pods --field-selector status.phase!=Running -A
kubectl get pods --sort-by=.status.startTime
kubectl get all -n production
kubectl describe pod <pod> # événements, état, sondes
kubectl top nodes && kubectl top pods -A --sort-by=memory # nécessite metrics-server
kubectl get events -A --sort-by=.lastTimestamp | tail -20Extraire des champs avec JSONPath et custom-columns #
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\n"}{end}'
kubectl get nodes -o custom-columns=NOM:.metadata.name,CPU:.status.capacity.cpu,MEM:.status.capacity.memory
kubectl get secret db -o jsonpath='{.data.password}' | base64 -d
kubectl get pods -o json | jq -r '.items[] | select(.status.phase!="Running") | .metadata.name'3. Créer, modifier, supprimer #
Cycle de vie des objets.
Commandes impératives et déclaratives #
kubectl apply -f deploy.yaml # déclaratif (recommandé)
kubectl apply -k overlays/prod/ # Kustomize
kubectl diff -f deploy.yaml # voir ce qui changerait
kubectl create deployment web --image=nginx:1.27 --replicas=2 --dry-run=client -o yaml > deploy.yaml
kubectl run debug --image=busybox -it --rm --restart=Never -- sh
kubectl expose deployment web --port=80 --target-port=8080 --type=ClusterIP
kubectl scale deployment web --replicas=5
kubectl set image deployment/web nginx=nginx:1.27.2
kubectl label pod <pod> env=prod --overwrite
kubectl annotate pod <pod> owner=equipe-a
kubectl edit deployment web # édition directe (à éviter en prod)
kubectl patch deployment web -p '{"spec":{"replicas":3}}'
kubectl delete -f deploy.yaml
kubectl delete pod <pod> --grace-period=0 --force # dernier recoursMises à jour progressives #
kubectl rollout status deployment/web
kubectl rollout history deployment/web
kubectl rollout undo deployment/web # retour arrière
kubectl rollout undo deployment/web --to-revision=2
kubectl rollout restart deployment/web # redémarrage progressif
kubectl rollout pause deployment/web && kubectl rollout resume deployment/web4. Déboguer #
Logs, exec, port-forward, debug.
Diagnostiquer un pod #
kubectl logs <pod> # logs du conteneur
kubectl logs <pod> -c <conteneur> -f --tail=100 --since=10m
kubectl logs <pod> --previous # logs avant le dernier crash
kubectl logs -l app=web --all-containers --prefix # tous les pods d'un label
kubectl exec -it <pod> -- sh # shell dans le pod
kubectl exec <pod> -- env | sort
kubectl port-forward svc/web 8080:80 # http://localhost:8080
kubectl port-forward pod/<pod> 5432:5432
kubectl cp <pod>:/var/log/app.log ./app.log
kubectl debug -it <pod> --image=nicolaka/netshoot --target=<conteneur> # conteneur éphémère de debug
kubectl debug node/<noeud> -it --image=busybox # inspecter un nœudDroits et ressources #
kubectl auth can-i create deployments -n production
kubectl auth can-i --list --as=system:serviceaccount:prod:app
kubectl api-resources --namespaced=true
kubectl explain pod.spec.containers.resources
kubectl get --raw /metrics | head # métriques de l'API serverBonne Pratique : Activez la complétion et l'aliask, et installezkubectx/kubenspour changer de contexte et de namespace en une commande.
