有没有办法在入站连接上使用负载均衡器强制进行SSL升级?或者如果这不可能,我可以禁用端口:80吗?我还没有找到一个好的文档页面来概述YAML文件中这样的选项。非常感谢!
有没有办法在入站连接上使用负载均衡器强制进行SSL升级?或者如果这不可能,我可以禁用端口:80吗?我还没有找到一个好的文档页面来概述YAML文件中这样的选项。非常感谢!
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)
更新:现在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
ssl-redirect
对我来说无法工作,因为我已经在我的 Ingress 中有了这个配置 kubernetes.io/ingress.allow-http: "false"
。请记得删除 ingress.allow-http
配置,否则 ssl-redirect
将无法正常工作。 - Frank Escobar注释已更改:
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
ssl-redirect:“false”
。ingress.kubernetes.io/force-ssl-redirect
强制重定向到SSL。nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
并且它有效。有关注释的完整列表,请访问https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/annotations.md - Balkrishna简要更新。 这里
现在可以创建一个FrontEndConfig来配置Ingress。希望能够帮助。
示例:
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创建负载均衡器,而不是同时为443和80创建。
然后您需要进行计算HTTP LB,而不是GKE的LB。
GUI方向: 创建一个负载平衡器并选择HTTP(S)负载平衡 - 开始配置。
选择 - 从Internet到我的VMs并继续
为LB选择一个名称
保留后端配置为空。
在主机和路径规则下,选择高级主机和路径规则,并将操作设置为重定向客户端到不同的主机/路径。 将主机重定向字段保留为空。 选择前缀重定向并将路径值保留为空。 选择308作为重定向响应代码。 勾选启用HTTPS重定向框。
对于前端配置,请将http和端口80保留,对于ip地址选择用于您的GKE入口的静态IP地址。
创建此LB。
现在您将所有http流量都发送到这里,并且308重定向到您的GKE https入口。非常简单的配置设置,并且运作良好。
注意:如果您只尝试删除GKE生成的80端口LB(而不执行注释更改和重建入口),然后添加新的重定向计算LB,它确实可以工作,但是您将开始看到关于Ingress的错误消息,显示字段'resource.ipAddress""的值无效,已在使用中,并将导致冲突,无效。它正在尝试启动80端口的LB,但无法启动,因为您已经有一个在使用相同IP的80端口的LB。它确实可以工作,但错误很烦人,而且GKE一直在尝试构建它(我想)。
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
在Kubernetes中进行HTTPS重定向有点复杂。根据我的经验,你可能会想使用一个类似于Ambassador或者ingress-nginx的入口控制器来控制对你的服务的路由,而不是让负载均衡器直接路由到你的服务。
假设你正在使用一个入口控制器,那么:
X-Forwarded-Proto
,并相应地发出重定向。这里有一个关于如何在Ambassador中进行此操作的教程。