命名空间是一个 Kubernetes 对象,它可以用 YAML 描述,因此 Helm 可以创建一个。 @mdaniel's answer 描述了为单个命名空间和相应的 RoleBinding 执行此操作的语法。
但是,如果您尝试使用此语法创建 Helm 安装命名空间,则会出现先有鸡还是先有蛋的问题。在 Helm 3 中,有关安装的元数据存储在 Kubernetes 对象中,通常在您要安装到的同一个命名空间中
helm install release-name ./a-chart-that-creates-a-namespace --namespace ns
如果命名空间尚不存在,则 Helm 无法检索安装元数据;或者,如果是,则图表中命名空间对象的声明将与集群中的现有对象冲突。您可以通过这种方式创建其他对象(例如 RoleBindings),但命名空间本身就是一个问题。
但是!您可以安全地创建 other 命名空间。您还可以使用 Helm 的模板构造根据 .Values 配置中的内容创建多个对象。因此,如果您的 values.yaml 文件(可能是特定于环境的)具有
namespaces: [service-a, service-b]
clusterRole: edit
user: deploy
然后你可以写一个模板文件像
{{- $top := . }}
{{- range $namespace := .Values.namespaces -}}
---
apiVersion: v1
kind: Namespace
metadata:
name: {{ $namespace }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: {{ $namespace }}
name: deployer-edit
roleRef:
apiGroup: ""
kind: ClusterRole
name: {{ $top.Values.clusterRole }}
subjects:
- apiGroup: ""
kind: User
name: {{ $top.Values.user }}
{{ end -}}
这将为.Values.namespaces 中的每个项目创建两个 YAML 文档。由于range 循环结构覆盖了. 特殊变量,因此我们在开始之前将其值保存在$top 局部变量中,然后在需要引用.Values 的地方使用$top.Values。我们还需要确保明确命名我们创建的每个对象的metadata: { namespace: },因为我们没有使用默认安装命名空间。
您需要确保 helm install --namespace 名称不是您使用此图表管理的任何命名空间。
这将使您拥有一个管理所有每个服务命名空间的图表。如果您需要更改服务集,您只需更新图表值和helm update。另一个注意事项是,如果您从 .Values.namespaces 列表中删除一个值,并且还会使用该名称空间中的所有内容(特别是任何包含您可能需要的数据的 PersistentVolumeClaims),这将愉快地删除名称空间而不会发出警告。