最近一直在困扰,在kubernetes上部署了服务器,怎么实现跳转到https呢。以前一直尝试在容器内部的nginx上解决,可是证书绑定在了路由上,Ingress转发过来的本身就是80端口,根本无法判断访问来源是否用了https。除非在后端程序获取绝对url,提取schema判断,但是这种方式显然不够优雅。

环境

服务器是阿里云的,使用了阿里云容器服务,Kubernetes集群(托管版)。
开启了 Ingress 路由,并配置了 TLS。

解决方案

在Ingress路由中添加注解:nginx.ingress.kubernetes.io/ssl-redirect: "true"
这种方式支持左右子路径,一一对应跳转到相应的https链接

更多参考

By default the controller redirects (308) to HTTPS if TLS is enabled for that ingress. If you want to disable this behavior globally, you can use ssl-redirect: "false" in the NGINX ConfigMap.

如果ingress的TSL功能开启的话,控制器会默认跳转到https。

(但是实际测试并没有跳转,我用的是阿里云的容器服务)

To configure this feature for specific ingress resources, you can use the nginx.ingress.kubernetes.io/ssl-redirect: "false" annotation in the particular resource.

想要在个别路由配置这个功能,可以使用 nginx.ingress.kubernetes.io/ssl-redirect: "false" 来关闭重定向。
反之,我们要开启这个功能,就要在注解当中配置:nginx.ingress.kubernetes.io/ssl-redirect: "true"

补充

When using SSL offloading outside of cluster (e.g. AWS ELB) it may be useful to enforce a redirect to HTTPS even when there is no TLS certificate available. This can be achieved by using the nginx.ingress.kubernetes.io/force-ssl-redirect: "true" annotation in the particular resource.

即使没有配置 TLS,想要强制开启,可以添加注解:nginx.ingress.kubernetes.io/force-ssl-redirect: "true"

官方文档:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#server-side-https-enforcement-through-redirect