K8S实战指南 —— 基于NFS存储与Ingress-Nginx实现前端项目高可用发布(ConfigMap、Secret、Deployment、Service)

张开发
2026/4/18 11:07:51 15 分钟阅读

分享文章

K8S实战指南 —— 基于NFS存储与Ingress-Nginx实现前端项目高可用发布(ConfigMap、Secret、Deployment、Service)
1. 为什么需要NFS存储与Ingress-Nginx在企业级前端项目部署中我们常常会遇到两个核心问题多Pod间的文件共享和外部访问的安全暴露。传统部署方式下静态文件存放在单个服务器本地当需要扩展时就会面临数据不一致的困境。而直接暴露NodePort又存在安全风险。我去年负责过一个电商大促项目就深刻体会到了这种痛点。当时前端资源包有2GB每次滚动更新时新老Pod交替期间总有用户反映页面加载异常。后来我们引入NFS作为共享存储配合Ingress-Nginx的流量管理终于实现了零感知更新。NFS就像团队共用的云盘所有Pod都能读写同一份文件。而Ingress-Nginx则像智能门卫不仅负责SSL证书卸载还能根据路径将请求精准路由到对应服务。这种组合解决了前端发布中最关键的持久化和高可用问题。2. 搭建NFS存储系统2.1 服务端配置实战在Master节点执行以下命令安装基础服务yum install -y nfs-utils rpcbind配置共享目录时有个坑我踩过如果直接用/data这类系统目录可能会因权限问题导致Pod无法写入。建议专门创建新目录mkdir -p /nfs/data/frontend chmod -R 777 /nfs/data/frontend编辑/etc/exports时生产环境建议限制访问IP段/nfs/data 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)启动服务后别忘记开防火墙firewall-cmd --add-servicenfs --permanent firewall-cmd --reload2.2 客户端挂载验证在所有Worker节点执行挂载测试showmount -e 192.168.1.100 # 查看可挂载目录 mount -t nfs 192.168.1.100:/nfs/data /mnt建议在/etc/fstab添加自动挂载避免重启失效192.168.1.100:/nfs/data /mnt nfs defaults 0 03. 前端项目资源准备3.1 项目文件部署将构建好的前端资源拷贝到NFS目录cp -r dist/* /nfs/data/frontend这里有个优化点建议按版本号建立子目录方便回滚/nfs/data/frontend ├── v1.0 ├── v1.1 └── current - v1.13.2 Nginx配置管理创建nginx.conf配置文件server { listen 80; server_name app.example.com; location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; expires 1d; } }通过ConfigMap挂载配置kubectl create configmap nginx-config --from-filenginx.conf4. 证书安全管理4.1 SSL证书存储将证书文件存入Secretkubectl create secret tls app-tls \ --certfullchain.pem \ --keyprivkey.pem建议定期轮转证书kubectl create secret tls app-tls-v2 --cert... --key... kubectl rollout restart deployment frontend4.2 安全加固措施给Secret添加注解限制访问metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: 5. Deployment深度配置5.1 多副本部署完整Deployment配置示例apiVersion: apps/v1 kind: Deployment metadata: name: frontend spec: replicas: 3 strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 template: spec: volumes: - name: web-root nfs: server: 192.168.1.100 path: /nfs/data/frontend/current - name: nginx-conf configMap: name: nginx-config containers: - image: nginx:1.21 volumeMounts: - mountPath: /usr/share/nginx/html name: web-root - mountPath: /etc/nginx/conf.d name: nginx-conf5.2 健康检查配置添加就绪探针确保流量只打到健康的PodreadinessProbe: httpGet: path: /healthz port: 80 initialDelaySeconds: 5 periodSeconds: 56. Service与Ingress配置6.1 服务暴露创建NodePort服务作为Ingress后端apiVersion: v1 kind: Service metadata: name: frontend-svc spec: ports: - port: 80 targetPort: 80 selector: app: frontend6.2 Ingress高级配置带HTTPS重定向的Ingress配置apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/force-ssl-redirect: true nginx.ingress.kubernetes.io/ssl-passthrough: false spec: tls: - hosts: - app.example.com secretName: app-tls rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: frontend-svc port: number: 807. 运维监控方案7.1 日志收集配置在Deployment中添加日志Sidecarcontainers: - name: log-tailer image: busybox args: [/bin/sh, -c, tail -n1 -f /var/log/nginx/access.log] volumeMounts: - name: nginx-logs mountPath: /var/log/nginx7.2 性能监控通过Annotations暴露Nginx指标annotations: prometheus.io/scrape: true prometheus.io/port: 9113 prometheus.io/path: /metrics8. 最佳实践总结在实际生产环境中我们还需要考虑以下优化点使用CDN加速静态资源Nginx配置中添加缓存头location ~* \.(js|css|png)$ { expires 365d; add_header Cache-Control public; }配置HPA实现自动扩缩容kubectl autoscale deployment frontend --cpu-percent50 --min2 --max10对于大型前端项目建议将静态资源拆分为多个PV如图片单独挂载volumes: - name: images nfs: server: 192.168.1.100 path: /nfs/data/images这套方案在我们多个线上项目中都稳定运行了1年以上经历过618、双11等大流量考验。最关键的是要确保NFS服务的高可用可以考虑使用DRBDKeepalived方案做服务冗余。

更多文章