Kubernetes RBAC动词:不使用列表获取,反之亦然?没有列表的手表?

Kubernetes RBAC动词:不使用列表获取,反之亦然?没有列表的手表?,kubernetes,rbac,Kubernetes,Rbac,虽然有很多关于Kubernetes RBAC的文档和示例,以及不同资源的可用动词,但我找不到关于某些动词是否总是组合使用或是否存在单独使用它们的用例的任何规则。特别是,我想知道动词get、list和watch。组合它们有什么用,尤其是不组合它们 是否允许获取资源,但不允许列表 相反,列表是否有不允许get的用途?也许是信息稀疏 得到并列出,但没有手表?仅限制受信任的主体和服务帐户,从而给API服务器和etcd带来更大的压力 观看没有列表或获得?这不会让大多数客户因为是列表观察者而瘫痪吗 有趣的

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

  • 是否允许获取资源,但不允许列表
  • 相反,列表是否有不允许get的用途?也许是信息稀疏
  • 得到并列出,但没有手表?仅限制受信任的主体和服务帐户,从而给API服务器和etcd带来更大的压力
  • 观看没有列表或获得?这不会让大多数客户因为是列表观察者而瘫痪吗

    • 有趣的问题,这里有一些在实践中使用的想法和例子

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

      获取但不获取列表 您希望有人能够阅读他们通过名称知道的资源,但不能发现其他资源存在。例如,允许执行
      kubectl get mypod
      ,但不允许执行
      kubectl get pods

      示例:

      • system:node
        ClusterRole在端点、PV和PVC上具有get权限,但不具有list权限
      • system:coredns
        ClusterRole在节点上具有get但不具有list权限
      • system:controller:expand controller
        ClusterRole对端点、机密和服务具有get权限,但不具有list权限
      列出但不获取 例如,允许执行
      kubectl get pod
      但不允许执行
      kubectl get pod mypod
      。这并没有多大意义,因为您可以通过get获得的所有信息也包含在列表中。然而,这在实践中有一些用法

      示例:

      • system:kube dns
        ClusterRole具有端点和服务的列表和监视权限,但没有获取权限
      • system:controller:daemon-set-controller
        ClusterRoel具有节点的列表和监视权限,但没有get
      • system:coredns
        ClusterRole具有端点、名称空间、POD和服务的列表和监视权限,但没有get
      获取并列出列表,但不要观看 实际上,在大多数情况下,有列表的地方也有手表。您可以剥夺某人的手表,以减少etcd上的观看者数量。用户可以执行
      kubectl get pods
      kubectl get pods mypod
      ,但不能使用
      -w
      选项

      如果API不支持监视操作(例如,可选的度量API),也有意义

      示例:

      • system:controller:persistent volume binder
        ClusterRole具有节点的get和list权限,但不具有监视权限
      观看,但不获取和列出 关于用例,它没有多大意义,因为您可以通过get和list获得的所有信息也包含在watch中。我不知道这在实践中有什么具体的用法

      然而,从技术上讲,这是可能的。例如,如果您有POD的监视权限,但没有get和list,则可以执行以下操作:

      ✅ 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 get pods -w
      ❌ kubectl get pods mypod -w
      
      因为kubectl在监视请求之前分别发出一个列表和get请求,很可能是为了获取资源的
      resourceVersion
      ,然后这些资源将包含在后续的监视请求中

      注意:这意味着,如果你有列表和观看,那么
      kubectl get pods-w
      工作,但是
      kubectl get pods mypod-w
      不工作,如果你有列表和观看,那么
      kubectl get pods mypod-w
      工作,但是
      kubectl get pods-w
      不工作。

      我的解释(如果有人可以验证的话)即*.list应仅显示可访问的资源列表,而不是整个列表。依我看,显示一张你无法“获取”的物品清单是没有多大意义的。正确的?