☸️ 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