k8s集群默認(rèn)安裝的ingress-Nginx直接投入測試或生產(chǎn)使用,其不合適的配置參數(shù)可能會導(dǎo)致一些訪問報錯。
例如:
- “413 Request Entity Too Large”
- “503 Service Unavailable”
此時我們就需要調(diào)整ingress-nginx的配置參數(shù)來解決問題,有以下三種方式:
- ConfigMap
使用ConfigMap設(shè)置Nginx的全局配置文件 - Annotations
使用Annotations設(shè)置特定Server的配置文件,如:某個hello.test.cn - Custom Template
使用模板設(shè)置更多的特定Server的配置文件
在此只介紹下比較常見的ConfigMap、Annotations兩種方式。
需求
在此主要以解決以下兩個問題為例:
- “413 Request Entity Too Large”
此問題為上傳文件過大導(dǎo)致,nginx默認(rèn)限制為1M,可以通過調(diào)整client_max_body_size參數(shù)解決。 - upstream超時
upstream超市可能會導(dǎo)致502、503、504等問題,nginx默認(rèn)超時時間為60s,可以通過設(shè)置proxy_read_timeout、proxy_connect_timeout、proxy_send_timeout參數(shù)解決。
ConfigMap
1. 默認(rèn)配置
默認(rèn)ingress-nginx的ConfigMap有以下三種并且數(shù)據(jù)都為空
# 默認(rèn)的三種ConfigMap
# kubectl get cm -n ingress-nginx
NAME DATA AGEingress-controller-leader-nginx 0 10d
nginx-configuration 0 10d
tcp-services 0 10d
udp-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設(shè)置,因此數(shù)據(jù)定義都為空;
- nginx-ingress-controller分別引用nginx-configuration、 tcp-services、 udp-services三個ConfigMap。
- 具體設(shè)置
調(diào)整參數(shù)我們需要選擇對應(yīng)的ConfigMap,經(jīng)過測試需要選擇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-nginx
data: proxy-connect-timeout: "300"
proxy-read-timeout: "300"
proxy-send-timeout: "300"
proxy-body-size: "200m"
# 應(yīng)用后,nginx會自動reload生效kubectl apply -f global_configmap.yaml# 檢查配置文件kubectl exec -it nginx-ingress-controller-gmzq6 -n ingress-nginx -- cat /etc/nginx/nginx.conf
注意:
- 使用nginx-configuration,而不是tcp-services和udp-services。
- 經(jīng)測試,按照官網(wǎng)"https://kubernetes.github.io/ingress-nginx/examples/customization/custom-configuration/"設(shè)置,ConfigMap使用ingress-nginx-controller是不生效的,因為沒有ingress-nginx-controller這個ConfigMap,需要使用nginx-configuration。
$ cat configmap.yaml
apiVersion: v1data: proxy-connect-timeout: "10"
proxy-read-timeout: "120"
proxy-send-timeout: "120"
kind: ConfigMapmetadata: name: ingress-nginx-controller
- 在此我將全局配置文件單獨列出,也可以將其合并到mandatory.yaml中。
Annotations
ConfigMap適用于全局配置,但是有時我們只需要針對某個特定的站點設(shè)置,此時就需要用到Annotations。
例如:要對hello.test.cn 這個站設(shè)置client_max_body_size解決上傳文件太大問題。
# vim hellworld.yaml
# 單獨設(shè)置IngressapiVersion: extensions/v1beta1kind: Ingressmetadata: name: helloworld namespace: test annotations: nginx.ingress.kubernetes.io/proxy-body-size: 300m
spec: rules: - host: hello.test.cn http: paths: - path: /
backend: serviceName: helloworld servicePort: 8080
# 應(yīng)用# kubectl apply -f helloworld.yaml# 驗證# kubectl exec -it nginx-ingress-controller-gmzq6 -n ingress-nginx -- cat /etc/ng
client_max_body_size 300m;
此時client_max_body_size只針對hello.test.cn 這個server生效,其他server仍然使用的是全局配置文件。
總結(jié)
在ingress-nginx的配置文件/etc/nginx/nginx.conf中指定了Global filters、TCP services、UDP services區(qū)域,應(yīng)該分別對應(yīng)三個ConfigMap。
熟悉了ingress-nginx的自定義配置后,我們就可以靈活修改配置參數(shù)了。