从 kubernetes 获取 'cannot list resource "pods/var"'
Getting 'cannot list resource "pods/var"' from kubernetes
我正在尝试在自定义命名空间中设置 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(以防其中一个破坏另一个)
但是这些东西并没有改变任何东西。还有人有其他想法吗?
您的错误显示 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/log
、pods/status
或 pods/exec
更常见,尽管基于该错误,我猜 pods/var
是一回事?
解决此问题的一种方法是复制 view
角色,并添加您需要的内容:
kubectl get -o yaml clusterrole view >my-view-role.yaml
vi my-view-role.yaml
重置其元数据,并重命名 clusterrole,删除 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。
我正在尝试在自定义命名空间中设置 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(以防其中一个破坏另一个)
但是这些东西并没有改变任何东西。还有人有其他想法吗?
您的错误显示 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/log
、pods/status
或 pods/exec
更常见,尽管基于该错误,我猜 pods/var
是一回事?
解决此问题的一种方法是复制 view
角色,并添加您需要的内容:
kubectl get -o yaml clusterrole view >my-view-role.yaml
vi my-view-role.yaml
重置其元数据,并重命名 clusterrole,删除 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。