1、概述

  Kubernetes 中的 TokenReview 是用于验证令牌(Token)有效性的一种 API 资源,属于 authentication.k8s.io/v1 API 组。它允许客户端通过创建 TokenReview 对象向 API Server 发起一个请求以验证一个令牌是否合法,并获取与该令牌关联的用户信息(如用户名、组、附加属性等)。大致验证流程如下:

+----------------+          (1) 创建 TokenReview 请求       +----------------+
| 客户端 | ------------------------------------> | API Server |
| (外部服务等) | | (服务端) |
+----------------+ <------------------------------------ +----------------+
(2) 返回验证结果(status 字段)
  1. 当客户端(如第三方服务、自定义控制器或 CLI 工具)需要验证一个令牌时,它通过创建 TokenReview 对象向 API Server 发起一个请求。

  2. 真正执行验证逻辑的是 API Server(服务端),服务端帮助客户端验证令牌。

  3. API Server 根据配置的认证机制(如 ServiceAccount、Webhook 等)验证令牌,并返回结果(status.authenticated、status.user 等)。

2、TokenReview 的用途

  • 令牌验证:验证一个令牌(如 ServiceAccount Token)是否有效。

  • 身份信息获取:返回与该令牌关联的身份信息(如用户、组、扩展属性等)。

  • 集成认证:用于自定义身份验证流程(例如与外部认证服务集成)。

3、TokenReview 的定义

  TokenReview是一个 Kubernetes API 对象,其结构如下:

apiVersion: authentication.k8s.io/v1
kind: TokenReview
spec:
token: "<Bearer Token>" # 要验证的令牌(必需)
audiences: ["aud1", "aud2"] # 可选:指定令牌的目标受众(audience),如果令牌的受众不匹配,验证会失败,通过kube-apiserver验证话受众为https://kubernetes.default.svc.cluster.local

4、使用示例

4.1 为用户创建Token

(1)创建用户:

apiVersion: v1
kind: ServiceAccount
metadata:
name: zmc-serviceaccount

注意:在 Kubernetes v1.24 之前,每当创建一个 ServiceAccount 时,Kubernetes 会自动为其创建一个包含令牌(token)的 Secret 对象,并且将这个 Secret 挂载到使用该 ServiceAccount 的 Pod 中,以便 Pod 可以使用这个令牌与 Kubernetes API 服务器进行通信。在Kubernetes v1.24 版本开始,创建 ServiceAccount 时默认不再自动创建对应的 Secret 对象。

(2)通过TokenRequest 为给定的服务账号请求一个令牌

可以使用 TokenRequest API 动态请求令牌。示例如下,使用 kubectl 为 ServiceAccount 请求令牌:

kubectl create token <serviceaccount-name>

也可以通过编写代码向 Kubernetes API 服务器发送 TokenRequest 请求,例如使用 curl 在 Pod 内请求令牌:

TOKEN=$(curl -s -X POST \
-H "Content-Type: application/json" \
-d '{"apiVersion": "authentication.k8s.io/v1", "kind": "TokenRequest", "spec": {"audience": "https://kubernetes.default.svc"}}' \
https://kubernetes.default.svc/api/v1/namespaces/<namespace>/serviceaccounts/<serviceaccount-name>/token \
--cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
--header "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)")
echo $TOKEN

本来通过kubectl命令为ServiceAccount zmc-serviceaccount颁发令牌:

