在 Kubernetes RBAC 中获取与列表

get vs. list in Kubernetes RBAC

getlist RBAC 动词有什么区别?

我能在文档中找到的是: "get (for individual resources), list (for collections, including full object content)",我发现严重缺乏。 listget 的超集吗,这意味着如果您拥有 list 权限,您是否可以从 get 获取所有信息以及更多信息?当我们这样做的时候,watch 呢?它是否只授予读取更改流但不授予完整对象的权限?

实际上,您可以通过 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
#   ...

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

您可以在Kubernetes API reference, for example, here for the Deployment.

中看到每个对象对应的API操作

这里有一些例子:

get

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

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

它return是特定部署的清单。

list

如果您拥有 list 权限,您可以执行这些 API 请求:

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

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

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]

他们打开一个流式连接,return每当 Deployment 发生变化时(或创建新 Deployment 时),它都会向您提供 Deployment 的完整清单。

请注意,后三个 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权限,并不意味着你可以做getwatch请求,如果你有watch权限,这并不意味着您可以执行 getlist 请求。

注3

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

中有更多示例。