k8s叢集預設安裝的ingress-nginx直接投入測試或生產使用,其不合適的配置引數可能會導致一些訪問報錯。例如:
“413 Request Entity Too Large”“503 Service Unavailable”此時我們就需要調整ingress-nginx的配置引數來解決問題,有以下三種方式:
ConfigMap使用ConfigMap設定Nginx的全域性配置檔案Annotations使用Annotations設定特定Server的配置檔案,如:某個hello.test.cnCustom Template使用模板設定更多的特定Server的配置檔案在此只介紹下比較常見的ConfigMap、Annotations兩種方式。
需求在此主要以解決以下兩個問題為例:
“413 Request Entity Too Large”此問題為上傳檔案過大導致,nginx預設限制為1M,可以通過調整client_max_body_size引數解決。upstream超時upstream超市可能會導致502、503、504等問題,nginx預設超時時間為60s,可以通過設定proxy_read_timeout、proxy_connect_timeout、proxy_send_timeout引數解決。ConfigMap1. 預設配置
預設ingress-nginx的ConfigMap有以下三種並且資料都為空
# 預設的三種ConfigMap# kubectl get cm -n ingress-nginxNAME DATA AGEingress-controller-leader-nginx 0 10dnginx-configuration 0 10dtcp-services 0 10dudp-services 0 10d# ConfigMap定義# vim mandatory# 擷取ConfigMap部分---kind: ConfigMapapiVersion: v1metadata: name: nginx-configuration namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx---kind: ConfigMapapiVersion: v1metadata: name: tcp-services namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx---kind: ConfigMapapiVersion: v1metadata: name: udp-services namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx
其中:
三種ConfigMap都沒有Data設定,因此資料定義都為空;nginx-ingress-controller分別引用nginx-configuration、 tcp-services、 udp-services三個ConfigMap。具體設定調整引數我們需要選擇對應的ConfigMap,經過測試需要選擇nginx-configuration。# vim global_configmap.yaml# ingress-nginx 全域性配置檔案apiVersion: v1kind: ConfigMapmetadata: name: nginx-configuration namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginxdata: proxy-connect-timeout: "300" proxy-read-timeout: "300" proxy-send-timeout: "300" proxy-body-size: "200m"# 應用後,nginx會自動reload生效kubectl apply -f global_configmap.yaml# 檢查配置檔案kubectl exec -it nginx-ingress-controller-gmzq6 -n ingress-nginx -- cat /etc/nginx/nginx.conf
注意:
AnnotationsConfigMap適用於全域性配置,但是有時我們只需要針對某個特定的站點設定,此時就需要用到Annotations。例如:要對hello.test.cn 這個站設定client_max_body_size解決上傳檔案太大問題。
# vim hellworld.yaml# 單獨設定IngressapiVersion: extensions/v1beta1kind: Ingressmetadata: name: helloworld namespace: test annotations: nginx.ingress.kubernetes.io/proxy-body-size: 300mspec: rules: - host: hello.test.cn http: paths: - path: / backend: serviceName: helloworld servicePort: 8080# 應用# kubectl apply -f helloworld.yaml# 驗證# kubectl exec -it nginx-ingress-controller-gmzq6 -n ingress-nginx -- cat /etc/ngclient_max_body_size 300m;
此時client_max_body_size只針對hello.test.cn 這個server生效,其他server仍然使用的是全域性配置檔案。
總結在ingress-nginx的配置檔案/etc/nginx/nginx.conf中指定了Global filters、TCP services、UDP services區域,應該分別對應三個ConfigMap。熟悉了ingress-nginx的自定義配置後,我們就可以靈活修改配置引數了。
最新評論