Un autre souci rencontré avec NSX Intelligence, et plus précisément avec la CNI Cilium.

En effet, la documentation de NSX Intelligence ne précise que les CNI suivantes :

  • Antrea la CNI développée par VMware avec une base Open vSwitch
  • Calico la deuxième CNI supportée par VMware Tanzu
  • Flannel une CNI qui ne supporte pas les Network Policy

Aucune raison que ça ne fonctionne pas sur Cilium !

Installation de NSX Intelligence

Le début de l’installation se déroule bien (les pré-checks passent sans souci), mais l’installation de NSX Application Platform boucle 🔁 malgré les retries !

Heureusement, Hubble 🛰 est là !

Pendant l’installation de NSX Platform, j’étais en train d’installer les outils complémentaires à Cilium, dont Hubble, qui permet d’avoir une visibilité sur les flux réseaux.

Regardons donc ce qui se passe…

Hubble Drop

Aïe, il y a des DROP !

💡 Première découverte

Lors de son installation, NSX Intelligence déploie aussi des Network Policies ! C’est top… (une grosse cinquantaine quand même !)

kubectl get networkpolicies.networking.k8s.io -n nsxi-platform

allow-all-egress                                      allow-traffic-to-all=true                                                                                                            32d
allow-all-ingress                                     allow-traffic-from-all=true                                                                                                          32d
authserver                                            app.kubernetes.io/instance=nsxi-platform,app.kubernetes.io/name=authserver                                                           32d
cluster-api                                           app.kubernetes.io/instance=nsxi-platform,app.kubernetes.io/name=cluster-api                                                          32d
cluster-api-client-egress                             cluster-api-client=true                                                                                                              32d
cluster-api-ingress                                   allow-traffic-from-cluster-api=true                                                                                                  32d
common-agent                                          app.kubernetes.io/instance=nsxi-platform,app.kubernetes.io/name=common-agent                                                         32d
contour-egress-networkpolicy                          allow-traffic-to-contour=true                                                                                                        32d
contour-ingress-networkpolicy                         allow-traffic-from-contour=true                                                                                                      32d
debezium-onprem                                       app.kubernetes.io/instance=intelligence,app.kubernetes.io/name=debezium-onprem                                                       31d
debezium-onprem-client-egress                         debezium-onprem-client=true                                                                                                          31d
default-deny-egress                                   <none>                                                                                                                               32d
default-deny-ingress                                  <none>                                                                                                                               32d
dns-networkpolicy                                     allow-traffic-to-dns=true                                                                                                            32d
druid-broker                                          app=druid,component=broker,release=nsxi-platform                                                                                     32d
druid-broker-client-egress                            druid-broker-client=true                                                                                                             32d
druid-coordinator                                     app=druid,component=coordinator,release=nsxi-platform                                                                                32d
druid-coordinator-client-egress                       druid-coordinator-client=true                                                                                                        32d
druid-historical                                      app=druid,component=historical,release=nsxi-platform                                                                                 32d
druid-historical-client-egress                        druid-historical-client=true                                                                                                         32d
druid-middle-manager                                  app=druid,component=middle-manager,release=nsxi-platform                                                                             32d
druid-middle-manager-client-egress                    druid-middleManager-client=true                                                                                                      32d
druid-router                                          app=druid,component=router,release=nsxi-platform                                                                                     32d
druid-router-client-egress                            druid-router-client=true                                                                                                             32d
egress-networkpolicy                                  allow-traffic-to-nsx=true                                                                                                            32d
[....]

Par contre, ça bloque.

👮 Vérification des Network Policies

Elles me paraissent normales…

kubectl describe networkpolicies.networking.k8s.io minio -n nsxi-platform
Name:         minio
Namespace:    nsxi-platform
Created on:   2025-01-30 11:59:45 +0100 CET
Labels:       app.kubernetes.io/instance=nsxi-platform
              app.kubernetes.io/managed-by=Helm
              app.kubernetes.io/name=minio
              app.kubernetes.io/version=1.16.0
              helm.sh/chart=minio-0.1.0
              vmware/version=4.2.0-1.0-24389993
Annotations:  meta.helm.sh/release-name: nsxi-platform
              meta.helm.sh/release-namespace: nsxi-platform
Spec:
  PodSelector:     app.kubernetes.io/instance=nsxi-platform,app.kubernetes.io/name=minio
  Allowing ingress traffic:
    To Port: https/TCP
    From:
      PodSelector: minio-client=true
  Allowing egress traffic:
    To Port: https/TCP
    To:
      PodSelector: app.kubernetes.io/component=minio
  Policy Types: Ingress, Egress

ou encore au format yaml

