New to Voyager? Please start here.
There is the usual way of forwarding traffic to a Service matching a StatefulSet. Create a Service with the pods label selector as selector, and use the service name as Backend ServiceName.
apiVersion: apps/v1 kind: StatefulSet metadata: name: http namespace: default spec: serviceName: "nginx-set" replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: gcr.io/google_containers/nginx-slim:0.8 ports: - containerPort: 80 name: http ---- apiVersion: v1 kind: Service metadata: name: nginx-set namespace: default labels: app: nginx spec: ports: - port: 80 name: http clusterIP: None selector: app: nginx
Create another service for StatefulSets pods with selector.
apiVersion: v1 kind: Service metadata: name: nginx-service namespace: default labels: app: nginx spec: ports: - port: 80 name: http selector: app: nginx
And Use the service in the ingress Backend service name, as:
backend: service: name: nginx-service port: number: 80
That will forward traffic to your StatefulSets Pods.
There is a way to send traffic to all or specific pod of a StatefulSet using voyager. You can set
hostNames field in
Backend, traffic will only forwarded to those pods.
For Example the above StatefulSet will create two pod.
Those are the host names.
Now Create a ingress that will only forward traffic to web-0
apiVersion: voyager.appscode.com/v1 kind: Ingress metadata: name: test-ingress namespace: default spec: rules: - host: appscode.example.com http: paths: - path: '/testPath' backend: hostNames: - web-0 service: name: nginx-set #! There is no extra service. This port: number: 80 # is the Statefulset's Headless Service
Viola. Now all
/testPath traffic will be sent to pod web-0 only. There is no extra service also.
The StatefulSet’s Headless Service is enough. By using all the hostNames You can forward traffic to all pods.