У меня проблема с разрешением (не могу создать ресурс \ "Работа \" в группе \ "API \") при создании заданий с помощью датчиков арго-событий.
Я пытаюсь запустить создание задания с помощью датчика, но получаю следующую ошибку.
Job.batch is forbidden: User \"system:serviceaccount:samplens:sample-sa\" cannot create resource \"Job\" in API group \"batch\" in the namespace \"samplens\"","errorVerbose":"timed out waiting for the condition: Job.batch is forbidden: User \"system:serviceaccount:samplens:sample-sa\" cannot create resource \"Job\" in API group \"batch\" in the namespace \"samplens\"\nfailed to execute trigger\ngithub.com/argoproj/argo-events/sensors.(*SensorContext).triggerOne\n\t/home/jenkins/agent/workspace/argo-events_master/sensors/listener.go:328\ngithub.com/argoproj/argo-events/sensors.(*SensorContext).triggerActions\n\t/home/jenkins/agent/workspace/argo-events_master/sensors/listener.go:269\ngithub.com/argoproj/argo-events/sensors.(*SensorContext).listenEvents.func1.3\n\t/home/jenkins/agent/workspace/argo-events_master/sensors/listener.go:181\nruntime.goexit\n\t/usr/local/go/src/runtime/asm_amd64.s:1357","triggerName":"sample-job","triggeredBy":["payload"],"triggeredByEvents":["38333939613965312d376132372d343262302d393032662d663731393035613130303130"],"stacktrace":"github.com/argoproj/argo-events/sensors.(*SensorContext).triggerActions\n\t/home/jenkins/agent/workspace/argo-events_master/sensors/listener.go:271\ngithub.com/argoproj/argo-events/sensors.(*SensorContext).listenEvents.func1.3\n\t/home/jenkins/agent/workspace/argo-events_master/sensors/listener.go:181"}
12
Хотя я создал учетную запись службы, роль и привязку ролей. Вот мой файл для создания сервисного аккаунта
apiVersion: v1
kind: ServiceAccount
metadata:
name: sample-sa
namespace: samplens
Вот мой rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: sample-role
namespace: samplens
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- create
- delete
- get
- watch
- patch
- apiGroups:
- "batch"
resources:
- jobs
verbs:
- create
- delete
- get
- watch
- patch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: sample-role-binding
namespace: samplens
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: sample-role
subjects:
- kind: ServiceAccount
name: sample-sa
namespace: samplens
а вот и мой sensor.yaml
apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
name: webhook
spec:
template:
serviceAccountName: sample-sa
dependencies:
- name: payload
eventSourceName: webhook
eventName: devops-toolkit
triggers:
- template:
name: sample-job
k8s:
group: batch
version: v1
resource: Job
operation: create
source:
resource:
apiVersion: batch/v1
kind: Job
metadata:
name: samplejob-crypto
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
ttlSecondsAfterFinished: 100
serviceAccountName: sample-sa
template:
spec:
serviceAccountName: sample-sa
restartPolicy: OnFailure
containers:
- name: sample-crypto-job
image: docker.artifactory.xxx.com/abc/def/yyz:master-b1b347a
Датчик срабатывает правильно, но не может создать задание. Может кто-нибудь помочь, что мне не хватает?
2 ответа
Разместив это как вики сообщества для лучшей наглядности, не стесняйтесь редактировать и расширять ее.
Исходная проблема была решена путем корректировки
role
и давая
*
глаголы. Это означает, что датчику argo на самом деле требуется больше разрешений.
Это рабочее решение для тестовой среды, а для производства RBAC следует использовать с
principle of least privileges
.
Как протестировать RBAC
Есть
kubectl
синтаксис, который позволяет проверить, правильно ли настроен RBAC (учетная запись службы + роль + привязка ролей).
Ниже приведен пример того, как проверить,
SERVICE_ACCOUNT_NAME
in может создавать рабочие места в пространстве имен
NAMESPACE
:
kubectl auth can-i --as=system:serviceaccount:NAMESPACE:SERVICE_ACCOUNT_NAME create jobs -n NAMESPACE
Ответ будет прост:
yes
или же
no
.
Полезные ссылки:
Только что столкнулся с той же проблемой в арго-событиях. Надеюсь, это будет исправлено в ближайшем будущем или, по крайней мере, в какой-то лучшей документации.
Измените следующее значение в вашем
sensor.yaml
:
spec.triggers[0].template.k8s.resource: jobs
Соответствующая документация (на данный момент), кажется, указывает на какую-то старую документацию Kubernetes API v1.13, поэтому я понятия не имею, почему это нужно писать во множественном числе «работы», но это решило проблему для меня.
В примере триггера , где запускается Pod, значение «pods» используется в том же поле, которое указало мне правильное направление.