通过承载令牌授权访问Kubernetes api

通过承载令牌授权访问Kubernetes api,kubernetes,Kubernetes,我正在尝试使用RESTAPI访问kubernetes群集。我按照的指示,但我想得到集群的吊舱 APISERVER=$(kubectl配置视图--minify-ojsonpath='{.clusters[0].cluster.server}') SECRET_NAME=$(kubectl get-serviceaccount默认值-o jsonpath='{.secrets[0].NAME}') 令牌=$(kubectl get secret$secret_NAME-o jsonpath='{.d

我正在尝试使用RESTAPI访问kubernetes群集。我按照的指示,但我想得到集群的吊舱

APISERVER=$(kubectl配置视图--minify-ojsonpath='{.clusters[0].cluster.server}')
SECRET_NAME=$(kubectl get-serviceaccount默认值-o jsonpath='{.secrets[0].NAME}')
令牌=$(kubectl get secret$secret_NAME-o jsonpath='{.data.TOKEN}'| base64--解码)
curl$APISERVER/api/v1/pods——标题“Authorization:Bearer$TOKEN”——不安全
结果是:

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "pods is forbidden: User \"system:serviceaccount:default:default\" cannot list resource \"pods\" in API group \"\" at the cluster scope",
  "reason": "Forbidden",
  "details": {
    "kind": "pods"
  },
  "code": 403
我通过运行以下命令尝试了相同的
(curl localhost:8001/api/v1/pods)

kubectl proxy --address='0.0.0.0' --disable-filter=true
在集群的主节点上,现在它可以根据需要工作


我怎样才能让竞技场持有者以同样的方式工作

您正在使用
default
服务帐户获取POD<代码>默认值服务帐户没有该权限。您可以通过运行来检查操作是否被允许

$ kubectl auth can-i get pods --as system:serviceaccount:default:default
no

“消息”:“pods被禁止:用户\”系统:serviceaccount:默认值:默认值\“无法在群集范围的API组\“\”中列出资源\“pods\”

如上所示,默认服务帐户无法列出POD

但当赋予适当的角色和如下所示的角色绑定时

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: demo-role
  namespace: default
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: demo-binding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: demo-role
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
现在如果你查一下

$ kubectl auth can-i get pods --as system:serviceaccount:default:default
yes
如果要使用api列出默认命名空间的吊舱,请运行

$ APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
$ SECRET_NAME=$(kubectl get serviceaccount default -o jsonpath='{.secrets[0].name}')
$ TOKEN=$(kubectl get secret $SECRET_NAME -o jsonpath='{.data.token}' | base64 --decode)

$ curl $APISERVER/api/v1/namespaces/default/pods --header "Authorization: Bearer $TOKEN" --insecure
{
  "kind": "PodList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/namespaces/default/pods",
    "resourceVersion": "1589"
  },
  "items": []
}

您正在使用
default
服务帐户获取POD<代码>默认值服务帐户没有该权限。您可以通过运行来检查操作是否被允许

$ kubectl auth can-i get pods --as system:serviceaccount:default:default
no

“消息”:“pods被禁止:用户\”系统:serviceaccount:默认值:默认值\“无法在群集范围的API组\“\”中列出资源\“pods\”

如上所示,默认服务帐户无法列出POD

但当赋予适当的角色和如下所示的角色绑定时

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: demo-role
  namespace: default
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: demo-binding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: demo-role
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
现在如果你查一下

$ kubectl auth can-i get pods --as system:serviceaccount:default:default
yes
如果要使用api列出默认命名空间的吊舱,请运行

$ APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
$ SECRET_NAME=$(kubectl get serviceaccount default -o jsonpath='{.secrets[0].name}')
$ TOKEN=$(kubectl get secret $SECRET_NAME -o jsonpath='{.data.token}' | base64 --decode)

$ curl $APISERVER/api/v1/namespaces/default/pods --header "Authorization: Bearer $TOKEN" --insecure
{
  "kind": "PodList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/namespaces/default/pods",
    "resourceVersion": "1589"
  },
  "items": []
}

为了能够获得所有名称空间的POD,您必须定义集群角色和集群角色绑定,而不是角色/角色绑定对

apiVersion:rbac.authorization.k8s.io/v1 种类:ClusterRole 元数据: 名称:获取豆荚 规则: -apiGroups:[“”] 资源:[“豆荚”] 动词:[“get”] --- apiVersion:rbac.authorization.k8s.io/v1 种类:簇状卷边 元数据: 名称:获取pods绑定 学科: -种类:服务帐户 名称:默认值 名称空间:默认值 roleRef: 种类:ClusterRole 名称:获取豆荚 apiGroup:rbac.authorization.k8s.io 您可以将其保存到名为例如
get\u pods\u role.yaml
的文件中,并执行
kubectl create-f get\u pods\u role.yaml
。 然后,您将能够通过以下方式获得所需的输出:

APISERVER=$(kubectl配置视图--minify-ojsonpath='{.clusters[0].cluster.server}')
SECRET_NAME=$(kubectl get-serviceaccount默认值-o jsonpath='{.secrets[0].NAME}')
令牌=$(kubectl get secret$secret_NAME-o jsonpath='{.data.TOKEN}'| base64--解码)
curl$APISERVER/api/v1/pods——标题“Authorization:Bearer$TOKEN”——不安全

为了能够获得所有名称空间的POD,您必须定义集群角色和集群角色绑定,而不是角色/角色绑定对

apiVersion:rbac.authorization.k8s.io/v1 种类:ClusterRole 元数据: 名称:获取豆荚 规则: -apiGroups:[“”] 资源:[“豆荚”] 动词:[“get”] --- apiVersion:rbac.authorization.k8s.io/v1 种类:簇状卷边 元数据: 名称:获取pods绑定 学科: -种类:服务帐户 名称:默认值 名称空间:默认值 roleRef: 种类:ClusterRole 名称:获取豆荚 apiGroup:rbac.authorization.k8s.io 您可以将其保存到名为例如
get\u pods\u role.yaml
的文件中,并执行
kubectl create-f get\u pods\u role.yaml
。 然后,您将能够通过以下方式获得所需的输出:

APISERVER=$(kubectl配置视图--minify-ojsonpath='{.clusters[0].cluster.server}')
SECRET_NAME=$(kubectl get-serviceaccount默认值-o jsonpath='{.secrets[0].NAME}')
令牌=$(kubectl get secret$secret_NAME-o jsonpath='{.data.TOKEN}'| base64--解码)
curl$APISERVER/api/v1/pods——标题“Authorization:Bearer$TOKEN”——不安全