在这种情况下为了成功执行这个命令:
kubectl create job --from=cronjob/<cronjob_name>
User/ServiceAccount 应该有适当的RBAC规则(至少有两个来自下面提供的输出,createJobs
和 get CronJobs
.
在第一个示例中,我授予了创建和获取的访问权限,Jobs
并且CronJobs
我能够创建Job
和获取Job --from CronJob
user@minikube:~$ cat test_role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: job
rules:
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create"]
- apiGroups: ["batch"]
resources: ["cronjobs"]
verbs: ["get"]
user@minikube:~$ kubectl create job --image=inginx testjob20
job.batch/testjob20 created
user@minikube:~$ kubectl create job --from=cronjobs/hello testjob21
job.batch/testjob21 created
但是,如果我只授予访问权限以创建Job
而没有 get CronJob
,我可以创建Job
但不能创建Job --from CronJob
user@minikube:~$ cat test_role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: job
rules:
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create"]
user@minikube:~$ kubectl create job --image=nginx testjob3
job.batch/testjob3 created
user@minikube:~$ kubectl create job --from=cronjobs/hello testjob4
Error from server (Forbidden): cronjobs.batch "hello" is forbidden: User "system:serviceaccount:default:t1" cannot get resource "cronjobs" in API group "batch" in the namespace "default"
当我删除对 create 的访问权限时Jobs
,我无法创建Job
并且Job --from CronJob
user@minikube:~$ cat test_role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: job
rules:
- apiGroups: ["batch"]
resources: ["cronjobs"]
verbs: ["get"]
user@minikube:~$ kubectl create job --image=inginx testjob10
error: failed to create job: jobs.batch is forbidden: User "system:serviceaccount:default:t1" cannot create resource "jobs" in API group "batch" in the namespace "default"
user@minikube:~$ kubectl create job --from=cronjobs/hello testjob11
error: failed to create job: jobs.batch is forbidden: User "system:serviceaccount:default:t1" cannot create resource "jobs" in API group "batch" in the namespace "default"
如您所见,如果 User/ServiceAccount 在这种情况下没有这两种权限,则无法创建 (Job
或Job --from CronJob
),因此仅使用 RABC 规则就无法创建此类限制。
一种可能的解决方案是将此权限拆分为两个不同的用户/服务帐户,用于两个不同的任务(第一个用户可以创建Jobs
+ 获取CronJobs
,第二个用户没有创建权限Jobs
)。
另一种可能是尝试使用带有 fe Open Policy 代理的 k8s admission Controller