60

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

4

10 回答 10

60

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 创建这些的方法。

于 2016-05-09T21:59:17.450 回答
16

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

从 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
于 2021-02-04T15:33:17.410 回答
15

注释已更改:

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

于 2016-10-07T11:56:58.677 回答
14

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

文档指出:

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

最近发布的0.9.0-beta.3附带了一个附加注释,用于显式执行此重定向:

使用注释强制重定向到 SSLingress.kubernetes.io/force-ssl-redirect

于 2017-03-21T09:38:55.223 回答
9

Google 已响应我们的请求,并正在其负载平衡器上测试 HTTP->HTTPS SSL 重定向。他们的最新回答说它应该在 2020 年 1 月结束之前的某个时间进入 Alpha。

他们的评论:

感谢您在这个问题上的耐心等待。该功能目前正在测试中,我们预计将在 1 月底之前进入 Alpha 阶段。随着我们接近 Alpha 的发布,我们的 PM 团队将发布一个包含更多细节的公告。

我的手指交叉,我们将在不久的将来对这个非常常见的功能有一个简单的解决方案。


更新(2020 年 4 月)

HTTP(S) 重写现在是一项普遍可用的功能。它的边缘仍然有点粗糙,不幸的是,它不能与GCE Ingress Controller一起使用。但是时间会证明一切,希望会出现原生解决方案。

于 2020-01-07T05:39:58.697 回答
8

快速更新。这里

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

例子:

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

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

于 2021-01-14T01:29:12.383 回答
4

为此工作了很长时间。以防有人不清楚上面的帖子。您将使用注释重建您的入口 -- 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 一直在尝试构建它(我认为)。

于 2020-08-19T03:13:57.140 回答
2

感谢@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
于 2022-02-02T15:13:47.347 回答
1

您可以在集群上禁用 HTTP(请注意,您需要重新创建集群才能将此更改应用于负载均衡器),然后通过在同一 IP 地址上创建额外的负载均衡器来设置 HTTP 到 HTTPS 重定向。

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

于 2020-06-14T16:08:03.877 回答
0

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

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

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

这是有关如何在大使中执行此操作的教程。

于 2019-11-11T21:36:45.223 回答