【问题标题】:Accessing k8s cluster with service account token使用服务帐户令牌访问 k8s 集群
【发布时间】:2023-03-03 11:45:01
【问题描述】:

是否可以使用 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” “测试”

【问题讨论】:

    标签: kubernetes deployment


    【解决方案1】:

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

    当然,这就是 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
    

    但是当脚本运行“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 会发出那个错误

    【讨论】:

    • 就是这样。谢谢。
    • 我很高兴它对你有用;请将答案标记为已接受,以便其他人知道您的问题已解决
    【解决方案2】:

    是的,这是可能的。例如,如果您通过令牌登录 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>
    

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

    【讨论】:

    • 此服务帐户的令牌存储在容器中的什么位置?我在 /var/run/secrets/kubernetes.io/serviceaccount/token 下没有看到另一个。谢谢!
    猜你喜欢
    • 2022-08-13
    • 1970-01-01
    • 2019-05-04
    • 2021-06-05
    • 2019-08-21
    • 2017-10-07
    • 2019-01-05
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多