Kubernetes证书轮换资源边界与审计日志分析 - 第1节
1.1 K8s 证书体系概述
Kubernetes 集群的安全基石建立在 双向 TLS(mTLS) 通信之上。集群内所有组件之间的通信——从 kube-apiserver 到 kubelet,从 kube-controller-manager 到 etcd——都通过 X.509 证书进行身份验证和加密。理解证书体系是排障的第一步。
1.1.1 证书分类与用途
| 证书类型 | 签发者 | 用途 | 默认路径 |
|---|---|---|---|
| CA 证书 | 自签或外部 CA | 签发所有组件证书的根信任 | /etc/kubernetes/pki/ca.crt |
| API Server 证书 | CA | 客户端验证 API Server 身份 | /etc/kubernetes/pki/apiserver.crt |
| Kubelet 证书 | CA 或自签 | kubelet 与 API Server 双向认证 | /var/lib/kubelet/pki/kubelet.crt |
| Service Account 密钥 | API Server | Pod 内 ServiceAccount 令牌签名 | /etc/kubernetes/pki/sa.key |
| etcd 证书 | CA | etcd 集群内部通信及客户端认证 | /etc/kubernetes/pki/etcd/server.crt |
| Front-Proxy 证书 | CA | Aggregation Layer 扩展 API 认证 | /etc/kubernetes/pki/front-proxy-client.crt |
1.1.2 证书生命周期与信任链
每个证书都包含 有效期(Not After)、签发者(Issuer) 和 主题(Subject)。K8s 默认证书有效期为 1 年(365 天)。当证书过期时,组件之间的 TLS 握手失败,导致集群功能异常。
1.2 证书轮换的重要性
证书轮换是指 在证书过期前 生成新证书并替换旧证书的过程。在 K8s 生产环境中,证书轮换不是可选项,而是 强制性运维操作。
1.2.1 不轮换证书的风险
- 集群不可用:API Server 证书过期后,kubectl、kubelet、scheduler 等所有客户端无法建立 TLS 连接。
- 数据面中断:etcd 证书过期导致 etcd 集群分裂或拒绝读写,整个集群状态丢失。
- 安全漏洞:长期未轮换的证书可能被泄露或暴力破解,攻击者可伪造身份。
- 审计合规失败:金融、医疗等行业要求证书定期轮换(通常 90 天或 1 年)。
1.2.2 轮换失败典型场景
| 场景 | 现象 | 根因 |
|---|---|---|
| kubelet 证书过期 | kubectl get nodes 显示 NotReady |
kubelet 无法向 API Server 注册 |
| API Server 证书过期 | kubectl 返回 x509: certificate has expired |
客户端验证服务端证书失败 |
| CA 证书轮换未同步 | 部分组件仍使用旧 CA 签发的新证书 | 信任链断裂,新旧 CA 不兼容 |
| Service Account 密钥轮换 | Pod 内无法获取合法令牌 | 旧令牌签名失效,新令牌未分发 |
排障提示: 证书轮换作业中最常见的错误是 顺序错误。例如先轮换 API Server 证书而未更新 kubelet 的 CA 信任列表,会导致 kubelet 拒绝连接。正确的轮换顺序应为:CA 证书 → 各组件证书 → 重启组件。
1.3 审计日志在排障中的角色
Kubernetes 审计日志(Audit Log) 记录了所有对 API Server 的请求,包括请求来源、操作、资源、响应状态和时间戳。在证书轮换排障中,审计日志是 第一手证据。
1.3.1 审计日志如何帮助排障
- 定位失败请求:通过
stage=ResponseComplete和responseStatus.code=401/403快速找到认证失败的请求。 - 追踪证书使用:审计日志中的
user.username字段可关联到证书的 CN(Common Name)。 - 发现异常轮换行为:短时间内大量
CertificateSigningRequest创建可能表示轮换脚本异常。 - 验证轮换生效:轮换后检查审计日志中是否出现新证书对应的用户请求。
1.3.2 审计日志关键字段
| 字段 | 含义 | 排障用途 |
|---|---|---|
kind |
事件类型(Event/Request) | 区分请求记录与资源变更 |
user.username |
发起请求的用户名 | 关联到证书 CN 或 ServiceAccount |
objectRef.resource |
请求的资源类型 | 判断是否操作了 certificatesigningrequests |
responseStatus.code |
HTTP 状态码 | 401=未认证,403=未授权,500=服务端错误 |
stage |
请求处理阶段 | ResponseComplete 表示请求已完成 |
requestReceivedTimestamp |
请求到达时间 | 分析轮换时间窗口内的异常 |
1.3.3 审计日志 vs 其他排障手段
| 排障手段 | 优势 | 局限 |
|---|---|---|
| 审计日志 | 记录所有请求,可回溯历史,精确到毫秒 | 需要提前启用,日志量大 |
| kubectl describe | 实时查看资源状态 | 无法查看历史事件,不记录认证细节 |
| 组件日志 | 详细错误堆栈 | 分散在各节点,格式不统一 |
| tcpdump/Wireshark | 网络层原始数据 | 需要 root 权限,分析成本高 |
重要提醒: 审计日志必须在集群部署时启用,无法事后补录。建议在生产集群中至少开启
Metadata 级别的审计策略,记录所有请求的元数据。对于证书轮换排障,建议开启 RequestResponse 级别以捕获完整的请求体和响应体。