如何使用Helm为已存在的namespace添加所需标签
解决方案
步骤1:确认要绑定的标签规则
首先你需要先明确你的MutatingWebhookConfiguration中配置的排除规则对应的标签键值,行业通用的配置是排除带有admission.webhook/ignore: "true"标签的命名空间,你也可以根据自己的webhook逻辑自定义键值。
步骤2:通过Helm自动给已存在的kube-system命名空间打标签
因为kube-system是Kubernetes默认预置的命名空间,不会被Helm直接作为资源管理,因此推荐通过Helm预安装钩子实现自动打标:
- 在你的Webhook Helm Chart的
templates目录下新建pre-install-namespace-label.yaml文件,写入以下内容:
apiVersion: batch/v1 kind: Job metadata: name: label-kube-system annotations: "helm.sh/hook": pre-install,pre-upgrade "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded spec: template: spec: containers: - name: kubectl image: docker.io/bitnami/kubectl:latest command: - /bin/bash - -c - | kubectl label namespace kube-system admission.webhook/ignore=true --overwrite restartPolicy: OnFailure serviceAccountName: {{ .Values.serviceAccount.name }}
- 给上述钩子用到的ServiceAccount绑定打标签所需的权限,在你的ClusterRole中新增以下规则:
- apiGroups: [""] resources: ["namespaces"] verbs: ["get", "patch"]
步骤3:验证效果
执行helm install部署你的Chart后,运行以下命令验证标签是否绑定成功:kubectl get namespace kube-system --show-labels
如果输出的LABELS列包含你配置的admission.webhook/ignore=true,说明操作成功。
补充说明
你的MutatingWebhookConfiguration需要同步配置namespaceSelector来排除对应标签的命名空间,示例配置如下:
namespaceSelector: matchExpressions: - key: admission.webhook/ignore operator: NotIn values: ["true"]
这样webhook就会跳过所有带有该标签的命名空间下的资源请求,符合你的需求。
内容的提问来源于stack exchange,提问作者moluzhui
相关产品推荐
相关产品推荐

