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. 【Javaweb】在项目中添加MyBatis依赖等

    pom.xml 仓库 如果你没有配置阿里云仓库镜像源,可以到这里来找 https://mvnrepository.com/ 如果你配置了阿里云仓库镜像源,可以来这里找 https://develope ...

  2. 聊一聊 C#线程池 的线程动态注入 (下)

    一:背景 1. 讲故事 前面二篇我们聊到了 Thread.Sleep 和 Task.Result 场景下的线程注入逻辑,在线程饥饿的情况下注入速度都不是很理想,那怎么办呢?有没有更快的注入速度,这篇作 ...

  3. Qt编写安防视频监控系统38-onvif校时

    一.前言 在视频监控系统中,对摄像机进行时间设置也是很有必要的,这样就和服务器或者软件这边统一了时间,一般在摄像机的画面上可以设置OSD标识当前时间,这样存储到视频文件中回放的时候,也能和本地的时间一 ...

  4. CentOS 集群初始化设置

    0. 前置操作 centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 下载CentOS-7-x86_64-DVD-2009.iso即可 1. 配置静态网络 1.1 查看 ...

  5. UML之图框架标题类型之谬

    在UML中,我们可以用一个被称为"框架"的边界框围绕着UML图形,当然在很多情况下,框架可以省略,也就是不将它描画出来.但是对于某些图形类型而言,框架具有语义意义,在这些图形类型中 ...

  6. 解决Failed to load module canberra-gtk-module错误

    在Ubuntu环境里,通过./triangulation 1.png 2.png 命令运行高翔的ch7的triangulation程序时报错: Gtk-Message: 09:10:26.571: F ...

  7. [转]Clion中如何使用矩阵库eigen

    CMakelist文件内容如下: cmake_minimum_required(VERSION 3.2) project(PISO) set(CMAKE_CXX_STANDARD 14) includ ...

  8. ERROR: SSL peer shut down incorrectly错误解决(Android Studio)

    错误信息:ERROR: SSL peer shut down incorrectly错误解决(Android Studio) 错误原因:android studio在下载"gradle-4. ...

  9. 网络编程懒人入门(十四):到底什么是Socket?一文即懂!

    本文由cxuan分享,原题"原来这才是 Socket",有修订. 1.引言 本系列文章前面那些主要讲解的是计算机网络的理论基础,但对于即时通讯IM这方面的应用层开发者来说,跟计算机 ...

  10. [LC623]在二叉树中增加一行

    题目描述 给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行. 注意,根节点 root 位于深度 1 . 加法规则如下: 给 ...