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 握手失败,导致集群功能异常。

K8s 证书信任链与通信关系 集群根 CA 中间 CA(可选) API Server 证书 Kubelet 证书 etcd 证书 Front-Proxy 证书 说明: 所有组件证书由根 CA 或中间 CA 签发,形成信任链。组件之间通过 mTLS 双向验证证书有效性。 证书过期或 CA 证书变更会导致整个信任链断裂,引发通信失败。

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 请求到达时间 分析轮换时间窗口内的异常
审计日志在证书轮换排障中的工作流 证书过期/轮换失败 API Server 拒绝请求 审计日志记录 401/403 排障分析 审计日志排障步骤: 1. 过滤 responseStatus.code=401 的请求 → 2. 提取 user.username 和 requestURI 3. 关联证书 CN 与用户 → 4. 检查证书有效期 → 5. 确认轮换是否完成 # 审计日志查询示例 kubectl logs -n kube-system kube-apiserver-master | grep '"code":401' jq 'select(.responseStatus.code==401) | {user, resource, timestamp}' audit.log

1.3.3 审计日志 vs 其他排障手段

排障手段 优势 局限
审计日志 记录所有请求,可回溯历史,精确到毫秒 需要提前启用,日志量大
kubectl describe 实时查看资源状态 无法查看历史事件,不记录认证细节
组件日志 详细错误堆栈 分散在各节点,格式不统一
tcpdump/Wireshark 网络层原始数据 需要 root 权限,分析成本高
重要提醒: 审计日志必须在集群部署时启用,无法事后补录。建议在生产集群中至少开启 Metadata 级别的审计策略,记录所有请求的元数据。对于证书轮换排障,建议开启 RequestResponse 级别以捕获完整的请求体和响应体。