我的目标是查看属于其他命名空间的 pod 的日志,以便诊断问题。
以下是我配置的权限:
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: jenkins
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: listar-recursos
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: asgina-lista-recursos
namespace: jenkins
subjects:
- kind: ServiceAccount
name: default
namespace: jenkins
roleRef:
kind: ClusterRole
name: listar-recursos
apiGroup: rbac.authorization.k8s.io
这是从 jenkins 命名空间内的 pod 运行后的结果:
kubectl logs -l name=myapp -n anothernamespace
Error from server (Forbidden): pods is forbidden:
User "system:serviceaccount:jenkins:default"
cannot list resource "pods" in API group ""
in the namespace "anothernamespace"
问之前,我仔细阅读了这篇文章: https://kubernetes.io/docs/reference/access-authn-authz/rbac/
根据您提供的 YAML 配置,我在这里看到的关键问题是您在 jenkins
命名空间中设置了
RoleBinding,这限制了授予该特定命名空间的权限范围。但是,为了跨不同命名空间访问 pod 等资源及其日志,您需要使用 ClusterRoleBinding 而不是 RoleBinding。
A ClusterRoleBinding 将关联的 ClusterRole 中定义的权限授予所有命名空间中的用户或组。
首先,我建议将您的
RoleBinding
更改为 ClusterRoleBinding
,即:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: asgina-lista-recursos-global
subjects:
- kind: ServiceAccount
name: default
namespace: jenkins
roleRef:
kind: ClusterRole
name: listar-recursos
apiGroup: rbac.authorization.k8s.io
此配置将
listar-recursos
ClusterRole 绑定到 default
命名空间中的 jenkins
ServiceAccount,但由于使用了 ClusterRoleBinding
,该绑定在所有命名空间中都有效。
然后继续将此更新后的配置应用到您的 Kubernetes 集群。
应用更新后的 ClusterRoleBinding 后,再次测试从另一个命名空间获取日志,您应该能够跨所有命名空间访问日志。