Kubernetes 无法使用 API 查询 kubernetes secret

Kubernetes unable to query kubernetes secret using API

我正在尝试使用 API 查询 kubernetes secret,并且我使用以下命令

向帐户 "default:default" 提供了所需的权限
kubectl create rolebinding default-viewer \
  --clusterrole=view \
  --serviceaccount=default:default \
  --namespace=default

我能够使用以下命令

在命名空间“default”下查询 pods
   curl -v -s https://10.xx.xx.xx:6443/api/v1/namespaces/default/pods --header "Authorization: Bearer $TOKEN" --cacert /tmp/ca.crt

但是,当我尝试从命名空间 "default" 中获取 secrets 时,出现以下错误

curl -v -s https://10.xx.xx.xx:6443/api/v1/namespaces/default/secrets --header "Authorization: Bearer $TOKEN" --cacert /tmp/ca.crt

错误

 "message": "secrets is forbidden: User \"system:serviceaccount:default:default\" cannot list resource \"secrets\" in API group \"\" in the namespace \"default\"",

我不确定我在这里错过了什么?任何帮助

您已使用群集角色 view 提供对默认命名空间的服务帐户 default 的访问权限。似乎(至少在我的集群中)集群角色 view 不提供与秘密相关的任何权限。

  kubectl describe  clusterrole view |grep -iEw 'secret|pods'
  pods/log                                     []                 []              [get list watch]
  pods/status                                  []                 []              [get list watch]
  pods                                         []                 []              [get list watch]

如果你运行上面的命令和上面命令的输出是一样的,那么这就解释了为什么你可以查询pods而不是secrets。下面的命令打印其中包含字符串“secret”的集群角色。

kubectl get clusterrole -o name |while read cr; do k describe $cr |grep -q secret && echo "$cr is having secret"; done
clusterrole.rbac.authorization.k8s.io/admin is having secret
clusterrole.rbac.authorization.k8s.io/edit is having secret
clusterrole.rbac.authorization.k8s.io/system:aggregate-to-edit is having secret
clusterrole.rbac.authorization.k8s.io/system:controller:expand-controller is having secret
clusterrole.rbac.authorization.k8s.io/system:controller:persistent-volume-binder is having secret
clusterrole.rbac.authorization.k8s.io/system:kube-controller-manager is having secret
clusterrole.rbac.authorization.k8s.io/system:node is having secret

您可能需要创建一个新的 clusterrole/role 或修改现有的 clusterrole/role。

此外, 您可以 运行 使用 --raw 的 kubectl 来验证您的 API query/URI。这将从等式中删除证书、密钥、cacert 和令牌。例如:

kubectl get --raw  https://10.xx.xx.xx:6443/api/v1/namespaces/default/secrets --as system:serviceaccount:default:default