kubectl create token zmc-serviceaccount
eyJhbGciOiJSUzI1NiIsImtpZCI6ImpyaFRNMDRFR0h5a2JpSUY2Vk5jM2lZYnRYY2Fwcl9yTmhDV04tTkdzdnMifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzQxMjY4NDEzLCJpYXQiOjE3NDEyNjQ4MTMsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0Iiwic2VydmljZWFjY291bnQiOnsibmFtZSI6InptYy1zZXJ2aWNlYWNjb3VudCIsInVpZCI6ImJhZDE1ODExLWMyMzktNGEzYy1hMTkzLWI3ZWViYWRmY2YxZSJ9fSwibmJmIjoxNzQxMjY0ODEzLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDp6bWMtc2VydmljZWFjY291bnQifQ.u53WwYrQILWQEIkKo06J6eIBB1Tw5oqEdCAMuRsx7XBjPZZM79WcVi-cGcRmzIAX6Hqdqqg6IMVf9xWzLYx1yfO7sad183Wbq_puJJJDH5o2C6mdUEcfthAD7EKmhgF35JFCYSnM0d7d0-8xRVyelNALR-Ex7yr91EL1e5OUuu9hx7fbhL91xeIxwTzB-5dNPt16km8Z9pdt4HzG3EC_zWeBdHIwEK5DRc1fvPenwDAbRFNQGMNAXQrLjPNJjGQboBC6M70fXwOxDa8l-9oNDIfWlx5bBNqCzUYaT3gx4G5tsRd99UmCcVN8EVlw_7h119GiYJlIPgjx1nqT2q28vg

验证token:

4.2 客户端通过创建TokenReview对象向API Server发起一个请求以验证一个令牌是否合法,并获取与该令牌关联的用户信息

同4.1,向API Server发送认证请求同样可以通过Kubectl或者通过 Kubernetes API 调用2种方式,这里通过Kubernetes API调用演示:

# export CURL_CA_BUNDLE=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
# TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
# curl -X POST https://192.168.137.159:6443/apis/authentication.k8s.io/v1/tokenreviews \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data '{
"apiVersion": "authentication.k8s.io/v1",
"kind": "Tok> enReview",
"spec": {
"token": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImpyaFRNMDRFR0h5a2JpSUY2Vk5jM2lZYnRYY2Fwcl9yTmhDV04tTkdzdnM> ifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzQxMjY4NDEzLCJpYXQiOjE3NDE> yNjQ4MTMsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pb> yI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0Iiwic2VydmljZWFjY291bnQiOnsibmF> tZSI6InptYy1zZXJ2aWNlYWNjb3VudCIsInVpZCI6ImJhZDE1ODExL> WMyMzktNGEzYy1hMTkzLWI3ZWViYWRmY2YxZSJ9fSwibmJmIjoxNzQx> MjY0ODEzLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDp6bWMtc2VydmljZWFjY291bnQifQ.u53WwYrQILWQEIkKo06J6eIBB1Tw5oqEdCAMuRsx7XBjPZZM79WcVi-cGcRmzIAX6Hqdqqg6IMVf9xWzLYx1yfO7sad183Wbq_puJJJDH5o2C6mdUEcfthAD7EKmhgF35JFCYSnM0d7d0-8xRVyelNALR-Ex7yr91EL1e5OUuu9hx7fbhL91xeIxwTzB-5dNPt16km8Z9pdt4HzG3EC_zWeBdHIwEK5DRc1fvPenwDAbRFNQGMNAXQrLjPNJjGQboBC6M70fXwOxDa8l-9oNDIfWlx5bBNqCzUYaT3gx4G5tsRd99UmCcVN8EVlw_7h119GiYJlIPgjx1nqT2q28vg"
}
}'
> > {
"kind": "TokenReview",
"apiVersion": "authentication.k8s.io/v1",
"metadata": {
"creationTimestamp": null,
"managedFields": [
{
"manager": "curl",
"operation": "Update",
"apiVersion": "authentication.k8s.io/v1",
"time": "2025-03-06T13:06:59Z",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:spec": {
"f:token": {}
}
}
}
]
},
"spec": {
"token": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImpyaFRNMDRFR0h5a2JpSUY2Vk5jM2lZYnRYY2Fwcl9yTmhDV04tTkdzdnMifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzQxMjY4NDEzLCJpYXQiOjE3NDEyNjQ4MTMsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0Iiwic2VydmljZWFjY291bnQiOnsibmFtZSI6InptYy1zZXJ2aWNlYWNjb3VudCIsInVpZCI6ImJhZDE1ODExLWMyMzktNGEzYy1hMTkzLWI3ZWViYWRmY2YxZSJ9fSwibmJmIjoxNzQxMjY0ODEzLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDp6bWMtc2VydmljZWFjY291bnQifQ.u53WwYrQILWQEIkKo06J6eIBB1Tw5oqEdCAMuRsx7XBjPZZM79WcVi-cGcRmzIAX6Hqdqqg6IMVf9xWzLYx1yfO7sad183Wbq_puJJJDH5o2C6mdUEcfthAD7EKmhgF35JFCYSnM0d7d0-8xRVyelNALR-Ex7yr91EL1e5OUuu9hx7fbhL91xeIxwTzB-5dNPt16km8Z9pdt4HzG3EC_zWeBdHIwEK5DRc1fvPenwDAbRFNQGMNAXQrLjPNJjGQboBC6M70fXwOxDa8l-9oNDIfWlx5bBNqCzUYaT3gx4G5tsRd99UmCcVN8EVlw_7h119GiYJlIPgjx1nqT2q28vg"
},
"status": { //验证结果通过 status 字段返回
"authenticated": true, #令牌是否有效
"user": {
"username": "system:serviceaccount:default:zmc-serviceaccount", #关联的用户名
"uid": "bad15811-c239-4a3c-a193-b7eebadfcf1e", #用户唯一标识
"groups": [
"system:serviceaccounts",
"system:serviceaccounts:default",
"system:authenticated"
]
},
"audiences": [ #令牌的受众
"https://kubernetes.default.svc.cluster.local"
]
}
}

