Bind nginx-ingress to static IP Address

11/9/2018

I want to set up an ingress controller on AWS EKS for several microservices that are accessed from an external system.

The microservices are accessed via virtual host-names like svc1.acme.com, svc2.acme.com, ...

I set up the nginx ingress controller with a helm chart: https://github.com/helm/charts/tree/master/stable/nginx-ingress

My idea was to reserve an Elastic IP Address and bind the nginx-controller to that IP by setting the variable externalIP.

This way I should be able to access the services with a stable wildcard DNS entry *.acme.com --> 54.72.43.19

I can see that the ingress controller service get the externalIP, but the IP is not accessible.

NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-ingress-controller        LoadBalancer   10.100.45.119    54.72.43.19   80:32104/TCP,443:31771/TCP   1m

Any idea why?

Update:

I installed the ingress controller with this command:

helm install --name ingress -f values.yaml stable/nginx-ingress

Here is the gist for values, the only thing changed from the default is

externalIPs: ["54.72.43.19"]

https://gist.github.com/christianwoehrle/3b136023b1e0085b028a67ca6a0959b7

-- christian
amazon-eks
amazon-web-services
kubernetes
nginx-ingress

1 Answer

11/14/2018

Maybe you can achieve that by using a Network Load Balancer (https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html), that supports fixed IPs, as the backing for your Nginx ingress, eg (https://aws.amazon.com/blogs/opensource/network-load-balancer-support-in-kubernetes-1-9/):

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  externalTrafficPolicy: Local
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
type: LoadBalancer
-- Paulo Schreiner
Source: StackOverflow