Неожиданные результаты от 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 не дает разрешения на создание. response.Status.Allowed всегда равно false для дженни (всегда верно для minikube)

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)
}

person GrandVizier    schedule 08.07.2020    source источник


Ответы (1)


В Kubernetes есть понятие видов и ресурсов. Это очень хорошо объяснено в Разница между объектами и ресурсами Kubernetes и в Соглашения API, если вам интересно узнать больше.

Короче:

  1. Вид — это тип, который сообщает клиенту, какой тип объекта он представляет, и это всегда верхний регистр, например Pod.
  2. Ресурс — это представление такого объекта, отправляемого через HTTP, всегда в нижнем регистре и во множественном числе.

В вашем случае вы работаете с Ресурсом, поэтому вам нужно изменить Pod (Вид) на pods (ресурс), что должно дать вам true для jenny. Что касается minikube, вы всегда получаете true, потому что это пользователь system:admin, который имеет полный доступ к кластеру.

person soltysh    schedule 21.08.2020