当前位置: 首页 > news >正文

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 --reload

2.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 0

3. 前端项目资源准备

3.1 项目文件部署

将构建好的前端资源拷贝到NFS目录:

cp -r dist/* /nfs/data/frontend

这里有个优化点:建议按版本号建立子目录,方便回滚:

/nfs/data/frontend ├── v1.0 ├── v1.1 └── current -> v1.1

3.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.conf

4. 证书安全管理

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 frontend

4.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-conf

5.2 健康检查配置

添加就绪探针确保流量只打到健康的Pod:

readinessProbe: httpGet: path: /healthz port: 80 initialDelaySeconds: 5 periodSeconds: 5

6. Service与Ingress配置

6.1 服务暴露

创建NodePort服务作为Ingress后端:

apiVersion: v1 kind: Service metadata: name: frontend-svc spec: ports: - port: 80 targetPort: 80 selector: app: frontend

6.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: 80

7. 运维监控方案

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/nginx

7.2 性能监控

通过Annotations暴露Nginx指标:

annotations: prometheus.io/scrape: "true" prometheus.io/port: "9113" prometheus.io/path: "/metrics"

8. 最佳实践总结

在实际生产环境中,我们还需要考虑以下优化点:

  1. 使用CDN加速静态资源,Nginx配置中添加缓存头:
location ~* \.(js|css|png)$ { expires 365d; add_header Cache-Control "public"; }
  1. 配置HPA实现自动扩缩容:
kubectl autoscale deployment frontend --cpu-percent=50 --min=2 --max=10
  1. 对于大型前端项目,建议将静态资源拆分为多个PV,如图片单独挂载:
volumes: - name: images nfs: server: 192.168.1.100 path: /nfs/data/images

这套方案在我们多个线上项目中都稳定运行了1年以上,经历过618、双11等大流量考验。最关键的是要确保NFS服务的高可用,可以考虑使用DRBD+Keepalived方案做服务冗余。

http://www.jsqmd.com/news/660474/

相关文章:

  • 窗口置顶解决方案:PinWin工具提升多任务效率
  • Adobe-GenP 3.0:一键解锁Adobe全家桶的终极解决方案
  • 从MMU到IOMMU:搞懂Linux虚拟化里这个‘影子保镖’到底在保护什么?
  • AD9833信号发生器DIY:从原理图绘制到PCB打样,打造你的桌面级测试工具
  • 创业融资指南:一文读懂创业板、新三板、科创板与主板的定位与选择
  • 告别IIS!Spotfire 7.0+ 架构升级后,如何用Node Manager轻松搞定Web Player负载均衡
  • 嵌入式开发者的福音:用Buildroot一键搞定OpenCV交叉编译的所有依赖(含CMake配置详解)
  • Genesis文件导出避坑指南:如何正确导出Panel和钻孔层(附常见错误解决方案)
  • HJ180 游游的最长稳定子数组
  • Flutter环境搭建保姆级避坑指南:从Flutter Doctor红叉到全绿勾的完整排错流程
  • 避开TensorRT INT8量化的那些坑:校准集选择、精度损失分析与调优经验分享
  • 剖析有实力的月子中心服务,哪家月子会所性价比高为你揭晓 - 工业品牌热点
  • 从比特币到以太坊:10个新手必知的区块链核心概念(附自测题)
  • 别再乱删PDB文件了!手把手教你用Visual Studio 2022分析客户现场发来的Dump文件
  • 猫抓Cat-Catch:3步解决网页视频下载难题的终极方案
  • 告别手动刷新:在Vue 2/3的Ant Design Vue表格中优雅实现数据联动更新
  • 终极戴尔G15散热控制指南:开源替代方案TCC-G15完全解析
  • 别再只调参了!用树莓派+Python+OpenCV打造你的第一个AIoT智能小车(环境搭建到自动驾驶)
  • Android 14 开机视觉定制:从分区创建到Uboot与Bootanimation的完整实践
  • 终极乐谱识别神器Audiveris:5分钟让纸质乐谱重获新生
  • 微信立减金回收:告别闲置浪费,安全高效变现 - 米米收
  • ESP8266-01S联网避坑大全:关于STA模式、TCP连接和透传的那些“反直觉”设定
  • 2026年微信公众号编辑器使用指南:5步打造高级推文 实操教程 - 鹅鹅鹅ee
  • 手把手教你为ARM设备交叉编译MQTT神器Mosquitto(附OpenSSL 1.0.2e配置)
  • OMI/Aura臭氧数据高效下载与M_Map可视化实践
  • **发散创新:基于Flink的实时流处理架构设计与实战优化**在现代大数据系统中,**实时流处理已成为核心能力
  • 别只盯着单片机!用74LS161芯片理解数字钟的底层逻辑(含校时、闹钟完整设计)
  • 2026河北合同纠纷律所观察:专业能力如何匹配维权需求? - 律界观察
  • Hotkey Detective:3分钟解决Windows热键冲突的终极指南
  • 完全掌握WindowsCleaner:高效使用开源系统清理工具