在 Kubernetes RBAC 中获取与列表
get vs. list in Kubernetes RBAC
get
和 list
RBAC 动词有什么区别?
我能在文档中找到的是:
"get (for individual resources), list (for collections, including full object content)",我发现严重缺乏。 list
是 get
的超集吗,这意味着如果您拥有 list
权限,您是否可以从 get
获取所有信息以及更多信息?当我们这样做的时候,watch
呢?它是否只授予读取更改流但不授予完整对象的权限?
实际上,您可以通过 list
调用获得通常从 get
调用中获得的所有信息。但是,拥有 list
资源的权限并不意味着 get
调用将起作用。您仍然必须使用 list
调用并以这种方式提取信息。
watch
是一个特殊的动词,允许您实时查看资源更新。在没有 list
或 get
的情况下拥有 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
# ...
get
、list
和 watch
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 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
或 list
请求。
注3
如果您只有 watch
权限(但没有 get
和 list
),则不能使用 kubectl (kubectl get deployment -w
) 观看,因为 kubectl 使 get
和 list
请求,分别在 watch
请求之前(获取观看资源的资源版本)。
中有更多示例。
get
和 list
RBAC 动词有什么区别?
我能在文档中找到的是:
"get (for individual resources), list (for collections, including full object content)",我发现严重缺乏。 list
是 get
的超集吗,这意味着如果您拥有 list
权限,您是否可以从 get
获取所有信息以及更多信息?当我们这样做的时候,watch
呢?它是否只授予读取更改流但不授予完整对象的权限?
实际上,您可以通过 list
调用获得通常从 get
调用中获得的所有信息。但是,拥有 list
资源的权限并不意味着 get
调用将起作用。您仍然必须使用 list
调用并以这种方式提取信息。
watch
是一个特殊的动词,允许您实时查看资源更新。在没有 list
或 get
的情况下拥有 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
# ...
get
、list
和 watch
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 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
或 list
请求。
注3
如果您只有 watch
权限(但没有 get
和 list
),则不能使用 kubectl (kubectl get deployment -w
) 观看,因为 kubectl 使 get
和 list
请求,分别在 watch
请求之前(获取观看资源的资源版本)。