如何在GKE上为Kubernetes Ingress强制使用SSL

时间:2016-05-03 10:21:34

标签: kubernetes

是否有办法强制对入口负载均衡器上的传入连接进行SSL升级?或者,如果无法使用,我可以禁用端口:80?我还没有找到一个很好的文档页面,它在YAML文件中概述了这样一个选项。非常感谢提前!

9 个答案:

答案 0 :(得分:32)

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

您可以通过注释kubernetes.io/ingress.allow-http: "false"阻止HTTP,或通过指定自定义后端将HTTP重定向到HTTPS。不幸的是,GCE并没有直接为你处理L7层的重定向或重写。 (见https://github.com/kubernetes/ingress-gce#ingress-cannot-redirect-http-to-https

答案 1 :(得分:12)

注释已更改:

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

这是注释更改PR: https://github.com/kubernetes/contrib/pull/1462/files

答案 2 :(得分:10)

如果您不受GCLB Ingress控制器的约束,您可以查看Nginx Ingress Controller。该控制器与内置控制器有多种不同。首先,您需要自己部署和管理一个。但是如果你愿意这样做,你可以获得不依赖于GCE LB(20美元/月)并获得IPv6 / websockets支持的好处。

documentation州:

  

默认情况下,如果为该入口启用了TLS,则控制器会将(301)重定向到HTTPS。如果要全局禁用该行为,则为您   可以在NGINX配置图中使用ssl-redirect: "false"

最近发布的0.9.0-beta.3附带了一个明确强制执行此重定向的注释:

  

使用注释ingress.kubernetes.io/force-ssl-redirect

强制重定向到SSL

答案 3 :(得分:9)

Google已响应我们的请求,并正在其负载均衡器上测试HTTP-> HTTPS SSL重定向。 Their latest answer表示应该在2020年1月底之前的某个时间到达Alpha。

他们的评论:

感谢您在此问题上的耐心配合。该功能目前正在测试中,我们预计在一月底之前进入Alpha阶段。随着我们接近Alpha发布,我们的PM团队将发布更详细的公告。

食指大动,我们将在不久的将来为这一非常常见的功能提供简单的解决方案。


更新(2020年4月)

HTTP(S)重写现在是Generally Available功能。它的边缘仍然有些粗糙,不幸的是,GCE Ingress Controller不能立即使用。但是时间会证明一切,并希望本机解决方案会出现。

答案 4 :(得分:6)

对已接受答案的评论已经正确回答了这个问题。但由于评论被埋没了,我错过了好几次。

从 GKE 版本 1.18.10-gke.600 开始,您可以添加 k8s 前端配置以从 http 重定向到 https。

https://cloud.google.com/kubernetes-engine/docs/how-to/ingress-features#https_redirect

apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
  name: ssl-redirect
spec:
  redirectToHttps:
    enabled: true

# add below to ingress
# metadata:
#   annotations:
#     networking.gke.io/v1beta1.FrontendConfig: ssl-redirect

答案 5 :(得分:4)

快速更新。 Here

现在可以使用 FrontEndConfig 来配置入口。希望有帮助。

示例:

apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
  name: my-frontend-config
spec:
  redirectToHttps:
    enabled: true
    responseCodeName: 301

您需要确保您的负载均衡器支持 HTTP 和 HTTPS

答案 6 :(得分:3)

为此工作了很长时间。以防万一在上面的帖子中不清楚的人。您将使用注释重建入口-kubernetes.io/ingress.allow-http:“ false”- 然后删除您的入口并重新部署。注释将使入口仅为443(而不是443和80)创建LB。

然后您执行一个计算HTTP LB,而不是GKE。

Gui路线: 创建一个负载平衡器,然后选择“ HTTP(S)负载平衡-开始配置”。

选择-从Internet到我的VM,然后继续

选择LB的名称

将后端配置留空。

在“主机和路径规则”下,选择“高级主机和路径规则”,将操作设置为 将客户端重定向到其他主机/路径。 将主机重定向字段保留为空。 选择“前缀重定向”,并将“路径”值保留为空白。 选择重定向响应代码为308。 选中“ HTTPS重定向的启用”框。

对于前端配置,保留http和端口80,对于ip地址,请选择静态 用于您的GKE入口的IP地址。

创建此LB。

您现在将拥有所有http流量,并将308重定向到GKE的https入口。超级简单的配置设置,效果很好。

注意:如果您只是尝试删除GKE进行的端口80 LB(不进行注释更改和重建入口),然后添加新的重定向计算LB,则它确实起作用,但是您将开始看到以下错误消息:您的Ingress说错误消息400的字段'resource.ipAddress“”无效值正在使用,将导致冲突,无效。它正在尝试加速端口80 LB,但不能这样做,因为您已经在端口80上使用相同的IP拥有了一个LB。它确实可以工作,但是错误很烦人,GKE一直在尝试构建它。(我认为)。

答案 7 :(得分:1)

您可以disable HTTP on your cluster(请注意,您需要重新创建集群才能将此更改应用到负载均衡器上),然后set HTTP-to-HTTPS redirect,方法是在同一IP地址上创建一个额外的负载均衡器

我在同一个问题上花费了几个小时,最后做了我刚才描述的事情。效果很好。

答案 8 :(得分:0)

在Kubernetes中重定向到HTTPS有点复杂。以我的经验,您可能想要使用Ambassadoringress-nginx之类的入口控制器来控制到服务的路由,而不是让负载均衡器直接路由到您的服务。

假设您正在使用入口控制器,则:

  • 如果您要在外部负载均衡器处终止TLS,并且LB以L7模式(即HTTP / HTTPS)运行,则您的入口控制器需要使用X-Forwarded-Proto,并相应地发出重定向。 / li>
  • 如果您要在外部负载均衡器处终止TLS,并且LB以TCP / L4模式运行,那么入口控制器需要使用PROXY协议进行重定向。
  • 您还可以直接在入口控制器中终止TLS,在这种情况下,它具有进行重定向的所有必要信息。

这里是tutorial,介绍了如何在大使中进行此操作。