Ingress NGINX Controller 自定义配置指南:通过 ConfigMap 精确调优 NGINX 超时与全局参数
【免费下载链接】ingress-nginxIngress NGINX Controller for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/in/ingress-nginx
Ingress NGINX Controller 是 Kubernetes 生态中最常用的入口流量网关之一,其核心设计之一就是无需直接修改 nginx.conf 文件,而是通过 Kubernetes 原生对象 ConfigMap 驱动 NGINX 配置生成与热加载。本文以官方示例 docs/examples/customization/custom-configuration/ 为骨架,从"改超时"这个最小用例出发,完整讲解 ConfigMap 的创建、应用、生效机制,并结合仓库源码深入剖析参数如何从 YAML 走到最终的 nginx.conf,同时给出常用调优参数的取值建议与注意事项。读完本文,你将掌握通过 ConfigMap 对 Ingress NGINX Controller 进行全局自定义配置的完整方法论,并能独立排查"改了配置为何不生效"之类的问题。
一、为什么用 ConfigMap 而不是直接改 nginx.conf
在 Ingress NGINX Controller 的架构中,Controller 启动后会监听 Ingress、Service、ConfigMap 等资源的变更,每当有变化时,它会:
- 汇总集群内的 Ingress 规则、后端服务、Secret 证书与 ConfigMap 配置;
- 将这些信息渲染成一份完整的 nginx.conf(渲染模板位于 rootfs/etc/nginx/template/nginx.tmpl);
- 校验配置合法性后触发 NGINX 平滑 reload。
由于 nginx.conf 是控制器自动生成的中间产物,用户直接修改它会被下一次渲染覆盖。因此官方提供了一条"正道":把自定义项写进 ConfigMap,由控制器消费后渲染进最终配置。这正是 官方示例 README 开篇所强调的:Using a ConfigMap is possible to customize the NGINX configuration。
二、最小实战:修改代理超时时间
示例文档给出的典型场景是调整与后端服务通信的超时时间。默认情况下 NGINX 在与上游(upstream)建立连接、读取响应、发送请求三个环节都有超时限制,如果业务接口本身耗时较长(例如超过 60 秒的报表导出),就需要调大这些值。
1. 创建 ConfigMap
仓库内置了可直接使用的完整示例文件 docs/examples/customization/custom-configuration/configmap.yaml:
apiVersion: v1 kind: ConfigMap metadata: name: ingress-nginx-controller namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx data: proxy-connect-timeout: "10" proxy-read-timeout: "120" proxy-send-timeout: "120"三个 key 的含义如下:
| ConfigMap Key | 对应 NGINX 指令 | 含义 | 示例默认值 |
|---|---|---|---|
proxy-connect-timeout | proxy_connect_timeout | 与后端建立 TCP 连接的超时时间(秒) | 5 |
proxy-read-timeout | proxy_read_timeout | 两次连续读操作之间的超时时间(秒),即后端响应"卡住"多久判定失败 | 60 |
proxy-send-timeout | proxy_send_timeout | 两次连续写操作之间的超时时间(秒),即请求体发送"卡住"多久判定失败 | 60 |
2. 应用到集群
data段是纯键值对,因此除了从文件 apply,也可以直接用命令行方式创建:
kubectl create configmap ingress-nginx-controller \ --namespace ingress-nginx \ --from-literal=proxy-connect-timeout=10 \ --from-literal=proxy-read-timeout=120 \ --from-literal=proxy-send-timeout=120或者使用仓库自带的文件:
kubectl apply -f docs/examples/customization/custom-configuration/configmap.yaml3. 验证是否生效
ConfigMap 更新后,控制器会自动检测变化并 reload NGINX(详见下文"热加载机制")。验证方法:
# 查看控制器是否记录了一次 reload kubectl logs -n ingress-nginx deployment/ingress-nginx-controller | grep -i reload # 进入控制器 Pod 查看生成的配置 kubectl exec -n ingress-nginx deployment/ingress-nginx-controller -- \ grep -E "proxy_(connect|read|send)_timeout" /etc/nginx/nginx.conf若输出中包含proxy_connect_timeout 10s;、proxy_read_timeout 120s;、proxy_send_timeout 120s;,即表示配置已生效。
三、ConfigMap 到 nginx.conf 的完整链路(源码级解读)
理解底层实现有助于你判断"某个参数能不能写在 ConfigMap 里、写了会不会生效"。
1. 参数定义与默认值
控制器把 ConfigMap 的键值对解析为内存中的Configuration结构体,定义在 internal/ingress/controller/config/config.go。其中超时类字段来自嵌入的defaults.Backend(见 internal/ingress/defaults/main.go),JSON tag 与 ConfigMap key 一一对应:
// Defines a timeout for establishing a connection with a proxied server. // It should be noted that this timeout cannot usually exceed 75 seconds. ProxyConnectTimeout int `json:"proxy-connect-timeout"` // Timeout in seconds for reading a response from the proxied server. ProxyReadTimeout int `json:"proxy-read-timeout"` // Timeout in seconds for transmitting a request to the proxied server. ProxySendTimeout int `json:"proxy-send-timeout"`默认值由NewDefault()统一设置(config.go#L856-L860):ProxyConnectTimeout: 5、ProxyReadTimeout: 60、ProxySendTimeout: 60。也就是说,你写入 ConfigMap 的任意一个 key 都会覆盖对应默认值。
2. ConfigMap 的读取与缓存
控制器通过 informer 监听指定 ConfigMap 的变更,读取与缓存逻辑在 internal/ingress/controller/store/store.go 中:
- 控制器启动时通过参数
--configmap=<namespace>/<name>指定要监听哪一个 ConfigMap(Helm 部署默认指向ingress-nginx/ingress-nginx-controller); - store.go#L740-L749 中,事件处理器会对 ConfigMap 的 add/update 事件做出响应,其中与
configmap名称匹配的 key 更新会触发配置重新计算; - 解析结果以
backendConfig字段缓存,通过GetBackendConfiguration()提供给其他模块读取(store.go#L1202-L1207)。
3. 渲染进 nginx.conf
渲染模板 rootfs/etc/nginx/template/nginx.tmpl#L1333-L1335 中,超时参数最终被输出为 NGINX 指令:
proxy_connect_timeout {{ $location.Proxy.ConnectTimeout }}s; proxy_send_timeout {{ $location.Proxy.SendTimeout }}s; proxy_read_timeout {{ $location.Proxy.ReadTimeout }}s;注意模板中每个值后面拼接了s单位,因此 ConfigMap 中的值应写成纯数字(秒),例如"10",而不是"10s"。
4. 热加载机制
如示例文档最后一句所述:"If the Configmap is updated, NGINX will be reloaded with the new configuration." 控制器内部采用校验后重载的策略:ConfigMap 变更 → 重新渲染配置 → 先执行nginx -t校验 → 通过后再向 master 进程发送 reload 信号,从而做到不停机平滑更新。因此当你在集群里修改 ConfigMap 后,通常几秒内即可在生成的配置中看到变化。
四、ConfigMap 支持的核心配置项速查
除了超时,控制器还支持数百个全局配置项,全部字段定义可查阅 internal/ingress/controller/config/config.go(jsontag 即 ConfigMap key),完整文档见 docs/user-guide/nginx-configuration/configmap.md。下面列出运维中最高频的几类,供快速参考:
1. 连接与会话
| ConfigMap Key | 默认值 | 作用 |
|---|---|---|
keep-alive | 75 | 客户端 keep-alive 连接在服务端保持的时间(秒) |
keep-alive-requests | 1000 | 一条 keep-alive 连接上最多可处理的请求数 |
upstream-keepalive-connections | 320 | 每个 worker 缓存到上游的空闲 keep-alive 连接数 |
upstream-keepalive-time | 1h | 通过一条上游 keep-alive 连接处理请求的最大时长 |
upstream-keepalive-requests | 10000 | 一条上游 keep-alive 连接最多处理的请求数 |
worker-processes | CPU 核数 | worker 进程数,可设为auto |
2. 请求体与缓冲区
| ConfigMap Key | 默认值 | 作用 |
|---|---|---|
proxy-body-size | 1m | 客户端请求体最大允许大小(对应client_max_body_size) |
client-header-buffer-size | 1k | 读取客户端请求头的缓冲区大小 |
client-header-timeout | 60 | 读取客户端请求头的超时(秒) |
large-client-header-buffers | 4 8k | 大请求头的缓冲区数量与大小 |
3. SSL/TLS
| ConfigMap Key | 默认值 | 作用 |
|---|---|---|
ssl-protocols | TLSv1.2 TLSv1.3 | 启用的 TLS 协议版本 |
ssl-ciphers | 见源码常量 | 启用的密码套件列表 |
ssl-session-cache | true | 是否启用 worker 间共享 SSL 会话缓存 |
ssl-session-timeout | 10m | 客户端可复用会话参数的时间 |
4. 日志与压缩
| ConfigMap Key | 默认值 | 作用 |
|---|---|---|
log-format-upstream | 见源码常量 | 自定义 upstream 访问日志格式 |
access-log-path | /var/log/nginx/access.log | 访问日志路径 |
use-gzip | false | 是否启用 gzip 压缩 |
gzip-level | 1 | gzip 压缩级别 |
enable-brotli | false | 是否启用 Brotli 压缩 |
5. 网络与安全
| ConfigMap Key | 默认值 | 作用 |
|---|---|---|
use-proxy-protocol | false | 是否启用 PROXY protocol 获取真实客户端 IP |
proxy-real-ip-cidr | 0.0.0.0/0 | 外部负载均衡器所在网段 |
server-tokens | false | 是否在响应头中暴露 NGINX 版本号 |
hsts | true | 是否启用 HSTS 响应头 |
allow-snippet-annotations | false | 是否允许 Ingress 注解注入自定义 snippet |
注意:各字段默认值以上文引用的
NewDefault()(config.go#L750-L923)为准,部署版本不同可能略有差异。
五、设置 ConfigMap 的完整流程与注意事项
1. 前提:确认控制器监听的 ConfigMap
控制器通过--configmap参数决定监听对象。使用 Helm Chart 安装时,该参数默认指向ingress-nginx/ingress-nginx-controller(对应 charts/ingress-nginx/values.yaml 中的 controller 配置)。若你的 ConfigMap 名称或命名空间与此不符,改动不会生效。可通过以下命令确认:
kubectl get deployment -n ingress-nginx ingress-nginx-controller -o yaml \ | grep -A2 configmap2. 设置流程
- 创建或编辑目标 ConfigMap,在
data段写入想要覆盖的键值对; - 使用
kubectl apply -f或kubectl edit configmap -n ingress-nginx ingress-nginx-controller提交; - 观察控制器日志确认 reload 成功(出现类似
Reloading nginx configuration的日志); - 用上文"验证是否生效"一节的方法检查生成的 nginx.conf。
3. 常见陷阱
- 值必须是字符串:ConfigMap 的
data段所有值均为字符串,数字也要加引号,例如"10"; - 单位约定:绝大多数超时类 key 使用秒(纯数字),模板渲染时统一追加
s;但个别字段(如proxy-protocol-header-timeout)直接接受带单位的字符串(如60s),写之前务必查阅 configmap.md 或源码中对应字段的注释; - 布尔值:如
use-gzip、hsts等布尔字段使用"true"/"false"字符串; - 连接超时上限:NGINX 的
proxy_connect_timeout一般不应超过 75 秒,这是 NGINX 自身的限制(源码注释中亦有说明); - 不要直接改 nginx.conf:生成文件会在每次 reload 时被覆盖,持久化修改必须走 ConfigMap;
- 优先级:ConfigMap 是全局配置;若想让单个 Ingress 或单个 Location 生效,应使用对应的注解(annotations,见 docs/user-guide/nginx-configuration/annotations.md)。
六、进阶:从 ConfigMap 到按 Ingress 覆盖
ConfigMap 定义的参数是全局生效的,适用于整台控制器的所有 Ingress 规则。实际生产中常遇到"只有某个服务需要更长超时"的需求,此时更合适的做法是在 Ingress 上使用注解覆盖,例如:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: slow-report-ingress annotations: nginx.ingress.kubernetes.io/proxy-connect-timeout: "10" nginx.ingress.kubernetes.io/proxy-read-timeout: "300" nginx.ingress.kubernetes.io/proxy-send-timeout: "300" spec: rules: - host: report.example.com http: paths: - path: / pathType: Prefix backend: service: name: report-service port: number: 8080注解与 ConfigMap 的解析会汇总到同一个Backend配置结构(internal/ingress/defaults/main.go),最终同样渲染进 nginx.tmpl 的 location 块中。两者结合即可形成"全局默认值 + 局部覆盖"的灵活配置体系。
七、小结
- ConfigMap 是 Ingress NGINX Controller 官方推荐的全局配置入口,修改后会触发控制器自动校验并热加载 NGINX;
- 最小的改超时用例只需要在
ingress-nginx-controller这个 ConfigMap 的data段写入proxy-connect-timeout、proxy-read-timeout、proxy-send-timeout三个 key; - 从 ConfigMap key 到 nginx.conf 指令的完整链路为:
config.go字段定义 →store.go监听解析缓存 →nginx.tmpl模板渲染 →nginx -t校验 → 平滑 reload; - 全局参数走 ConfigMap、局部参数走 Ingress 注解,是生产环境的标准搭配。
仓库中还提供了同一主题的官方参考文档 docs/user-guide/nginx-configuration/configmap.md,列出了所有支持的 key 与默认值,建议作为调参时的权威字典随身查阅。
【免费下载链接】ingress-nginxIngress NGINX Controller for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/in/ingress-nginx
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考