问题

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?)

image-20211019151509146

综上,ingress-controller修改ssl重定向端口的方法如下:

  1. daemonset/deployment的yaml里修改容器args,增加参数--https-port=8443
  2. daemonset/deployment的yaml里相应地修改容器的containerPort
  3. 如果需要对整个集群的所有ingress重定向时加上非标准端口,则可以在ingress-controller命名空间的ingress-nginx configmap中增加use-port-in-redirects: "true"
  4. 如果仅需要对某个ingress重定向时加非标准端口,则只需要在特定的ingress文件中加入annotation:nginx.ingress.kubernetes.io/use-port-in-redirects: true

参考

Path redirection appends port after the hostname · Issue #5222 · kubernetes/ingress-nginx (github.com)

k8s笔记——NodePort暴露nginx-controller实现https自动跳转自定义nodePort端口 - a1010 - 博客园 (cnblogs.com)

文章目录