Kubernetes 有状态与无状态应用
一、基础概念对比
1. 本质区别
特征 | 无状态应用 | 有状态应用 |
---|---|---|
数据存储 | 不保存本地数据 | 依赖持久化存储 |
实例标识 | 完全匿名 | 具有唯一稳定标识(hostname等) |
请求关联性 | 请求相互独立 | 请求可能依赖会话状态 |
典型代表 | Nginx、Stateless微服务 | MySQL、Kafka、Redis |
2. 请求处理差异
graph TD subgraph 无状态 A[请求1] --> C[实例A] B[请求2] --> D[实例B] end subgraph 有状态 E[请求1] --> F[实例X] G[请求2] --> F[实例X] end
二、无状态应用深度解析
1. 核心优势
- 弹性扩展:秒级扩容/缩容
- 高可用:实例故障自动重建无影响
- 部署简单:无需考虑数据一致性
2. Kubernetes 实现方案
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 3
strategy:
rollingUpdate:
maxUnavailable: 1
template:
spec:
containers:
- name: web
image: nginx:latest
ports:
- containerPort: 80
3. 最佳实践
- 使用ConfigMap管理配置
- 通过Service实现负载均衡
- 设置Pod反亲和性避免单节点过载
kubectl top pods -l app=nginx # 监控资源使用
三、有状态应用核心技术
1. 关键需求
- 稳定网络标识:
<pod-name>.<service-name>.svc.cluster.local
- 持久化存储:每个Pod独立PVC
- 有序部署:主从架构需顺序启动
2. StatefulSet 配置示例
# statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql"
replicas: 3
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "ssd"
resources:
requests:
storage: 100Gi
template:
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
3. 数据管理策略
策略 | 描述 | 适用场景 |
---|---|---|
单节点读写 | ReadWriteOnce | 主数据库 |
多节点只读 | ReadOnlyMany | 从库/分析节点 |
动态供给 | storageClassName | 云环境 |
本地存储 | local-volume-provisioner | 性能敏感型应用 |
四、状态管理机制详解
1. 控制器工作原理
sequenceDiagram participant User participant API_Server participant Controller participant etcd User->>API_Server: 提交Spec API_Server->>etcd: 存储期望状态 Controller->>API_Server: 监听变化 Controller->>etcd: 读取当前状态 Controller->>API_Server: 执行调谐操作 API_Server->>etcd: 更新Status
2. 状态转换示例
# Pod状态生命周期
status:
phase: Pending -> Running -> Succeeded/Failed
conditions:
- type: Ready
status: "False" -> "True"
评论需开启科学上网!