Nestjs项目实战 Kubernetes集群部署指南

最近在尝试将Nestjs项目部署到Kubernetes集群,但在实际操作中遇到了一些问题。首先,在编写Dockerfile构建镜像时,对于多阶段构建的最佳实践不太清楚,特别是如何优化镜像体积。其次,在编写K8s的deployment.yaml文件时,对于资源限制(CPU/Memory)的参数设置没有把握,担心设置不当会影响服务稳定性。另外,在服务发现方面,如何配置Ingress和Service才能让外部访问Nestjs服务?有没有成熟的健康检查方案可以分享?最后想请教下,针对Nestjs这种Node.js应用,在K8s环境中需要特别注意哪些性能调优点?希望有实际部署经验的大神能分享下完整的部署流程和避坑指南。


3 回复
  1. 环境准备
    确保本地安装Docker、Kubectl和Helm工具。将NestJS项目打包成Docker镜像并推送到私有镜像仓库。

  2. 配置Kubernetes文件
    创建deployment.yaml定义Pod副本数量、容器镜像地址及端口映射;创建service.yaml暴露服务;创建ingress.yaml用于域名访问。

  3. 数据库与配置管理
    使用ConfigMap管理环境变量,通过Secret存储敏感信息如数据库密码。为数据库创建独立的StatefulSet或使用外部托管服务。

  4. 资源限配
    resources.limits中设置CPU和内存限制,避免资源争抢导致性能下降。

  5. 监控与日志
    集成Prometheus和Grafana监控指标;通过EFK(Elasticsearch, Fluentd, Kibana)收集日志。

  6. CI/CD流水线
    使用Jenkins或GitLab CI自动构建镜像并更新到K8s集群,实现灰度发布或蓝绿部署。

  7. 调试与验证
    使用kubectl describe检查Pod状态,通过K8s Dashboard查看服务运行情况。

遵循以上步骤即可完成NestJS项目的Kubernetes集群部署。


作为屌丝程序员,分享一个简单的NestJS项目K8s部署流程:

  1. 代码准备:确保项目已构建,运行npm run build生成dist目录。

  2. Dockerfile编写

    # 基础镜像
    FROM node:16-alpine
    WORKDIR /usr/src/app
    COPY package*.json ./
    RUN npm install --production
    COPY . .
    EXPOSE 3000
    CMD ["node", "dist/main"]
    
  3. 构建镜像:执行docker build -t yourname/nestjs-app:1.0 .

  4. 推送镜像:登录Docker Hub,docker push yourname/nestjs-app:1.0

  5. Kubernetes配置

    • 创建Deployment:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nestjs-deployment
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: nestjs
        template:
          metadata:
            labels:
              app: nestjs
          spec:
            containers:
            - name: nestjs
              image: yourname/nestjs-app:1.0
              ports:
              - containerPort: 3000
      
    • 创建Service:
      apiVersion: v1
      kind: Service
      metadata:
        name: nestjs-service
      spec:
        type: LoadBalancer
        ports:
        - port: 80
          targetPort: 3000
        selector:
          app: nestjs
      
  6. 部署到K8s:使用kubectl apply -f deployment.yamlkubectl apply -f service.yaml

  7. 验证:通过kubectl get podskubectl get services查看状态。

注意:根据实际环境调整资源配置。

NestJS项目Kubernetes部署指南

准备阶段

  1. 容器化NestJS应用
# Dockerfile示例
FROM node:16-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .
RUN npm run build

EXPOSE 3000
CMD ["node", "dist/main"]
  1. 构建并推送镜像
docker build -t your-registry/your-nest-app:latest .
docker push your-registry/your-nest-app:latest

Kubernetes部署文件

  1. Deployment配置
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nest-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nest-app
  template:
    metadata:
      labels:
        app: nest-app
    spec:
      containers:
      - name: nest-app
        image: your-registry/your-nest-app:latest
        ports:
        - containerPort: 3000
        env:
        - name: NODE_ENV
          value: production
  1. Service配置
apiVersion: v1
kind: Service
metadata:
  name: nest-app-service
spec:
  selector:
    app: nest-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  1. Ingress配置(可选)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nest-app-ingress
spec:
  rules:
  - host: your-domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nest-app-service
            port:
              number: 80

部署命令

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml

最佳实践建议

  1. 使用ConfigMap或Secret管理环境变量
  2. 设置资源请求和限制
  3. 配置就绪和存活探针
  4. 考虑使用Horizontal Pod Autoscaler自动扩缩容
  5. 实施CI/CD流水线自动化部署流程

如需更详细的配置或遇到具体问题,可以提供更多上下文我会给出针对性建议。

回到顶部