有没有办法强制对入口负载平衡器上的传入连接进行 SSL 升级?或者,如果这不可能,我可以禁用端口:80 吗?我还没有找到一个很好的文档页面来概述 YAML 文件中的此类选项。提前非常感谢!
10 回答
https://github.com/kubernetes/ingress-gce#frontend-https
您可以通过注释阻止 HTTPkubernetes.io/ingress.allow-http: "false"
或通过指定自定义后端将 HTTP 重定向到 HTTPS。不幸的是,GCE 还没有直接为您处理 L7 层的重定向或重写。(见https://github.com/kubernetes/ingress-gce#ingress-cannot-redirect-http-to-https)
更新:GCP 现在处理负载平衡器的重定向规则,包括 HTTP 到 HTTPS。似乎还没有通过 Kubernetes YAML 创建这些的方法。
对已接受答案的评论已经正确回答了这个问题。但由于评论被埋没了,我错过了好几次。
从 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
注释已更改:
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
如果您没有绑定到 GCLB 入口控制器,您可以查看Nginx 入口控制器。该控制器在多个方面与内置控制器不同。首先,您需要自己部署和管理一个。但是,如果您愿意这样做,您将获得不依赖 GCE LB(20 美元/月)并获得对 IPv6/websockets 的支持的好处。
该文档指出:
默认情况下,如果为该入口启用了 TLS,则控制器会将 (301) 重定向到 HTTPS。如果要全局禁用该行为,可以
ssl-redirect: "false"
在 NGINX 配置映射中使用。
最近发布的0.9.0-beta.3附带了一个附加注释,用于显式执行此重定向:
使用注释强制重定向到 SSL
ingress.kubernetes.io/force-ssl-redirect
Google 已响应我们的请求,并正在其负载平衡器上测试 HTTP->HTTPS SSL 重定向。他们的最新回答说它应该在 2020 年 1 月结束之前的某个时间进入 Alpha。
他们的评论:
感谢您在这个问题上的耐心等待。该功能目前正在测试中,我们预计将在 1 月底之前进入 Alpha 阶段。随着我们接近 Alpha 的发布,我们的 PM 团队将发布一个包含更多细节的公告。
我的手指交叉,我们将在不久的将来对这个非常常见的功能有一个简单的解决方案。
更新(2020 年 4 月):
HTTP(S) 重写现在是一项普遍可用的功能。它的边缘仍然有点粗糙,不幸的是,它不能与GCE Ingress Controller一起使用。但是时间会证明一切,希望会出现原生解决方案。
快速更新。这里
现在可以制作 FrontEndConfig 来配置入口。希望它有所帮助。
例子:
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
name: my-frontend-config
spec:
redirectToHttps:
enabled: true
responseCodeName: 301
您需要确保您的负载均衡器支持 HTTP 和 HTTPS
为此工作了很长时间。以防有人不清楚上面的帖子。您将使用注释重建您的入口 -- kubernetes.io/ingress.allow-http: "false" -- 然后删除您的入口并重新部署。注释将使入口只为 443 创建一个 LB,而不是 443 和 80 .
然后你做一个计算 HTTP LB,而不是 GKE。
Gui 指导:创建一个负载均衡器并选择 HTTP(S) Load Balancing -- Start configuration。
选择 - 从 Internet 到我的虚拟机并继续
为 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 一直在尝试构建它(我认为)。
感谢@Andrej Palicka 的评论并根据他提供的页面:https ://cloud.google.com/kubernetes-engine/docs/how-to/ingress-features#https_redirect现在我有了一个更新且有效的解决方案。
首先我们需要定义一个FrontendConfig资源,然后我们需要告诉Ingress资源使用这个FrontendConfig。
例子:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-app-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: myapp-prd
networking.gke.io/managed-certificates: managed-cert
kubernetes.io/ingress.class: "gce"
networking.gke.io/v1beta1.FrontendConfig: myapp-frontend-config
spec:
defaultBackend:
service:
name: myapp-app-service
port:
number: 80
---
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
name: myapp-frontend-config
spec:
redirectToHttps:
enabled: true
responseCodeName: MOVED_PERMANENTLY_DEFAULT
您可以在集群上禁用 HTTP(请注意,您需要重新创建集群才能将此更改应用于负载均衡器),然后通过在同一 IP 地址上创建额外的负载均衡器来设置 HTTP 到 HTTPS 重定向。
我在同一个问题上花了几个小时,最后做了我刚才描述的事情。它完美地工作。
在 Kubernetes 中重定向到 HTTPS 有点复杂。根据我的经验,您可能希望使用诸如Ambassador或ingress-nginx之类的入口控制器来控制到您的服务的路由,而不是让您的负载均衡器直接路由到您的服务。
假设您使用的是入口控制器,那么:
- 如果您在外部负载均衡器上终止 TLS,并且 LB 以 L7 模式(即 HTTP/HTTPS)运行,那么您的入口控制器需要使用
X-Forwarded-Proto
,并相应地发出重定向。 - 如果您在外部负载均衡器上终止 TLS 并且 LB 以 TCP/L4 模式运行,那么您的入口控制器需要使用 PROXY 协议进行重定向。
- 您还可以直接在入口控制器中终止 TLS,在这种情况下,它具有执行重定向所需的所有信息。
这是有关如何在大使中执行此操作的教程。