首页 > 解决方案 > Kubernetes RBAC 动词:没有列表,反之亦然?看没有清单?

问题描述

虽然有很多关于 Kubernetes RBAC 的文档和示例以及不同资源的可用动词,但我找不到任何关于某些动词是否总是组合使用或是否有单独使用它们的用例的规则。特别是,我想知道动词 get、list 和 watch。将它们结合起来有什么用途,尤其是不结合它们?

标签: kubernetesrbac

解决方案


有趣的问题,这里有一些想法和实践中的用法示例。

实践中的例子还有很多。例如,您可以通过浏览来检查默认 ClusterRoles kubectl describe clusterroles。要查看 kubectl 在后台发出哪些 API 请求,您可以增加日志详细程度,例如kubectl get pods -w -v 10.

获取但不列出

您希望某人能够通过名称读取他们知道的资源,但不发现存在哪些其他资源。例如,允许做kubectl get mypod,但不允许kubectl get pods

例子:

  • ClusterRole对 Endpoints、PV 和 PVCsystem:node具有获取但不列出权限。
  • ClusterRole对节点system:coredns具有获取但不列出权限。
  • ClusterRole对 Endpoints、Secrets 和 Servicessystem:controller:expand-controller具有获取但不列出权限。

列出但没有得到

例如,允许做,kubectl get pods但不允许做kubectl get pod mypod。这没有多大意义,因为您可以使用get 获得的所有信息也包含在list 中。尽管如此,在实践中还是有一些这样的用法。

例子:

  • system:kube-dnsClusterRole 具有Endpoints 和 Services的listwatch权限,但没有get
  • system:controller:daemon-set-controllerClusterRoel 具有节点的列表监视权限,但没有获取
  • system:corednsClusterRole 具有Endpoints、Namespaces、Pods 和 Services的listwatch权限,但没有get

获取列出,但不观看

实际上,在大多数情况下,有list也有watch。你可以剥夺某人的观察权以减少 etcd 上的观察者数量。用户可以做kubectl get podsand kubectl get pods mypod,但不能使用该-w选项。

如果 API 不支持监视操作也有意义,例如可选的指标 API。

例子:

  • ClusterRole对节点system:controller:persistent-volume-bindergetlist权限,但没有watch

watch,但不是getlist

关于用例,它没有多大意义,因为您可以使用getlist获得的所有信息也包含在watch中。我不知道这在实践中的任何具体用法。

但是,从技术上讲,这是可能的。例如,如果您对 Pod 有watch权限,但没有getlist,您可以这样做:

✅ kubectl get --raw="/api/v1/watch/namespaces/default/pods"
✅ kubectl get --raw="/api/v1/watch/namespaces/default/pods/mypod"

它有效。但是,这些watch端点已被弃用,您应该使用带有参数的列表端点。watch但这也有效:

✅ kubectl get --raw="/api/v1/namespaces/default/pods?watch=true"

但是,您不能像这样观看单个 Pod,因为get端点没有watch参数。因此,以下内容无效:

❌ kubectl get --raw="/api/v1/namespaces/default/pods/mypod?watch=true"

而且你根本无法使用 kubectl 观看资源。以下失败:

❌ kubectl get pods -w
❌ kubectl get pods mypod -w

因为 kubectl在watch请求之前分别进行listget请求,很可能是为了获取随后将包含在后续watch请求中的资源。resourceVersion

注意:这意味着,如果你有listwatch,那么kubectl get pods -w工作,但kubectl get pods mypod -w没有,如果你有getwatch,那么kubectl get pods mypod -w工作但kubectl get pods -w没有。


推荐阅读