# Créer un alias pour un contextekubectlconfigset-contextdev--cluster=minikube--user=minikube--namespace=dev
# Basculer rapidement entre contexteskubectlconfiguse-contextproduction
kubectlconfiguse-contextstaging
# Voir quel namespace est actifkubectlconfigview--minify|grepnamespace:
# Créer plusieurs namespaceskubectlcreatensdev
kubectlcreatensstaging
kubectlcreatensproduction
# Travailler temporairement dans un namespacekubectlgetpods-nkube-system
kubectlgetsvc-nproduction
# Définir le namespace par défaut pour la sessionknsproduction# Avec l'alias défini plus haut
2. Pods
Opérations de Base
Action
Commande
Description
Lister pods
kubectl get pods
Tous les pods du namespace actuel
Tous les namespaces
kubectl get pods -A ou --all-namespaces
Pods de tous les namespaces
Détails d'un pod
kubectl describe pod <nom>
Informations détaillées
Format large
kubectl get pods -o wide
Afficher IP, Node, etc.
Watch
kubectl get pods -w
Surveiller les changements en temps réel
Créer pod
kubectl run <nom> --image=<image>
Créer un pod simple
Supprimer pod
kubectl delete pod <nom>
Supprimer un pod
Force delete
kubectl delete pod <nom> --grace-period=0 --force
Suppression forcée
# Lancer un pod nginx temporairekubectlrunnginx--image=nginx:latest--port=80# Pod avec variables d'environnementkubectlrunmyapp--image=myapp:v1--env="ENV=production"--env="DEBUG=false"# Pod temporaire pour debug (supprimé après exit)kubectlrundebug--rm-it--image=busybox--sh
# Obtenir les pods avec leur consommation (nécessite metrics-server)kubectltoppods
kubectltoppods--all-namespaces
Sélecteurs & Filtres
# Filtrer par labelkubectlgetpods-lapp=nginx
kubectlgetpods-lapp=nginx,env=production
kubectlgetpods-l'env in (dev,staging)'# Filtrer par statutkubectlgetpods--field-selector=status.phase=Running
kubectlgetpods--field-selector=status.phase!=Running
# Trier par créationkubectlgetpods--sort-by=.metadata.creationTimestamp
# Trier par restartskubectlgetpods--sort-by='.status.containerStatuses[0].restartCount'
# Créer un deployment avec 3 replicaskubectlcreatedeploymentwebapp--image=nginx:1.21--replicas=3# Mettre à jour l'image (déclenchement d'un rolling update)kubectlsetimagedeployment/webappnginx=nginx:1.22
# Surveiller le déploiementkubectlrolloutstatusdeployment/webapp
# Voir l'historique des déploiementskubectlrollouthistorydeployment/webapp
# Rollback au déploiement précédentkubectlrolloutundodeployment/webapp
# Rollback à une version spécifiquekubectlrollouthistorydeployment/webapp# Voir les révisionskubectlrolloutundodeployment/webapp--to-revision=3
Rolling Updates
Par défaut, Kubernetes effectue un rolling update (mise à jour progressive).
Configuration dans le deployment:
spec:replicas:3strategy:type:RollingUpdaterollingUpdate:maxSurge:1# Max 1 pod supplémentaire pendant l'updatemaxUnavailable:0# Aucun pod indisponible (zero downtime)
ReplicaSets & StatefulSets
# Lister ReplicaSetskubectlgetreplicasets
kubectlgetrs
# Lister StatefulSetskubectlgetstatefulsets
kubectlgetsts
# Scaler un StatefulSetkubectlscalestatefulset/mysql--replicas=3# Supprimer un StatefulSet sans supprimer les podskubectldeletestatefulsetmysql--cascade=false
# Exposer un deployment en ClusterIP (interne uniquement)kubectlexposedeploymentwebapp--port=80--target-port=8080--name=webapp-svc
# Exposer en NodePort (accessible via IP du node)kubectlexposedeploymentwebapp--port=80--type=NodePort--name=webapp-nodeport
# Exposer en LoadBalancer (cloud provider)kubectlexposedeploymentwebapp--port=80--type=LoadBalancer--name=webapp-lb
# Voir les endpoints d'un servicekubectlgetendpointswebapp-svc
# Tester un service depuis un pod temporairekubectlruncurl--image=curlimages/curl-i--rm--restart=Never--curlhttp://webapp-svc
Ingress
# Lister les Ingresskubectlgetingress
kubectlgeting
# Décrire un Ingresskubectldescribeingressmyapp-ingress
# Créer un Ingress (nécessite un fichier YAML)kubectlapply-fingress.yaml
Network Policies
# Lister les Network Policieskubectlgetnetworkpolicies
kubectlgetnetpol
# Décrire une Network Policykubectldescribenetworkpolicydeny-all
5. Logs & Debugging
Logs
Action
Commande
Logs d'un pod
kubectl logs <pod>
Logs container spécifique
kubectl logs <pod> -c <container>
Follow logs
kubectl logs -f <pod>
Logs précédent
kubectl logs <pod> --previous
Dernières N lignes
kubectl logs <pod> --tail=100
Logs depuis X temps
kubectl logs <pod> --since=1h
Tous les pods d'un label
kubectl logs -l app=nginx --all-containers=true
# Logs en temps réelkubectllogs-fwebapp-7d8f9c5b6-xkq2m
# Logs du container précédent (après crash)kubectllogswebapp-7d8f9c5b6-xkq2m--previous
# Logs multiples pods (par label)kubectllogs-f-lapp=webapp--all-containers=true# Logs depuis les 30 dernières minuteskubectllogswebapp-7d8f9c5b6-xkq2m--since=30m
# Logs avec timestampskubectllogswebapp-7d8f9c5b6-xkq2m--timestamps
# Exporter les logs dans un fichierkubectllogswebapp-7d8f9c5b6-xkq2m>/tmp/webapp.log
Debugging & Exec
Action
Commande
Shell dans un pod
kubectl exec -it <pod> -- /bin/bash
Exec dans container
kubectl exec -it <pod> -c <container> -- /bin/sh
Commande unique
kubectl exec <pod> -- ls -la /app
Port forward
kubectl port-forward <pod> 8080:80
Port forward service
kubectl port-forward svc/<service> 8080:80
Copy vers pod
kubectl cp /local/file <pod>:/remote/path
Copy depuis pod
kubectl cp <pod>:/remote/file /local/path
# Ouvrir un shell dans un podkubectlexec-itwebapp-7d8f9c5b6-xkq2m--/bin/bash
# Exécuter une commande sans entrer dans le podkubectlexecwebapp-7d8f9c5b6-xkq2m--env
kubectlexecwebapp-7d8f9c5b6-xkq2m--cat/etc/nginx/nginx.conf
# Port forwarding (accès local au pod)kubectlport-forwardwebapp-7d8f9c5b6-xkq2m8080:80
# Ensuite: curl http://localhost:8080# Port forwarding vers un servicekubectlport-forwardsvc/webapp-svc8080:80
# Copier un fichier vers un podkubectlcpconfig.yamlwebapp-7d8f9c5b6-xkq2m:/etc/app/config.yaml
# Copier depuis un podkubectlcpwebapp-7d8f9c5b6-xkq2m:/var/log/app.log./app.log
Debugging Avancé
# Voir les événements du clusterkubectlgetevents--sort-by=.metadata.creationTimestamp
kubectlgetevents--field-selectortype=Warning
# Événements d'un namespacekubectlgetevents-nkube-system
# Debug d'un pod qui ne démarre paskubectldescribepod<pod>
kubectllogs<pod>--previous
# Créer un pod de debug avec image spécifiquekubectldebug<pod>-it--image=busybox--share-processes--copy-to=debug-pod
# Voir l'utilisation des ressourceskubectltopnodes
kubectltoppods
kubectltoppods--containers
# Créer un ConfigMap avec des paires clé-valeurkubectlcreateconfigmapapp-config\--from-literal=database_host=mysql.example.com\--from-literal=database_port=3306\--from-literal=log_level=info
# Créer depuis un fichierkubectlcreateconfigmapnginx-config--from-file=nginx.conf
# Créer depuis plusieurs fichierskubectlcreateconfigmapapp-configs--from-file=./config/
# Voir le contenukubectlgetconfigmapapp-config-oyaml
# Utiliser dans un pod (exemple)# spec:# containers:# - name: app# envFrom:# - configMapRef:# name: app-config
kubectl get secret <nom> -o jsonpath='{.data.password}' \| base64 -d
# Créer un secret pour DB credentialskubectlcreatesecretgenericdb-credentials\--from-literal=username=admin\--from-literal=password='MyS3cr3tP@ss'# Créer un secret TLSkubectlcreatesecrettlswebapp-tls\--cert=webapp.crt\--key=webapp.key
# Secret pour pull depuis un registry privékubectlcreatesecretdocker-registryregcred\--docker-server=registry.example.com\--docker-username=myuser\--docker-password=mypassword\--docker-email=myemail@example.com
# Voir un secret (encodé en base64)kubectlgetsecretdb-credentials-oyaml
# Décoder un secretkubectlgetsecretdb-credentials-ojsonpath='{.data.password}'|base64-d
echo""# Ajouter un retour à la ligne# Créer un secret depuis un fichierkubectlcreatesecretgenericssh-key--from-file=id_rsa=~/.ssh/id_rsa
Attention Sécurité
Les secrets Kubernetes sont encodés en base64, PAS chiffrés.
- Utilisez RBAC pour limiter l'accès
- Considérez des solutions comme Sealed Secrets ou External Secrets Operator
- Activez le chiffrement au repos (encryption at rest)
7. Volumes & Persistent Storage
PersistentVolumes & PersistentVolumeClaims
# Lister PersistentVolumeskubectlgetpersistentvolumes
kubectlgetpv
# Lister PersistentVolumeClaimskubectlgetpersistentvolumeclaims
kubectlgetpvc
# Décrire un PVCkubectldescribepvcmysql-pvc
# Voir l'utilisation du stockagekubectlgetpvc-ocustom-columns=NAME:.metadata.name,SIZE:.spec.resources.requests.storage,USED:.status.capacity.storage
# Supprimer un PVC (attention: supprime les données si reclaim policy = Delete)kubectldeletepvcmysql-pvc
StorageClasses
# Lister les StorageClasseskubectlgetstorageclass
kubectlgetsc
# Voir les détailskubectldescribescstandard
# Définir une StorageClass par défautkubectlpatchstorageclassstandard-p'{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
8. Commandes Utilitaires
Manipulation YAML & JSON
# Obtenir la définition YAML d'une ressourcekubectlgetpodwebapp-7d8f9c5b6-xkq2m-oyaml
# Format JSONkubectlgetpodwebapp-7d8f9c5b6-xkq2m-ojson
# Extraire un champ spécifique (jsonpath)kubectlgetpods-ojsonpath='{.items[*].metadata.name}'kubectlgetpods-ojsonpath='{.items[*].status.podIP}'# Format custom-columnskubectlgetpods-ocustom-columns=NAME:.metadata.name,STATUS:.status.phase,IP:.status.podIP
# Export pour sauvegarde/migrationkubectlgetdeploymentwebapp-oyaml--export>webapp-deployment.yaml
# Dry-run: Voir le YAML sans créer la ressourcekubectlcreatedeploymenttest--image=nginx--dry-run=client-oyaml
kubectlruntest--image=nginx--dry-run=client-oyaml>pod.yaml
Apply, Create, Replace
# Apply: Créer ou mettre à jour (recommandé)kubectlapply-fdeployment.yaml
# Create: Créer uniquement (erreur si existe)kubectlcreate-fdeployment.yaml
# Replace: Remplacer (erreur si n'existe pas)kubectlreplace-fdeployment.yaml
# Delete: Supprimerkubectldelete-fdeployment.yaml
# Apply un dossier entierkubectlapply-f./manifests/
# Apply depuis une URLkubectlapply-fhttps://raw.githubusercontent.com/example/repo/main/deploy.yaml
Labels & Annotations
# Ajouter un labelkubectllabelpodwebapp-7d8f9c5b6-xkq2menv=production
# Modifier un label existantkubectllabelpodwebapp-7d8f9c5b6-xkq2menv=staging--overwrite
# Supprimer un labelkubectllabelpodwebapp-7d8f9c5b6-xkq2menv-
# Ajouter une annotationkubectlannotatepodwebapp-7d8f9c5b6-xkq2mdescription="Main web application"# Lister avec labelskubectlgetpods--show-labels
kubectlgetpods-Lapp,env
9. Gestion des Ressources
Quotas & Limits
# Lister ResourceQuotaskubectlgetresourcequotas
kubectlgetquota
# Lister LimitRangeskubectlgetlimitranges
kubectlgetlimits
# Voir l'utilisation des ressources d'un namespacekubectldescribenamespaceproduction
kubectltoppods-nproduction
kubectltopnodes
Patch & Edit
# Edit: Ouvrir la ressource dans un éditeurkubectleditdeploymentwebapp
# Patch: Modifier partiellement (JSON)kubectlpatchdeploymentwebapp-p'{"spec":{"replicas":5}}'# Patch stratégique (merge)kubectlpatchdeploymentwebapp--type='json'-p='[{"op": "replace", "path": "/spec/replicas", "value":3}]'# Patch avec un fichierkubectlpatchdeploymentwebapp--patch-file=patch.yaml
10. Maintenance & Administration
Nodes
# Lister les nodeskubectlgetnodes
kubectlgetnodes-owide
# Détails d'un nodekubectldescribenode<node-name>
# Marquer un node comme non schedulable (drain)kubectlcordon<node-name>
# Évacuer les pods d'un node (maintenance)kubectldrain<node-name>--ignore-daemonsets--delete-emptydir-data
# Remettre un node en servicekubectluncordon<node-name>
# Voir les pods sur un nodekubectlgetpods--all-namespaces-owide--field-selectorspec.nodeName=<node-name>
# Taint un node (empêcher scheduling)kubectltaintnodes<node-name>key=value:NoSchedule
# Retirer un taintkubectltaintnodes<node-name>key:NoSchedule-
Backup & Restore
# Backup de toutes les ressources d'un namespacekubectlgetall-nproduction-oyaml>backup-production.yaml
# Backup spécifiquekubectlgetdeployment,service,configmap,secret-nproduction-oyaml>backup.yaml
# Restorekubectlapply-fbackup-production.yaml
# Backup avec Velero (outil dédié)velerobackupcreateproduction-backup--include-namespacesproduction
velerorestorecreate--from-backupproduction-backup
11. Tips & Tricks
Productivité
# Complétion bash (à ajouter dans ~/.bashrc)source<(kubectlcompletionbash)echo"source <(kubectl completion bash)">>~/.bashrc
# Alias kubectl -> kaliask=kubectl
complete-odefault-F__start_kubectlk
# Fonction pour changer rapidement de namespacekns(){kubectlconfigset-context--current--namespace=$1}# Fonction pour changer de contextekx(){kubectlconfiguse-context$1}
Commandes Combinées
# Supprimer tous les pods Failedkubectldeletepods--field-selectorstatus.phase=Failed-A
# Supprimer tous les pods Evictedkubectlgetpods-A|grepEvicted|awk'{print $2, "-n", $1}'|xargskubectldeletepod
# Redémarrer tous les pods d'un deploymentkubectlrolloutrestartdeploymentwebapp
# Obtenir les images de tous les podskubectlgetpods-ojsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}'# Compter les pods par nodekubectlgetpods-A-owide|awk'{print $8}'|sort|uniq-c
# Voir tous les pods qui ne sont pas Runningkubectlgetpods-A--field-selector=status.phase!=Running
Debug Shortcuts
# Pod de debug temporaire (auto-supprimé)kubectlrundebug-pod--rm-it--image=nicolaka/netshoot--bash
# Tester la résolution DNSkubectlrundnsutils--rm-it--image=gcr.io/kubernetes-e2e-test-images/dnsutils:1.3--nslookupkubernetes.default
# Curl depuis un pod temporairekubectlruncurl--rm-it--image=curlimages/curl--sh
# Voir les API resources disponibleskubectlapi-resources
kubectlapi-resources--namespaced=truekubectlapi-resources--namespaced=false# Expliquer une ressourcekubectlexplainpod
kubectlexplainpod.spec
kubectlexplainpod.spec.containers