16-Pod 身份与认证机制

发布时间:2026/8/2 2:33:49
16-Pod 身份与认证机制 Pod 身份与认证机制概念引入在文章 14 中你学了 RBAC——“谁能做什么”。但有个问题被跳过了API Server 怎么知道你是谁RBAC文章 14 → 授权Authorization→ 你有权限做这个操作吗 Pod 身份本篇 → 认证Authentication→ 你是谁你是合法的 Pod 吗每个 Pod 从出生就携带一个身份证——ServiceAccount Token。Pod 用这个 Token 访问 API Server。Pod身份绑定Bearer Token 认证通过 RBAC 检查权限ServiceAccountmy-app-saProjected 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 自动做三件事为 Pod 创建一个ServiceAccount Token通过 TokenRequest API将 Token 以projected volume方式挂载到 Pod 内Token 有过期时间kubelet 会自动续期# 进入任何 Pod 都能看到 Tokenls/var/run/secrets/kubernetes.io/serviceaccount/# ca.crt namespace token ← 三个文件Schema从创建 Pod 到认证的全链路API ServerTokenRequest APIkubeletPodAPI ServerTokenRequest APIkubeletPodPod 创建阶段Pod 运行时需要 ServiceAccount TokenTokenRequest(samy-app-sa, audienceapi, expiration3600s)签发 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 Token1.21旧版 Secret Token过期时间✅ 有1 小时可配置❌ 永不过期自动轮换✅ kubelet 自动续期❌ 需手动重建 Secret绑定 Pod✅ Token 和 Pod 绑定❌ 不绑定Audience✅ 支持限制用途❌ 不支持安全性⭐⭐⭐⭐⭐⭐⭐手动创建 SA 和 TokenapiVersion:v1kind:ServiceAccountmetadata:name:my-readernamespace:default---apiVersion:v1kind:Podmetadata:name:reader-podspec:serviceAccountName:my-reader# 指定 SA不指定则用 defaultcontainers:-name:appimage:nginx:1.27# 手动创建一个 Token用于本地调试kubectl create token my-reader# 指定 audience 和过期时间kubectl create token my-reader--audiencemy-api--duration2hToken 的 JWT 结构Token 是一个 JWTJSON Web Token可以解码查看# 在 Pod 内解码 TokenBASE64 中间那部分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)APISERVERhttps://kubernetes.default.svccurl-sk-HAuthorization: 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 Serverkubectlexecreader-pod --sh-c TOKEN$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) APISERVERhttps://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 权限的 SATOKEN$(kubectl create token test-sa--duration1h)# 用这个 Token 尝试访问kubectl get pods--token$TOKEN21# 预期Error from server (Forbidden)步骤 6清理bashteardown.sh自检问题[基础]每个 Pod 默认能访问 API Server 吗能做什么操作[理解]为什么新版的 Projected Token 比旧的 Secret-based Token 更安全[应用]你发现 Pod 里的恶意容器正在用 SA Token 调用 API Server。除了删 Pod你能做什么来在架构层面减少这种风险查看答案能访问。每个 Pod 默认挂载了defaultServiceAccount 的 Token。但defaultSA 通常几乎没有任何 RBAC 权限——所以 Pod 能连上 API Server但验证身份后几乎所有操作都被拒绝。可以通过 RBAC 授予特定权限如文章 14 中的 readonly-sa。旧 Secret Token永不过期、不绑定 Pod、不支持 audience 限制——如果 Token 泄露攻击者可以永久使用它。新版 Projected Token① 1 小时后自动过期kubelet 自动续期泄露的 Token 很快失效② Token 绑定到特定 Podkubernetes.io.pod.uid其他 Pod 无法使用③ 支持audience字段——给外部的 Token 不能用于访问 API Server。① 遵循最小权限原则不要给 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