如何查询OpenShift/Kubernetes部署资源的修改历史记录
可通过以下几种方式查询资源修改记录,覆盖操作人、修改内容、操作时间等核心信息:
1. 审计日志(最全面方案)
所有发送到kube-apiserver的请求都会被审计日志完整记录,包括oc apply/kubectl apply操作、组件自动触发的配置修改、ServiceAccount发起的请求都可以查到,核心记录字段包含操作人(普通用户/ServiceAccount/系统组件)、请求动作(create/update/patch/delete)、操作资源的类型/名称/命名空间、修改前后完整payload、操作时间戳。
OpenShift 4.x默认开启审计日志,可直接通过命令查询控制面节点的审计日志:
# 查询最近1小时内所有Deployment资源的更新操作 oc adm node-logs --role master --path=/var/log/kube-apiserver/audit.log | grep '"operation":"UPDATE"' | grep '"resource":"deployments"' | grep "$(date -d '-1 hour' +%Y-%m-%dT%H:%M:%S)"
如果集群部署了默认的集群日志栈(EFK),可以直接在日志控制台过滤audit.k8s.io类日志,按资源、用户、时间维度筛选即可快速定位目标操作。
2. 资源修订版本历史
针对Deployment、StatefulSet、DaemonSet这类支持回滚的工作负载资源,Kubernetes默认会保留最近的配置修订版本,可直接查询配置差异定位修改内容:
# 查看指定Deployment的所有修订版本 oc rollout history deployment/<部署名称> -n <命名空间> # 查看某一具体修订版本的完整配置内容 oc rollout history deployment/<部署名称> -n <命名空间> --revision=2
需要对比两个版本的配置差异可以直接用diff工具:
diff <(oc rollout history deployment/<部署名称> --revision=1 -o yaml) <(oc rollout history deployment/<部署名称> --revision=2 -o yaml)
注意:该方法仅能查到修改后的配置内容,无法直接获取操作人信息,需要结合审计日志对应时间点匹配操作主体,默认保留的修订版本数量由资源的revisionHistoryLimit字段控制,默认值为10
3. 集群事件查询
集群事件会记录最近1小时(部分集群会调整为24小时)的资源变更操作,信息密度低于审计日志,但可以快速定位异常修改的时间点和触发源:
# 查询指定命名空间下所有事件,按时间升序排序 oc get events -n <命名空间> --sort-by='.lastTimestamp'
如果是HPA、KEDA等扩缩容组件触发的副本数调整,事件中会直接显示对应的触发主体,无需查询审计日志即可快速区分是人为操作还是组件自动操作。
额外排查建议
如果确认所有团队成员都没有主动发起操作,优先排查以下场景:
- 是否有CI/CD流水线、GitOps工具(如Argo CD)的ServiceAccount自动同步配置
- 是否开启了HPA、自定义扩缩容策略,触发了自动副本数调整
- 对应资源是否被Operator管控,集群内置Operator或自定义Operator会自动修正不符合预期的资源配置,可能出现配置被自动覆盖的情况
- 若出现凭证类资源(Secret、ServiceAccount)被删除或修改,优先检查资源的OwnerReference字段,关联的上层资源删除时会级联删除关联的凭证资源
内容的提问来源于stack exchange,提问作者peez80

