解决方案
- 为 Argo 工作流的 ServiceAccount 授权访问 services 资源
错误提示表明 Argo 的 ServiceAccount (system:serviceaccount:argo:default) 没有权限在 argo 命名空间下执行 patch 操作。你需要为该 ServiceAccount 授予适当的权限,允许其更新服务(services)。
创建一个 Role 或 ClusterRole 来授予 Argo 的 default ServiceAccount 更新服务的权限。
创建一个名为 argo-service-account-role.yaml 的文件,内容如下:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: argo
name: argo-service-account-role
rules:
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
然后,创建一个 RoleBinding 将该角色绑定到 argo 命名空间下的默认 ServiceAccount:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: argo-service-account-role-binding
namespace: argo
subjects:
- kind: ServiceAccount
name: default
namespace: argo
roleRef:
kind: Role
name: argo-service-account-role
apiGroup: rbac.authorization.k8s.io
然后应用这些文件:
kubectl apply -f argo-service-account-role.yaml
kubectl apply -f argo-service-account-role-binding.yaml
这样,Argo 的默认 ServiceAccount 就有权限更新服务了。
检查 Argo Workflow 的权限(确保它有足够权限)
如果你依赖于 Argo Workflow 来管理资源,确保你在工作流中应用了正确的权限策略。如果有权限问题,可以通过以下步骤来排查和修复:
通过 kubectl auth can-i 来检查当前 ServiceAccount 是否具有所需的权限。
kubectl auth can-i patch services --as system:serviceaccount:argo:default -n argo
如果返回 no,说明权限不足,你需要按照上面的步骤为该 ServiceAccount 分配适当的 Role 或 ClusterRole。