首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes就业服务账户

Kubernetes就业服务账户
EN

Stack Overflow用户
提问于 2020-02-04 22:01:13
回答 1查看 5.8K关注 0票数 4

在启用RBAC的集群中,我需要从同一个名称空间中的另一个荚调用Kubernetes作业。作业是使用C# Kubernetes客户端库创建的。此任务在未启用RBAC的测试环境中正确工作。

在遵循用于创建服务帐户的Kubernetes文件之后,我有以下YAML。

代码语言:javascript
复制
apiVersion: v1
kind: ServiceAccount
metadata:
  name: x20-jobs-sp
  namespace: prod
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: prod
  name: x20-jobs-sp-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["batch", "extensions"]
  resources: ["jobs"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: x20-jobs-sp-rolebinding
  namespace: prod
subjects:
  - kind: ServiceAccount
    # Reference to ServiceAccount kind's `metadata.name`
    name: x20-jobs-sp
    # Reference to ServiceAccount kind's `metadata.namespace`
    namespace: prod
roleRef:
  kind: ClusterRole
  name: x20-jobs-sp-role
  apiGroup: rbac.authorization.k8s.io

这是调用作业的代码。

代码语言:javascript
复制
var job = await client.CreateNamespacedJobAsync(new k8s.Models.V1Job
{
    Metadata = new k8s.Models.V1ObjectMeta
    {
        Name = safeName
    },
    Spec = new k8s.Models.V1JobSpec
    {
        Template = new k8s.Models.V1PodTemplateSpec
        {
            Spec = new k8s.Models.V1PodSpec
            {
                Containers = new List<k8s.Models.V1Container>()
                {
                    new k8s.Models.V1Container
                    {
                        Image = $"{_containerRegistry}/{jobName}:{_imageTag}",
                        Args = args.Select(x => x.ToString()).ToList(),
                        Env = GetDefaultEnvironment(),
                        Name = safeName,
                        ImagePullPolicy = "Always"  
                    }
                },
                ImagePullSecrets = new List<k8s.Models.V1LocalObjectReference>
                {
                    new k8s.Models.V1LocalObjectReference
                    {
                        Name = _containerRegistry
                    }
                },
                RestartPolicy = "OnFailure", 
                ServiceAccountName = "x20-jobs-sp" // jobs service principal
            }
        },
        TtlSecondsAfterFinished = _ttlSecondsAfterFinished
    }
}, _namespace);

这正确地创建了ServiceAccount、ClusterRole和ClusterRoleBinding,但是试图调用任务的结果仍然是Forbidden结果。

我尝试了许多不同的ClusterRole选项,包括使用内置的cluster-admin角色,但都没有成功。这已经使用kubectl auth can-i命令进行了测试。

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-10 01:34:25

因此,原来原因是试图调用作业的pod的默认服务帐户没有必要的角色绑定。

我通过将cluster-admin RoleBinding添加到名称空间中的默认服务帐户并调用作业来测试这一点。

kubectl create clusterrolebinding --user system:serviceaccount:prod:default prod-cluster-admin --clusterrole cluster-admin

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60066170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档