Kubernetes

kubectl auth can-i 說我可以,但我不能

  • June 3, 2020

我很困惑。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"如果您想列舉Secrets

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

引用自:https://serverfault.com/questions/1019782