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限制资源使用 - 设置
livenessProbe和readinessProbe实现健康检查
二、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:yamltype: 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工作流程:
- 用户访问
https://api.myapp.com/api/users - Ingress Controller(如 Nginx、Traefik)接收请求
- 匹配
host和path,转发到nestjs-service:80 - 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-config2. 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 Secrets 或 Hashicorp Vault 实现更高级密钥管理
五、完整部署流程
- 构建镜像:CI 中构建并推送带
sha标签的镜像 - 应用配置:bash
kubectl apply -f configmap.yaml kubectl apply -f secret.yaml - 部署应用:bash
kubectl apply -f deployment.yaml kubectl apply -f service.yaml kubectl apply -f ingress.yaml - 验证: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 应用。它们不仅是技术组件,更是云原生架构的设计语言。