如何为GKE上的Kubernetes入口强制SSL

如何为GKE上的Kubernetes入口强制SSL,ssl,kubernetes,google-kubernetes-engine,kubernetes-ingress,Ssl,Kubernetes,Google Kubernetes Engine,Kubernetes Ingress,有没有办法强制对入口负载平衡器上的传入连接进行SSL升级?或者,如果无法使用,是否可以禁用端口:80?我还没有在YAML文件中找到一个好的文档页面来概括这样一个选项。提前多谢 您可以通过注释kubernetes.io/ingres.allow-HTTP:“false”阻止HTTP,或者通过指定自定义后端将HTTP重定向到HTTPS。不幸的是,GCE还不能直接为您处理L7层的重定向或重写。(见附件) 更新:,包括HTTP到HTTPS。似乎还没有通过Kubernetes YAML创建这些的方法。注

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

您可以通过注释
kubernetes.io/ingres.allow-HTTP:“false”
阻止HTTP,或者通过指定自定义后端将HTTP重定向到HTTPS。不幸的是,GCE还不能直接为您处理L7层的重定向或重写。(见附件)


更新:,包括HTTP到HTTPS。似乎还没有通过Kubernetes YAML创建这些的方法。

注释已更改:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
...
以下是注释更改PR:

如果您没有绑定到GCLB入口控制器,您可以查看。此控制器与内置控制器在多个方面不同。首先,您需要自己部署和管理一个。但是,如果您愿意这样做,您就可以不依赖GCE LB(20美元/月)并获得对IPv6/WebSocket的支持

各国:

默认情况下,如果为该入口启用TLS,则控制器将(301)重定向到HTTPS。如果您想在全球范围内禁用该行为,您可以 可以在NGINX配置映射中使用ssl重定向:“false”

最近发布的版本附带了一个用于显式强制执行此重定向的附加注释:

使用注释
ingres.kubernetes.io/Force SSL redirect


在Kubernetes中重定向到HTTPS有些复杂。根据我的经验,您可能希望使用入口控制器(如或)来控制到服务的路由,而不是让负载平衡器直接路由到服务

假设您使用的是入口控制器,则:

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

下面是一篇关于如何在Ambassador中实现这一点的文章。

谷歌已经响应了我们的请求,并正在他们的负载平衡器上测试HTTP->HTTPS SSL重定向。说它应该在2020年1月底前的某个时候在阿尔法

他们的评论是:

谢谢你在这个问题上的耐心。该功能目前正在测试中,我们预计在1月底之前进入Alpha阶段。随着Alpha发射的临近,我们的PM团队将发布一份更详细的公告

我祈祷在不久的将来,我们将有一个简单的解决方案来解决这个非常常见的功能


更新(2020年4月)

HTTP(S)重写现在是一项功能。它的边缘仍然有点粗糙,很不幸的是,它不能在开箱即用的情况下工作。但是时间会告诉我们,希望本机解决方案会出现。

您可以(注意,您需要重新创建集群,以便在负载平衡器上应用此更改),然后在同一IP地址上创建其他负载平衡器


我在同一个问题上花了几个小时,最后做了我刚才描述的事情。它工作得很好。

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

然后进行HTTP LB计算,而不是GKE计算

图形用户界面说明: 创建负载平衡器并选择HTTP(S)负载平衡--启动配置

选择-从Internet到我的虚拟机并继续

为LB选择一个名称

将后端配置留空

在“主机和路径规则”下,选择操作设置为的高级主机和路径规则 将客户端重定向到不同的主机/路径。 将主机重定向字段留空。 选择Prefix Redirect并将路径值留空。 选择重定向响应代码为308。 勾选HTTPS重定向的启用框

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

创建此LB

现在,所有的http流量都将转到这里,308重定向到GKE的https入口。超级简单的配置设置,运行良好

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

快速更新

现在可以制作FrontEndConfig来配置入口。希望能有帮助

例如:

apiVersion:networking.gke.io/v1beta1 种类:FrontendConfig 元数据: 名称:我的前端配置 规格: 重定向到HTTPS: 已启用:true 回应姓名:301
您需要确保您的负载平衡器支持HTTP和HTTPS,这已通过对已接受答案的评论得到正确回答。但由于评论被掩埋,我错过了好几次

从GKE版本1.18.10-GKE.600开始,您可以
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