HTTP(S)負載均衡器-ingress
Ingress是kubernetes API的标準資源類型之一,其本質就是一組基于DNS名稱(host)或URL路徑把請求轉發至指定的Service資源的規則,用于将叢集外的請求流量轉發至叢集内部完成服務釋出。
Ingress控制器(Ingress Controller)可以由任何具有反向代理(HTTP/HTTPS)功能的服務程式實作,如Nginx、Envoy、HAProxy、Vulcand和Traefik等。Ingress控制器本身也作為Pod對象與被代理的運作為Pod資源的應用運作于同一網絡中。我們在這裡選擇了NGINX Ingress Controller,由于對NGINX的配置較為熟悉,同時我們使用的kubernetes是阿裡雲的容器服務,建構叢集的時候,容器服務會自帶NGINX Ingress Controller。
根據實際情況Ingress調優
解決400 Request Header Or Cookie Too Large問題
現象:微信小程式需要調用後端接口,需要在header中傳一段很長的token參數,直接使用浏覽器通路該端口可以通路通,但是在加上token通路之後,會報“400 Request Header Or Cookie Too Large”
<html>
<head>
<title>400 Request Header Or Cookie Too Large</title>
</head>
<body>
<center>
<h1>400 Bad Request</h1>
</center>
<center>Request Header Or Cookie Too Large</center>
<hr>
<center>nginx/1.15.6</center>
</body>
</html>
問題定位:直接修改Service使用nodeport的形式通路,則沒有報錯,初步定位需要在ingress中nginx配置用戶端的請求頭,進入Ingress Controller的Pod查詢配置,果然是請求頭空間不足。
www-data@nginx-ingress-controller-5vx7x:/etc/nginx$ cat nginx.conf | grep client_header_buffer_size
client_header_buffer_size 1k;
www-data@nginx-ingress-controller-5vx7x:/etc/nginx$ cat nginx.conf | grep large_client_header_buffers
large_client_header_buffers 4 8k;
解決方法:在ingress中添加注釋
nginx.ingress.kubernetes.io/server-snippet: client_header_buffer_size 2046k;
Server snippet
Using the annotation
nginx.ingress.kubernetes.io/server-snippet
it is possible to add custom configuration in the server configuration block.
該注釋是将自定義配置加入nginx的server配置中
解決請求逾時問題
現象:有一個資料導出功能,需要将大量資料進行處理,然後以Excel格式傳回,在導出一個大約3W條資料的時候,出現通路逾時情況。
解決方法:調整proxy_read_timeout,連接配接成功後_等候後端伺服器響應時間_其實已經進入後端的排隊之中等候處理
在ingress中添加注釋
nginx.ingress.kubernetes.io/proxy-read-timeout: 600
這裡需要注意的事該注釋的value需要時number類型,不能加s,否則将不生效
總結
使用NGINX ingress controller的好處就是對于nginx配置相對比較熟悉,性能也不差。相關nginx配置的對應的ingress可以在
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/上查到。