【问题标题】:Getting 'cannot list resource "pods/var"' from kubernetes从 kubernetes 获取“无法列出资源“pods/var””
【发布时间】:2021-08-11 17:41:03
【问题描述】:

我正在尝试在自定义命名空间中设置 fluent-bit。我采取了以下步骤(为了清楚起见,这里省略了很多):

我这样创建了服务帐户:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: k8s-logger
  namespace: efk

然后我将该服务帐户绑定到标准“视图”ClusterRrole:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: k8s-logger
subjects:
- kind: ServiceAccount
  name: k8s-logger
  namespace: efk
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io

最后,我创建了 fluent-bit DaemonSet 并告诉它使用“k8s-logger”ServiceAccount:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluent-bit
  namespace: efk
spec:
  template:
    spec:
      serviceAccount: k8s-logger
      serviceAccountName: k8s-logger
.
.
.

(顺便说一句,如果有人知道 serviceAccount 和 serviceAccountName 之间的区别,我有兴趣了解)。

但是,我在 fluent-bit 日志中得到以下输出:

pods is forbidden: User "system.serviceaccount:efk:k8s-logger" cannot list resource "pods/var" in API group "" in the namespace "work"

当它不起作用时,我开始验证:

  • Fluent-bit 正在使用自定义 ServiceAccount 进行连接: 我相信这是因为错误消息引用了system.serviceaccount:efk:k8s-logger
  • 服务帐户存在并且在正确的命名空间中:
    $ kubectl get serviceaccounts/k8s-logging --namespace=efk
    NAME        SECRETS   AGE
    k8s-logger  1         15h
    
  • ClusterRoleBinding 正确(引用正确的 ServiceAccount 和 ClusterRole):
    $ kubectl describe clusterrolebinding/k8s-logging
    Name:         k8s-logger
    Labels:       <none>
    Annotations:  <none>
    Role:
      Kind:  ClusterRole
      Name:  view
    Subjects:
      Kind            Name        Namespace
      ----            ----        ---------
      ServiceAccount  k8s-logger  efk
    
  • 最后,验证默认角色“view”是否拥有我需要的权限:
    $ kubectl describe clusterrole/view
    Name:       view
    Labels:     kubernetes.io/bootstrapping=rbac-defaults
    PolicyRule:
      Resources           Non-Resource URLs   Resource Names  Verbs
      ---------           -----------------   --------------  -----
      pods                []                  []              [get list watch]
      pods/log            []                  []              [get list watch]
      pods/status         []                  []              [get list watch]
      .
      .
      .
    

此时我不知道如何进一步调试或找出问题所在。我通过:

  • 使用我需要的权限创建自定义 ClusterRole(以防万一视图无法按我想象的方式工作)
  • 在 DaemonSet 规范中仅使用 serviceAccount 或 serviceAccountName(以防其中一个破坏另一个)

但这些事情并没有改变任何东西。有没有人有其他想法?

【问题讨论】:

    标签: kubernetes fluent-bit


    【解决方案1】:

    您的错误提示为 cannot list resource "pods/var" -- 并且作为免责声明:我从未见过该 RBAC 资源。

    虽然view ClusterRole 授予您以下读取权限:

    pods                []                  []              [get list watch]
    pods/log            []                  []              [get list watch]
    pods/status         []                  []              [get list watch]
    

    尝试创建自己的 ClusterRole,将 pods/var 添加到该列表中,假设这是一件事? pods/logpods/statuspods/exec 更常见,尽管基于那个错误,我猜 pods/var 是一个东西?

    解决此问题的一种方法是复制view 角色,并添加您需要的内容:

    kubectl get -o yaml clusterrole view >my-view-role.yaml
    vi my-view-role.yaml
    

    重置其元数据,重命名集群角色,删除aggregationRules(如果有):

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: view-plus
    rules:
    [...]
    

    按照错误消息的建议,保留原始规则,找到提及 pods/status 或 pods/log,并插入 pods/var:

    - apiGroups:
      - ""
      resources:
      - bindings
      - events
      - limitranges
      - namespaces/status
      - pods/log
      - pods/status
      - pods/var
      - replicationcontrollers/status
      - resourcequotas
      - resourcequotas/status
      verbs:
      - get
      - list
      - watch
    

    创建该 ClusterRole,kubectl create -f ...

    接下来,使用您的自定义 ClusterRole 替换您的 ClusterRoleBinding。

    【讨论】:

    • 就是这样。很困惑,因为我也从来没有听说过 pods/var,而且错误信息中提到了“pods is disabled”,所以我没有尝试。
    猜你喜欢
    • 2020-10-14
    • 2022-01-03
    • 1970-01-01
    • 2020-10-16
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多