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

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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM