登录
首页 >  Golang >  Go问答

clientset.AuthorizationV1().SelfSubjectAccessReviews().Create() 出现意外结果

来源:stackoverflow

时间:2024-04-18 10:45:33 183浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《clientset.AuthorizationV1().SelfSubjectAccessReviews().Create() 出现意外结果》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我正在尝试将 kubectl auth can-i 逻辑合并到我的代码库中,但是当代码运行时,结果不是我所期望的。

我有 2 个用户 (minikube/jenny)。 minikube 具有完整的集群范围访问权限,但 jenny 仅限于命名空间角色/角色绑定:

kubectl create role "jenny-pod-creator" --verb=create --resource=pod -n "jenny"
kubectl create rolebinding "jenny-creator-binding" --role="jenny-pod-creator" --user="jenny" --namespace="jenny"

使用 cli,我得到了我期望的结果:

$ kubectl auth can-i create pod --context jenny -n jenny
yes
$ kubectl auth can-i create pod --context jenny -n default
no - rbac: role.rbac.authorization.k8s.io "jenny-pod-creator" not found

但在我的代码中,jenny 没有获得创建权限。对于 jennyresponse.status.allowed 始终为 false (对于 minikube 始终为 true)

package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "path/filepath"

    authorizationv1 "k8s.io/api/authorization/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    kubeconfig := filepath.Join(
        os.Getenv("HOME"), ".kube", "config",
    )
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        log.Fatal(err)
    }
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        log.Fatal(err)
    }
    a := clientset.AuthorizationV1().SelfSubjectAccessReviews()
    sar := &authorizationv1.SelfSubjectAccessReview{
        Spec: authorizationv1.SelfSubjectAccessReviewSpec{
            ResourceAttributes: &authorizationv1.ResourceAttributes{
                Namespace: "jenny",
                Verb:      "create",
                Resource:  "Pod",
            },
        },
    }
    response, err := a.Create(context.TODO(), sar, metav1.CreateOptions{})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("create resource POD is %v \n", response.Status.Allowed)
}

解决方案


在 Kubernetes 中,有“种类”和“资源”的概念。如果您想了解更多信息,请参阅 Difference between Kubernetes Objects and ResourcesAPI Conventions

简而言之:

  1. Kind 是告诉客户端它代表哪种实体的类型,并且始终为大写,例如 Pod
  2. 资源是通过 HTTP 发送的此类实体的表示,并且始终为小写和复数。

就您而言,您正在使用资源,因此您需要将 PodKind)更改为 pods资源),这应该给你 truejenny。至于 minikube,您始终会得到 true,因为该用户是 system:admin,它具有对集群的完全访问权限。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《clientset.AuthorizationV1().SelfSubjectAccessReviews().Create() 出现意外结果》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>