我很困惑。kubectl 说我可以(通过kubectl auth can-i
子命令),但是当我去执行操作时,我不能。
我已经安装kubectl
在一个 docker 镜像上,该镜像运行在一个由Deployment
. 当我kubectl exec -it
进入那个 pod(只有一个容器)时,我得到了这个。
user@my-pod:~$ kubectl auth can-i get secrets -n myNamespace
yes
user@my-pod:~$ kubectl get secrets -n myNamespace
Error from server (Forbidden):
secrets is forbidden:
User "system:serviceaccount:myNamespace:myServiceAccount"
cannot list resource "secrets" in API group "" in the namespace "myNamespace"
这是我的服务帐户的配置方式
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: myServiceAccount
namespace: myNamespace
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: myRole
namespace: myNamespace
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "describe"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: myRoleBinding
namespace: myNamespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: myRole
subjects:
- kind: ServiceAccount
name: myServiceAccount
namespace: myNamespace
我首先很想知道我是否使用kubectl auth can-i
不正确。
其次,我希望能够授权此服务帐户进行此 API 调用。我的 yaml 中是否存在错误配置?
这里发生的是两种不同方式使用之间的不幸碰撞,但
kubectl
仅以一种方式使用它。支持的动词列表显示在其参考页面上get
can-i
can-i
跑步:
kubectl auth can-i get secrets -n myNamespace
专门询问
get
动词。这相当于kubectl get secret my-awesome-secret
。如果您想了解kubectl get secret
,那就是使用列表动词,因此将通过以下方式进行测试:kubectl auth can-i list secrets -n myNamespace
下表中列出了区别:https ://kubernetes.io/docs/reference/access-authn-authz/authorization/#determine-the-request-verb
我相信您的解决方法
Role
是更新verbs:
以包括"list"
如果您想枚举Secret
s