升级Ingress Nginx至1.12.x后无法提供页面的问题咨询
问题:Nginx Ingress升级后*-snippet注解失效导致404及Header配置问题
将Nginx Ingress从1.11.5(Helm Chart版本4.11.5)升级至1.12.2(Helm Chart版本4.12.2)后出现异常:原本正常运行的Ingress资源返回404错误。
- 移除Ingress模板中的
configuration-snippet注解后,页面可正常显示,但全局配置的controller.addHeaders会导致ContentSecurityPolicy Header不符合业务要求。 - 本次升级是为修复CVE-2025-1097、CVE-2025-1098、CVE-2025-1974、CVE-2025-24513和CVE-2025-24514漏洞,问题大概率与这些安全变更相关。
- 升级前后均已设置
controller.allowSnippetAnnotations: true,但*-snippet注解仍无法正常工作。
需求:
- 如何重新启用*-snippet注解?
- 受安全变更影响,是否还能继续启用该注解?
- 有没有更优的Header配置方式替代当前方案?
关联Ingress配置示例
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/configuration-snippet: | more_set_headers ContentSecurityPolicy "default-src 'self' 'unsafe-eval' 'unsafe-inline' https://*.pendo.io https://*.storage.googleapis.com; img-src 'self' https://*.pendo.io data:;frame-src 'self' 'unsafe-eval' 'unsafe-inline' https://*.pendo.io https://*.storage.googleapis.com blob: data:;object-src 'self' 'unsafe-eval' 'unsafe-inline' https://*.pendo.io https://*.storage.googleapis.com blob: data:;" more_set_headers "Cache-Control: no-store"; nginx.ingress.kubernetes.io/cors-allow-credentials: "false" nginx.ingress.kubernetes.io/cors-allow-headers: Authorization, Content-Type nginx.ingress.kubernetes.io/cors-allow-methods: GET, POST, PUT, DELETE, OPTIONS nginx.ingress.kubernetes.io/cors-allow-origin: https://<host>,http://localhost:3000 nginx.ingress.kubernetes.io/cors-max-age: "3600" nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/proxy-buffer-size: 64k nginx.ingress.kubernetes.io/proxy-buffers-number: "8" nginx.ingress.kubernetes.io/proxy-read-timeout: "300" nginx.ingress.kubernetes.io/rewrite-target: /$1 nginx.org/proxy-pass-headers: IDAM_USER,IDAM-USER nginx.org/server-tokens: "False" labels: app: <release-name> app.kubernetes.io/managed-by: Helm name: <release-name> namespace: <namespace> spec: ingressClassName: <ingressclass-name> rules: - host: <host> http: paths: - backend: service: name: <release-name> port: number: 80 path: /(.*) pathType: Prefix tls: - hosts: - <host> secretName: <secret-name>
解答
1. 重新启用*-snippet注解的方法
1.12.x版本为修复上述CVE漏洞,对snippet注解的启用逻辑做了双重限制,仅设置controller.allowSnippetAnnotations: true已不足以生效,需补充配置:
- 在Helm values中新增
controller.config.snippets.enabled: true,该参数是新版本新增的全局snippet开关:controller: allowSnippetAnnotations: true config: snippets: enabled: true - 若使用自定义IngressClass,需确保该Class关联的controller实例已配置上述两个参数,而非仅依赖全局默认配置。
2. 安全变更下是否仍可启用*-snippet注解
可以启用,但需明确并管控风险:
- 本次修复的CVE核心是snippet注解存在代码注入风险,因此启用后必须严格限制Ingress资源的创建/修改权限,仅允许可信的ServiceAccount或操作人配置带有snippet注解的Ingress。
- 多租户环境不建议全局开启snippet功能,可通过IngressClass粒度控制,仅给特定业务集群/命名空间开启对应controller的snippet配置。
3. 更优的Header配置方式
若不想依赖snippet注解,推荐以下替代方案:
方案一:使用官方Header注解
对于Header设置需求,可直接使用nginx.ingress.kubernetes.io/add-header官方注解,支持多行配置多个Header,无需依赖more_set_headers指令:
nginx.ingress.kubernetes.io/add-header: | ContentSecurityPolicy "default-src 'self' 'unsafe-eval' 'unsafe-inline' https://*.pendo.io https://*.storage.googleapis.com; img-src 'self' https://*.pendo.io data:;frame-src 'self' 'unsafe-eval' 'unsafe-inline' https://*.pendo.io https://*.storage.googleapis.com blob: data:;object-src 'self' 'unsafe-eval' 'unsafe-inline' https://*.pendo.io https://*.storage.googleapis.com blob: data:;" Cache-Control "no-store"
方案二:ConfigMap自定义模板+IngressClass隔离
- 创建自定义Nginx配置模板,嵌入Header设置逻辑,通过ConfigMap挂载到controller。
- 针对不同业务需求创建多个IngressClass,每个Class关联不同的ConfigMap模板,实现差异化Header策略,避免全局配置冲突。
方案三:后端服务直接设置Header
若业务允许,直接在后端应用中返回所需Header,完全绕过Ingress层配置,这是最安全且无依赖的方案。
内容的提问来源于stack exchange,提问作者Kostrahb
相关产品推荐
相关产品推荐

