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

时间:2021-02-20 20:56:46

标签: kubernetes deployment

是否可以使用 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.k8s.io”中列出资源“rolebindings” “测试”

2 个答案:

答案 0 :(得分:2)

<块引用>

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

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

如果您希望 default NS 中的 test 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
<块引用>

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

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

答案 1 :(得分:1)

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

按照以下步骤操作;

创建服务帐号

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

角色绑定将角色中定义的权限授予一个用户或一组用户。您可以使用预定义的角色,也可以创建自己的角色。查看此链接以获取更多信息。 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>

如果您仔细按照这些步骤操作,您的问题将得到解决。