J'ai la configuration de service suivante:
kind: Service
apiVersion: v1
metadata:
name: web-srv
spec:
type: NodePort
selector:
app: userapp
tier: web
ports:
- protocol: TCP
port: 8090
targetPort: 80
nodePort: 31000
et un conteneur nginx est derrière ce service. Bien que je puisse accéder au service via nodePort
, le service n'est pas accessible via le champ port
. Je suis capable de voir les configurations avec kubectl
et le tableau de bord Kubernetes mais curl
ing à ce port (par exemple curl http://192.168.0.100:8090
) génère une Connection Refused error.
Je ne sais pas quel est le problème ici. Dois-je m'assurer que des services de proxy s'exécutent dans le nœud ou le conteneur?
Obtenez l'adresse IP du service kubernetes puis appuyez sur 8090; Cela fonctionnera. nodeport implique que le service est lié au nœud au port 31000.
Ce sont les 3 choses qui vont marcher:
curl <node-ip>:<node-port> # curl <node-ip>:31000
curl <service-ip>:<service-port> # curl <svc-ip>:8090
curl <pod-ip>:<target-port> # curl <pod-ip>:80
Alors maintenant, regardons 3 situations:
1. Vous êtes dans le cluster kubernetes (vous êtes un pod)
<service-ip>
et <pod-ip>
et <node-ip>
fonctionneront.
2. Vous êtes sur le noeud
<service-ip>
et <pod-ip>
et <node-ip>
fonctionneront.
3. Vous êtes en dehors du noeud
Seul <node-ip>
fonctionnera en supposant que <node-ip>
est accessible.
Le comportement est comme prévu puisque je suppose que vous essayez d'accéder au service de l'extérieur du cluster. Cela signifie que seule la nodePort
expose le service au monde extérieur au cluster. port
fait référence au port du pod, tel qu’exposé par le conteneur situé à l’intérieur du pod. Ce comportement est généralement souhaité pour prendre en charge des grappes de services qui sont généralement représentés par un répartiteur de charge. Ainsi, l’équilibreur de charge exposera le port que vous souhaitez pour votre service (par exemple, load-balancer:80
) et le transmettra au nodePort sur tous les nœuds de manière à répartir la charge.
Si vous accédez au service de l'intérieur du cluster, vous devriez pouvoir y accéder via service-name:service-port
grâce au DNS intégré.
Des informations plus détaillées sont disponibles sur docs .