How do I get more control over the NodePorts my Service assigns to my Deployment? I have a Deployment with 5 replicas. All have ssh and telnet. They should not be load balanced. I would like each to select from a predictable list of 5.

Here is my Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 5
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.0
        ports:
        - name: ssh
          protocol: TCP
          containerPort: 22
        - name: telnet
          protocol: TCP
          containerPort: 23


This is my Service with invalid nodePort values for illustrative purposes.

apiVersion: v1
kind: Service
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  type: NodePort
  ports:
  - name: ssh
    port: 22
    nodePort: [30022, 30122, 30222, 30322, 30422, 30522]
  - name: telnet
    port: 23
    nodePort: [30023, 30123, 30223, 30323, 30423, 30523]


I am hoping to be able to accomplish 2 things:


Each pod replica instance will only get an ssh port from [30022, 30122, 30222, 30322, 30422, 30522] and a telnet port from [30023, 30123, 30223, 30323, 30423, 30523]
A pod replica instance that gets an ssh port of 30022 also gets the telnet port 30023. A pod replica instance that gets an ssh port of 30122 gets a telnet port of 30123 and so on.


Thank you!
As far as I understand kubernetes services, that trick is not possible.

What could help you to have preserved hostnames is a StatefulSet.
See more here


  The Pods’ ordinals, hostnames, SRV records, and A record names have
  not changed, but the IP addresses associated with the Pods may have
  changed. In the cluster used for this tutorial, they have. This is why
  it is important not to configure other applications to connect to Pods
  in a StatefulSet by IP address.