kubernetes - Kubernetes RBAC 角色允许仅从 Cron 作业创建作业

标签 kubernetes kubernetes-rbac

是否可以创建一个 kubernetes RBAC 规则,允许从现有 CronJob 创建作业,但阻止以其他方式创建作业?

我们希望严格锁定我们的集群,以避免不受 CICD 管理的任意部署 - 但我们还需要促进 CronJobs 的手动测试,或者不按计划重新运行失败的作业。我希望开发人员能够运行如下命令:

kubectl create job --from=cronjob/my-job my-job-test-run-1

但无法运行如下内容:

kubectl create job my-evil-job -f evil-job.yaml

这可能吗?

最佳答案

在这种情况下为了成功执行此命令:

kubectl create job --from=cronjob/<cronjob_name>  

用户/服务帐户应具有正确的 RBAC规则(下面提供的输出中至少有两个,创建 Jobs 并获取 CronJobs

在第一个示例中,我授予了创建 Jobs 和获取 CronJobs 的访问权限,并且我能够创建 JobJob --来自 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 的访问权限而不获取 CronJob,我就能够创建 Job 但无法创建 >作业——来自 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"

当我删除创建 Job 的访问权限时,我无法创建 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 没有这两种权限,则无法创建(JobJob --from CronJob),因此不可能仅使用 RABC 规则创建此类限制。

一种可能的解决方案是将此权限拆分为两个不同的 User/ServiceAccount 来执行两个不同的任务(第一个用户可以创建 Jobs + 获取 CronJobs,第二个用户没有权限创建作业)。

另一种可能性是尝试将 k8s 准入 Controller 与 f.e. 一起使用。 Open Policy agent

关于kubernetes - Kubernetes RBAC 角色允许仅从 Cron 作业创建作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71265398/

相关文章:

docker - 如何使用客户端API从运行Pod获取当前 namespace

kubernetes - 您可以使用 k8s Ingress 将 HTTP 重定向到 HTTPS 吗?

kubernetes - K3s 上的 RBAC(基于角色的访问控制)

kubernetes - AWS EKS 集群的 "cluster creator"用户如何映射到 "system:masters"RBAC 组?

azure - 创建集群后将 RBAC 添加到 Azure Kubernetes (AKS)

kubernetes - 我可以远程托管minikube以便在团队中进行开发吗?

google-compute-engine - Kubernetes 作业是否有 'max-retries'?

kubernetes - 如何基于状态为ImagePullBackOff的kubectl和滤镜查看 pods ?