How to force SSL for Kubernetes Ingress on GKE

后端 未结 7 2115
情话喂你
情话喂你 2020-11-28 07:38

Is there a way to force an SSL upgrade for incoming connections on the ingress load-balancer? Or if that is not possible with, can I disable port :80? I haven\'t found a goo

相关标签:
7条回答
  • 2020-11-28 07:45

    https://github.com/kubernetes/ingress-gce#frontend-https

    You can block HTTP through the annotation kubernetes.io/ingress.allow-http: "false" or redirect HTTP to HTTPS by specifying a custom backend. Unfortunately GCE doesn't handle redirection or rewriting at the L7 layer directly for you, yet. (see https://github.com/kubernetes/ingress-gce#ingress-cannot-redirect-http-to-https)

    Update: GCP now handles redirection rules for load balancers, including HTTP to HTTPS. There doesn't appear to be a method to create these through Kubernetes YAML yet.

    0 讨论(0)
  • 2020-11-28 07:55

    Worked on this for a long time. In case anyone isn't clear on the post above. You would rebuild your ingress with annotation -- kubernetes.io/ingress.allow-http: "false” -- Then delete your ingress and redeploy. The annotation will have the ingress only create a LB for 443, instead of both 443 and 80.

    Then you do a compute HTTP LB, not one for GKE.

    Gui directions: Create a load balancer and choose HTTP(S) Load Balancing -- Start configuration.

    choose - From Internet to my VMs and continue

    Choose a name for the LB

    leave the backend configuration blank.

    Under Host and path rules, select Advanced host and path rules with the action set to Redirect the client to different host/path. Leave the Host redirect field blank. Select Prefix Redirect and leave the Path value blank. Chose the redirect response code as 308. Tick the Enable box for HTTPS redirect.

    For the Frontend configuration, leave http and port 80, for ip address select the static IP address being used for your GKE ingress.

    Create this LB.

    You will now have all http traffic go to this and 308 redirect to your https ingress for GKE. Super simple config setup and works well.

    Note: If you just try to delete the port 80 LB that GKE makes (not doing the annotation change and rebuilding the ingress) and then adding the new redirect compute LB it does work, but you will start to see error messages on your Ingress saying error 400 invalid value for field 'resource.ipAddress " " is in use and would result in a conflict, invalid. It is trying to spin up the port 80 LB and can't because you already have an LB on port 80 using the same IP. It does work but the error is annoying and GKE keeps trying to build it (I think).

    0 讨论(0)
  • 2020-11-28 07:56

    The annotation has changed:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: test
      annotations:
        kubernetes.io/ingress.allow-http: "false"
    spec:
    ...
    

    Here is the annotation change PR: https://github.com/kubernetes/contrib/pull/1462/files

    0 讨论(0)
  • 2020-11-28 08:02

    You can disable HTTP on your cluster (note that you'll need to recreate your cluster for this change to be applied on the load balancer) and then set HTTP-to-HTTPS redirect by creating an additional load balancer on the same IP address.

    I spend couple of hours on the same question, and ended up doing what I've just described. It works perfectly.

    0 讨论(0)
  • 2020-11-28 08:03

    If you are not bound to the GCLB Ingress Controller you could have a look at the Nginx Ingress Controller. This controller is different to the builtin one in multiple ways. First and foremost you need to deploy and manage one by yourself. But if you are willing to do so, you get the benefit of not depending on the GCE LB (20$/month) and getting support for IPv6/websockets.

    The documentation states:

    By default the controller redirects (301) to HTTPS if TLS is enabled for that ingress . If you want to disable that behaviour globally, you can use ssl-redirect: "false" in the NGINX config map.

    The recently released 0.9.0-beta.3 comes with an additional annotation for explicitly enforcing this redirect:

    Force redirect to SSL using the annotation ingress.kubernetes.io/force-ssl-redirect

    0 讨论(0)
  • 2020-11-28 08:05

    Redirecting to HTTPS in Kubernetes is somewhat complicated. In my experience, you'll probably want to use an ingress controller such as Ambassador or ingress-nginx to control routing to your services, as opposed to having your load balancer route directly to your services.

    Assuming you're using an ingress controller, then:

    • If you're terminating TLS at the external load balancer and the LB is running in L7 mode (i.e., HTTP/HTTPS), then your ingress controller needs to use X-Forwarded-Proto, and issue a redirect accordingly.
    • If you're terminating TLS at the external load balancer and the LB is running in TCP/L4 mode, then your ingress controller needs to use the PROXY protocol to do the redirect.
    • You can also terminate TLS directly in your ingress controller, in which case it has all the necessary information to do the redirect.

    Here's a tutorial on how to do this in Ambassador.

    0 讨论(0)
提交回复
热议问题