I have a statefulset app which can have any number of replicas. The pods produced should be able to communicate to external comptures. Those pods must act statefully when clients communicate with them. I tried to create headless service and nodeport services, but it still has only one service to communicate with and also couldn't make it to communicate externally. How can I make it allocate external ip and port per each port?
2 Answers
The above answer is incorrect. You can use pod name labels, cf: https://stackoverflow.com/questions/68123751/kubernetes-service-for-a-subset-of-statefulset-pods
For example:
apiVersion: v1
kind: Service
metadata:
name: my-sts-1
spec:
...
selector:
statefulset.kubernetes.io/pod-name: my-sts-1
...
You will have to manually create the services when you scale your statefulset up or down. Alternatively, you could create a helm chart or a CRD + Operator.
Just to clarify if I got you right.
Do you want to have a separate service for every pod/replica in your statefulSet?
If so - this is not how K8s sees services being used. The service is used for grouping and load balancing purposes.
In your case, if you want to have 1-on-1 connection between an external client and a pod, I suggest deploying your statefulSet a number of times with replicas=1
and exposing a service (as NodePort/LB) every time.
-
How else can I communicate with each pod statefully from the outside world? In your soultion you suggest creating copies of the statefulset manually? Because its not a deployment.. Commented Jul 15, 2020 at 12:08
-
The logic is like this: In order for a pod to be available from outside it needs to be exposed via a service (NodePort/LB). Service is applied to a group of pods with the same selectors. Since you want to open each pod (a replica of a statefulset in your case), you need to create 1 service per 1 pod. You either create a number of STS with services pointing at them, or can manually label each STS pod and point services to them accordingly. The second option is very dirt though. Are you sure you need exactly this?– AlexCommented Jul 17, 2020 at 7:42
-
The reason I need this is that every pod has an app that communicates with an outside app on specific ports. That app has to receive an ip and then it communicates with that app according to saved actions, therefore statefully. Commented Jul 17, 2020 at 11:17
-
Therefore the only way I see is to create service for each pod that exposes those ports and then I use the pod's ip adress to give the outside app. Commented Jul 17, 2020 at 11:19