修改nginx-ingress https重定向时的端口号
问题
k8s集群通过ingress-nginx暴露前端门户。
在默认情况下ingress controller使用了80和443这一组惯用端口,因此当ingress中配置了nginx.ingress.kubernetes.io/ssl-redirect
时,访问http://url
时会自动重定向至https://url
,无需关心端口问题。
当部署ingress controller时443对应的hostPort由于种种原因不能使用443时,如果不进行额外的配置,redirect目标还是443端口,无法正常访问。
解决
经过google并查看ingress-nginx的代码,发现一个annotation:
nginx.ingress.kubernetes.io/use-port-in-redirects: true
该annotation可以在重定向时加入非标准的端口号。
于是在应用的前端页面ingress中加入了该annotation,但是发现重定向后还是443端口。
此时发现遗漏了一个问题:annotation里的user port,到底是use哪个port呢?经过测试,答案是ingress-controller自身的监听端口,即下图中红字所代表的的端口。(从实现的角度想,这是最为直接的方案;延展思考这里是不是可以实现通过k8s的downward api把hostPort信息传进容器,直接重定向至hostPort?)
综上,ingress-controller修改ssl重定向端口的方法如下:
- daemonset/deployment的yaml里修改容器args,增加参数
--https-port=8443
- daemonset/deployment的yaml里相应地修改容器的containerPort
- 如果需要对整个集群的所有ingress重定向时加上非标准端口,则可以在ingress-controller命名空间的ingress-nginx configmap中增加
use-port-in-redirects: "true"
- 如果仅需要对某个ingress重定向时加非标准端口,则只需要在特定的ingress文件中加入annotation:
nginx.ingress.kubernetes.io/use-port-in-redirects: true
参考
k8s笔记——NodePort暴露nginx-controller实现https自动跳转自定义nodePort端口 - a1010 - 博客园 (cnblogs.com)
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。