如何通过 helm 为现有命名空间添加标签

问题描述 投票:0回答:3

我有一个项目要在

kube-system
命名空间中创建一个变异的webhook,它需要排除webhook服务器部署命名空间。

但是

kube-system
命名空间已经创建。如何使用 Helm 将所需的标签附加到它?

kubernetes-helm
3个回答
3
投票

Helmfile 提供了非常简洁的钩子:

releases:
- name: istio-ingress
  namespace: istio-ingress
  chart: istio/gateway
  wait: true
  hooks:
    - events:
        - presync
      showlogs: true
      command: sh
      args:
        - -c
        - "kubectl create namespace istio-ingress --dry-run=client -o yaml | kubectl apply -f -"
    - events:
        - presync
      showlogs: true
      command: sh
      args:
        - -c
        - "kubectl label --dry-run=client -o yaml --overwrite namespace istio-ingress istio-injection=enabled | kubectl apply -f -"

0
投票

由于

kube-system
命名空间是Kubernetes的核心部分(每个集群都预装了它,一些核心组件运行在那里)Helm无法管理它。

您可以做的一些可能的事情:

  • 使每个命名空间标签选择加入,而不是选择退出;仅在存在标签的命名空间中应用 webhook,而不是在除了标记的命名空间之外的每个命名空间中。 (Istio 的 sidecar 注入器就是这样工作的。)
  • 排除
    kube-system
    作为代码中的特例。
  • 在 Helm 之外手动运行
    kubectl label namespace
  • 让你的大规模部署管道运行
    kubectl
    命令(例如,如果你有一个安装 webhook 的 Jenkins 构建,也让它设置标签)。

0
投票

由于 helm 不支持直接管理命名空间(见:Helm 3 不创建命名空间#5753),“正确”的方法是使用 chart hook

  1. 为命名空间标记作业创建服务帐户:
apiVersion: v1
kind: ServiceAccount
metadata:
  name: {{ include "chart.serviceAccountName" . }}
  labels:
    {{- include "chart.labels" . | nindent 4 }}
  annotations:
    {{- toYaml .Values.serviceAccount.annotations | nindent 4 }}
  1. 创建具有适当权限的角色:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: label-ns
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  resourceNames: [{{ .Release.Namespace }}]
  verbs: ["get", "patch"]
  1. 绑定服务账号到角色:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: {{ .Release.Namespace }}:label-ns
subjects:
  - kind: ServiceAccount
    name: {{ include "chart.serviceAccountName" . }}
    namespace: {{ .Release.Namespace }}
roleRef:
  kind: Role
  name: label-ns
  apiGroup: rbac.authorization.k8s.io
  1. 创建命名空间标签作业,确保使用适当的
    serviceAccountName
apiVersion: batch/v1
kind: Job
metadata:
  name: label-ns
  labels:
    app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
    app.kubernetes.io/instance: {{ .Release.Name | quote }}
    app.kubernetes.io/version: {{ .Chart.AppVersion }}
    helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
  annotations:
    "helm.sh/hook": post-install
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    metadata:
      labels:
        app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
        app.kubernetes.io/instance: {{ .Release.Name | quote }}
        helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    spec:
      restartPolicy: Never
      serviceAccountName: {{ include "chart.serviceAccountName" . }}
      containers:
      - name: label-ns
        image: "bitnami/kubectl:latest"
        command:
          - kubectl
          - label
          - ns
          - {{ .Release.Namespace }}
          - foo=bar
© www.soinside.com 2019 - 2024. All rights reserved.