news 2026/8/2 2:33:48

16-Pod 身份与认证机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
16-Pod 身份与认证机制

Pod 身份与认证机制

概念引入

在文章 14 中你学了 RBAC——“谁能做什么”。但有个问题被跳过了:API Server 怎么知道"你是谁"?

RBAC(文章 14) → 授权(Authorization)→ "你有权限做这个操作吗?" Pod 身份(本篇) → 认证(Authentication)→ "你是谁?你是合法的 Pod 吗?"

每个 Pod 从出生就携带一个"身份证"——ServiceAccount Token。Pod 用这个 Token 访问 API Server。

Pod

身份绑定

Bearer Token 认证

通过 RBAC 检查权限

ServiceAccount
my-app-sa

Projected Token
(自动挂载到 /var/run/secrets/...)

API Server
验证 Token → 识别身份

授权判断:
这个身份能 GET pods 吗?

学完本篇你将能够:

  • 查看 Pod 自动挂载的 ServiceAccount Token,理解 Pod 如何向 API Server 证明身份
  • 区分新版 projected token 和旧版 Secret token 的差异
  • 为 Pod 配置自定义 ServiceAccount,结合 RBAC 控制 API 访问权限

原理讲解

Pod 的身份证:ServiceAccount Token

每个 Pod 创建时,K8s 自动做三件事:

  1. 为 Pod 创建一个ServiceAccount Token(通过 TokenRequest API)
  2. 将 Token 以projected volume方式挂载到 Pod 内
  3. Token 有过期时间,kubelet 会自动续期
# 进入任何 Pod 都能看到 Tokenls/var/run/secrets/kubernetes.io/serviceaccount/# ca.crt namespace token ← 三个文件

Schema:从创建 Pod 到认证的全链路

API ServerTokenRequest APIkubeletPodAPI ServerTokenRequest APIkubeletPodPod 创建阶段Pod 运行时需要 ServiceAccount TokenTokenRequest(sa=my-app-sa, audience=api, expiration=3600s)签发 JWT Token挂载到 projected volumeGET /api/v1/namespaces/default/podsAuthorization: Bearer <token>验证 JWT 签名 + 过期时间识别 SA 身份:system:serviceaccount:default:my-app-saRBAC 检查:这个 SA 能 list pods 吗?允许/拒绝

新 Token vs 旧 Secret Token

特性新版 Projected Token(1.21+)旧版 Secret Token
过期时间✅ 有,1 小时(可配置)❌ 永不过期
自动轮换✅ kubelet 自动续期❌ 需手动重建 Secret
绑定 Pod✅ Token 和 Pod 绑定❌ 不绑定
Audience✅ 支持(限制用途)❌ 不支持
安全性⭐⭐⭐⭐⭐⭐⭐

手动创建 SA 和 Token

apiVersion:v1kind:ServiceAccountmetadata:name:my-readernamespace:default---apiVersion:v1kind:Podmetadata:name:reader-podspec:serviceAccountName:my-reader# 指定 SA(不指定则用 default)containers:-name:appimage:nginx:1.27
# 手动创建一个 Token(用于本地调试)kubectl create token my-reader# 指定 audience 和过期时间kubectl create token my-reader--audience=my-api--duration=2h

Token 的 JWT 结构

Token 是一个 JWT(JSON Web Token),可以解码查看:

# 在 Pod 内解码 Token(BASE64 中间那部分)cat/var/run/secrets/kubernetes.io/serviceaccount/token|cut-d.-f2|base64-d|python3-mjson.tool
{"aud":["https://kubernetes.default.svc"],"exp":1753187200,"iat":1753183600,"iss":"https://kubernetes.default.svc","kubernetes.io":{"namespace":"default","pod":{"name":"reader-pod","uid":"abc123..."},"serviceaccount":{"name":"my-reader","uid":"def456..."}},"sub":"system:serviceaccount:default:my-reader"}

使用 Token 访问 API Server

# 在 Pod 内直接访问 API ServerTOKEN=$(cat/var/run/secrets/kubernetes.io/serviceaccount/token)APISERVER=https://kubernetes.default.svccurl-sk-H"Authorization: Bearer$TOKEN"$APISERVER/api/v1/namespaces/default/pods

动手实验

配套实验位于docs/labs/beginner/pod-identity/

步骤 1:部署实验环境

cddocs/labs/beginner/pod-identitybashsetup.sh

步骤 2:查看 Pod 的默认身份

kubectlexecreader-pod --cat/var/run/secrets/kubernetes.io/serviceaccount/token kubectlexecreader-pod --ls/var/run/secrets/kubernetes.io/serviceaccount/

步骤 3:用 SA Token 访问 API Server

kubectlexecreader-pod --sh-c' TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) APISERVER=https://kubernetes.default.svc curl -sk -H "Authorization: Bearer $TOKEN" $APISERVER/api/v1/namespaces/default/pods '# 根据 SA 的 RBAC 权限,可能会返回 pods 列表或被拒绝

步骤 4:解码查看 Token 内容

kubectlexecreader-pod --sh-c' cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d. -f2 | base64 -d 2>/dev/null | python3 -m json.tool 2>/dev/null || echo "需要 python3 解码" '

步骤 5:创建自定义 Token 并测试权限区别

