基于Amazon Linux 2构建Nginx Plus部署EKS启动报错排查
核心问题排查与修复
1. 容器启动报错 exec: "-nginx-plus=true": executable file not found in $PATH
这个错误和你配置的PATH环境变量没有任何关系,根因有两个:
- 你构建的镜像只是一个纯Nginx Plus镜像,只装了nginx的rpm包,没有安装Nginx Ingress Controller对应的核心二进制(nginx-ingress),根本不具备Ingress控制器的运行能力。
- 你给镜像设置的CMD是直接启动nginx二进制,但是你用的0.11.3版本的Helm chart启动控制器时,会把
--nginxplus=true这类控制器启动参数直接拼到容器启动命令里,因为你的镜像没有适配chart的入口逻辑,这些参数被直接当成了要执行的可执行文件,所以报找不到文件的错误。
修复方案:
- 不要从零写Dockerfile构建,直接拉取对应版本的官方Nginx Plus Ingress Controller的Amazon Linux 2基础镜像,在这个镜像基础上做自定义改造,官方镜像已经内置了控制器二进制、适配了Helm chart的启动参数逻辑,不会出现参数识别问题。
- 如果必须从零构建,需要先下载对应版本(和你用的Helm chart版本匹配)的nginx-ingress控制器二进制放到镜像的/usr/bin/目录下,把ENTRYPOINT设置为
["nginx-ingress"],才能正常接收chart传的启动参数。
2. Pod无法使用root、缺少排查工具
这个问题是镜像默认安全加固配置导致的,修复方式:
- 构建镜像时直接预装你需要的排查工具,在Dockerfile的yum install命令里补上包名:
tcpdump mtr bind-utils procps sudo,这些工具在Amazon Linux 2的默认源里都有,直接装就行,不用等Pod启动后再安装。 - Helm部署时加两个参数强制用root用户启动,不需要改镜像里的用户配置:
--set controller.containerSecurityContext.runAsUser=0 \ --set controller.containerSecurityContext.allowPrivilegeEscalation=true - 你之前Dockerfile里写的
echo "root:root" | chpasswd完全没用,K8s进入容器不需要系统密码,只要runAsUser设为0,exec进Pod就是root权限,可以直接执行所有操作。
3. 自定义根证书加载不生效
你现在的证书放置路径错了:Amazon Linux 2的update-ca-trust命令只会扫描/etc/pki/ca-trust/source/anchors/目录下的证书,你把qlik.crt放到/etc/ssl/nginx/目录下,执行update-ca-trust不会把这个证书加入系统信任链,自然还是会报证书校验错误。
修复方式:
- 构建镜像时把qlik.crt拷贝到
/etc/pki/ca-trust/source/anchors/目录下,再执行update-ca-trust extract,系统层面的curl、nginx的openssl模块就都会信任这个根证书。 - 后续换成Secret挂载方案时,直接把证书挂载到上述路径,加一个postStart钩子执行
update-ca-trust extract即可,不需要重新构建镜像。
验证步骤
镜像构建完成后先本地验证控制器二进制是否正常:
docker run --rm 957123096554.dkr.ecr.eu-central-1.amazonaws.com/nginx-service:6.0.1 nginx-ingress -v
如果能正常输出版本信息,说明镜像核心组件没问题,推到ECR后再用Helm部署就不会出现之前的启动报错。
内容的提问来源于stack exchange,提问作者Dilu
相关产品推荐
相关产品推荐