kubectl get networkpolicies.networking.k8s.io minio -n nsxi-platform -o yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  annotations:
    meta.helm.sh/release-name: nsxi-platform
    meta.helm.sh/release-namespace: nsxi-platform
  creationTimestamp: "2025-01-30T10:59:45Z"
  generation: 1
  labels:
    app.kubernetes.io/instance: nsxi-platform
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: minio
    app.kubernetes.io/version: 1.16.0
    helm.sh/chart: minio-0.1.0
    vmware/version: 4.2.0-1.0-24389993
  name: minio
  namespace: nsxi-platform
  resourceVersion: "9752279"
  uid: 5b26c6d6-5a95-4535-abe5-2d371f57f43d
spec:
  egress:
  - ports:
    - port: https
      protocol: TCP
    to:
    - podSelector:
        matchLabels:
          app.kubernetes.io/component: minio
  ingress:
  - from:
    - podSelector:
        matchLabels:
          minio-client: "true"
    ports:
    - port: https
      protocol: TCP
  podSelector:
    matchLabels:
      app.kubernetes.io/instance: nsxi-platform
      app.kubernetes.io/name: minio
  policyTypes:
  - Ingress
  - Egress

🚧 Workaround

En attendant, j’applique les deux Network Policies suivantes pour autoriser tout le trafic entrant et sortant.

Policy pour l’ingress

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: alg-allow-all-ingress
  namespace: nsxi-platform
spec:
  ingress:
  - {}
  podSelector: {}
  policyTypes:
  - Ingress

Policy pour l’egress

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: alg-allow-all-egress
  namespace: nsxi-platform
spec:
  egress:
  - {}
  podSelector: {}
  policyTypes:
  - Egress

et on applique

kubectl apply -f alg-allow-all-*.yaml

J’aurai pu fusionné les 2 policies mais j’ai voulu verifier si j’avais pas le souci que dans un sens ! mais ce n’est pas le cas, j’ai des flux drop en egress & ingress !

Mon deploiement NSX Application Platform est maintenant fonctionnel !

🚨 C’est quoi le probleme au final ?

Revenons à notre problème…

Si on regarde bien les Network Policies, on constate qu’elles utilisent des named ports

kubectl get networkpolicies.networking.k8s.io minio -n nsxi-platform -o yaml
[...]
spec:
  egress:
  - ports:
    - port: https
      protocol: TCP
[...]

En regardant côté statefulsets du minio, on retrouve bien le port, mais…

kubectl get statefulsets.apps minio -o yaml
[...]

        name: minio
        ports:
        - containerPort: 9000
          name: https
          protocol: TCP
        - containerPort: 9001
          name: console
          protocol: TCP

[...]

Étrange… le port HTTPS utilise un port non standard !

Serait-ce la source du problème ? 🤔

Je vous épargne les heures de debug et de tests…

🕵️‍♂️ et après plusieurs heures (semaines)…

J’ai fini par trouver la cause du problème. C’est une limitation connue dans la CNI Cilium :

On ne peut pas avoir deux déploiements qui utilisent le même named port avec des ports différents.

(D’un côté, c’est presque logique…)

✅ Vérification avec Cilium

Pour vérifier cela, on peut utiliser la commande suivante (Merci l’IA 🤖) qui permet de lister l’ensemble des named ports avec leur port :

kubectl get pods -A -o json | jq -r '.items[] | "\(.metadata.namespace) \(.metadata.name)" + ( .spec.containers[]? | select(.ports) | " \(.ports[]?.name):\(.ports[]?.containerPort)" )' 

et si je filtre sur le https

[...]
nsxi-platform cluster-api-6556d44fb8-t7mct https:8843
nsxi-platform debezium-onprem-9786b4799-wkfmx https:808
nsxi-platform minio-0 https:9000
nsxi-platform minio-1 https:9000
nsxi-platform minio-2 https:9000
nsxi-platform minio-3 https:9000
nsxi-platform monitor-8465b6d5cb-vl6bl https:8443
nsxi-platform pubsub-54578d7444-8fgcs https:8443
[...]

On voit que NSX Intelligence utilise plusieurs fois le même named port avec des valeurs différentes…

🎯 Correction en Cilium 1.18 !

La correction serait prévue dans Cilium 1.18 !

Donc attention si vous utilisez les named ports dans vos Network Policies avec Cilium.

🚦 Conclusion : un NSX Intelligence en mode “open-bar” 🎉

Concernant mon installation de NSX Intelligence, pour le moment, elle va rester avec des Network Policies qui laissent tout ouvert

Il serait possible de corriger les Network Policies existantes, mais avec un risque de devoir refaire la correction à chaque mise à jour.

Et vu que la CNI Cilium n’est pas officiellement supportée par NSX Intelligence, j’ai des doutes que ce soit corrigé par VMware un jour… 🤷‍♂️