如何从另一个命名空间查看k8s中的日志

问题描述 投票:0回答:1

我的目标是查看属于其他命名空间的 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/

kubernetes permissions namespaces
1个回答
0
投票

根据您提供的 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 后,再次测试从另一个命名空间获取日志,您应该能够跨所有命名空间访问日志。

© www.soinside.com 2019 - 2024. All rights reserved.