You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Docker-Compose部署的Node.js应用迁移至Kubernetes的方法咨询

将Next.js + Nginx架构从Docker Compose迁移到Kubernetes

前置准备

首先得把你的两个镜像推到容器镜像仓库(比如Docker Hub、私有Harbor等),Kubernetes集群需要能拉取到这些镜像。假设你已经给镜像打上标签:

  • Next.js镜像:your-registry/nextjs-app:v1
  • Nginx镜像:your-registry/nginx-proxy:v1

1. 部署Next.js应用(Deployment + Service)

创建nextjs-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nextjs-deployment
spec:
  replicas: 2 # 可根据业务需求调整副本数量
  selector:
    matchLabels:
      app: nextjs
  template:
    metadata:
      labels:
        app: nextjs
    spec:
      containers:
      - name: nextjs
        image: your-registry/nextjs-app:v1 # 替换为你的实际镜像地址
        ports:
        - containerPort: 3000
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "256Mi"

创建nextjs-service.yaml(ClusterIP类型,仅集群内部可访问):

apiVersion: v1
kind: Service
metadata:
  name: nextjs-service
spec:
  selector:
    app: nextjs
  ports:
  - port: 3000
    targetPort: 3000

2. 部署Nginx代理(Deployment + Service)

注意:你的Nginx配置文件里的proxy_pass必须修改为Kubernetes内部的Service地址,也就是http://nextjs-service:3000——K8s的Service会通过集群DNS自动解析这个内部域名。

创建nginx-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: your-registry/nginx-proxy:v1 # 替换为你的实际镜像地址
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "100m"
            memory: "64Mi"
          limits:
            cpu: "200m"
            memory: "128Mi"

创建nginx-service.yaml(根据集群环境选择类型):

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: NodePort # 裸金属集群可用NodePort;云环境可改用LoadBalancer

3. 用Ingress暴露服务(推荐方案)

如果你的集群已经部署了Ingress Controller(比如NGINX Ingress Controller),可以直接用Ingress替代单独的Nginx Deployment,这更符合Kubernetes最佳实践:

创建ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nextjs-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: your-domain.com # 替换为你的业务域名
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nextjs-service
            port:
              number: 3000

4. 执行部署

运行以下命令将所有资源部署到Kubernetes集群:

kubectl apply -f nextjs-deployment.yaml
kubectl apply -f nextjs-service.yaml
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
# 若使用Ingress方案,执行:
kubectl apply -f ingress.yaml

5. 验证部署状态

  • 查看Pod运行状态:kubectl get pods
  • 查看Service信息:kubectl get svc
  • 访问验证:
    • NodePort方案:http://<集群节点IP>:<NodePort端口>
    • LoadBalancer方案:访问云厂商分配的外部负载均衡IP
    • Ingress方案:配置域名解析后,直接访问你的业务域名

内容的提问来源于stack exchange,提问作者CaptainPy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:36:23