web-dev-qa-db-fra.com

Comment déboguer l'erreur «n'a pas eu de ports libres» avec les paramètres «hostNetwork: true» et «NET_BIND_SERVICE»

J'ai besoin d'aide pour déboguer l'erreur: 0/1 nodes are available: 1 node(s) didn't have free ports for the requested pod ports. Quelqu'un peut-il m'aider?

J'essaie d'exécuter un pod sur Mac (d'abord) en utilisant la saveur Docker Desktop de Kubernetes, et la version est 2.1.0.1 (37199). Je voudrais essayer d'utiliser le mode hostNetwork en raison de son efficacité et du nombre de ports qui doivent être ouverts (en milliers). Avec seulement hostNetwork: true set, il n'y a pas d'erreur mais je ne vois pas non plus les ports ouverts sur l'hôte, ni l'interface réseau de l'hôte à l'intérieur du conteneur. Comme je dois également ouvrir le port 443, j'ai ajouté la capacité de NET_BIND_SERVICE et c'est là qu'il a commencé à lancer l'erreur.

J'ai couru lsof -i à l'intérieur du conteneur (ubuntu: 18.04) puis Sudo lsof -i sur mon Mac, et je n'ai vu aucun conflit. Ensuite, j'ai aussi regardé /var/lib/log/containers/kube-apiserver-docker-desktop_kube-system_kube-apiserver-*.log et je n'ai vu aucun indice. Merci!

Informations supplémentaires: j'ai exécuté ce qui suit à l'intérieur du conteneur:

# ss -nltp
State  Recv-Q  Send-Q     Local Address:Port      Peer Address:Port
LISTEN 0       5                0.0.0.0:10024          0.0.0.0:*      users:(("pnnsvr",pid=1,fd=28))
LISTEN 0       5                0.0.0.0:2443           0.0.0.0:*      users:(("pnnsvr",pid=1,fd=24))
LISTEN 0       5                0.0.0.0:10000          0.0.0.0:*      users:(("pnnsvr",pid=1,fd=27))
LISTEN 0       50               0.0.0.0:6800           0.0.0.0:*      users:(("pnnsvr",pid=1,fd=14))
LISTEN 0       1                0.0.0.0:6802           0.0.0.0:*      users:(("pnnsvr",pid=1,fd=13))
LISTEN 0       50               0.0.0.0:443            0.0.0.0:*      users:(("pnnsvr",pid=1,fd=15))

Ensuite, j'ai exécuté netstat sur mon Mac (l'hôte) et recherché ces ports et je ne trouve pas de collision. Je suis heureux de fournir la sortie de netstat (767 lignes) si nécessaire.

Voici le yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pnnsvr
  labels:
    app: pnnsvr
    env: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pnnsvr
      env: dev
  template:
    metadata:
      labels:
        app: pnnsvr
        env: dev
    spec:
      hostNetwork: true
      containers:
      - name: pnnsvr
        image: dev-pnnsvr:0.92
        args: ["--root_ip=192.168.15.194"]
        # for using local images
        imagePullPolicy: Never
        ports:
        - name: https
          containerPort: 443
          hostPort: 443
        - name: cport6800tcp
          containerPort: 6800
          hostPort:  6800
          protocol: TCP
        - name: cport10000tcp
          containerPort: 10000
          hostPort: 10000
          protocol: TCP
        - name: cport10000udp
          containerPort: 10000
          hostPort: 10000
          protocol: UDP
        - name: cport10001udp
          containerPort: 10001
          hostPort: 10001
          protocol: UDP
        #test
        - name: cport23456udp
          containerPort: 23456
          hostPort: 23456
          protocol: UDP
        securityContext:
          capabilities:
            add:
              - SYS_Nice
              - NET_BIND_SERVICE
              - CAP_SYS_ADMIN
3
skwokie

Je n'ai pas la possibilité de configurer cela sur docker pour mac mais il semble que vous devriez vérifier vos ports dans votre VM Docker:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

Veuillez considérer si vous pouvez modifier la plage de ports de noeud par défaut (--service-node-port-rangeportRange-Default: 30000-32767 ) Ici vous pouvez trouver un excellent article pour le faire dans docker pour mac

N'oubliez pas qu'en utilisant le hostNetwork: true ce n'est pas une bonne solution selon les meilleures pratiques.

Selon la documentation:

Ne spécifiez pas de hostPort pour un pod sauf si cela est absolument nécessaire. Lorsque vous liez un pod à un hostPort, cela limite le nombre de places que le pod peut être planifié, car chaque combinaison doit être unique. Si vous ne spécifiez pas explicitement hostIP et le protocole, Kubernetes utilisera 0.0.0.0 comme hostIP par défaut et TCP comme protocole par défaut. Évitez d'utiliser hostNetwork, pour les mêmes raisons que hostPort.

Si vous devez explicitement exposer le port d'un pod sur le nœud, envisagez d'utiliser un service NodePort avant de recourir à hostPort.

Configurer un contexte de sécurité pour un pod ou un conteneur https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

Pour spécifier les paramètres de sécurité d'un conteneur, incluez le champ securityContext dans le manifeste du conteneur. Le champ securityContext est un objet SecurityContext. Les paramètres de sécurité que vous spécifiez pour un conteneur s'appliquent uniquement au conteneur individuel et remplacent les paramètres définis au niveau du pod en cas de chevauchement. Les paramètres du conteneur n'affectent pas les volumes du pod.

Veuillez noter en plus pour securityContext for POD:

Le champ runAsGroup spécifie l'ID de groupe principal de 3000 pour tous les processus dans tous les conteneurs du pod. Si ce champ est omis, l'ID de groupe principal des conteneurs sera root (0)

s'il vous plaît laissez-moi savoir si cela a aidé.

1
Hanx