You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Kubernetes云部署Ingress Controller ConfigMap遇Kustomize报错求助

问题

我有一个托管多个Web应用的Kubernetes集群,目前一直使用GitHub提供的默认nginx ingress controller,通过Azure DevOps流水线中的Kubernetes@1任务部署,部署YAML如下:

- task: Kubernetes@1
          displayName: 'Deploy Ingress controller'
          inputs:
            connectionType: 'Azure Resource Manager'
            azureSubscriptionEndpoint: ${{ parameters.serviceConnection }}
            azureResourceGroup: ${{ variables.resourcePrefix }}-rg
            kubernetesCluster: ${{ variables.resourcePrefix }}-cluster
            command: 'apply'
            arguments: '-f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-${{ parameters.nginxControllerVersion }}/deploy/static/provider/cloud/deploy.yaml'
            secretType: 'dockerRegistry'
            containerRegistryType: 'Azure Container Registry'

现在需要修改该Ingress Controller对应的ConfigMap中的proxy-buffer-size属性,当前通过上述apply命令创建的ConfigMap信息如下:

Name:         ingress-nginx-controller
Namespace:    ingress-nginx
Labels:       app.kubernetes.io/component=controller
              app.kubernetes.io/instance=ingress-nginx
              app.kubernetes.io/name=ingress-nginx
              app.kubernetes.io/part-of=ingress-nginx
              app.kubernetes.io/version=1.10.0
              k8slens-edit-resource-version=v1
Annotations:  <none>

Data
====
allow-snippet-annotations:
----
false

尝试使用Kustomize来合并修改,在kustomize/nginx目录下创建了kustomization.yaml文件:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

configMapGenerator:
- name: ingress-nginx-controller
  namespace: ingress-nginx
  behavior: merge
  literals:
  - test=value

执行kubectl apply -k ./kustomize/nginx时出现报错:

error: merging from generator &{0xc000b67ba0 }: id resid.ResId{Gvk:resid.Gvk{Group:"", Version:"v1", Kind:"ConfigMap", isClusterScoped:false}, Name:"ingress-nginx-controller", Namespace:"ingress-nginx"} does not exist; cannot merge or replace

刚接触Kubernetes,想了解这种修改ConfigMap的最简单方法,当前用Kustomize的方向是否正确?若正确,缺少什么?若不正确,应该采用什么方式?

解决方案

Kustomize方向正确,但用法有误

报错原因是:Kustomize的merge行为只能针对自身管理的资源,也就是必须在Kustomization的resources里包含要修改的ConfigMap的基础定义。单独运行kubectl apply -k时,你的Kustomize配置里没有引入官方的Ingress Controller部署文件,所以Kustomize找不到要合并的ConfigMap,导致报错。

修正Kustomize配置(推荐用于多修改场景)

修改kustomize/nginx/kustomization.yaml,先引入官方部署文件作为基础资源,再用补丁修改ConfigMap:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

# 引入官方Ingress Controller的部署资源作为基础
resources:
- https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-${{ parameters.nginxControllerVersion }}/deploy/static/provider/cloud/deploy.yaml

# 用Strategic Merge Patch修改ConfigMap,保留原有配置并新增proxy-buffer-size
patchesStrategicMerge:
- |-
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: ingress-nginx-controller
    namespace: ingress-nginx
  data:
    proxy-buffer-size: "16k"
    allow-snippet-annotations: "false"

然后修改Azure DevOps流水线中的部署任务,将原来的apply -f改为apply -k:

- task: Kubernetes@1
          displayName: 'Deploy Ingress controller with custom config'
          inputs:
            connectionType: 'Azure Resource Manager'
            azureSubscriptionEndpoint: ${{ parameters.serviceConnection }}
            azureResourceGroup: ${{ variables.resourcePrefix }}-rg
            kubernetesCluster: ${{ variables.resourcePrefix }}-cluster
            command: 'apply'
            arguments: '-k ./kustomize/nginx'
            secretType: 'dockerRegistry'
            containerRegistryType: 'Azure Container Registry'

更简单的方法:直接用kubectl patch(适合快速修改)

如果只是单属性修改,不需要维护Kustomize文件,可以在Azure DevOps流水线中新增一个patch任务,在部署Ingress Controller后执行:

- task: Kubernetes@1
          displayName: 'Deploy Ingress controller'
          inputs:
            connectionType: 'Azure Resource Manager'
            azureSubscriptionEndpoint: ${{ parameters.serviceConnection }}
            azureResourceGroup: ${{ variables.resourcePrefix }}-rg
            kubernetesCluster: ${{ variables.resourcePrefix }}-cluster
            command: 'apply'
            arguments: '-f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-${{ parameters.nginxControllerVersion }}/deploy/static/provider/cloud/deploy.yaml'
            secretType: 'dockerRegistry'
            containerRegistryType: 'Azure Container Registry'

        # 新增patch任务修改ConfigMap
        - task: Kubernetes@1
          displayName: 'Patch Ingress Controller ConfigMap'
          inputs:
            connectionType: 'Azure Resource Manager'
            azureSubscriptionEndpoint: ${{ parameters.serviceConnection }}
            azureResourceGroup: ${{ variables.resourcePrefix }}-rg
            kubernetesCluster: ${{ variables.resourcePrefix }}-cluster
            command: 'patch'
            arguments: 'configmap ingress-nginx-controller -n ingress-nginx --type merge -p ''{"data":{"proxy-buffer-size":"16k"}}'''

这个命令会直接合并修改集群中已存在的ConfigMap,无需额外配置文件,操作更简洁。

临时修改方法(不推荐用于流水线)

如果只是临时测试,可以直接在终端执行:

kubectl edit configmap ingress-nginx-controller -n ingress-nginx

在打开的编辑器中添加proxy-buffer-size: "16k"到data部分即可。但这种修改不会持久化到流水线,下次部署Ingress Controller时会被覆盖。

内容的提问来源于stack exchange,提问作者Tom Troughton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:07:32