# 创建 Token(无任何 RBAC 权限的 SA)TOKEN=$(kubectl create token test-sa--duration=1h)# 用这个 Token 尝试访问kubectl get pods--token="$TOKEN"2>&1# 预期:Error from server (Forbidden)

步骤 6:清理

bashteardown.sh

自检问题

  1. [基础]每个 Pod 默认能访问 API Server 吗?能做什么操作?

  2. [理解]为什么新版的 Projected Token 比旧的 Secret-based Token 更安全?

  3. [应用]你发现 Pod 里的恶意容器正在用 SA Token 调用 API Server。除了删 Pod,你能做什么来在架构层面减少这种风险?

查看答案
  1. 能访问。每个 Pod 默认挂载了defaultServiceAccount 的 Token。但defaultSA 通常几乎没有任何 RBAC 权限——所以 Pod 能连上 API Server,但验证身份后几乎所有操作都被拒绝。可以通过 RBAC 授予特定权限(如文章 14 中的 readonly-sa)。

  2. 旧 Secret Token永不过期不绑定 Pod不支持 audience 限制——如果 Token 泄露,攻击者可以永久使用它。新版 Projected Token:① 1 小时后自动过期(kubelet 自动续期),泄露的 Token 很快失效;② Token 绑定到特定 Pod(kubernetes.io.pod.uid),其他 Pod 无法使用;③ 支持audience字段——给外部的 Token 不能用于访问 API Server。

  3. ① 遵循最小权限原则:不要给 default SA 任何 RBAC 权限;② 为每个应用创建专用 SA,只给必要的权限;③ 关闭不需要的automountServiceAccountTokenspec.automountServiceAccountToken: false);④ 使用 NetworkPolicy 限制 Pod 到 API Server 的流量;⑤ 启用审计日志监控异常的 API 调用。

下一步

Pod 的身份认证搞清楚了。接下来,学习如何扩展 K8s 的 API 定义你自己的资源类型:

→ 27. Custom Resource 入门

📚 本文来自 K8s Guide —— 开源免费的 Kubernetes 中文学习指南

  • 🗺️ 初学者轨道 + 面试轨道,从零基础到拿 Offer 一站式覆盖
  • 🧪 每篇文章配套 Kind 实验脚本,本地一键运行
  • 🔗 本文源码:docs/beginner/20-gateway-api.md
  • ⭐ 如果对你有帮助,欢迎 Star! github.com/callmebg/k8s-guide
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/2 2:31:08

DRAM内存寻址与容量计算全解析:从芯片颗粒到内存条标签

1. 从一次内存升级的困惑说起前阵子帮朋友升级一台老电脑&#xff0c;他指着主板上的内存插槽问我&#xff1a;“我这板子最大能插多少G的内存&#xff1f;我看网上说要看什么寻址&#xff0c;这到底是个啥&#xff1f;” 我一看&#xff0c;他主板上插着两条标着“8GB 2Rx8 PC…

作者头像 李华
网站建设 2026/8/2 2:27:49

知识总结02

集合&#xff1a;集合的分类set怎么保证元素不重复Hash冲突解决方式hashmap数据结构hashmap、hashtable、concurrentHashMap区别hashmap的set流程hashmap cap2^n&#xff0c;为什么&#xff0c;怎么保证hashmap负载因子0.75&#xff0c;为什么hashmap hash方法实现concurrentHa…

作者头像 李华
网站建设 2026/8/2 2:26:53

从零构建十亿级混合检索系统:融合BM25与向量搜索的工程实践

如果你正在为海量数据检索发愁&#xff0c;无论是构建一个智能问答系统&#xff0c;还是开发一个精准的推荐引擎&#xff0c;都会面临一个核心挑战&#xff1a;如何在海量候选集中&#xff0c;又快又准地找到最相关的TopK结果&#xff1f;传统的全文检索&#xff08;如BM25&…

作者头像 李华
网站建设 2026/8/2 2:25:45

索尼IMX462星光级相机模组:从硬件解析到树莓派实战应用

1. 项目概述&#xff1a;IMX462星光级相机模组最近在折腾一个低照度环境下的视觉项目&#xff0c;对市面上几款主流的小型图像传感器做了不少功课&#xff0c;最终把目光锁定在了索尼的IMX462这颗CMOS上。如果你也在寻找一款能在近乎全黑环境下还能输出清晰画面的相机方案&…

作者头像 李华
网站建设 2026/8/2 2:20:44

AI上下文工程实战:结构化与隔离原则提升大模型协作效率

你有没有遇到过这样的情况&#xff1a;在一个复杂的项目中&#xff0c;你试图让一个AI助手帮你分析一份长文档&#xff0c;同时处理一些数据&#xff0c;再生成一份报告。你精心设计了每一步的提示词&#xff0c;但AI的回复却开始变得混乱——它可能把文档里的概念错误地套用到…

作者头像 李华
网站建设 2026/8/2 2:20:39

Coze智能体开发实战:从概念到工程化,构建高效AI应用

如果你在2024年关注AI应用开发&#xff0c;却还在为复杂的代码、高昂的算力成本和漫长的部署周期而头疼&#xff0c;那么今天这篇文章&#xff0c;就是为你准备的“降压药”。我们正处在一个奇妙的拐点&#xff1a;构建一个能对话、会思考、可执行任务的AI智能体&#xff08;Ag…

作者头像 李华