get、list 和 watch 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 get、kubectl 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 权限(但没有get 和list),则无法使用kubectl(kubectl get deployment -w)观看,因为kubectl 分别发出get 和list 请求,在watch 请求之前(获取被监视资源的资源版本)。
this answer 中的更多示例。