kubernetes - 带有 nodejs 客户端的 Kubernetes RBAC 配置
问题描述
我的设计是:EventController 位于“默认”命名空间中,并在“游戏空间”命名空间中启动作业。
我在尝试使用 Node.js kubernetes 客户端创建作业时遇到此错误:
jobs.batch is forbidden: User "system:serviceaccount:default:event-manager" cannot create resource "jobs" in API group "batch" in the namespace "gamespace"
从这行代码:
const job = await batchV1Api.createNamespacedJob('gamespace', kubeSpec.job)
kubeSpec.job 是:
{
apiVersion: 'batch/v1',
kind: 'Job',
metadata: {
name: 'event-60da4bee95e237001d65e355',
namespace: 'gamespace',
labels: {
tier: 'event-servers',
}
},
spec: {
backoffLimit: 1,
activeDeadlineSeconds: 14400,
ttlSecondsAfterFinished: 86400,
template: { spec: [Object] }
}
}
这是我的 RBAC 配置:
apiVersion: v1
kind: Namespace
metadata:
name: gamespace
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: event-manager
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: event-manager-role
rules:
- apiGroups: ['', 'batch'] # '' means "core"
resources: ['jobs', 'services']
verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: event-manager-clusterrole-binding
# Specifies the namespace the ClusterRole can be used in.
namespace: gamespace
subjects:
- kind: ServiceAccount
name: event-manager
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: event-manager-role
进行函数调用的容器配置如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: eventcontroller-deployment
labels:
app: eventcontroller
spec:
selector:
matchLabels:
app: eventcontroller
replicas: 1
template:
metadata:
labels:
app: eventcontroller
spec:
# see accounts-namespaces.yaml
serviceAccountName: 'event-manager'
imagePullSecrets:
- name: registry-credentials
containers:
- name: eventcontroller
image: eventcontroller
imagePullPolicy: Always
envFrom:
- configMapRef:
name: eventcontroller-config
ports:
- containerPort: 3003
我不确定我是否错误地使用了客户端(为什么规范和函数调用中需要命名空间?),或者我是否错误地配置了 RBAC。
有什么建议么?
谢谢!
解决方案
我无法发表评论,所以我将分享一些可能是问题的想法以及我将如何进一步调试问题。
对于您的部署,您没有定义命名空间,是否可能是 Pod 在不同的命名空间(!=游戏空间)中运行,但您的服务帐户仅适用于游戏玩法?
RoleBinding 授予特定命名空间内的权限1
如果这不是错误,您可能希望尝试使用已创建并授予所有启动权限的服务帐户以排除其他错误。
这是一个示例清单
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
creationTimestamp: null
name: all-permissions
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: service-account-all-permissions
namespace: gameplay
在您的部署中将服务帐户设置为“服务帐户所有权限”,看看您是否仍然从 Kubernetes API 收到权限错误
来源。
推荐阅读
- python - Spring Batch ScriptItemProcessor
- amazon-ec2 - aws ec2 describe-snapshots 不返回标签
- sql - 使用 SQL 将 MS Access 信息返回到 Excel 电子表格
- php - Symfony 没有用户令牌,或者您忘记将控制器放在防火墙后面 @Security
- google-apps-script - 我如何显示带有超链接的图像?
- php - 使用 hubspot api 的 PHP curl 代码适用于多个订单,但有时会突然失败而没有任何响应
- python - 收敛到相同种群的遗传算法的交叉
- python - 如何获得上述人物的 3D 图?
- c# - ASP.NET Core 5.0 - 带颜色的全尺寸列
- mysql - 我可以根据按值分组为我的计数添加条件吗