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-service=nfs --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-file=nginx.conf4. 证书安全管理
4.1 SSL证书存储
将证书文件存入Secret:
kubectl create secret tls app-tls \ --cert=fullchain.pem \ --key=privkey.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 健康检查配置
添加就绪探针确保流量只打到健康的Pod:
readinessProbe: 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中添加日志Sidecar:
containers: - name: log-tailer image: busybox args: [/bin/sh, -c, 'tail -n+1 -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: "/metrics"8. 最佳实践总结
在实际生产环境中,我们还需要考虑以下优化点:
- 使用CDN加速静态资源,Nginx配置中添加缓存头:
location ~* \.(js|css|png)$ { expires 365d; add_header Cache-Control "public"; }- 配置HPA实现自动扩缩容:
kubectl autoscale deployment frontend --cpu-percent=50 --min=2 --max=10- 对于大型前端项目,建议将静态资源拆分为多个PV,如图片单独挂载:
volumes: - name: images nfs: server: 192.168.1.100 path: /nfs/data/images这套方案在我们多个线上项目中都稳定运行了1年以上,经历过618、双11等大流量考验。最关键的是要确保NFS服务的高可用,可以考虑使用DRBD+Keepalived方案做服务冗余。
