Учетной записи службы Kubernetes не назначена роль?

#python #kubernetes #openshift #rbac

#python #kubernetes #openshift #rbac

Вопрос:

У меня есть учетная запись службы в kubernetes:

 apiVersion: v1
kind: ServiceAccount
metadata:
  name: testsa
  namespace: project-1
  

И я назначил ей view роль:

 apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: testsa-view
  namespace: project-1
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
- kind: ServiceAccount
  name: testsa
  namespace: project-1
  

Это должно предоставить учетной записи службы доступ на чтение ко всем ресурсам. Внутри модуля в project-1 пространстве имен я пытаюсь запустить следующий код Python:

 >>> from kubernetes import client, config
>>> config.load_incluster_config()
>>> api = client.CoreV1Api()
>>> api.list_pod_for_all_namespaces()
  

Но это завершается с 403 ошибкой:

 kubernetes.client.rest.ApiException: (403)
Reason: Forbidden
[...]
HTTP response body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"pods is forbidden: User "system:serviceaccount:project-1:testsa" cannot list resource "pods" in API group "" at the cluster scope","reason":"Forbidden","details":{"kind":"pods"},"code":403}
  

Модуль связан с учетной записью службы:

 apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testsa
  name: testsa-2-l929g
  namespace: project-1
spec:
  serviceAccountName: testsa
  automountServiceAccountToken: true
  containers:
  - image: larsks/testsa
    imagePullPolicy: Always
    name: testsa
    ports:
    - containerPort: 8080
      protocol: TCP
    resources: {}
  

И внутри контейнера я вижу смонтированные секреты:

 /src $ find /run/secrets/ -type f
/run/secrets/kubernetes.io/serviceaccount/..2020_09_04_16_30_26.292719465/ca.crt
/run/secrets/kubernetes.io/serviceaccount/..2020_09_04_16_30_26.292719465/token
/run/secrets/kubernetes.io/serviceaccount/..2020_09_04_16_30_26.292719465/service-ca.crt
/run/secrets/kubernetes.io/serviceaccount/..2020_09_04_16_30_26.292719465/namespace
/run/secrets/rhsm/ca/redhat-uep.pem
/run/secrets/rhsm/ca/redhat-entitlement-authority.pem
  

Чего мне здесь не хватает?

Ответ №1:

Ошибка говорит о том, cannot list resource "pods" in API group "" at the cluster scope что вы пытаетесь получить доступ ко всем блокам всех пространств имен в кластере, а не ко всем блокам только project-1 пространства имен.

Поэтому измените Role на ClusterRoleBinding

 apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: testsa-view
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
- kind: ServiceAccount
  name: testsa
  namespace: project-1
  

Ссылка на здесь RoleBinding примеры всегда дает разрешение на ресурсы в пространстве имен, ограниченные только этим конкретным пространством имен, даже если вы ссылаетесь на ClusterRole в нем.

Вы можете использовать приведенные ниже команды для проверки прав учетной записи службы

 kubectl auth can-i --list --as=system:serviceaccount:project-1:testsa
kubectl auth can-i --list --as=system:serviceaccount:project-1:testsa -n project-1
kubectl auth list pods --as=system:serviceaccount:project-1:testsa
kubectl auth list pods --as=system:serviceaccount:project-1:testsa -n project-1
  

Комментарии:

1. Спасибо, это имеет большой смысл. Я должен был заметить это сам, и я вижу, что если я просто вызываю api.list_namespaced_pod("project-1') , это работает нормально.