-2

I have 2 bare metal worker nodes and a replicaset with 10 pod replicas. How can I expose each pod using nodeport?

Tarmo
  • 3,728
  • 1
  • 8
  • 25
rraj gautam
  • 125
  • 1
  • 1
  • 10
  • Hi, What is the use-case for doing this, instead of a simple deployment with 10 replicas, and a NodePort service? – Aalok Jun 09 '21 at 05:22
  • I could expose the service with nodeport, but I need each pod exposed on different ports of a worker. Each pod requires an individual port. Usecase: I am using it for RDP port. @WytrzymałyWiktor – rraj gautam Jun 10 '21 at 14:29
  • Kubernetes pods are ephemeral, so I'm not sure your approach is recommended. Maybe [kubectl port-forward](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#port-forward) is what you need ? – matt_j Jun 21 '21 at 08:30

2 Answers2

2

You can use the kubectl expose command to create a NodePort Service for a ReplicaSet.

This is a template that may be useful:

kubectl expose rs <REPLICASET_NAME> --port=<PORT> --target-port=<TARGET_PORT> --type=NodePort

The most important flags are:
NOTE: Detailed information on this command can be found in the Kubectl Reference Docs.

--port

The port that the service should serve on. Copied from the resource being exposed, if unspecified

--target-port

Name or number for the port on the container that the service should direct traffic to. Optional.

--type

Type for this service: ClusterIP, NodePort, LoadBalancer, or ExternalName. Default is 'ClusterIP'.

I will create an example to illustrate how it works


First, I created a simple app-1 ReplicaSet:

$ cat app-1-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: app-1
  labels:
    app: app-1
spec:
  replicas: 10
  selector:
    matchLabels:
      app: app-1
  template:
    metadata:
      labels:
        app: app-1
    spec:
      containers:
      - name: nginx
        image: nginx

$ kubectl apply -f app-1-rs.yaml
replicaset.apps/app-1 created

$ kubectl get rs
NAME    DESIRED   CURRENT   READY   AGE
app-1   10        10        10      93s

Then I used the kubectl expose command to create a NodePort Service for the app-1 ReplicaSet:

### kubectl expose rs <REPLICASET_NAME> --port=<PORT> --target-port=<TARGET_PORT> --type=NodePort

$ kubectl expose rs app-1 --port=80 --type=NodePort
service/app-1 exposed

$ kubectl get svc app-1
NAME    TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
app-1   NodePort   10.8.6.92    <none>        80:32275/TCP   18s

$ kubectl describe svc app-1 | grep -i endpoints
Endpoints:                10.4.0.15:80,10.4.0.16:80,10.4.0.17:80 + 7 more...

If you want to make some modifications before creating the Service, you can export the Service defintion to a manifest file and apply it after the modifications:

kubectl expose rs app-1 --port=80 --type=NodePort --dry-run=client -oyaml > app-1-svc.yaml

Additionally, it's worth considering if you can use Deployment instead of directly using ReplicaSet. As we can find in the Kubernetes ReplicaSet documentation:

Deployment is a higher-level concept that manages ReplicaSets and provides declarative updates to Pods along with a lot of other useful features. Therefore, we recommend using Deployments instead of directly using ReplicaSets, unless you require custom update orchestration or don't require updates at all.

matt_j
  • 4,010
  • 1
  • 9
  • 23
0

you can create a service with selector point to the pods, use NodePort type, and be sure deploy kube-proxy on every node.

example yaml like below, you should set right selector and port. get service detail for nodePort after created

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  type: NodePort
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80

the official doc is good enough https://kubernetes.io/docs/concepts/services-networking/service/

fancy
  • 76
  • 4