Nginx Deployment未从ConfigMap读取版本号问题求助
Kubernetes中Nginx无法渲染版本号的解决方法
问题根源:你把ConfigMap里的index.html直接挂载到Nginx静态目录,但Nginx本身不会自动替换静态HTML文件中的环境变量占位符,所以页面里的${VERSION}没有被替换成实际的版本值,导致显示空白。
解决方法1:启动容器时替换变量
修改Deployment配置,在Nginx启动前用envsubst工具替换index.html里的${VERSION}:
apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: selector: matchLabels: app: my-nginx replicas: 1 template: metadata: labels: app: my-nginx spec: containers: - name: nginx image: nginx:latest env: - name: VERSION valueFrom: configMapKeyRef: name: my-configmap key: version ports: - containerPort: 80 volumeMounts: - name: html mountPath: /usr/share/nginx/html # 新增启动命令:先替换变量再启动Nginx command: ["/bin/sh", "-c"] args: ["envsubst '${VERSION}' < /usr/share/nginx/html/index.html > /usr/share/nginx/html/index.tmp && mv /usr/share/nginx/html/index.tmp /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"] volumes: - name: html configMap: name: my-configmap
原理:用envsubst把index.html中的${VERSION}替换为容器环境变量的值,先写到临时文件避免原文件被占用,替换完成后启动Nginx。
解决方法2:用Nginx内置模块替换响应内容
利用Nginx的ngx_http_sub_module模块,在返回页面时动态替换占位符:
- 先创建存放Nginx配置的ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: nginx-config data: nginx.conf: | events {} http { server { listen 80; root /usr/share/nginx/html; index index.html; # 替换页面中的${VERSION}为环境变量值 sub_filter '${VERSION}' '$VERSION'; sub_filter_once off; } }
- 修改Deployment,挂载这个配置到Nginx的配置目录:
apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: selector: matchLabels: app: my-nginx replicas: 1 template: metadata: labels: app: my-nginx spec: containers: - name: nginx image: nginx:latest env: - name: VERSION valueFrom: configMapKeyRef: name: my-configmap key: version ports: - containerPort: 80 volumeMounts: - name: html mountPath: /usr/share/nginx/html - name: nginx-config mountPath: /etc/nginx/nginx.conf subPath: nginx.conf volumes: - name: html configMap: name: my-configmap - name: nginx-config configMap: name: nginx-config
原理:Nginx收到请求返回页面时,自动把页面里的${VERSION}替换成容器的VERSION环境变量值,sub_filter_once off确保页面中所有匹配的占位符都被替换。
验证方法:部署修改后的配置后,执行kubectl exec <你的Nginx Pod名称> -- curl localhost:80,就能看到页面显示This is version 1.0 of my site.。
内容的提问来源于stack exchange,提问作者Chris G.
相关产品推荐
相关产品推荐

