Jarod
Jarod

Reputation: 199

k8s create service with port, targetPort and nodePort identical

I need to create Kubernetes services that their nodePort are auto-allocated by K8S, and port/targetPort must equal to nodePort. (The requirement comes from the spec of a spark YARN node as the backend of the services). Maybe I can first create the service with a fixed dummy port/targetPort and an auto-allocated nodePort, then update the service to set port/targetPort to the same value as the nodePort. But is there any better way of doing this?

Upvotes: 0

Views: 283

Answers (1)

kiggyttass
kiggyttass

Reputation: 348

There are two main ways to expose a resource on k8s

First one using kubectl expose command: using this one you can choose the pod/deploy to expose but not the nodePort value. Then as you already know you must set the nodeport value on the created yaml

Another way to expose is using kubectl create service nodeport command: using this one you can set the port, target port and nodeport.

If you know the label of the pod to expose (for example app: superPod ) you can create a file, then replace a label (for example TOREPLACE) with the value of your choosen port (for example 30456):

On linux:

portValue=30456 && k create service nodeport TOREPLACE \
--node-port=$portValue --tcp=$portValue --dry-run=client -oyaml > file.yaml \
&& sed -i 's/app: TOREPLACE/app: yourselector/g' file.yaml \
&& sed -i 's/name: TOREPLACE/name: yourselector-name/g' file.yaml

This will creates the file with preferred values.

After that, you can apply the file using kubectl -f file.yaml apply

However, depending on your needs, and if you want a reliable customizations of your resources, you could try to use:

https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization/ or https://helm.sh/docs/

Hope it helps.

Upvotes: 1

Related Questions