Kubernetes RBA C: невозможно получить cronjob, хотя у пользователя, кажется, есть необходимые разрешения - PullRequest
2 голосов
/ 06 февраля 2020

Приветствую, товарищи-тинкеры!

В чем моя проблема?

В двух словах, пользователь toto не может "получить" cronjob хотя разрешения кажутся нормальными. Точнее:

$> kubectl get cronjob/test -n my_namespace
Error from server (Forbidden): cronjobs.batch "test" is forbidden: User "toto" cannot get resource "cronjobs" in API group "batch" in the namespace "my_namespace"
$> kubectl auth can-i get cronjob/test -n my_namespace
no

даже жестко:

$> kubectl auth can-i get cronjobs -n my_namespace
yes
$> kubectl auth can-i --list -n my_namespace
Resources      Non-Resource URLs  Resource Names   Verbs
...
cronjobs.batch []                 []               [get list watch list watch get]
...
$> kubectl get cronjobs -n my_namespace
NAME     SCHEDULE     ...   AGE
test     */5 * * * *        2d21h

Обратите также внимание, что команда отлично работает, когда выполняется пользователем уровня администратора (из системы группы: мастера), или если Я добавляю toto в систему групп: master.

Что я пробовал?

Я добавил полные разрешения для всех ресурсов во всех пространствах имен , к группе toto принадлежит (назовем это my_group ). Тот факт, что он не работал даже тогда, заставляет меня думать, что моя проблема может быть вызвана не разрешениями, а другим механизмом k8s.

Дополнительная информация

По запросу Вот некоторые дополнительные сведения:

$> kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.2", GitCommit:"c97fe5036ef3df2967d086711e6c0c405941e14b", GitTreeState:"clean", BuildDate:"2019-10-15T23:41:55Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.9-eks-c0eccc", GitCommit:"c0eccca51d7500bb03b2f163dd8d534ffeb2f7a2", GitTreeState:"clean", BuildDate:"2019-12-22T23:14:11Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}

Кластер размещен на AWS с использованием службы EKS, поэтому:

  • контексты позволяют пользователям динамически проходить проверку подлинности с использованием двоичного файла aws-iam-authenticator
  • , как упоминает EKS c, мы добавляем пользователей в группы в aws-auth ConfigMap
  • , затем мы определяем некоторые кластерные кластеры + ролевые привязки, предназначенные для этих вышеупомянутых групп.

Что для этих двух последних точек, переводится в следующие файлы yaml:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  ...
  mapUsers: |
    ...
    - userarn: arn:aws:iam::xxxxxxxxxxxx:user/toto
      username: toto
      groups:
        - system:basic-user
        - my_group
    ...

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my_role
rules:
  ...
  - apiGroups: ["batch"]
    resources: ["cronjobs"]
    resourceNames: [""]
    verbs: ["list", "watch", "get"]
  ...
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my_rolebinding
  namespace: my_namespace
subjects:
  - kind: Group
    name: my_group
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: my_role
  apiGroup: rbac.authorization.k8s.io

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

OK. Итак, понял. Вопрос в параметре resourceNames. Когда вы указываете этот параметр, вам также нужно указать, какое именно c имя ресурса вы имеете в виду.

Пример:

Если вы создаете это Role .. .

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my_role
  namespace: toto
rules:
  - apiGroups: ["", "batch"]
    resources: ["cronjobs"]
    resourceNames: [""]
    verbs: ["list", "watch", "get"]

... и получить cronjobs, вы получите их, но вы не получите спецификацию c cronJob по имени.

# kubectl -n toto --context toto-context get cronjobs
NAME          SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-pod   */1 * * * *   False     0        4d21h           4d21h
# kubectl -n toto --context toto-context get cronjob cronjob-pod
Error from server (Forbidden): cronjobs.batch "cronjob-pod" is forbidden: User "toto" cannot get resource "cronjobs" in API group "batch" in the namespace "toto"

Но если Вы удалите параметр resourceNames или напишите имя ресурса, который хотите получить, он будет работать. Таким образом, будет работать следующее Role:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my_role
  namespace: toto
rules:
  - apiGroups: ["", "batch"]
    resources: ["cronjobs"]
    verbs: ["list", "watch", "get"]

# kubectl -n toto --context toto-context get cronjob cronjob-pod
NAME          SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-pod   */1 * * * *   False     0        4d21h           4d21h

Также, в моем случае, это будет работать:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my_role
  namespace: toto
rules:
  - apiGroups: ["", "batch"]
    resources: ["cronjobs"]
    resourceNames: ["cronjob-pod"]          <- specify the resource name
    verbs: ["list", "watch", "get"]

Примечание: resourceNames: ["*"] не будет работать.

0 голосов
/ 06 февраля 2020

Если я не ошибаюсь, группа API - batch, а ресурс - cronjobs, а не cronjobs.batch.

Kubernetes cluster-role.yaml и документы для Kubernetes. Роль API cronjob .

yaml должна выглядеть следующим образом:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: my_namespace
  name: toto
rules:
- apiGroups: ["", "batch"]
  resources: ["cronjobs"]
  verbs: ["get", "list", "watch", "list", "watch"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...