简述
k8s集群默认安装的ingress-nginx直接投入测试或生产使用,其不合适的配置参数可能会导致一些访问报错。
例如:
- “413 Request Entity Too Large”
- “503 Service Unavailable”
此时我们就需要调整ingress-nginx的配置参数来解决问题,有以下三种方式:
- ConfigMap
使用ConfigMap设置Nginx的全局
配置文件 - Annotations
使用Annotations设置特定Server
的配置文件,如:某个hello.test.cn - Custom 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
参数解决。
ConfigMap
- 默认ingress-nginx的ConfigMap有以下三种并且
数据都为空
# 默认的三种ConfigMap
# kubectl get cm -n ingress-nginx
NAME DATA AGE
ingress-controller-leader-nginx 0 10d
nginx-configuration 0 10d
tcp-services 0 10d
udp-services 0 10d
# ConfigMap定义
# vim mandatory
# 截取ConfigMap部分
---
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: tcp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
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: v1
kind: ConfigMap
metadata:
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"
# 应用后,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。 - 经测试,按照官网Custom Configuration设置,ConfigMap使用
ingress-nginx-controller
是不生效的,因为没有ingress-nginx-controller这个ConfigMap,需要使用nginx-configuration。
$ cat configmap.yaml
apiVersion: v1
data:
proxy-connect-timeout: "10"
proxy-read-timeout: "120"
proxy-send-timeout: "120"
kind: ConfigMap
metadata:
name: ingress-nginx-controller
- 在此我将全局配置文件单独列出,也可以将其合并到mandatory.yaml中。
Annotations
ConfigMap适用于全局配置,但是有时我们只需要针对某个特定的站点设置,此时就需要用到Annotations。
例如:要对hello.test.cn 这个站设置client_max_body_size
解决上传文件太大问题。
# vim hellworld.yaml
# 单独设置Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
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
# 应用
# 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仍然使用的是全局配置文件。
总结
在ingress-nginx的配置文件/etc/nginx/nginx.conf
中指定了Global filters
、TCP services
、UDP services
区域,应该分别对应三个ConfigMap。
熟悉了ingress-nginx的自定义配置后,我们就可以灵活修改配置参数了。