首页 > 解决方案 > 带有 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。

有什么建议么?

谢谢!

标签: kubernetes

解决方案


我无法发表评论,所以我将分享一些可能是问题的想法以及我将如何进一步调试问题。

对于您的部署,您没有定义命名空间,是否可能是 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 收到权限错误

来源


推荐阅读