关键响应字段:

status.authenticated:true 表示令牌有效,false 表示无效。
status.user:令牌关联的用户信息(遵循 Kubernetes 用户模型)。
status.audiences:令牌实际生效的受众列表。
status.error:如果验证失败,返回错误原因(如 Token expired)。

注意 1:确保调用Kube-APIServer服务的客户端拥有创建TokenReview资源对象的权限。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: tokenreview-creator
rules:
- apiGroups: ["authentication.k8s.io"]
resources: ["tokenreviews"]
verbs: ["create"]

注意 2: 客户端获创建 TokenReview 权限,便能调用 Kube-APIServer,对令牌合法性进行验证,可以帮助鉴定Token合法性。

5、 应用场景

  • ServiceAccount Token 验证:当 Pod 使用 ServiceAccount 访问 API Server 时,API Server 会自动验证其 Token 的有效性。

  • 外部身份提供者集成:与 OpenID Connect (OIDC)、Webhook Token Authentication 等外部认证系统集成时,可通过TokenReview验证外部令牌。

  • 自定义身份验证逻辑:开发自定义控制器或服务时,可能需要验证客户端提供的令牌是否合法。

6、总结

  通过TokenReview,Kubernetes 提供了一种标准化的方式验证令牌并获取身份信息,是实现安全认证的关键机制之一。

  • TokenReview 的验证行为始终由服务端(API Server)执行,客户端仅通过 API 触发验证请求。

  • 这种设计将验证逻辑集中在服务端,同时为客户端提供了一种标准化的身份验证查询方式,兼顾安全性与灵活性。

参考文档:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/authentication-resources/token-request-v1/

参考文档:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/authentication-resources/token-review-v1/

