如何配置OpenShift/Kubernetes存储容器历史日志以使用oc logs -p?
解决
oc logs -p报错:配置OpenShift/Kubernetes保留历史容器日志 刚好碰到过类似的问题,咱们一步步来搞定这个事儿——你执行oc logs -p mystuff时收到的报错,核心原因是集群默认没配置保留已终止容器的日志,导致kubelet把终止的容器清理掉了,自然查不到历史日志。下面是具体的配置步骤,涵盖OpenShift的节点配置和容器运行时设置:
一、先搞懂为啥报错
oc logs -p是用来拉取已经终止的容器日志的,报错说找不到之前的容器,要么是kubelet自动清理了终止的Pod/容器,要么是压根没开保留终止容器日志的功能。咱们得从kubelet和容器运行时两个层面来配置。
二、配置kubelet保留终止容器与日志
OpenShift用MachineConfig来统一管理节点配置,咱们给worker节点加个kubelet的配置:
1. 编写MachineConfig配置文件
创建一个叫worker-kubelet-log-retention.yaml的文件:
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: worker-kubelet-log-retention spec: config: ignition: version: 3.2.0 storage: files: - path: /etc/kubernetes/kubelet.conf.d/99-log-retention.conf mode: 0644 contents: source: data:text/plain;charset=utf-8,apiVersion%3A%20kubelet.config.k8s.io/v1beta1%0Akind%3A%20KubeletConfiguration%0AfeatureGates%3A%0A%20%20RetrieveContainerLogs%3A%20true%0AcontainerLogMaxFiles%3A%205%0AcontainerLogMaxSize%3A%2010Mi%0AterminatedPodGCThreshold%3A%20100
这里几个关键配置得解释下:
RetrieveContainerLogs: true:强制开启kubelet拉取终止容器日志的特性(有些版本默认开,但显式配置更稳妥)containerLogMaxFiles: 5:每个容器最多保留5份轮换的日志文件containerLogMaxSize: 10Mi:单个日志文件超过10Mi就自动轮换,避免日志文件太大terminatedPodGCThreshold: 100:节点上最多保留100个已终止的Pod,防止占满磁盘
2. 应用配置到集群
执行命令把配置推上去:
oc apply -f worker-kubelet-log-retention.yaml
这时候worker节点会重启来加载新配置,记得等所有节点都回到Ready状态再继续。
三、配置CRI-O保留终止容器
OpenShift默认用CRI-O当容器运行时,光kubelet配置还不够,得让CRI-O也保留终止的容器:
1. 编写CRI-O的MachineConfig
创建worker-crio-terminated-containers.yaml:
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: worker-crio-terminated-containers spec: config: ignition: version: 3.2.0 storage: files: - path: /etc/crio/crio.conf.d/99-terminated-containers.conf mode: 0644 contents: source: data:text/plain;charset=utf-8,%5Bcrio.runtime%5D%0Akeep_terminated_containers%3Dtrue%0Akeep_terminated_containers_count%3D5
关键配置:
keep_terminated_containers: true:告诉CRI-O别删终止的容器keep_terminated_containers_count: 5:每个Pod最多保留5个终止的容器实例
2. 应用CRI-O配置
oc apply -f worker-crio-terminated-containers.yaml
同样等节点重启完成。
四、验证配置是否生效
咱们整个测试Pod来验证:
- 启动一个会自动终止的Pod:
oc run test-log-pod --image=busybox --command -- sleep 15
- 等个20秒,Pod会变成
Completed状态,然后执行:
oc logs -p test-log-pod
如果能正常输出sleep命令的日志,说明配置成功了!
一些额外提醒
- 磁盘空间要盯紧:保留历史日志会占节点磁盘,建议给集群加个磁盘监控告警,别到时候磁盘满了影响业务。
- 控制平面节点也想配?:把MachineConfig里的
machineconfiguration.openshift.io/role改成master就行,步骤一样。 - 版本兼容性:上面的配置适用于OpenShift 4.x和Kubernetes 1.18+,如果是老版本,部分配置项可能有变化,得对应调整。
内容的提问来源于stack exchange,提问作者AnoE




