在启用RBAC的集群中,我需要从同一个名称空间中的另一个荚调用Kubernetes作业。作业是使用C# Kubernetes客户端库创建的。此任务在未启用RBAC的测试环境中正确工作。
在遵循用于创建服务帐户的Kubernetes文件之后,我有以下YAML。
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这是调用作业的代码。
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命令进行了测试。
我遗漏了什么?
发布于 2020-02-10 01:34:25
因此,原来原因是试图调用作业的pod的默认服务帐户没有必要的角色绑定。
我通过将cluster-admin RoleBinding添加到名称空间中的默认服务帐户并调用作业来测试这一点。
kubectl create clusterrolebinding --user system:serviceaccount:prod:default prod-cluster-admin --clusterrole cluster-admin
https://stackoverflow.com/questions/60066170
复制相似问题