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
- Vérifier que les quatre nœuds sont
Ready. - Vérifier zéro pod inattendu hors
Running/Succeeded. - Vérifier toutes les Kustomizations Flux
Ready=Truesur la même révision. - Vérifier les certificats et les URL publiques.
- Vérifier Gatus, Grafana et les logs de l'application.
- Documenter la cause et la correction si elle peut se reproduire.