微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从另一个kubernetes作业触发Kubernetes

如何解决从另一个kubernetes作业触发Kubernetes

我正在从基本Pod运行kubernetes作业(job-1)。它适用于基本用例。对于第二个用例,我想从已经运行的作业中触发另一个kubernetes作业(job-2):job-1。运行job-2时,出现如下所示的服务帐户错误

Error occurred while starting container for Prowler due to exception : Failure executing: POST at: https://172.20.0.1/apis/batch/v1/namespaces/my-namespace/jobs. Message: Forbidden!Configured service account doesn't have access. Service account may have been revoked. jobs.batch is forbidden: User "system:serviceaccount:my-namespace:default" cannot create resource "jobs" in API group "batch" in the namespace "my-namespace".

我已创建具有所需权限的服务帐户,如下所示:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
Metadata:
  name: my-sa-service-role-binding
subjects:
  - kind: ServiceAccount
    name: my-sa
    namespace: my-namespace
roleRef:
  kind: Role
  name: my-namespace
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
Metadata:
  name: my-sa-service-role
rules:
  - apiGroups: [""]
    resources: ["secrets","pods"]
    verbs: ["get","list","watch","create","update","patch","delete"]
  - apiGroups: ["batch","extensions"]
    resources: ["jobs"]
    verbs: ["get","delete"]
  - apiGroups: [""]
    resources: ["pods/log"]
    verbs: ["get","list"]
---
apiVersion: v1
kind: ServiceAccount
Metadata:
  name: my-sa

我将“ my-sa”作为服务帐户名传递,但仍引用认服务帐户。

我正在使用fabric8io kubernetes客户端来触发作业,下面是我的代码

          final Job job = new JobBuilder()
            .withApiVersion("batch/v1")
            .withNewMetadata()
            .withName("demo")
            .withLabels(Collections.singletonMap("label1","maximum-length-of-63-characters"))
            .withAnnotations(Collections.singletonMap("annotation1","some-annotation"))
            .endMetadata()
            .withNewSpec().withParallelism(1)
            .withNewTemplate()
            .withNewSpec().withServiceAccount("my-sa")
            .addNewContainer()
            .withName("prowler")
            .withImage("demo-image")
            .withEnv(env)
            .endContainer()
            .withRestartPolicy("Never")
            .endSpec()
            .endTemplate()
            .endSpec()
            .build();

解决方法

如果详细看到错误消息,您会发现您的客户端未使用您创建的服务帐户( my-sa )。它使用名称空间中的 default 服务帐户代替:

"system:serviceaccount:my-namespace:default" cannot create resource "jobs"

应该可以安全地假设默认服务帐户将没有创建作业的特权。

值得值得一提的是 fabric8io 的官方文档,以了解如何使用自定义服务帐户进行身份验证。从我在文档中可以找到的地方,应该首先通过将与服务帐户相对应的机密装入Pod,然后配置您的应用程序代码或可能设置特定的环境变量来进行处理。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?