在kubernetes中,有没有一种方法可以查找与serviceAccount相关的RoleBinding/ClusterRoleBinding而无需遍历所有绑定(bind)?

在尝试解决与Pod用于请求APIServer的身份验证相关的问题时,这非常有用。

最佳答案

如前所述,没有简单的方法可以使用kubectl做到这一点,但是在技术上支持它。您可以传递“自定义列”来控制结果STDOUT生成您感兴趣的信息。然后,您可以指定-A参数来搜索所有 namespace ,也可以使用-n specificNamespace参数。最后,然后可以对命令的结果STDOUT进行grep编码,以在必要时进行相应的过滤。

例如,如果我从kubernetes-dashboard获取所有绑定(bind),则可以运行以下命令:

$> kubectl get rolebindings,clusterrolebindings \
      -n kubernetes-dashboard \
      -o custom-columns='KIND:kind,NAMESPACE:metadata.namespace,NAME:metadata.name,SERVICE_ACCOUNTS:subjects[?(@.kind=="ServiceAccount")].name' | wc -l
64


如您所见,我通过wc用管道传输了它,因为返回了60多个结果,这简直无法发布到StackOverflow上。但是,如果使用grep代替,则可以轻松检索更精细的结果。例如,此经过调整的命令显示tj ServiceAccount资源有一个CRB。
$> kubectl get rolebindings,clusterrolebindings \
     -n kubernetes-dashboard \
     -o custom-columns='KIND:kind,NAMESPACE:metadata.namespace,NAME:metadata.name,SERVICE_ACCOUNTS:subjects[?(@.kind=="ServiceAccount")].name' | grep tj
ClusterRoleBinding   <none>                 tj                                                     tj

然后,您可以设置一个shell别名来简化此过程:
$> alias getbindings="kubectl get rolebindings,clusterrolebindings   -n kubernetes-dashboard    -o custom-columns='KIND:kind,NAMESPACE:metadata.namespace,NAME:metadata.name,SERVICE_ACCOUNTS:subjects[?(@.kind==\"ServiceAccount\")].name' | grep"
$> getbindings tj
ClusterRoleBinding   <none>                 tj                                                     tj

另外,您甚至可以将其变成一个接受两个参数的函数,一个命名空间和一个ServiceAccount。然后可以有效地为您提出的功能请求创建自己的解决方案。例如:
$> tail -n 6 ~/.bashrc
function get_bindings(){

    kubectl get rolebindings,clusterrolebindings \
      -n $1 \
      -o custom-columns='KIND:kind,NAMESPACE:metadata.namespace,NAME:metadata.name,SERVICE_ACCOUNTS:subjects[?(@.kind=="ServiceAccount")].name' | grep $2
}
$> get_bindings "kubernetes-dashboard" "tj"
ClusterRoleBinding   <none>                 tj                                                     tj

希望这可以帮助。

10-06 09:58