【Kubernetes 安全】集群安全机制(一):认证体系详解
对 Kubernetes 有点了解的朋友可能知道,访问 Kubernetes 集群通常有三种主要方式:使用 kubectl(命令行工具)、通过 Dashboard(仪表盘)界面操作,或者编写程序直接调用 RESTful API。但无论采用哪种方式,所有与集群的交互请求都必须首先到达 API Server。
然而,并非所有到达 API Server 的请求都会被允许执行。请求需要经过三个关键的安全检查阶段:认证(Authentication)、鉴权(Authorization) 和 准入控制(Admission Control)。这三个阶段共同构成了 Kubernetes 访问控制的核心机制,确保只有合法且合规的请求才能对集群资源进行操作。
本篇主要围绕 认证阶段 展开介绍。
一、从访问入口说起
在日常使用 Kubernetes 时,我们通常通过以下几种方式与集群交互:
-
使用
kubectl命令行工具 -
通过 Dashboard 可视化界面
-
调用 RESTful API
无论采用哪种方式,所有请求最终都会汇聚到 Kubernetes 的核心组件:API Server。
不过,API Server 并不会直接执行请求,而是会先进行一系列安全校验。整个流程可以抽象为:
请求 → 认证 → 鉴权 → 准入控制 → 执行
这也是 Kubernetes 安全体系的核心链路。
二、Kubernetes 的 3A 安全模型
Kubernetes 的访问控制机制可以用经典的 3A 模型来理解。
1. 认证(Authentication)
解决的问题:你是谁?
用于确认请求的身份是否合法。
类比:进入公司大楼需要刷工卡验证身份。
2. 鉴权(Authorization)
解决的问题:你能做什么?
在确认身份后,系统判断该用户是否具备执行某个操作的权限。
类比:是否有权限进入某一层办公区域。
3. 准入控制(Admission Control)
解决的问题:你的操作是否符合规则?
即使具备权限,请求仍需要通过策略校验。
类比:某些敏感操作需要额外审批。
这三个阶段全部由 API Server 统一处理,是 Kubernetes 的第一道安全防线。
三、认证方式详解
Kubernetes 提供了多种认证方式,安全级别逐步提升。
1. Token 认证
原理:通过一个字符串(Token)标识用户身份。
Authorization: Bearer <token>
特点:
-
实现简单
-
适用于测试或内部环境
-
安全性较低
2. Basic 认证
原理:将“用户名:密码”进行 Base64 编码后传输。
Authorization: Basic base64(username:password)
特点:
-
使用方便
-
Base64 不是加密,仅是编码
-
存在被解码风险
3. HTTPS 证书认证
基于 CA 签发的证书进行身份验证。

单向认证
客户端验证服务端身份,常见于普通网站访问。
双向认证
客户端和服务端互相验证身份,常见于金融系统等高安全场景。
特点:
-
安全级别最高
-
双方都需要证书
生产环境通常推荐使用证书认证。
四、API Server 的认证策略
不同组件访问 API Server 的方式有所不同。
1. 集群核心组件
例如:
-
Controller Manager
-
Scheduler
特点:
-
通常与 API Server 在同一节点
-
通过本地地址通信
-
不需要复杂认证
2. 客户端工具
例如:
-
kubectl
-
kube-proxy
特点:
-
使用证书认证
-
认证信息通常保存在 kubeconfig 文件中
3. kubelet
特点:
-
自动申请证书
-
加入集群时完成认证
-
支持证书轮换
五、Pod 如何访问 API Server
部分运行在 Pod 中的组件需要访问 API Server,例如:
-
网络插件(Calico)
-
DNS 服务(CoreDNS)
Pod 是动态创建和销毁的,如果为每个 Pod 单独签发证书,会带来以下问题:
-
证书管理复杂
-
性能开销大
-
安全风险难控制
因此 Kubernetes 引入了 ServiceAccount 机制。
六、ServiceAccount 工作机制
1. 默认行为
每个 Namespace 都会自动创建一个 default ServiceAccount。
如果 Pod 未显式指定,则默认使用该账户。
2. 自动挂载凭证
当 Pod 使用 ServiceAccount 时,系统会自动创建对应的 Secret,并挂载到容器中:
/run/secrets/kubernetes.io/serviceaccount/
3. 挂载内容
通常包含以下三个文件:
ca.crt
token
namespace
4. 各文件作用
| 文件 | 说明 |
|---|---|
| ca.crt | 用于验证 API Server 的证书 |
| token | 用于身份认证(JWT) |
| namespace | 当前 Pod 所属命名空间 |
其中 token 是由 API Server 签发的 JWT,用于 Pod 访问 API Server。
七、实验验证
1. 创建命名空间
kubectl create namespace test-sa
2. 查看 ServiceAccount
kubectl get serviceaccount -n test-sa
可以看到默认的 default ServiceAccount。
3. 查看 Pod 中的挂载信息
kubectl get pod -A
kubectl exec -it -n <namespace> <pod-name> -- /bin/sh
cd /run/secrets/kubernetes.io/serviceaccount/
ls
输出如下:
ca.crt
namespace
token
八、创建 ServiceAccount
方式一:命令行
kubectl create serviceaccount my-sa -n my-namespace
查看 YAML:
kubectl create serviceaccount my-sa -n my-namespace \
--dry-run=client -o yaml
方式二:YAML 文件
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-serviceaccount
namespace: my-namespace
应用:
kubectl apply -f my-serviceaccount.yaml
九、总结
Kubernetes 的认证体系可以从以下几个方面理解:
核心流程
认证 → 鉴权 → 准入控制
关键设计
-
API Server 作为统一入口
-
提供多种认证方式
-
使用 ServiceAccount 解决 Pod 身份问题
设计目标
-
降低证书管理成本
-
提升整体安全性
-
适配动态资源场景
总结一句话
Kubernetes 通过 3A 模型构建访问控制体系,并通过 ServiceAccount 机制解决了 Pod 的身份认证问题。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)