☸️ Kubectl
Pods, deployments, services, namespaces, debug
Aide-mémoire
Kubectl — Aide-mémoire
Configuration & Contextes
kubectl version --client
kubectl config view # Voir la kubeconfig
kubectl config get-contexts # Lister les contextes
kubectl config current-context # Contexte actif
kubectl config use-context mon-cluster # Changer de contexte
kubectl config set-context --current --namespace=prod # Namespace par défaut
Variables d'environnement
export KUBECONFIG=~/.kube/config:~/.kube/autre-config # Fusionner plusieurs configs
Namespaces
kubectl get namespaces
kubectl create namespace staging
kubectl delete namespace staging
Travailler dans un namespace
kubectl get pods -n prod
kubectl get all -n prod
kubectl -n prod exec -it mon-pod -- bash
alias kprod='kubectl -n prod' # Alias pratique
Pods
kubectl get pods # Pods dans le namespace courant
kubectl get pods -A # Tous les namespaces
kubectl get pods -o wide # Avec IP et nœud
kubectl get pods --show-labels
kubectl get pods -l app=nginx # Filtrer par label
kubectl get pod mon-pod -o yaml # YAML complet
kubectl describe pod mon-pod # Événements + état détaillé
kubectl logs mon-pod # Logs
kubectl logs mon-pod -f # Suivre en temps réel
kubectl logs mon-pod -c mon-conteneur # Multi-conteneur
kubectl logs mon-pod --previous # Logs du pod précédent (après crash)
kubectl logs -l app=nginx --all-containers # Logs de tous les pods d'un label
kubectl exec -it mon-pod -- bash # Shell interactif
kubectl exec -it mon-pod -c mon-conteneur -- bash # Conteneur spécifique
kubectl exec mon-pod -- cat /etc/nginx/nginx.conf # Commande directe
kubectl delete pod mon-pod # Supprimer (re-créé si géré par Deployment)
kubectl delete pod mon-pod --force --grace-period=0 # Force immédiate
Deployments
kubectl get deployments
kubectl describe deployment mon-deploy
Créer / Mettre à jour
kubectl apply -f deployment.yaml
kubectl create deployment nginx --image=nginx:1.25
Scaler
kubectl scale deployment mon-deploy --replicas=3
kubectl autoscale deployment mon-deploy --min=2 --max=10 --cpu-percent=80
Rollout
kubectl rollout status deployment/mon-deploy
kubectl rollout history deployment/mon-deploy
kubectl rollout undo deployment/mon-deploy # Retour en arrière
kubectl rollout undo deployment/mon-deploy --to-revision=2
Mettre à jour l'image
kubectl set image deployment/mon-deploy app=mon-image:v2
kubectl set env deployment/mon-deploy NODE_ENV=production
Annoter (requis pour rollout history)
kubectl annotate deployment mon-deploy kubernetes.io/change-cause="Update to v2"
Services
kubectl get services
kubectl get svc -o wide
Types de services
ClusterIP : accessible uniquement dans le cluster (défaut)
NodePort : port sur chaque nœud (30000-32767)
LoadBalancer: IP externe (cloud providers)
ExternalName: alias DNS externe
kubectl expose deployment nginx --port=80 --type=ClusterIP
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl expose deployment nginx --port=80 --type=LoadBalancer
Port-forward (accès local → service/pod)
kubectl port-forward service/mon-service 8080:80
kubectl port-forward pod/mon-pod 8080:80
kubectl port-forward deployment/mon-deploy 8080:80
ConfigMaps & Secrets
# ConfigMap
kubectl create configmap ma-config \
--from-literal=DB_HOST=localhost \
--from-literal=DB_PORT=5432
kubectl create configmap ma-config --from-file=config.yaml
kubectl get configmap ma-config -o yaml
Secret
kubectl create secret generic mon-secret \
--from-literal=DB_PASSWORD=secret123 \
--from-literal=API_KEY=abcdef
kubectl create secret generic mon-secret --from-file=.dockerconfigjson
kubectl create secret docker-registry regcred \
--docker-server=registry.example.com \
--docker-username=user \
--docker-password=pass \
[email protected]
kubectl get secrets
kubectl describe secret mon-secret
Décoder un secret
kubectl get secret mon-secret -o jsonpath='{.data.DB_PASSWORD}' | base64 -d
Ingress
kubectl get ingress -A
kubectl describe ingress mon-ingress
Exemple Ingress NGINX
cat <<YAML | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mon-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: monapp.exemple.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mon-service
port:
number: 80
tls:
- hosts:
- monapp.exemple.com
secretName: mon-cert-tls
YAML
Volumes & PersistentVolumeClaims
kubectl get pv # PersistentVolumes
kubectl get pvc # PersistentVolumeClaims
kubectl describe pvc mon-pvc
PVC simple
cat <<YAML | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mon-pvc
spec:
accessModes: [ReadWriteOnce]
storageClassName: standard
resources:
requests:
storage: 10Gi
YAML
Nœuds
kubectl get nodes
kubectl get nodes -o wide # Avec IPs
kubectl describe node mon-noeud
kubectl top nodes # CPU/RAM (nécessite metrics-server)
kubectl top pods -A # CPU/RAM des pods
Maintenance
kubectl cordon mon-noeud # Empêcher les nouveaux pods
kubectl drain mon-noeud --ignore-daemonsets # Évacuer les pods
kubectl uncordon mon-noeud # Réautoriser
kubectl label node mon-noeud role=worker # Ajouter un label
kubectl taint nodes mon-noeud key=value:NoSchedule # Taint
kubectl taint nodes mon-noeud key=value:NoSchedule- # Supprimer le taint
Debugging
# Pod éphémère de debug (k8s 1.23+)
kubectl debug -it mon-pod --image=busybox --target=mon-conteneur
Copier des fichiers
kubectl cp mon-pod:/var/log/app.log ./app.log
kubectl cp ./config.yaml mon-pod:/etc/app/config.yaml
Événements
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl get events -n prod --field-selector type=Warning
Métriques
kubectl top pod mon-pod --containers
Test DNS dans le cluster
kubectl run dns-test --image=busybox --rm -it --restart=Never -- nslookup kubernetes.default
Test connectivité réseau
kubectl run net-test --image=curlimages/curl --rm -it --restart=Never -- curl http://mon-service
État du cluster
kubectl cluster-info
kubectl get componentstatuses # État des composants (deprecated >1.20)
kubectl api-resources # Tous les types de ressources
kubectl explain deployment.spec # Documentation inline
Kubectl avancé
# JSONPath
kubectl get pods -o jsonpath='{.items[*].metadata.name}'
kubectl get pod mon-pod -o jsonpath='{.spec.containers[0].image}'
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
Custom columns
kubectl get pods -o custom-columns=NAME:.metadata.name,IMAGE:.spec.containers[0].image
Diff avant apply
kubectl diff -f mon-deployment.yaml
Dry-run
kubectl apply -f mon-deployment.yaml --dry-run=client
kubectl apply -f mon-deployment.yaml --dry-run=server # Valide côté API
Générer du YAML
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > deploy.yaml
Attendre qu'un déploiement soit prêt
kubectl wait --for=condition=available deployment/mon-deploy --timeout=120s
kubectl wait --for=condition=ready pod -l app=nginx --timeout=60s
Kubectl avec plusieurs fichiers
kubectl apply -f manifests/ # Appliquer tout un dossier
kubectl apply -f manifests/ -R # Récursivement
kubectl delete -f manifests/ # Supprimer tout
Kustomize (intégré à kubectl)
kubectl apply -k overlays/prod/
kubectl diff -k overlays/prod/
kubectl build -k overlays/prod/ | kubectl apply -f -
🔧 Ouvrir tools.rdr-it.com — application complète →
Plus de 40 outils AdminSys gratuits · SSL · DNS · Docker · Nginx · SSH · Mermaid · et plus