You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

排查方向

  1. PID Namespace 共享问题
    sidecar执行nginx -s reload时,若未与nginx容器共享PID namespace,无法定位到nginx主进程,可能误启动全新nginx实例,导致端口冲突。

  2. 自定义UID/GID 权限不足

    • nginx运行用户无CRL文件读取权限,重载时无法加载新CRL,触发主进程退出。
    • nginx pid文件目录(默认/var/run)无写入权限,导致重载时无法更新pid信息,引发进程异常。
  3. OpenShift SCC 约束限制
    自定义uid/gid对应的安全上下文约束(SCC)可能限制了进程信号发送、端口绑定或文件系统操作,导致重载后容器异常退出。

  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:34:58