web-dev-qa-db-fra.com

Comment exposer un service Kubernetes sur un Nodeport spécifique?

J'ai créé un pod avec la définition yaml ci-dessous.

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: praveensripati/docker-demo:1.2
    ports:
    - containerPort: 3000

Et maintenant, j'expose le pod, qui crée un service.

kubectl expose pod myapp-pod --type=NodePort

Le port 3000 sur le conteneur est exposé au port 31728 sur les nœuds. Et je peux accéder à la page en utilisant curl sur le port 31728.

kubectl get service myapp-pod
NAME        TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
myapp-pod   NodePort   10.107.254.254   <none>        3000:31728/TCP   5s

Cette fois, je voulais exposer le service non pas un port aléatoire, mais sur le port 80. Et je spécifie donc le numéro de port 80, en utilisant --port. Les détails du service sont un peu bizarres. Il indique que le port 80 sur le conteneur est exposé au port 31316 sur les nœuds. De plus, je peux accéder à la page en utilisant curl sur le port aléatoire (31316 dans ce cas) et non sur le port 80.

kubectl expose pod myapp-pod --type=NodePort --target-port=3000 --port=80

kubectl get service myapp-pod
NAME        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
myapp-pod   NodePort   10.105.123.73   <none>        80:31316/TCP   12s

Je ne suis pas en mesure d'exposer un service sur un port spécifique et non sur un port aléatoire. J'ai essayé quelques combinaisons et lu la documentation du k8s, mais sans succès.

Comment exposer un service sur un port spécifique au lieu d'un port aléatoire?

8
Praveen Sripati

Je vais essayer de répondre à votre question ici.

De plus, je peux accéder à la page en utilisant curl sur le port aléatoire (31316 dans ce cas) et non sur le port 80.

-- Because, kubernetes exposed the port 31316 on the Host (maps to the service) and hence it can be accessed on Host:31316.

-- Service port is visible only within the kubernetes cluster. You can exec into a pod container and do a curl on servicename:service port instead of the NodePort.

Notez les termes - container port: le conteneur de port écoute. Service port: le port où le service kubernetes est exposé sur l'IP interne du cluster et mappé sur le port du conteneur. Nodeport: le port exposé sur l'hôte et mappé au service kubernetes.

1
techuser soma

Votre question concerne l'exposition du type de service NodePort sur un port spécifique. Pour cela, vous devez spécifier le champ nodePort sous ports dans votre définition de service.

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 3000
    nodePort: 32321
  type: NodePort

Notez qu'il doit être dans une plage donnée fournie dans les configurations. Par défaut, 30000-32767. Cette plage peut être spécifiée dans les configurations kube-apiserver en utilisant le --service-node-port-range option.

15
Rico

Si votre cluster n'a pas de fournisseur LoadBalancer, vous pouvez spécifier externalIPs dans l'IP de l'interface réseau des nœuds.

Par exemple:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:   
  type: ClusterIP
  externalIPs:
    - 125.100.99.101 # Node1-IP
    - 125.100.99.102 # Node2-IP
    - 192.168.55.112 # Node2-IP2
  selector:
    pod: nginx
  ports:
    - name: http
      port: 80      
    - name: https
      port: 443      

Cela écoutera 80 et 443 sur le nœud spécifié, et le transmettra à le service nginx.

3
KFC

Lorsqu'un service Dashboard existant existe déjà, supprimez-le.

kubectl delete service kubernetes-dashboard -n kube-system

Exposez le déploiement du tableau de bord en tant que NodePort.

kubectl expose deployment kubernetes-dashboard -n kube-system --type=NodePort

Ce qui précède attribuera un port aléatoire> = 30000. Utilisez donc la commande Patch pour affecter le port à un port connu, inutilisé et souhaité> = 30000.

kubectl patch service kubernetes-dashboard --namespace=kube-system --type='json' --patch='[{"op": "replace", "path": "/spec/ports/0/nodePort", "value":30000}]'

Attention: N'exposez jamais votre tableau de bord publiquement sans authentification.

2
javajon

nous pouvons exposer le service Kubernetes sur un port de nœud spécifique.

La valeur du port doit être comprise entre 30000 et 32767.

Nous pouvons exposer le service à un port spécifique des types de service ci-dessous:

  1. NodePort

  2. LoadBalancer

Trouvez l'exemple de fichier myservice.yaml ci-dessous:

apiVersion: v1
kind: Service
metadata:
  name: app1
spec:
  type: NodePort/LoadBalancer
  ports:
  - name: "80"
    port: 80
    nodePort: 32062
    targetPort: 80
  selector:
    appone: app1
    app: test

Remarque: Dans le fichier yaml de service ci-dessus, nous pouvons spécifier le type de service NodePort ou Loadbalancer.

0
kalyani chaudhari