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等必要权限。
调整步骤
- 修正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
- 确认
test-user服务账号创建在chaostoolkit-run命名空间下,如果之前建在其他命名空间需要重建,或者在chaostoolkit-run下新建同名SA。 - 调整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 # 改成你实际要操作的命名空间
- 给
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
- 重新apply配置后,删除之前失败的实验关联Pod,Operator会自动用新配置创建实验Pod,此时Pod会使用
test-user作为服务账号,不会再出现403报错。
内容的提问来源于stack exchange,提问作者Kenny Jefferson
相关产品推荐
相关产品推荐

