You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K8s配置ChaosToolkit RBAC后仍用默认ServiceAccount报403权限错误

问题原因
  • 字段层级配置错误:ChaosToolkitExperiment CRD中serviceAccountName和automountServiceAccountToken不属于spec根级字段,需要嵌套在spec.pod字段下才会被Operator识别。你当前的配置把这两个字段写在了spec根目录,Operator读取不到自定义SA配置,就会自动生成格式为chaostoolkit-<随机字符串>的临时服务账号运行实验Pod,这也是报错里出现自动生成SA的根本原因。
  • 服务账号命名空间不匹配:实验Pod默认运行在chaostoolkit-run命名空间,而ServiceAccount是命名空间级资源,如果你创建的test-user不在chaostoolkit-run命名空间下,就算字段写对也无法正常引用。
  • 配置项冲突:你当前设置了automountServiceAccountToken: false,会禁止Pod挂载SA的API访问凭证,就算SA配置正确,也无法调用Kubernetes API执行操作。另外你在实验Secrets中硬编码了KUBERNETES_CONTEXT: "docker-desktop",这个是本地docker-desktop集群的上下文配置,在集群内Pod中运行时无效,会干扰chaosk8s模块自动加载集群内SA凭证。
  • RBAC权限范围不匹配:从报错看你实际在操作task-dispatcher命名空间的Pod,但你实验配置里写的ns: default,且需要确认test-user是否已经绑定了目标操作命名空间下Pod的list、delete等必要权限。
调整步骤
  1. 修正ChaosToolkitExperiment CRD的字段层级,将SA相关配置移动到spec.pod下,同时打开SA token自动挂载,修正后的CRD配置参考如下:
apiVersion: chaostoolkit.org/v1
kind: ChaosToolkitExperiment
metadata:
  name: my-chaos-exp
  namespace: chaostoolkit-crd
spec:
  pod:
    serviceAccountName: test-user
    automountServiceAccountToken: true
    image: chaostoolkit/chaostoolkit:full
    imagePullPolicy: IfNotPresent
    experiment:
      configMapName: my-chaos-exp
      configMapExperimentFileName: experiment.yaml
  restartPolicy: Never
  1. 确认test-user服务账号创建在chaostoolkit-run命名空间下,如果之前建在其他命名空间需要重建,或者在chaostoolkit-run下新建同名SA。
  2. 调整experiment.yaml配置,删除硬编码的KUBERNETES_CONTEXT字段,同时修正你要操作的目标命名空间(如果要操作task-dispatcher就把ns改成task-dispatcher,要操作default就保留default),修正后的ConfigMap参考:
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-chaos-exp
  namespace: chaostoolkit-run
data:
  experiment.yaml: | 
    ---
    version: 1.0.0
    title: Terminate Pod Experiment
    description: If a pod gets terminated, a new one should be created in its place in a reasonable amount of time.
    tags: ["kubernetes"]
    method:
    - type: action
      name: terminate-k8s-pod
      provider:
        type: python
        module: chaosk8s.pod.actions
        func: terminate_pods
        arguments:
          label_selector: ''
          name_pattern: my-release-rabbitmq-[0-9]$
          rand: true
          ns: task-dispatcher # 改成你实际要操作的命名空间
  1. 给test-user绑定目标命名空间的Pod操作权限,参考RBAC配置如下(如果要操作多个命名空间可以调整为ClusterRole和对应ClusterRoleBinding):
# 针对task-dispatcher命名空间的权限角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: task-dispatcher
  name: chaos-pod-manager
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list", "get", "delete"]
---
# 将角色绑定到chaostoolkit-run命名空间下的test-user SA
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: chaos-pod-manager-binding
  namespace: task-dispatcher
subjects:
- kind: ServiceAccount
  name: test-user
  namespace: chaostoolkit-run
roleRef:
  kind: Role
  name: chaos-pod-manager
  apiGroup: rbac.authorization.k8s.io
  1. 重新apply配置后,删除之前失败的实验关联Pod,Operator会自动用新配置创建实验Pod,此时Pod会使用test-user作为服务账号,不会再出现403报错。

内容的提问来源于stack exchange,提问作者Kenny Jefferson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:24:18