【问题标题】:Where can I get a list of Kubernetes API resources and subresources?我在哪里可以获得 Kubernetes API 资源和子资源的列表?
【发布时间】:2018-08-29 23:58:24
【问题描述】:

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

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

【问题讨论】:

标签: kubernetes kubernetes-security


【解决方案1】:

使用kubectl api-resources -o wide 显示所有资源动词和相关的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 配置中所需的资源列表

【讨论】:

  • 这不会列出子资源,例如service/proxy,可用于RBAC。
【解决方案2】:

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

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

api_version resource: [verb]

其中api-version 是核心资源的core,应在您的角色定义中替换为""(带引号的空字符串)。

例如,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 会使用此处未列出的专用动词检查其他权限。例如,rbac.authorization.k8s.io API 组中的rolesclusterroles 资源需要bind 动词。这些专用动词的详细信息可以在docs here 中找到。

【讨论】:

  • 你的回答很有用。不幸的是,我的 jq (1.5) 报告了一个无效字符。
  • 我找到了修复脚本的方法:将 \" 替换为 "\.
  • 我刚刚修好了。
  • 如果将 SERVER 更改为 https://kubernetes.default 并使用 curl -sk -H "Authorization: Bearer $(cat /run/secrets/kubernetes.io/serviceaccount/token)" $SERVER,此脚本可以在 Kubernetes 的 pod 内运行。
  • 至少我们现在有一些关于子资源的文档 ;-) 非常感谢!
【解决方案3】:
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'

【讨论】:

  • 我必须稍作修改才能让它在我的 Mac 上运行:for kind in $(kubectl api-resources | tail -n +2 | awk '{ print $1 }' | sort); do kubectl explain $kind ; done | egrep "(KIND|VERSION)" | awk '{print $2}' | paste -sd' \n'
【解决方案4】:

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

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

我没有这些文件在我面前知道它们是否包含子资源定义,所以希望其他人可以权衡一下。

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

因此,如果您有兴趣使用 RBAC 来限制 Deployment 的映像,您可能非常更喜欢Webhook Mode,其中可以将几乎无限的业务逻辑应用于尝试的请求。

【讨论】:

    【解决方案5】:

    您可以从这里找到 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 端。例如,您的注册表应该有一个访问控制器来在用户拉取图像时进行身份验证。

    【讨论】:

    • 好的,接近​​了。从 API 文档中仍然不清楚 Deployment 资源的子资源是什么。具体来说,我有兴趣引用部署的模板化 pod 的图像。我必须深入到一堆资源中才能到达那里:部署 -> 部署规范 -> PodTemplate -> PodSpec -> 容器 -> 图像。
    • 我要做的是创建一个角色,该角色可以更新部署的 pod 的图像标签,但不能更新图像本身。如果一个角色可以更新整个图像名称,它基本上可以使用 root 权限执行任何来自 Internet 的代码。我想将此特定角色限制为更改预设图像名称的版本。
    • @ChrisSnell 这是一个棘手的问题,我对此没有任何解决方案或建议。我认为角色可以授权的最小资源是部署本身。不知道有没有办法控制Deployment的每一个配置。
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

      Markdown 版本,使用 kubectl 代替 curl

      下面是一个不同的代码 sn-p,源自 answer by John 中发布的脚本。
      在 Bash 中执行时,它会以 Markdown table 的形式生成更详细的输出,并保存为文件 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
      

      【讨论】:

        【解决方案8】:

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

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

        例子

        kubectl get-all --since 1d
        

        【讨论】:

          【解决方案9】:

          另一种选择是OpenAPI 规范,特别是对于那些无法立即访问实时k8s 的人。
          api reference,您可以到达latest docs,它在右上角有一个指向git managed OpenAPI spec 的链接,您可以在Swagger live web editor 加载该链接。
          /api/v1/namespaces/{namespace}/pods/{name}/log 之类的端点将在此处列出。

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

          【讨论】:

            猜你喜欢
            • 2012-02-04
            • 1970-01-01
            • 2011-10-26
            • 2010-11-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多