Kubernetes身份认证资源 —— TokenReview详解的更多相关文章

  1. Kubernetes K8S之CPU和内存资源限制详解

    Kubernetes K8S之CPU和内存资源限制详解 Pod资源限制 备注:CPU单位换算:100m CPU,100 milliCPU 和 0.1 CPU 都相同:精度不能超过 1m.1000m C ...

  2. Kubernetes K8S之存储Volume详解

    K8S之存储Volume概述与说明,并详解常用Volume示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C ...

  3. Shiro 登录认证源码详解

    Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...

  4. Kubernetes YAML 文件全字段详解

    Kubernetes YAML 文件全字段详解 Deployment yaml 其中主要参数都在podTemplate 中,DaemonSet StatefulSet 中的pod部分一样. apiVe ...

  5. CDA考试 ▏2017 CDA L1备考资源习题详解-统计基础部分

    CDA考试 ▏2017 CDA L1备考资源习题详解-统计基础部分 <CDA LEVEL 1描述性分析典型例题讲解> 主讲人:CDA命题组委会 傅老师 ▏2017 CDA L1备考资源习题 ...

  6. Kubernetes集群YAML文件详解

    Kubernetes集群YAML文件详解 概述 k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到YAML 格式文件中,我们把这种 ...

  7. services资源+pod详解

    services资源+pod详解 一.Service 虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题: Pod IP 会随着Pod的重建产生变化 Pod IP 仅仅是集群内可见的虚 ...

  8. delphi 资源文件详解

    delphi资源文件详解 一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便 ...

  9. res文件夹及xml资源文件详解

    目录 一.values文件:存放字符串(strings).颜色(colors).尺寸(dimens).数组(arrays).样式(styles类似于CSS文件).类型等资源 二.drawable:存放 ...

  10. Kubernetes K8S之存储ConfigMap详解

    K8S之存储ConfigMap概述与说明,并详解常用ConfigMap示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS ...

随机推荐

  1. 实现一个分布式调用(OkHttp+SpringBoot)

    很多情况,trace是分布在不同的应用中的,最常用的远程调用方式就是Http. 在这种情况下,我们通常通过增加额外的Http Header传递Trace信息,然后将其组织起来. 本部分通过构建一个目前 ...

  2. C#中定义类时关于CLSCompliant属性的声明

    今天在做code analysis时,遇到了这个提示 Warning 1 CA1014 : Microsoft.Design : Mark 'Demo.exe' with CLSCompliant(t ...

  3. 微信团队分享:微信后端海量数据查询从1000ms降到100ms的技术实践

    本文由微信技术团队仇弈彬分享,原题"微信海量数据查询如何从1000ms降到100ms?",本文进行了内容修订和排版优化. 1.引言 微信的多维指标监控平台,具备自定义维度.指标的监 ...

  4. IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)

    本文由金蝶随手记技术团队丁同舟分享. 1.引言 跟移动端IM中追求数据传输效率.网络流量消耗等需求一样,随手记客户端与服务端交互的过程中,对部分数据的传输大小和效率也有较高的要求,普通的数据格式如 J ...

  5. 即时通讯安全篇(九):为什么要用HTTPS?深入浅出,探密短连接的安全性

    本文由ELab技术团队分享,原题"探秘HTTPS",有修订和改动. 1.引言 对于IM开发者来说,IM里最常用的通信技术就是Socket长连接和HTTP短连接(通常一个主流im会是 ...

  6. Mybatis-Plus 多租户模式忽略某个方法

    Mapper 类方法添加注解: @InterceptorIgnore(tenantLine = "true") 亲测有效.

  7. 如何快速的开发一个完整的iOS直播app(点赞功能)

    客户端代码 点击小红心,发送socket给服务器,并且要传递房间Key给服务器,通知给哪个主播点赞,就能传入到对应的分组socket中 怎么传递房间key,房间Key在主播界面,一般一个客户端,只会产 ...

  8. PICO 避坑指南

    1. Win10 不需要串口驱动,使用PICO W之前先刷固件pico w的固件 micropython-firmware-pico-w-290622.rar 刚开始 刷的固件不对,一直无法识别串口. ...

  9. 从v-for的key说起

    一.v-for中的key是为什么存在呢? 这是vue官网给key的定义,key主要用于vue的虚拟dom算法.新的问题出现了,vue的虚拟dom算法是什么? 二.虚拟domg算法 我们的程序在运行时, ...

  10. hello-world-python

    Hello World 各位朋友们,大家好,我是jason,欢迎来到我的博客. 今天,我教大家如何使用Python来写一个简单的"Hello World"程序. 如何使用Pytho ...