Kubernetes 控制器详解:RC vs RS vs Deployment
一、核心概念对比
特性 | ReplicationController (RC) | ReplicaSet (RS) | Deployment |
---|---|---|---|
API版本 | v1 | apps/v1 | apps/v1 |
选择器类型 | 仅支持等式选择器 | 支持集合选择器 | 继承RS的选择器能力 |
滚动更新 | 不支持 | 不支持 | 原生支持 |
版本回滚 | 不支持 | 不支持 | 完整支持 |
状态历史 | 无 | 无 | 保留revision历史 |
推荐程度 | 已废弃 | 通常不直接使用 | 生产环境标准 |
二、ReplicationController (RC) 深度解析
1. 基础架构
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx-rc
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14
2. 核心机制
- Pod维护:通过selector匹配Pod,确保符合
replicas
数量 - 扩缩容:
kubectl scale rc nginx-rc --replicas=5
- 更新方式:
- 删除重建(replace命令)
- 修改template触发滚动替换
3. 局限性
- 无法区分不同版本的Pod
- 更新过程可能造成服务中断
- 选择器不可变(修改会导致失控)
三、ReplicaSet (RS) 深度解析
1. 核心改进
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3
selector:
matchExpressions:
- {key: tier, operator: In, values: [frontend]}
- {key: environment, operator: NotIn, values: [dev]}
template:
metadata:
labels:
tier: frontend
environment: prod
2. 关键特性
-
增强选择器:
# 匹配env=production且tier=frontend或backend的Pod matchLabels: env: production matchExpressions: - {key: tier, operator: In, values: [frontend, backend]}
-
与Deployment关系:
- Deployment实际控制RS
- 每个revision对应一个RS
3. 典型操作
# 查看关联的Pod
kubectl get pods -l tier=frontend
# 手动缩容
kubectl scale rs frontend --replicas=2
四、Deployment 深度解析
1. 完整架构示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
annotations:
kubernetes.io/change-cause: "initial version"
spec:
replicas: 3
revisionHistoryLimit: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.1
ports:
- containerPort: 80
2. 核心功能详解
滚动更新流程
graph TD A[当前RS:v1] -->|创建新RS:v2| B[新Pod逐步创建] B -->|健康检查通过| C[旧Pod逐步终止] C --> D[完成更新]
版本控制
# 查看发布历史
kubectl rollout history deployment/nginx-deployment
# 回滚到特定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2
更新策略对比
策略类型 | 特点 | 适用场景 |
---|---|---|
RollingUpdate | 渐进式替换(默认) | 生产环境主流选择 |
Recreate | 先删除全部旧Pod再创建新Pod | 需要完全替换的场景 |
3. 高级特性
-
暂停/恢复更新:
kubectl rollout pause deployment/nginx-deployment # 进行多次配置修改... kubectl rollout resume deployment/nginx-deployment
-
金丝雀发布:
strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0
五、三者在集群中的关系
graph LR Deployment -->|控制| ReplicaSet ReplicaSet -->|控制| Pod ReplicationController -->|独立控制| Pod style Deployment fill:#b3e0ff,stroke:#333 style ReplicaSet fill:#c2f0c2,stroke:#333 style ReplicationController fill:#ffcccc,stroke:#333
六、生产实践建议
-
版本升级规范:
# 使用声明式更新(推荐) kubectl set image deployment/nginx-deployment nginx=nginx:1.19.3 # 或使用apply更新yaml kubectl apply -f deployment-v2.yaml
-
健康检查配置:
readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 5
-
资源监控:
# 查看部署状态 kubectl rollout status deployment/nginx-deployment # 查看事件记录 kubectl describe deployment/nginx-deployment
-
故障排查流程:
1. 检查Deployment事件 2. 检查关联的ReplicaSet 3. 检查Pod状态和日志 4. 检查资源配额限制
七、迁移路线图
graph LR RC -->|升级到| RS RS -->|包装为| Deployment style RC fill:#ff9999,stroke:#333 style RS fill:#99cc99,stroke:#333 style Deployment fill:#66b3ff,stroke:#333
注:自Kubernetes 1.8起,Deployment已成为无状态应用管理的标准选择,RC仅用于兼容旧系统
评论需开启科学上网!