Skip to content

Kubernetes 部署核心概念:从 Pod 到 Ingress 的完整链路

Kubernetes(K8s)是现代云原生应用的事实标准编排平台。要成功部署一个 Node.js、NestJS 或 Bun 应用,必须掌握其核心对象:Deployment、Service、Ingress、ConfigMap 和 Secret。它们共同构成了一个可扩展、可维护、安全的生产级部署架构。


一、Deployment:管理 Pod 副本,实现声明式更新

作用
Deployment 是 Kubernetes 中用于管理应用副本(Pods) 的核心控制器。它确保指定数量的 Pod 副本始终运行,并支持滚动更新、回滚、扩缩容。

核心功能:

  • 副本管理:确保始终运行指定数量的 Pod(如 replicas: 3
  • 滚动更新:逐步替换旧 Pod,实现零停机发布
  • 自愈能力:Pod 崩溃时自动重建
  • 声明式配置:通过 YAML 定义“期望状态”,K8s 自动达成

示例:NestJS 应用 Deployment

yaml
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nestjs-app
  labels:
    app: nestjs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nestjs
  template:
    metadata:
      labels:
        app: nestjs
    spec:
      containers:
      - name: app
        image: my-registry/nestjs-app:v1.2.3-abc123
        ports:
        - containerPort: 3000
        envFrom:
        - configMapRef:
            name: app-config
        - secretRef:
            name: app-secrets
        resources:
          requests:
            memory: "256Mi"
            cpu: "100m"
          limits:
            memory: "512Mi"
            cpu: "200m"
        livenessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 3000
          initialDelaySeconds: 10
          periodSeconds: 5

关键点

  • 使用具体镜像标签(如 v1.2.3-abc123),避免 latest
  • 配置 resources 限制资源使用
  • 设置 livenessProbereadinessProbe 实现健康检查

二、Service:暴露服务,实现服务发现

作用
Service 为一组 Pod 提供稳定的网络入口。Pod 是临时的(可能被调度、重启),而 Service 提供一个固定的 IP 和 DNS 名称。

三种主要类型:

类型用途是否暴露公网
ClusterIP(默认)集群内部通信
NodePort通过节点 IP + 端口暴露✅(有限)
LoadBalancer云厂商提供公网负载均衡器

示例:为 Deployment 创建 Service

yaml
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nestjs-service
spec:
  selector:
    app: nestjs
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: ClusterIP  # 内部服务

服务发现

  • 其他 Pod 可通过 http://nestjs-service:80 访问该应用
  • K8s 内置 DNS 自动解析服务名

若需公网访问,使用 LoadBalancer

yaml
type: LoadBalancer

三、Ingress:7 层路由,基于域名和路径转发

作用
Ingress 是 Kubernetes 的第 7 层(HTTP/HTTPS)入口网关,用于管理外部流量如何进入集群。它基于域名和路径进行路由,是实现多应用共享公网 IP 的关键。

核心功能:

  • ✅ 基于域名路由:api.myapp.com → 后端 API,web.myapp.com → 前端
  • ✅ 基于路径路由:/api → API 服务,/ → 静态站点
  • ✅ TLS 终止:自动管理 HTTPS 证书(配合 Cert-Manager)
  • ✅ 负载均衡、重写、限流等高级功能

示例:Ingress 配置

yaml
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
  - hosts:
    - api.myapp.com
    secretName: api-tls-secret
  rules:
  - host: api.myapp.com
    http:
      paths:
      - path: /api(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: nestjs-service
            port:
              number: 80

工作流程

  1. 用户访问 https://api.myapp.com/api/users
  2. Ingress Controller(如 Nginx、Traefik)接收请求
  3. 匹配 hostpath,转发到 nestjs-service:80
  4. Service 负载均衡到后端 Pod

注意:需先部署 Ingress Controller(如 ingress-nginx


四、ConfigMap 与 Secret:外部化配置与密钥

1. ConfigMap:管理非敏感配置

用途:存储环境变量、配置文件内容(如 NODE_ENV=production

yaml
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  NODE_ENV: production
  LOG_LEVEL: info
  API_TIMEOUT: "5000"

在 Deployment 中引用:

yaml
envFrom:
- configMapRef:
    name: app-config

2. Secret:安全存储敏感数据

用途:数据库密码、JWT 密钥、API Tokens

yaml
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  DB_PASSWORD: MWYyZDFlMmU2N2Rm # base64 编码
  JWT_SECRET: ZmM2YzRhZGZkY2ViNzE1 # base64 编码

在 Deployment 中引用:

yaml
envFrom:
- secretRef:
    name: app-secrets

安全建议

  • 使用 kubectl create secret --from-literal 创建
  • 结合 External SecretsHashicorp Vault 实现更高级密钥管理

五、完整部署流程

  1. 构建镜像:CI 中构建并推送带 sha 标签的镜像
  2. 应用配置
    bash
    kubectl apply -f configmap.yaml
    kubectl apply -f secret.yaml
  3. 部署应用
    bash
    kubectl apply -f deployment.yaml
    kubectl apply -f service.yaml
    kubectl apply -f ingress.yaml
  4. 验证
    bash
    kubectl get pods,svc,ingress
    kubectl logs -f <pod-name>

六、总结:K8s 部署核心对象关系图

User Request

  Ingress (api.myapp.com → /api → nestjs-service)

  Service (ClusterIP: 10.100.1.100)

  Pods (ReplicaSet → 3个 Pod)

  ConfigMap + Secret (注入配置与密钥)

掌握 Deployment、Service、Ingress、ConfigMap、Secret 这五大核心对象,你就能在 Kubernetes 上部署任何现代 Web 应用。它们不仅是技术组件,更是云原生架构的设计语言