Static global IP on GKE using Nginx Ingress?

8/6/2018

I am trying to setup an nginx ingress controller in my GKE cluster and I'd like to use a static global IP address but I am struggling figuring it out how.

After a lot of research, most guides/stackoverflow/blogs just say "use the kubernetes.io/ingress.global-static-ip-name annotation on your ingress resource" however that does not do anything.

Below is an example of my Ingress resource

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  namespace: my-namespace
  annotations:
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.class: "nginx"
    kubernetes.io/ingress.allow-http: "false"
    nginx.org/websocket-services: "ws-svc"
    kubernetes.io/ingress.global-static-ip-name: my-global-gce-ip
spec:
  tls:
  - secretName: my-secret
    hosts:
    - mysite.com
  rules:
  - host: mysite.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web
          servicePort: 80

The service always get's an ephemeral IP address which is thrown away whenever I recreate the controller. I suspect the issue at hand here is that annotation only works for GCE type of Ingress, not nginx (Even though this is stated nowhere)

Next I attempted setting the IP manually in my ingress resource as showsn in this guide yet when I look at the service created, the external IP address just shows as pending which some github issues seem to point is due to the fact that it is a global and not a regional IP.

With all this in mind, is there any way to have a static global ip on a GKE cluster using an nginx ingress controller?

-- Alexandre Thenorio
google-kubernetes-engine
kubernetes-ingress
static-ip-address

1 Answer

12/6/2018

You have to set the static IP as loadBalancerIP in nginx ingress controller, not in ingress-resource (as you did). As per the documentation, Load Balancer IP is the IP address to assign to load balancer (if supported).

https://github.com/helm/charts/tree/master/stable/nginx-ingress

 spec:
  ...
  externalTrafficPolicy: Cluster
  loadBalancerIP: [your static IP]
  sessionAffinity: None
  type: LoadBalancer

And make sure your IP is regional and not global. Only GCP load balancers (GCP built-in ingress controller) support global IP.

-- Jawahar
Source: StackOverflow