创建命名空间后自动创建Kubernetes资源

3

我有两个团队:

  • 开发人员:每次部署应用程序的分支/标签时,他们会创建一个新的Kubernetes命名空间
  • 运维人员:他们使用(cluster)roles和(cluster)rolebindings来管理对集群的访问控制

问题在于,“开发人员”在“运维人员”创建RBAC资源之前无法kubectl其名称空间。而由于他们没有主题列表可以放入rolebinding资源中(共享列表不是选项),因此“开发人员”无法自行创建RBAC资源。

我已阅读有关Admission webhooks的官方文档,但我的理解是它们只针对触发Webhook的资源进行操作。

在Kubernetes中,是否有一种本地且/或简单的方法可以在创建新命名空间时应用资源?


有一件事情对我来说不太清楚,新创建的命名空间的角色是否总是相同的? - Will R.O.F.
是的,只有角色绑定可能会改变(通过添加/删除主体)。 - blakelead
3个回答

7

我通过编写自定义控制器提出了一种解决方案。

使用以下自定义资源部署后,控制器会在与dev-.*fix-.*匹配的命名空间中注入rolerolebinding

kind: NamespaceResourcesInjector
apiVersion: blakelead.com/v1alpha1
metadata:
  name: nri-test
spec:
  namespaces:
  - dev-.*
  - fix-.*
  resources:
  - |
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: dev-role
    rules:
      - apiGroups: [""]
        resources: ["pods","pods/portforward", "services", "deployments", "ingresses"]
        verbs: ["list", "get"]
      - apiGroups: [""]
        resources: ["pods/portforward"]
        verbs: ["create"]
      - apiGroups: [""]
        resources: ["namespaces"]
        verbs: ["list", "get"]
  - |
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: dev-rolebinding
    subjects:
    - kind: User
      name: dev
    roleRef:
      kind: Role
      name: dev-role
      apiGroup: rbac.authorization.k8s.io

这个控制器仍处于开发的早期阶段,但我已经在越来越多的集群中成功使用它。

对于那些感兴趣的人,这里是它的链接:https://github.com/blakelead/nsinjector


3
是的,有一种本地方法可以实现,但这并不是一个开箱即用的功能。
您可以通过使用/创建operator来实现所描述的内容。本质上,它是为您的需求扩展Kubernetes API。
由于操作符只是一个开放的模式,可以用许多方式来实现事情,在您给出的场景中,控制流程可能如下所示:
1. 部署具有创建RBAC特权的operator,并订阅对k8s命名空间对象类型的更改 2. Devs创建包含达成共识的标签的命名空间 3. Operator被通知集群发生的更改 4. 操作员检查命名空间验证(这也可以由单独的接受webhook完成) 5. 操作员在新创建的命名空间中创建RBAC 6. 如果RBAC是全集群范围的,则同一operator可以在删除命名空间时执行RBAC清理

那就是我需要知道的,谢谢 :)。不太确定如何实现它,但我会尝试一下。 - blakelead
@blakelead 这个操作符框架 是一个很好的起点。 - Griffin

1
这与用户如何通过身份验证进入群集以及获取kubeconfig文件有关。您可以在客户端证书或从kubeconfig使用的bearer令牌中放置一个组。提前定义一个clusterrole,将其绑定到该组,使其有权对某些资源执行特定动词(例如创建命名空间的能力)。
此外,您可以使用准入webhook来验证用户是否应该成为该组的一部分。

很遗憾我无法控制身份验证过程,因为用户通过aws eks update-kubeconfig获取他们的kubeconfig。 - blakelead
AWS EKS提供了灵活性,让您定义IAM角色映射到哪些组中 https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html - Arghya Sadhu
1
即使我使用组,我仍然需要授权该组访问新命名空间及其资源。 - blakelead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接