Colle tes manifestes Kubernetes (ou la sortie de kubectl get pods,netpol,svc,ns -A -o yaml, ou de helm template) et il calcule quel pod peut se connecter à quel autre selon leurs NetworkPolicies, avec le port. Clique sur une cellule pour voir pourquoi : quelle politique isole chaque côté et quelle règle laisse passer. Il signale aussi ce qui ne mène nulle part : Services sans pods, ConfigMaps ou Secrets absents, politiques qui ne sélectionnent rien.
Un pod que n'importe aucune politique n'a sélectionné N'est PAS isolé : tout l'atteint. Pour qu'une connexion passe, il faut que la sortie (egress) de la source ET l'entrée (ingress) de la destination l'autorisent toutes les deux. Sans policyTypes, la politique affecte toujours l'ingress, et l'egress seulement si elle a une section egress. Et namespaceSelector avec podSelector dans le MÊME élément, c'est un « et » ; dans des éléments séparés, un « ou ».
Pour chaque charge, le niveau le plus élevé qu'elle atteint (baseline ou restricted) et ce qui lui manque pour le suivant, selon les règles de l'admission controller officiel de Kubernetes 1.37. Si un namespace déclare pod-security.kubernetes.io/enforce, il signale les charges que ce namespace REJETTERAIT à leur création, ce qui est un échec silencieux : le Deployment est créé, ses pods non. Comparé aux 4 537 cas de test du contrôleur lui-même et à sa bibliothèque sur plus de 700 charges réelles.
Si tu colles aussi tes Role, ClusterRole et bindings, chaque charge affiche ce que son ServiceAccount peut faire d'après la liste des risques d'escalade du guide officiel de Kubernetes (lire des secrets, créer des pods, exec, nodes/proxy, escalate, bind, impersonate…), dans quelle portée et quel binding l'accorde. Et si le token est monté dans le pod : sans token, compromettre le pod ne donne pas ces permissions. Utilise le même moteur que le Labo d'accès. Il n'évalue pas resourceNames : une permission sur UN secret apparaît comme « lire des secrets », on surestime mais on ne cache rien.
Vérifie chaque objet par rapport au schéma OFFICIEL de la version de Kubernetes que tu choisis (de la 1.33 à la 1.37) : champs qui n'existent pas, avec celui que tu voulais probablement écrire, types erronés (un « 80 » entre guillemets là où doit aller un nombre), champs obligatoires manquants et apiVersion retirées, avec la version où elles ont disparu et vers laquelle migrer. Le schéma n'est téléchargé qu'au moment de la validation et seulement celui de cette version : environ 9 Ko. Comparé à kubeconform en mode strict sur plus de mille manifestes, réels et avec des erreurs injectées.
Ce qui fait tomber un service sans que personne n'attaque : des conteneurs sans requests ni limite de mémoire, des pods qui reçoivent du trafic d'un Service sans readinessProbe, readiness et liveness identiques, des images sans version fixe, une seule réplique, des répliques qui peuvent tomber ensemble sur le même nœud, et des PodDisruptionBudgets qui manquent ou qui empêchent de vider le nœud. Ce sont les vérifications de kube-score, avec deux nuances de la documentation officielle : une request manquante est remplie par Kubernetes avec la limite, donc elle n'est pas demandée deux fois ; et la limite de CPU n'est pas exigée, car elle étrangle le conteneur même si le nœud est inactif. Si un HorizontalPodAutoscaler est associé, les répliques qui comptent sont son minimum ; un LimitRange associé supprime les avertissements de ressources de son namespace.
Il suit la spécification officielle de NetworkPolicy, et son résultat a été comparé à netpol-analyzer (np-guard) sur plus d'une centaine de scénarios de son propre dépôt. Ce qu'il NE calcule PAS : les politiques propres à chaque CNI (CiliumNetworkPolicy, Calico), AdminNetworkPolicy, ni le trafic depuis le nœud lui-même, qui passe toujours. Si ton CNI n'applique pas NetworkPolicy, aucune d'elles ne fait rien.