kubectl auth can-i 说可以,但实际上不能

kubectl auth can-i 说可以,但实际上不能

我感到很困惑。kubectl 说我可以(通过kubectl auth can-i子命令),但是当我去执行操作时,却不能。

我已经安装kubectl在由 管理的 pod 上运行的 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 中是否存在配置错误?

答案1

这里发生的是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列举

rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "describe", "list"]

相关内容