【问题标题】:get vs. list in Kubernetes RBAC在 Kubernetes RBAC 中获取与列表
【发布时间】:2020-11-10 00:27:00
【问题描述】:

getlist RBAC 动词有什么区别?

我在文档中能找到的只是: “get(用于单个资源),list(用于集合,包括完整的对象内容)”,我发现严重缺乏。 listget 的超集,这意味着如果您有 list 权限,您可以从 get 获取所有信息等等吗?当我们这样做的时候,watch 呢?它是否只授予读取更改流而不是完整对象的权限?

【问题讨论】:

    标签: kubernetes rbac


    【解决方案1】:

    在实践中,您可以通过list 呼叫获得通常从get 呼叫中获得的所有信息。但是,拥有list 资源的权限并不意味着get 调用将起作用。您仍然必须使用list 调用并以这种方式提取信息。

    watch 是一个特殊动词,允许您实时查看资源更新。在没有listget 的情况下拥有watch 访问权限并不是很有帮助,因为更新后您将无法查看资源。通过kubectl,如果没有get 访问该资源的权限,我将无法观看该资源。

    要玩弄这些角色,我建议在Katacoda 上的 Kubernetes 集群中玩弄角色。

    创建角色并将其授予(假)用户的初始设置:

    kubectl create role deployment-getter --verb=get --resource=deployment
    kubectl create role deployment-lister --verb=list --resource=deployment
    kubectl create role deployment-watcher --verb=watch --resource=deployment
    
    kubectl create rolebinding only-get --role=deployment-getter --user=only-get
    kubectl create rolebinding only-list --role=deployment-lister--user=only-list
    kubectl create rolebinding only-watch --role=deployment-watcher--user=only-list
    
    kubectl run nginx --image=nginx # Make a resource to look at
    

    然后您可以run kubectl commands as one of the special users 看看受限的 RBAC 权限是什么样的。

    例如,以下命令显示我们只能列出带有list 动词的资源。

    kubectl get deployment --as list-only # Prints out nginx deployment
    kubectl get deployment --as get-only # RBAC error
    kubectl get deployment --as watch-only # RBAC error
    

    而且这个例子表明我们只能通过get 动词来获取资源(但你也可以通过列出资源来获取类似的信息)。

    kubectl get deployment nginx --as get-only -o yaml
    # apiVersion: extensions/v1beta1
    # kind: Deployment
    # ...
    kubectl get deployment nginx --as list-only -o yaml # RBAC error
    kubectl get deployment --as list-only -o yaml
    # apiVersion: v1
    # kind: List
    # items:
    # - apiVersion: extensions/v1beta1
    #   kind: Deployment
    #   ...
    

    【讨论】:

      【解决方案2】:

      getlistwatch RBAC 动词为不同的 Kubernetes API 操作授予权限。

      您可以在Kubernetes API reference中看到每个对象对应的API操作,例如here for the Deployment

      这里有一些例子:

      get

      如果您对 Deployment 资源拥有 get 权限,则可以执行以下 API 请求:

      GET /apis/apps/v1/namespaces/{namespace}/deployments/{name}
      

      它返回特定部署的清单。

      list

      如果您拥有list 权限,则允许您执行这些API 请求:

      GET /apis/apps/v1/namespaces/{namespace}/deployments
      GET /apis/apps/v1/deployments
      

      它们都返回一个部署清单列表。前者是特定命名空间中的所有部署,后者是跨所有命名空间的所有部署。

      watch

      如果您拥有watch 权限,则允许您执行这些 API 请求:

      GET /apis/apps/v1/deployments?watch=true
      GET /apis/apps/v1/watch/namespaces/{namespace}/deployments?watch=true
      GET /apis/apps/v1/watch/namespaces/{namespace}/deployments/{name}  [DEPRECATED]
      GET /apis/apps/v1/watch/namespaces/{namespace}/deployments  [DEPRECATED]
      GET /apis/apps/v1/watch/deployments  [DEPRECATED]
      

      他们打开一个流式连接,每当部署发生变化(或创建新部署)时,该连接会返回完整的部署清单。

      请注意,后三个 API 端点已被弃用,您应该使用带有 watch=true 参数的 list 操作端点。但是,这仍然会触发watch API 操作,而不是list

      注 1

      kubectl getkubectl list 等命令只是在后台执行这些 API 请求。对于实验,您可以直接执行这些 API 请求。

      例如,先做:

      kubectl proxy
      

      然后:

      curl localhost:8001/apis/apps/v1/deployments?watch=true
      

      或者,你也可以使用这个(不需要kubectl proxy):

      kubectl get --raw="/apis/apps/v1/deployments?watch=true"
      

      注2

      一般来说,权限并不相互暗示。比如你有list权限,不代表你可以做get或者watch请求,如果你有watch权限,不代表你可以做get或者@ 987654351@ 请求。

      注3

      如果您只有watch 权限(但没有getlist),则无法使用kubectl(kubectl get deployment -w)观看,因为kubectl 分别发出getlist 请求,在watch 请求之前(获取被监视资源的资源版本)。

      this answer 中的更多示例。

      【讨论】:

        猜你喜欢
        • 2019-12-30
        • 2019-04-07
        • 2019-01-11
        • 2018-12-20
        • 2010-10-29
        • 2019-11-11
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        相关资源
        最近更新 更多