GKE Ingress出现413请求实体过大及大请求头异常,求解决方案
解决GKE中请求头过大导致的Ingress问题
哎,你踩了个常见的坑——你改的client_max_body_size是用来限制请求体大小的,而你的问题是请求头过大,这俩完全不是一回事儿!难怪改了没用,咱们一步步来解决:
先明确核心问题
不管是GKE默认的GCE Ingress还是ingress-nginx,请求头大小的限制都是单独配置的,和请求体限制是两个独立的参数。你的K8s版本是1.7.x(确实有点老了),下面分两种Ingress方案给你对应解决办法:
方案1:继续使用GKE默认的GCE Ingress
GCE Ingress的请求头大小默认是8KB,要调整这个限制,你需要用到BackendConfig资源(1.7版本的GKE已经支持这个beta资源了):
- 创建一个BackendConfig配置文件,指定请求头大小(比如设置成64KB):
apiVersion: cloud.google.com/v1beta1 kind: BackendConfig metadata: name: large-header-config spec: requestHeadersSize: 65536 # 64KB,单位是字节
- 将这个BackendConfig关联到你的Service上,通过添加注解:
apiVersion: v1 kind: Service metadata: name: your-service-name annotations: cloud.google.com/backend-config: '{"default": "large-header-config"}' spec: # 你的Service原有配置...
- 应用配置:
kubectl apply -f backend-config.yaml kubectl apply -f your-service.yaml
等GCE Ingress同步配置后,请求头大小限制就会生效了。
方案2:使用ingress-nginx解决问题
既然你已经切换到ingress-nginx,那需要调整的是Nginx本身的请求头缓冲参数,而不是请求体参数。针对1.7版本的K8s,你需要用对应版本的ingress-nginx(比如0.9.x系列,避免版本不兼容),然后通过两种方式配置:
方式A:通过Ingress注解单独配置
在你的Ingress资源里添加注解,针对单个Ingress生效:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: your-ingress-name annotations: nginx.ingress.kubernetes.io/client-header-buffer-size: "64k" nginx.ingress.kubernetes.io/large-client-header-buffers: "4 64k" spec: # 你的Ingress原有配置...
方式B:通过ConfigMap全局配置
如果要让所有ingress-nginx的Ingress都生效,修改ingress-nginx的ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: nginx-configuration # 这个名字要和你ingress-nginx使用的ConfigMap一致 data: client-header-buffer-size: "64k" large-client-header-buffers: "4 64k"
然后重启ingress-nginx的Pod,让配置生效:
kubectl rollout restart deployment nginx-ingress-controller
额外注意事项
你的K8s版本1.7.x已经不再受官方支持了,建议尽快升级到较新的稳定版本,不然不仅会有安全隐患,后续很多新特性和修复都用不上。
内容的提问来源于stack exchange,提问作者FinishedFin
相关产品推荐
相关产品推荐

