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.
- 141
- 1
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.
- 31
- 1
Are you sure you need exactly this?
– Alex Jul 17 '20 at 07:42