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
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-range
portRange-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é.