EKS Fargate Pod挂载emptyDir共享目录下access文件夹丢失问题
问题原因
- emptyDir挂载覆盖镜像原有目录:你在Deployment中把
emptyDir类型的卷直接挂载到了业务容器的/logs根路径,挂载操作会完全覆盖镜像中预先创建的/logs/boot、/logs/access目录,镜像中预建的目录不会保留。 - 业务进程仅自动创建boot目录:你观察到
/logs/boot依然存在,是因为业务启动脚本/erctl进程运行时会自动检查并创建/logs/boot目录用于写入启动日志,但不会创建/logs/access目录,最终只保留了boot目录。 - 本地测试正常的原因:本地Docker测试时你没有挂载
emptyDir到/logs路径,直接使用的是镜像内预创建的目录结构,因此不会出现目录丢失问题。 - Fluent Bit额外报错原因:日志中169.254.169.254连接超时是因为Pod关联的IAM身份没有CloudWatch日志写入权限,Fluent Bit无法获取IAM凭证调用CloudWatch接口。
解决方案
修复目录丢失问题,二选一即可:
- 方案1:修改业务启动逻辑:在业务容器启动命令中先执行目录创建逻辑,调整CMD为:
CMD ["sh", "-c", "mkdir -p /logs/boot /logs/access && chmod -R 0777 /logs/* && ./erctl"] - 方案2:新增Init容器预创建目录:在Deployment的spec.template.spec下新增initContainers配置,业务容器启动前自动完成目录创建:
initContainers: - name: log-dir-init image: alpine:latest command: ["sh", "-c", "mkdir -p /logs/boot /logs/access && chmod -R 0777 /logs/*"] volumeMounts: - mountPath: /logs name: logs
修复Fluent Bit权限问题:
给Pod使用的eretail服务账号关联具备以下权限的IAM角色,或者直接给EKS Fargate执行角色添加以下权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": "*" } ] }
内容的提问来源于stack exchange,提问作者Nitin G
相关产品推荐
相关产品推荐

