John
John

Reputation: 171

Does GKE support nginx-ingress with static ip?

I have been using the Google Cloud Load Balancer ingress. However, I'm trying to install a nginxinc/kubernetes-ingress controller in a node with a Static IP address in GKE.

  1. Can I use Google's Cloud Load Balancer ingress controller in the same cluster?
  2. How can we use the nginxinc/kubernetes-ingress with a static IP?

Thanks

Upvotes: 17

Views: 14539

Answers (5)

Chetan Jain
Chetan Jain

Reputation: 241

ONLY WORKS WITH GCE NOT INGRESS-NGINX

Create a Static Ip

 gcloud compute addresses create my-ip --global

Describe the Static Ip (this will helo you to know static IP )

gcloud compute addresses describe  ssl-ip --global

Now add these annotations:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: "gce" # <----
    kubernetes.io/ingress.global-static-ip-name: my-ip # <----

Apply the ingress

kubectl apply -f infress.yaml

(Now wait for 2 minutes) Run this to it will reflect the new ip

kubectl get ingress

Upvotes: -3

Bernie Lenz
Bernie Lenz

Reputation: 2146

In case you're using helm to deploy nginx-ingress.

First create a static IP address. In google the Network Loadbalancers (NLBs) only support regional static IPs:

gcloud compute addresses create my-static-ip-address --region us-east4

Then install nginx-helm with the ip address as a loadBalancerIP parameter

helm install --name nginx-ingress stable/nginx-ingress --namespace my-namespace --set controller.service.loadBalancerIP=35.186.172.1

Upvotes: 16

It is perfectly fine to run multiple ingress controllers inside kubernetes, but they need to be aware which Ingress objects they are supposed to instantiate. That is done with a special annotation like :

kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"

which tells that this ingress is expected to be provided by and only by nginx ingress controller.

As for IP, Some cloud providers allow the loadBalancerIP to be specified. with this you can controll the public IP of a service.

Upvotes: 0

GalloCedrone
GalloCedrone

Reputation: 5067

First question

As Radek 'Goblin' Pieczonka already pointed you out it is possible to do so. I just wanted to link you to the official documentation regarding this matter:

If you have multiple Ingress controllers in a single cluster, you can pick one by specifying the ingress.class annotation, eg creating an Ingress with an annotation like

metadata:
  name: foo
  annotations:
    kubernetes.io/ingress.class: "gce"

will target the GCE controller, forcing the nginx controller to ignore it, while an annotation like

metadata:
  name: foo
  annotations:
    kubernetes.io/ingress.class: "nginx"

Second question

Since you are making use of the Google Cloud Platform I can give you further details regarding this implementation of Kubernetes in Google.

Consider that:

By default, Kubernetes Engine allocates ephemeral external IP addresses for HTTP applications exposed through an Ingress.

However of course you can use static IP addressed for your ingress resource, there is an official step to step guide showing you how to create a HTTP Load Balancing with Ingress making use of a ingress resource and to link to it a static IP or how to promote an "ephemeral" already in use IP to be static.

Try to go through it and if you face some issue update the question and ask!

Upvotes: 5

unguiculus
unguiculus

Reputation: 405

For the nginx-ingress controller you have to set the external IP on the service:

spec:
  loadBalancerIP: "42.42.42.42"
  externalTrafficPolicy: "Local"

Upvotes: 4

Related Questions