Kubernetes Pod添加command配置后无法提供网站服务该如何解决
问题根因
你自定义的command和args配置覆盖了镜像默认的启动逻辑:该Nginx镜像默认启动时会运行前台Nginx进程,监听80端口对外提供网站服务。你替换启动命令后,仅会执行打印日志的操作,操作完成后shell进程直接退出,没有运行Nginx服务进程,因此网站无法访问。你看到的Pod处于运行状态大概率是反复重启的假象,本质没有服务进程在监听端口。
可行解决方案
根据你的使用场景可以选择以下任意一种方案:
- 方案1:启动命令追加Nginx启动逻辑
如果需要每次启动都自动打印日志,直接修改你的args配置,在打印操作结束后启动Nginx进程即可,建议用exec替换shell进程保证信号正常传递:
command: - sh - -c args: - cat /usr/share/nginx/html/env.js && echo $REACT_APP_ENV_VARIABLE && echo $REACT_APP_ENV_VARIABLE_TWO && exec nginx -g 'daemon off;'
修改后前面的打印操作会正常输出到Pod日志,之后Nginx进程会作为主进程一直运行,正常提供网站服务。
- 方案2:临时调试用
kubectl exec进入容器操作
如果只是临时需要验证容器内的文件、环境变量,不需要每次启动都打印日志,不需要修改Pod配置,直接执行命令进入容器操作即可,完全不影响服务运行:
kubectl exec -it playground-pod -- sh
进入容器后可以手动执行你需要的cat、echo等任意操作。
- 方案3:使用PostStart生命周期钩子执行启动后操作
如果需要每次容器启动后自动执行打印逻辑,又不想改动镜像默认的启动命令,可以用Kubernetes内置的生命周期钩子实现:
apiVersion: v1 kind: Pod metadata: name: playground-pod labels: name: playground-pod app: playground-app spec: containers: - name: playground image: localhost:5000/playground:1.8 ports: - containerPort: 80 env: - name: REACT_APP_ENV_VARIABLE value: "Variable from Kube!" - name: REACT_APP_ENV_VARIABLE_TWO value: "192.168.0.120" lifecycle: postStart: exec: command: - sh - -c - cat /usr/share/nginx/html/env.js && echo $REACT_APP_ENV_VARIABLE && echo $REACT_APP_ENV_VARIABLE_TWO
该配置不会改动镜像默认的启动逻辑,Nginx服务会正常运行,容器启动完成后会自动执行钩子内的打印命令输出到日志。
内容的提问来源于stack exchange,提问作者AbreQueVoy
相关产品推荐
相关产品推荐

