是否可以使用 serviceaccount 令牌获得 k8s 集群访问权限?
我的脚本无权访问 kubeconfig 文件,但是,它可以访问位于 /var/run/secrets/kubernetes.io/serviceaccount/token 的服务帐户令牌。
以下是我尝试过但不起作用的步骤。
但是当脚本运行“kubectl get rolebindings”时,我收到以下错误: 来自服务器的错误(禁止):rolebindings.rbac.authorization.k8s.io 被禁止:用户“system:serviceaccount:test:default”无法在命名空间中的 API 组“rbac.authorization.k8s.io”中列出资源“rolebindings” “测试”
答案 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>
如果您仔细按照这些步骤操作,您的问题将得到解决。