一、先搞懂:Ingress 网关的 ConfigMap 是干嘛的?
它是 ingress-nginx 的全局配置文件,作用:
- 设置全局超时时间
- 设置客户端上传大小
- 开启 gzip
- 配置 SSL 协议
- 配置 worker 进程、连接数
- 开启真实 IP
- 配置代理缓冲区
一句话:网关全局行为都在这里控制。
二、第一步:找到网关 ConfigMap
1. 查看 ConfigMap 名称
bash
kubectl get configmap -n ingress-nginx
你会看到:
nginx-configuration
这就是全局配置 ConfigMap
三、第二步:编辑 ConfigMap
bash
kubectl edit configmap nginx-configuration -n ingress-nginx
打开后长这样:
yaml
apiVersion: v1
data:
# 这里是配置项
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: ingress-nginx
四、第三步:企业级标准配置
把下面这段直接粘贴到 data: 下面 ,这是企业生产通用最优配置:
yaml
data:
# 1. 全局最大上传大小
proxy-body-size: "500m"
# 2. 全局超时
proxy-connect-timeout: "10"
proxy-send-timeout: "30"
proxy-read-timeout: "30"
# 3. 真实客户端IP(必须开)
use-forwarded-headers: "true"
forwarded-for-header: "X-Forwarded-For"
real-ip-header: "X-Real-IP"
# 4. SSL 安全配置
ssl-protocols: "TLSv1.2 TLSv1.3"
ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256"
hsts: "true"
hsts-max-age: "31536000"
hsts-include-subdomains: "true"
# 5. Nginx 性能优化
worker-processes: "auto"
worker-connections: "65535"
keepalive-timeout: "60"
keepalive-requests: "100"
# 6. Gzip 压缩
gzip-types: "text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript"
gzip-vary: "true"
# 7. 忽略不合法主机头
server-tokens: "false"
保存退出
vi 编辑器:
ESC → :wq → 回车
五、第四步:让配置生效(关键)
方法1:优雅重启(推荐,不影响业务)
bash
kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx
方法2:查看是否生效
bash
kubectl get pods -n ingress-nginx
看到 AGE 刷新、Pod 重建 → 成功。
六、如何验证 ConfigMap 真的生效了?
1. 进入网关容器查看 nginx 配置
bash
kubectl exec -it -n ingress-nginx <ingress-nginx-pod名> -- bash
2. 查看nginx.conf
bash
cat /etc/nginx/nginx.conf | grep client_max_body_size
cat /etc/nginx/nginx.conf | grep proxy_read_timeout
出现你配置的值 → 生效成功。
七、最常见需要修改的 8 个配置
1. 文件上传大小限制(解决 413)
yaml
proxy-body-size: "500m"
2. 后端服务慢导致超时(解决 504)
yaml
proxy-read-timeout: "60"
3. 后端拿不到真实IP
yaml
use-forwarded-headers: "true"
real-ip-header: "X-Real-IP"
4. 开启 HTTPS 强制 HSTS
yaml
hsts: "true"
5. 性能低、并发上不去
yaml
worker-processes: "auto"
worker-connections: "65535"
6. 隐藏 Nginx 版本号
yaml
server-tokens: "false"
7. 开启 gzip 压缩
yaml
gzip-types: "text/plain text/css application/json..."
8. 禁用不安全 SSL 协议
yaml
ssl-protocols: "TLSv1.2 TLSv1.3"
八、修改 ConfigMap 不生效?99% 是这 4 个原因
1. 没重启 ingress-nginx 控制器
必须执行重启命令才会加载新配置
bash
kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx
2. 改错了 ConfigMap
一定要改:
-n ingress-nginx
name: nginx-configuration
3. 配置项名称写错
ingress-nginx 配置名称严格区分大小写,写错不生效。
4. 配置值格式错误
例如:
- 正确:
proxy-body-size: "500m" - 错误:
proxy-body-size: 500
九、安全操作规范
- 先备份
bash
kubectl get configmap nginx-configuration -n ingress-nginx -o yaml > backup-cm.yaml
- 再编辑
bash
kubectl edit configmap nginx-configuration -n ingress-nginx
- 再优雅重启
bash
kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx
- 验证
bash
kubectl get pods -n ingress-nginx
十、一句话总结
- Ingress 全局配置在:nginx-configuration
- 命令:
kubectl edit configmap nginx-configuration -n ingress-nginx - 修改后必须重启控制器