How can I expose a StatefulSet service with ClusterIP None on Google Cloud Platform?

3/31/2019

How can I expose a StatefulSet service (cassandra, mysql, etc...) with ClusterIP=None on Kubernetes in Google Cloud Platform?

I need to change the ClusterIP config? Or I need to configure Google Cloud NAT? Or I need to change other things?

Thanks

EDIT: I want to connect to cassandra from an external IP, from anyplace on the internet

EDIT2: I guess that the solution is to use LoadBalance instead of ClusterIP, but when I use LoadBalance, the Cassandra nodes can't find the seed node. Then I sill using ClusterIP=None to Cassandra cluster, and I created another POD with type=LoadBalance to connect to Cassandra and to have connections to exterior. And now it's working :)

-- Rui Martins
google-cloud-platform
kubernetes
kubernetes-statefulset

3 Answers

4/1/2019

If by "expose" you mean ability to reach your service endpoints without cluster IP , then just use selector in your headless service, i.e.

apiVersion: v1
kind: Service
metadata:
  name: cassandra
spec:
  clusterIP: None
  selector:
    app: cassandra
  ports:
  - port: 80
    targetPort: 80

For more details refer to documentation

Otherwise, if you want to expose your deployments outside of the cluster, you won't be able to do it with headless service.

-- A_Suh
Source: StackOverflow

4/1/2019

ClusterIP services are not exposed outside of the Kubernetes cluster. Perhaps you mean to use a NodePort or LoadBalancer service instead?

-- coderanger
Source: StackOverflow

4/1/2019

If you want to expose the service externally, you will need a service that is ClusterIP backed whether that be a NodePort or LoadBalancer; even if you use ingress, you will need to back it up with a ClusterIP service at the very least.

The ClusterIP is only internal and provides the Kubebernetes cluster a fixed endpoint to reference your deployment/pod internally. The simplest method to expose your services is to use a NodePort, in which case your service will take on the IP of the node externally with a high port number (30000+). On GCP, if you define a load-balancer, you will be given an external IP, and the traffic will be forwarded in order to your pods in the stateful sets. If you use an ingress, your external IP will be that of your ingress, and the packet forwarding to your services will be done based on the request URL (ie. you can have multiple FQDNs mapped to a single external IP in your DNS).

"Headless" services are mainly used to decouple your design from Kubernetes. The assumption is that you will be doing your own service discovery, and I don't believe that is a good use case for your application.

Hope this helps!

-- Frank Yucheng Gu
Source: StackOverflow