天天看點

解決kubernetes中ingress-nginx配置問題

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/

上查到。

繼續閱讀