【问题标题】:Setup a Kubernetes Namespace and Roles Using Helm使用 Helm 设置 Kubernetes 命名空间和角色
【发布时间】:2021-05-22 22:52:11
【问题描述】:

我正在尝试为我的公司设置 Kuberentes。在这个过程中,我正在尝试学习 Helm。

我的任务之一是设置自动化以获取提供的命名空间 name 参数,并创建命名空间并在该命名空间中为部署用户帐户设置正确的权限。

我可以简单地使用使用kubectl apply 的脚本来做到这一点,如下所示:

kubectl create namespace $namespaceName
kubectl create rolebinding deployer-edit --clusterrole edit --user deployer --namespace $namespaceName

但我想知道我是否应该使用 Helm 图表来设置这样的东西。当我查看 Helm 图表时,似乎一切都是部署。我不确定这是否适合“部署”事物的模型。它更像是一个命名空间的一般设置,然后将允许部署到其中。但如果可能的话,我想将其作为 Helm 图表进行尝试。

如何使用 Helm 创建 Kubernetes 命名空间和角色绑定?

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    命名空间是一个 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),这将愉快地删除名称空间而不会发出警告。

    【讨论】:

      【解决方案2】:

      几乎any chart 需要与 kubernetes 本身交互的安装将包含 RBAC 资源,因此肯定不仅仅是部署

      # templates/rolebinding.yaml
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        namespace: {{ .Release.Namespace }}
        name: {{ .Values.bindingName }}
      roleRef:
        apiGroup: ""
        kind: ClusterRole
        name: {{ .Values.clusterRole }}
      subjects:
      - apiGroup: ""
        kind: User
        name: {{ .Values.user }}
      

      那么values.yaml 不是严格要求的,但可以帮助人们了解可以提供哪些值:

      # values.yaml
      bindingName: deployment-edit
      clusterRole: edit
      user: deployer
      

      Helm v3 has --create-namespace 将创建提供的--namespace(如果它尚不存在),这不是非常具有声明性,但确实可以像kubectl 版本一样实现最终结果

      理论上也可以让图表创建Namespace,但我不认为helm remove the-namespaced-rolebinding 会做正确的事情,因为删除项目的顺序很重要:

      # templates/00namespace.yaml
      apiVersion: v1
      kind: Namespace
      metadata:
        name: {{ .Values.theNamespace }}
      

      然后运行helm --namespace kube-system ... 或任何非真实的NS,因为它还不存在

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        • 2021-12-11
        • 1970-01-01
        • 2020-11-27
        • 1970-01-01
        • 2020-08-21
        • 1970-01-01
        相关资源
        最近更新 更多