33

我正在尝试以尽可能少的许可方式配置 Kubernetes RBAC,并且我想将我的角色范围限定为特定的资源和子资源。我浏览了文档,找不到资源及其子资源的简明列表。

我对管理部署规范的一部分的子资源特别感兴趣——容器映像。

4

9 回答 9

52

使用kubectl api-resources -o wide显示所有ressources动词和相关的 API-group

$ kubectl api-resources -o wide
NAME                              SHORTNAMES     APIGROUP                       NAMESPACED   KIND                             VERBS
bindings                                                                        true         Binding                          [create]
componentstatuses                 cs                                            false        ComponentStatus                  [get list]
configmaps                        cm                                            true         ConfigMap                        [create delete deletecollection get list patch update watch]
endpoints                         ep                                            true         Endpoints                        [create delete deletecollection get list patch update watch]
events                            ev                                            true         Event                            [create delete deletecollection get list patch update watch]
limitranges                       limits                                        true         LimitRange                       [create delete deletecollection get list patch update watch]
namespaces                        ns                                            false        Namespace                        [create delete get list patch update watch]
nodes                             no                                            false        Node                             [create delete deletecollection get list patch update watch]
persistentvolumeclaims            pvc                                           true         PersistentVolumeClaim            [create delete deletecollection get list patch update watch]
persistentvolumes                 pv                                            false        PersistentVolume                 [create delete deletecollection get list patch update watch]
pods                              po                                            true         Pod                              [create delete deletecollection get list patch update watch]
statefulsets                      sts            apps                           true         StatefulSet                      [create delete deletecollection get list patch update watch]
meshpolicies                                     authentication.istio.io        false        MeshPolicy                       [delete deletecollection get list patch create update watch]
policies                                         authentication.istio.io        true         Policy                           [delete deletecollection get list patch create update watch]
...
...

我想您可以使用它来创建 RBAC 配置中所需的资源列表

于 2019-03-26T13:45:17.110 回答
23

定义 RBAC 角色所需的资源、子资源和动词未记录在静态列表中的任何位置。它们在发现文档中可用,即通过 API,例如/api/apps/v1.

以下 bash 脚本将按以下格式列出所有资源、子资源和动词:

api_version resource: [verb]

whereapi-versioncore核心资源,应""在角色定义中替换为(带引号的空字符串)。

例如,core pods/status: get patch update

该脚本需要jq

#!/bin/bash
SERVER="localhost:8080"

APIS=$(curl -s $SERVER/apis | jq -r '[.groups | .[].name] | join(" ")')

# do core resources first, which are at a separate api location
api="core"
curl -s $SERVER/api/v1 | jq -r --arg api "$api" '.resources | .[] | "\($api) \(.name): \(.verbs | join(" "))"'

# now do non-core resources
for api in $APIS; do
    version=$(curl -s $SERVER/apis/$api | jq -r '.preferredVersion.version')
    curl -s $SERVER/apis/$api/$version | jq -r --arg api "$api" '.resources | .[]? | "\($api) \(.name): \(.verbs | join(" "))"'
done

警告:请注意,如果没有通过 api 列出动词,输出将只显示 api 版本和资源,例如

core pods/exec:

在以下资源的具体实例中,通过 api 没有显示动词,​​这是错误的(Kubernetes bug #65421,由#65518 修复):

nodes/proxy
pods/attach
pods/exec
pods/portforward
pods/proxy
services/proxy

这些资源支持的动词如下:

nodes/proxy: create delete get patch update
pods/attach: create get
pods/exec: create get
pods/portforward: create get
pods/proxy: create delete get patch update
services/proxy: create delete get patch update

警告 2:有时 Kubernetes 会使用此处未列出的特殊动词检查其他权限。例如,API 组中的资源和资源bind需要动词。这些特殊动词的详细信息可以在此处的文档中找到。rolesclusterrolesrbac.authorization.k8s.io

于 2018-07-11T15:37:11.237 回答
7
for kind in `kubectl api-resources | tail +2 | awk '{ print $1 }' | sort`; do kubectl explain $kind ; done | grep -e "KIND:" -e  "VERSION:" | awk '{print $2}' | paste -sd' \n'
于 2019-07-30T20:09:47.640 回答
5

我什至不愿将此作为“答案”,但评论肯定太长了

对于资源列表,您是否知道$HOME/.kube/cache/discoverySwagger JSON 文件按与其封闭相匹配的目录保存到磁盘的位置apiVersion这是我能找到的最快链接(查看“发现和使用 CRD”标题),但ls -la ~/.kube/cached/discovery会说明我的意思。这些 Swagger JSON 文件apiVersion以一种比 API 参考网站更易于访问的方式列举了所有主要参与者。

我面前没有这些文件来知道它们是否包含子资源定义,因此希望其他人可以对此进行权衡。

“权衡”部分的小星号是,根据我对 RBAC 文档和 1.9 API 参考所做的浏览,我没有得到子资源是对其父资源的“字段级访问”的印象。例如,v1beta1/Evictions是一个 Pod 子资源,/evictions据我所知,它不是其中的一个字段PodSpec

因此,如果您有兴趣使用 RBAC 来约束 Deployment 的图像,您可能会喜欢Webhook模式,其中可以将几乎无限的业务逻辑应用于尝试的请求。

于 2018-03-21T05:39:23.470 回答
2

您可以从这里找到 Kubernetes v1.9 的资源列表:https ://kubernetes.io/docs/reference/generated/kubernetes-api/v1.9/#-strong-api-overview-strong- 。对于其他 K8s 版本,请查看https://kubernetes.io/docs/reference/上的“API 参考”部分

查看左侧的目录,例如,'Workloads' 是 Container、Deployment、CronJob 等基本资源类型的高级概述。而 'Container、Deployment、CronJob 等这些子资源是典型的基本资源Kubernetes API 资源。

您可以通过 kubectl 访问这些基本资源,因此在https://kubernetes.io/docs/reference/kubectl/cheatsheet/中还提供了一个“资源类型”列表

但是我在您的声明中感到困惑“管理部署规范的一部分的子资源 - 容器映像”,如果您尝试管理容器映像的权限,您应该在您的映像注册表上进行,但是不在 Kubernetes 方面。例如,您的注册表应该有一个访问控制器来在用户拉取图像时进行身份验证。

于 2018-03-21T06:05:17.823 回答
1

为此,我编写了一个小型 Go 实用程序。使用集群上所有可能的资源和子资源生成完整的 RBAC 角色。然后,您可以将其修剪回来以适合您角色的用例。

https://github.com/coopernetes/kube-role-gen

于 2020-06-08T15:39:39.463 回答
1

Markdown 版本,使用 kubectl 代替 curl

下面是一个不同的代码片段,源自John 在答案中发布的脚本。
在 Bash 中执行时,它会以Markdown 表的形式生成更详细的输出,并保存为文件Kubernetes_API_resources.md
它使用kubectl get --raw ...而不是curl查询 API,生成的 Markdown 文件在代码块中记录了它自己的创建。

echo "# Kubernetes API resources

Updated on `date -I`

\`\`\`bash
${BASH_COMMAND}
\`\`\`

| API name/version | Resource | Verbs | Kind | Namespaced |
| ---------------- | -------- | ----- | ---- | ---------- |
`
for apipath in $(kubectl api-versions | sort | sed '/\//{H;1h;$!d;x}'); do
  version=${apipath#*/}
  api=${apipath%$version}
  api=${api%/}
  prefix="/api${api:+s}/"
  api=${api:-(core)}
  >&2 echo "${prefix}${apipath}: ${api}/${version}"
  kubectl get --raw "${prefix}${apipath}" | jq -r --arg api "${api}/${version}" '.resources | sort_by(.name) | .[]? | "| \($api) | \(.name) | \(.verbs | join(" ")) | \(.kind) | \(if .namespaced then "true" else "false" end) |"'
done
`" > Kubernetes_API_resources.md
于 2021-04-14T21:35:23.043 回答
0

k8s另一种选择是OpenAPI规范,特别是对于那些无法立即访问 live的人。
api 参考中,您可以访问最新的文档,该文档在右上角有一个指向git 管理的 OpenAPI 规范的链接,您可以在Swagger 实时网络编辑器中加载该规范。
类似的端点/api/v1/namespaces/{namespace}/pods/{name}/log将在此处列出。

放置所有这些链接是为了让这个答案在未来得到验证。我找不到/latest指向最新版本的类型 URL。

于 2020-11-30T20:43:18.877 回答
0

如果你使用 kubectl krew 插件,我会建议使用get-all。它可以获得几乎90%的资源。包括 configmap、secret、endpoints、istio 等

它有一个很棒的参数——因为,你可以用它来列出最后 x 分钟创建的资源。

例子

kubectl get-all --since 1d

在此处输入图像描述

于 2020-05-18T10:10:08.863 回答