kubernetes 具有服务帐户令牌的Rank8s群集

6pp0gazn  于 2023-11-17  发布在  Kubernetes
关注(0)|答案(3)|浏览(113)

是否可以使用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”时,我得到以下错误:Error from server(Forbidden):rolebindings.rbac.authorization.k8s.io is forbidden:用户“system:serviceaccount:test:default”无法列出命名空间“test”中API组“rbac.authorization.k8s.io”中的资源“rolebindings”
qvk1mo1f

qvk1mo1f1#

是否可以使用serviceaccount令牌获得k8s群集访问权限?
当然,这就是ServiceAccount令牌的意义所在。您似乎要问的问题是“为什么我的default ServiceAccount没有我想要的所有特权”,这是另一个问题。阅读有关此主题的详细手册将使您受益匪浅
如果希望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时发出该错误

vmjh9lq9

vmjh9lq92#

是的,这是可能的。例如,如果您通过令牌登录K8S Jmeter 板,它确实使用相同的方式。
遵循这些步骤;
创建服务帐户

$ 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>


如果你仔细遵循这些步骤,你的问题就会得到解决。

idv4meu8

idv4meu83#

请确保您选择正确的秘密,因为每个sa有两种不同的类型:

  • kubernetes.io/dockercfg
  • kubernetes.io/service-account-token

你要找的东西就在后面。

相关问题