K8s环境中容器执行nginx -s reload引发进程重启故障求助
问题场景
在OpenShift 4环境中,使用nginx:1.26.0作为反向代理,通过CRL文件验证客户端证书,由sidecar容器负责更新CRL文件。执行nginx -s reload重载配置时,容器意外启动全新主进程,因端口占用导致容器几秒后关闭。日志显示重载初期流程正常(旧worker优雅关闭、新worker启动),但容器突然停止。环境限制:无法使用默认101/101 uid/gid,采用自定义uid/gid范围;容器文件系统为只读。
关键日志片段
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: can not modify /etc/nginx/conf.d/default.conf (read-only file system?) /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2024/05/22 06:49:37 [notice] 88#88: using the "epoll" event method 2024/05/22 06:49:37 [notice] 88#88: nginx/1.26.0 ... 2024/05/22 06:49:56 [notice] 88#88: signal 1 (SIGHUP) received from 123, reconfiguring 2024/05/22 06:49:56 [notice] 88#88: reconfiguring 2024/05/22 06:49:56 [notice] 88#88: start worker processes ... 2024/05/22 06:49:56 [notice] 114#114: exiting
排查方向
PID Namespace 共享问题
sidecar执行nginx -s reload时,若未与nginx容器共享PID namespace,无法定位到nginx主进程,可能误启动全新nginx实例,导致端口冲突。自定义UID/GID 权限不足
- nginx运行用户无CRL文件读取权限,重载时无法加载新CRL,触发主进程退出。
- nginx pid文件目录(默认
/var/run)无写入权限,导致重载时无法更新pid信息,引发进程异常。
OpenShift SCC 约束限制
自定义uid/gid对应的安全上下文约束(SCC)可能限制了进程信号发送、端口绑定或文件系统操作,导致重载后容器异常退出。CRL 文件有效性问题
若更新后的CRL文件格式错误、损坏,nginx重载时无法解析,可能静默退出主进程(错误日志会记录相关信息)。
解决方案建议
强制共享PID Namespace
在Deployment配置中添加shareProcessNamespace: true,确保sidecar能直接访问nginx主进程PID,避免误启动新实例:spec: template: spec: shareProcessNamespace: true直接发送HUP信号替代
nginx -s reload
在sidecar中执行以下命令,精准发送信号给nginx主进程,避免命令调用的潜在问题:kill -HUP $(cat /var/run/nginx.pid)修复权限配置
- 确保CRL文件所在目录挂载为可写卷,且自定义uid/gid对文件拥有读权限。
- 确认
/var/run目录为可写(可通过emptyDir挂载),保证nginx能写入pid文件。
检查nginx错误日志
查看/var/log/nginx/error.log,重载时的权限错误、CRL解析失败等问题会在此处记录,是定位根本原因的关键。验证OpenShift SCC配置
确保自定义uid/gid所在范围被允许使用anyuid或自定义SCC,允许进程执行信号发送、端口绑定等操作。
内容的提问来源于stack exchange,提问作者Johan Kindgren

