相关文件
dep.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
nodeName: master-01
containers:
- name: myapp
image: myapp:1.1
volumeMounts:
- mountPath: /tmp/myapp # 容器内挂载路径
name: xeslog-volume # 卷的名字
volumes:
- name: myappLog
hostPath:
path: /tmp/myapp/$(date +%Y-%m-%d-%s) # 宿主机上的路径
type: DirectoryOrCreate # 挂载的类型为目录
Dockerfile
FROM alpine:3.8
# 安装 tzdata 来确保时区设置正确
RUN apk add --no-cache tzdata
# 复制 start.sh 脚本到容器中
COPY start.sh /start.sh
# 赋予执行权限
RUN chmod +x /start.sh
# 设置工作目录
WORKDIR /
# 设置容器启动时的入口命令
ENTRYPOINT ["/bin/sh", "/start.sh"]
背景
在 Kubernetes 环境中,有一个名为 myapp-deploy 的服务(Dep)。
该服务使用了一个 hostPath 卷将宿主机目录 /tmp/myapp/$(date +%Y-%m-%d-%s) 挂载到容器中的 /tmp/myapp,作为日志存储。
这些日志会被 Filebeat 收集,并转发至 EFK(Elasticsearch, Fluentd, Kibana)日志系统。
故障现象
在某个时刻,开发人员发现日志无法找到。这导致了日志采集的中断,影响了日志的监控与排查。
原因
故障的核心原因是节点的 /tmp/myapp/$(date +%Y-%m-%d-%s) 目录被意外删除。由于容器通过 hostPath 卷将宿主机上的该目录挂载至容器内,目录一旦丢失,容器就无法继续写入日志文件。这直接导致了服务中断和日志丢失。
但是服务正常运行,没有报警发出。
评论区