我正在尝试以最不宽容的方式配置Kubernetes RBAC,我希望将我的角色范围扩展到特定资源和子资源。我已经挖掘了文档,无法找到简明的资源列表及其子资源。
我对管理部署规范的一部分的子资源特别感兴趣 - 容器图像。
答案 0 :(得分:5)
使用kubectl api-resources -o wide
显示所有资源,动词以及相关的 API组。
$ 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配置中所需的资源列表
答案 1 :(得分:4)
在静态列表的任何地方都没有记录定义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错误#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使用此处未列出的专用动词检查其他权限。例如,bind
API组中的roles
和clusterroles
资源需要rbac.authorization.k8s.io
动词。这些专用动词的详细信息可以在docs here中找到。
答案 2 :(得分: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'
答案 3 :(得分:2)
您可以在此处找到Kubernetes v1.9的资源列表:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.9/#-strong-api-overview-strong-。对于其他K8版本,请查看“API参考”' https://kubernetes.io/docs/reference/
部分检查左侧的目录,例如,'工作负载'是对容器,部署,CronJob等基本资源类型的高级概述。这些子资源包括容器,部署,CronJob和#39;是典型的基本Kubernetes API资源。
您可以通过kubectl访问这些基本资源,因此还有一个'资源类型列表'可在https://kubernetes.io/docs/reference/kubectl/cheatsheet/
中找到但我在你的陈述中混淆了#34;一个管理部署规范部分的子资源 - 容器映像",如果你试图管理权限一个容器图像,你应该在你的图像注册表上,但不是在Kubernetes一侧。例如,您的注册表应该有一个访问控制器,以便在用户提取图像时进行身份验证。
答案 4 :(得分:1)
下面是一个不同的代码片段,源自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
答案 5 :(得分:0)
我甚至毫不犹豫地将其作为"答案",但肯定会有太长时间发表评论
对于资源列表,您是否了解$HOME/.kube/cache/discovery
其中Swagger JSON文件通过与其封闭apiVersion
匹配的目录持久保存到磁盘? This is我能找到的最快的链接(查看"发现和使用CRD"标题)但ls -la ~/.kube/cached/discovery
将显示我的意思。那些Swagger JSON文件列举了apiVersion
中的所有主要玩家,我发现它比API参考网站更容易访问。
我不会在我面前有这些文件,知道它们是否包含子资源定义,所以希望其他人可以权衡这一点。
&#34的小星号称重"部分原因是,基于我对RBAC文档和1.9 API参考的冲浪,我没有得到子资源是"字段级访问"到其父资源。例如,v1beta1/Evictions是/evictions
的Pod子资源,据我所知,这不属于PodSpec
因此,如果您有兴趣使用RBAC来约束部署的映像,那么您可能很多更乐意使用Webhook Mode,其中可以将几乎无限制的业务逻辑应用于尝试请求。
答案 6 :(得分:0)
如果您使用的是kubectl krew插件,我建议您使用get-all。它可以获得近90%的资源。包括configmap,secret,端点,istio等
它有一个很大的arg,因为您可以用它列出最后x分钟创建的资源。
示例
kubectl get-all --since 1d
答案 7 :(得分:0)
我为此目的编写了一个很小的Go实用程序。使用群集上的所有可能资源和子资源生成完整的RBAC角色。然后,您可以将其修剪回去以适合您角色的用例。
答案 8 :(得分:0)
k8s
规范是另一种选择,特别是对于那些无法即时访问实时OpenAPI
的人。
从api reference,您可以到达latest docs,该链接的右上方有一个git managed OpenAPI spec的链接,您可以在Swagger live web editor上加载该链接。
像/api/v1/namespaces/{namespace}/pods/{name}/log
这样的端点将在此处列出。
放置所有这些链接,以便将来验证此答案。我找不到指向最新版本的/latest
类型的URL。