Kubernetes CronJob因RBAC服务账户权限问题无法创建Docker Registry类型Secret
Kubernetes CronJob因RBAC服务账户权限问题无法创建Docker Registry类型Secret
看起来你的问题根源主要出在RBAC角色的配置细节上,还有一个ServiceAccount的设置需要留意,下面给你拆解和解决方法:
核心问题:Role中resourceNames导致Create权限失效
你在role-full-access-to-secrets这个Role里指定了resourceNames: ["regcred"],这个配置的作用是把权限限制在已存在的特定Secret资源上。但create操作是用来生成新资源的,此时regcred还未存在,RBAC规则无法匹配到这个权限,所以你的ServiceAccount实际上没有创建Secret的权限。
而删除操作能成功,是因为delete针对的是已经存在的regcred,刚好能匹配到resourceNames的限制,所以权限校验通过了。
修复方式:拆分Role规则
把针对已有资源的操作和创建操作分开写,创建操作不需要resourceNames限制:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: creationTimestamp: '2023-09-11T00:06:03Z' name: role-full-access-to-secrets namespace: cfh rules: # 针对已存在的regcred的操作(删除、查询等) - apiGroups: - '' resourceNames: - regcred resources: - secrets verbs: - delete - get - list - patch - update - watch # 专门用于创建Secret的规则,不限制resourceNames - apiGroups: - '' resources: - secrets verbs: - create
次要问题:ServiceAccount的token挂载设置
你的默认ServiceAccount配置了automountServiceAccountToken: false,这会导致Pod无法自动挂载ServiceAccount的认证token,而kubectl默认依赖这个token和K8s API通信。虽然你的删除操作成功了,可能是因为你通过secretRef传入了其他认证凭证,但为了确保kubectl能稳定完成所有操作,建议开启自动挂载:
apiVersion: v1 kind: ServiceAccount metadata: name: default creationTimestamp: '2023-09-10T22:14:31Z' namespace: cfh automountServiceAccountToken: true
或者也可以在CronJob的Pod模板里单独配置:
spec: jobTemplate: spec: template: spec: automountServiceAccountToken: true serviceAccountName: default # 其他容器配置...
验证步骤
- 应用修改后的Role和ServiceAccount配置:
kubectl apply -f your-role.yaml -n cfh kubectl apply -f your-serviceaccount.yaml -n cfh - 手动触发CronJob生成一个Job,观察日志是否能成功创建Secret:
kubectl create job --from=cronjob/ecr-registry-helper test-ecr-secret -n cfh kubectl logs -f test-ecr-secret-<pod-suffix> -n cfh
备注:内容来源于stack exchange,提问作者Walker Christie
相关产品推荐
相关产品推荐

