使用服务帐户令牌访问 k8s 集群

Accessing k8s cluster with service account token

是否可以使用 serviceaccount 令牌获得 k8s 集群访问权限?

我的脚本无法访问 kubeconfig 文件,但是,它可以访问位于 /var/run/secrets/kubernetes.io/serviceaccount/token.

的服务帐户令牌

以下是我尝试过的步骤,但它不起作用。

  1. kubectl config set-credentials sa-user --token=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
  2. kubectl config set-context sa-context --user=sa-user

但是当脚本 运行 "kubectl get rolebindings" 我得到以下错误: 来自服务器的错误(禁止):rolebindings.rbac.authorization.k8s.io 被禁止:用户“system:serviceaccount:test:default”无法在 API 组“rbac.authorization 中列出资源“rolebindings” .k8s.io”在命名空间“test”中

是的,这是可能的。例如,如果您通过令牌登录 K8S 仪表板,它确实使用相同的方式。

按照以下步骤操作;

创建服务帐户

$ kubectl -n <your-namespace-optional> create serviceaccount <service-account-name>

角色绑定将角色中定义的权限授予一个用户或一组用户。您可以使用预定义的角色,也可以创建自己的角色。查看此 link 了解更多信息。 https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-example

$ kubectl create clusterrolebinding <binding-name> --clusterrole=cluster-admin --serviceaccount=<namespace>:<service-account-name>

获取代币名称

$ TOKENNAME=`kubectl -n <namespace> get serviceaccount/<service-account-name> -o jsonpath='{.secrets[0].name}'`

最后,获取令牌并设置凭据

$ kubectl -n <namespace> get secret $TOKENNAME -o jsonpath='{.data.token}'| base64 --decode
$ kubectl config set-credentials <service-account-name> --token=<output from previous command>
$ kubectl config set-context --current --user=<service-account-name>

如果您认真按照这些步骤操作,您的问题就会得到解决。

Is possible to gain k8s cluster access with serviceaccount token?

当然,这就是 ServiceAccount 令牌的意义所在。您似乎要问的问题是“为什么我的 default ServiceAccount 没有我想要的所有权限”,这是一个不同的问题。阅读 the fine manual on the topic

会受益匪浅

如果您希望 test NS 中的 default SA 有权限读取其 NS 中的内容,您必须创建一个作用域为该 NS 的角色,然后显式声明关系。 SA 不会自动拥有这些权限

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: test
  name: test-default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: whatever-role-you-want
subjects:
- kind: ServiceAccount
  name: default
  namespace: test

but when the script ran "kubectl get pods" I get the following error: Error from server (Forbidden): rolebindings.rbac.authorization.k8s.io is forbidden: User "system:serviceaccount:test:default" cannot list resource "rolebindings" in API group "rbac.authorization.k8s.io" in the namespace "test"

大概你的意思是你可以 kubectl get rolebindings,因为我不希望 运行 kubectl get pods 发出那个错误