你已经用 Docker Compose 把应用跑得很顺畅了——一个 docker-compose up 就能拉起全套服务。那为什么还需要 Kubernetes?答案很简单:Compose 管单机,K8s 管集群。

当你需要跨多台服务器部署、自动故障转移、滚动更新而不停机时,K8s 就是那个答案。

核心概念对照表

Docker Compose Kubernetes 说明
Container Pod Pod 是最小调度单元,可含 1+ 个容器
docker-compose.yml Deployment 声明式定义应用
Network Service 服务发现与负载均衡
Volume PersistentVolume/PVC 持久化存储
Env Variables ConfigMap/Secret 配置与密钥分离
Port Mapping Ingress 外部流量入口

第一个 K8s 部署:minikube 实战

1
2
3
4
5
minikube start --driver=docker
kubectl create deployment my-app --image=myapp:v1 --replicas=3
kubectl expose deployment my-app --port=3000 --type=NodePort
kubectl get pods
kubectl get services

三个 replicas 意味着 K8s 会自动维持 3 个 Pod 实例。如果某个 Pod 挂了,K8s 会立刻拉起一个新的——这就是自愈能力。

Deployment:声明式 YAML

生产环境中你不会用 kubectl create 命令,而是用 YAML 声明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: myapp:v1
ports:
- containerPort: 3000
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 3000
readinessProbe:
httpGet:
path: /ready
port: 3000

关键字段:resources.requests(最低保证资源)、resources.limits(硬上限)、livenessProbe(健康检查失败重启)、readinessProbe(就绪后接入流量)。

Service:稳定的网络入口

Pod 随时会重建(IP 会变),Service 提供了不变的虚拟 IP 和 DNS 名称:

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 3000
type: ClusterIP

现在集群内任何服务都可以通过 http://my-app-service 访问你的应用,K8s 自动做负载均衡。

ConfigMap 与 Secret:配置代码分离

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
NODE_ENV: "production"
LOG_LEVEL: "info"
---
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
DB_PASSWORD: c2VjdXJlLXBhc3N3b3Jk # base64 编码

在 Deployment 中引用:

1
2
3
4
5
6
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secrets
key: DB_PASSWORD

总结

从 Compose 到 K8s 不是替代关系,而是单机到集群的自然演进。当你只需要单台服务器跑几个服务时,Compose 是最佳选择。当业务需要高可用、自动扩缩容、滚动更新时,K8s 的价值就体现出来了。两者各有所长,关键是在合适的阶段选择合适的工具。