Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to expose a Kubernetes service on a specific Nodeport?

Tags:

I have create a pod with the below yaml definition.

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 

And now I expose the pod, which creates a service.

kubectl expose pod myapp-pod --type=NodePort 

The port 3000 on the container is exposed to port 31728 on the nodes. And I am able to do access the page using curl on 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 

This time I wanted to expose the service not a random port, but on port 80. And so I specify the port number as 80, by using --port. The service details are a bit odd. It says that port 80 on the container is exposed to port 31316 on the nodes. Also, I am able to access the page using curl on the random port (31316 in this case) and not 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 

I am not able to expose a service on a specific port and not on a random port. I tried a few combinations and read the k8s documentation, but no success.

How do I expose a service on a specific port instead of a random port?

like image 585
Praveen Sripati Avatar asked Sep 26 '18 16:09

Praveen Sripati


People also ask

Which Kubernetes service will expose the service on a static port on the deployed node?

NodePort : Exposes the Service on each Node's IP at a static port (the NodePort ).


2 Answers

Your question is about exposing the NodePort type of service on a specific port. For that you need to specify the nodePort field under ports in your service definition.

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

Note that it has to be within a given range provided in the configs. Which defaults to 30000-32767. This range can be specified in the kube-apiserver configs using the --service-node-port-range option.

like image 142
Rico Avatar answered Sep 17 '22 00:09

Rico


When an existing Dashboard service already exists, remove it.

kubectl delete service kubernetes-dashboard -n kube-system

Expose the Dashboard deployment as a NodePort.

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

The above will assign a random port >= 30000. So use the Patch command to assign the port to a known, unused and desired port >= 30000.

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

Caution: Never expose your dashboard publicly without authentication.

like image 33
javajon Avatar answered Sep 18 '22 00:09

javajon