Aller au contenu

Troubleshooting infrastructure

Triage rapide

kubectl get nodes -o wide
kubectl get pods -A
kubectl get events -A --sort-by=.lastTimestamp
kubectl -n flux-system get gitrepositories,kustomizations
kubectl get ingress,certificate -A
kubectl top nodes

Arbre de diagnostic

flowchart TD
  A[Service indisponible] --> B{DNS résout ?}
  B -- Non --> C[Cloudflare / délégation]
  B -- Oui --> D{TLS répond ?}
  D -- Non --> E[cert-manager / Traefik / port 443]
  D -- Oui --> F{Ingress trouve le Service ?}
  F -- Non --> G[Ingress / Service / endpoints]
  F -- Oui --> H{Pods Ready ?}
  H -- Non --> I[Events / logs / probes / PVC]
  H -- Oui --> J[Application / SSO / dépendance]

Par composant

Flux

kubectl -n flux-system get gitrepository,kustomizations
kubectl -n flux-system describe kustomization apps
kubectl -n flux-system logs deployment/source-controller --tail=200
kubectl -n flux-system logs deployment/kustomize-controller --tail=200

Comparer lastAppliedRevision au dernier commit de main. Corriger Git, puis demander une réconciliation ; ne pas patcher l'application directement.

etcd et control-plane

kubectl get nodes
kubectl get --raw='/readyz?verbose'

Sur chaque serveur control-plane concerné : systemctl status k3s, journalctl -u k3s et k3s etcd-snapshot ls. Stopper toute action destructive si deux membres etcd sont indisponibles.

Sur le worker UK, le service à contrôler est k3s-agent :

systemctl status k3s-agent
journalctl -u k3s-agent --since "30 minutes ago" --no-pager

Réseau, DNS et Ingress

kubectl -n kube-system get pods -l app.kubernetes.io/name=traefik -o wide
kubectl -n kube-system get svc traefik
kubectl get ingress -A
kubectl get endpointslice -A
Resolve-DnsName <hote> -Server 1.1.1.1

Si les événements affichent DNSConfigForming, contrôler sur le nœud concerné :

grep '^nameserver' /run/systemd/resolve/resolv.conf
resolvectl status ens3

Il doit y avoir au plus trois entrées nameserver au total, sans doublon. Kubelet compte les entrées du fichier et non le nombre d'adresses distinctes. Ne pas déclarer les mêmes DNS simultanément dans la configuration globale de systemd-resolved et dans celle de l'interface réseau.

TLS

kubectl get certificate,certificaterequest,challenge,order -A
kubectl -n cert-manager logs deployment/cert-manager --tail=200

Pour HTTP-01, le DNS doit viser une entrée joignable et le port 80 doit atteindre Traefik.

Pod non prêt

kubectl -n <namespace> describe pod <pod>
kubectl -n <namespace> logs <pod> --all-containers --tail=200
kubectl -n <namespace> logs <pod> --all-containers --previous --tail=200

Lire d'abord les événements et le message de la probe. Vérifier ConfigMap, Secret, ServiceAccount, limites, image et dépendances.

Stockage

kubectl get pvc,pv -A
kubectl describe pv <volume>
kubectl get pods -A -o wide

Les volumes local-path sont liés à un nœud. Une panne ou un remplacement de celui-ci peut empêcher la reprise du pod même si un autre nœud a de la capacité.

Ressources

kubectl top nodes
kubectl top pods -A --sort-by=memory
kubectl describe node <noeud>

Chercher MemoryPressure, DiskPressure, évictions, OOMKilled et pods sans requests/limits.

Après correction

  1. Vérifier que les quatre nœuds sont Ready.
  2. Vérifier zéro pod inattendu hors Running/Succeeded.
  3. Vérifier toutes les Kustomizations Flux Ready=True sur la même révision.
  4. Vérifier les certificats et les URL publiques.
  5. Vérifier Gatus, Grafana et les logs de l'application.
  6. Documenter la cause et la correction si elle peut se reproduire.