一、为什么需要这些控制器?
想象你要组织学校运动会:
- 观众席座位要按班级顺序固定(类似StatefulSet管理数据库集群)
- 每个出入口必须有安保人员值守(类似DaemonSet在节点部署日志代理)
Kubernetes通过这些控制器让容器管理更贴近真实业务需求。我们用以下案例说明(技术栈:Kubernetes v1.24 + containerd运行时)
二、StatefulSet:给服务加上身份证
2.1 典型场景剖析
当遇到这些情况请选用:
- 数据库集群(MySQL主从复制)
- 分布式存储系统(Elasticsearch分片)
- 需要固定网络标识的应用
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-cluster
spec:
serviceName: "mysql" # 必须配套Headless Service
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "yoursecurepassword"
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
# 声明持久化模板(每个Pod独立PVC)
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "ssd-storage" # 预先创建的存储类
resources:
requests:
storage: 20Gi
重要特性说明:
- 按序部署(pod-0 → pod-1 → pod-2)
- 固定域名格式:
<statefulset-name>-<ordinal>.<service-name>
- 持久卷与实例绑定生命周期
三、DaemonSet:让节点获得标准化配置
3.1 典型部署场景
适合下列需求时使用:
- 节点监控代理(Prometheus node-exporter)
- 日志收集器(Fluentd/Filebeat)
- 网络插件(Calico/Weave)
# fluentd-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
tolerations:
- key: node-role.kubernetes.io/master # 允许调度到master节点
effect: NoSchedule
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1.16
resources:
limits:
memory: 300Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: config-volume
mountPath: /etc/fluentd
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: config-volume
configMap:
name: fluentd-config # 预先创建的自定义配置
关键优势点:
- 新节点自动部署实例
- 保障关键服务的全覆盖
- 资源按需分配不浪费
四、技术对比与选型指南
4.1 功能差异矩阵
特性 | StatefulSet | DaemonSet |
---|---|---|
部署目标 | 特定数量Pod | 所有/部分节点 |
存储卷 | 支持动态模板 | 通常使用hostPath |
网络标识 | 稳定域名/IP | 不固定 |
典型应用 | 数据库/中间件 | 基础服务/监控 |
4.2 踩坑预警
StatefulSet注意事项:
- 删除PVC需要手动操作(保护数据安全)
- 滚动更新策略需配合partition参数分阶段
- 拓扑约束影响调度顺序
DaemonSet避坑指南:
- 避免使用资源占用大的镜像
- 注意master节点的污点容忍
- 升级可能引起瞬时服务中断
五、进阶联动玩法
5.1 组合应用案例
监控数据库集群的方案:
- StatefulSet部署PostgreSQL集群
- DaemonSet部署Prometheus节点监控
- 通过Service关联两种资源
# 混合部署架构示例
---
apiVersion: v1
kind: Service
metadata:
name: postgres
spec:
clusterIP: None # Headless服务
ports:
- port: 5432
selector:
app: postgres
---
# StatefulSet定义(参考前文结构)
---
# DaemonSet定义(监控组件)
六、总结与决策树
当你犹豫如何选择时,请回答:
- 需要保证每个实例的唯一性吗? → StatefulSet
- 需要在每个节点运行相同任务吗? → DaemonSet
- 两者都不符合 → 考虑Deployment
最后通过表格快速回顾:
决策因素 | StatefulSet | DaemonSet |
---|---|---|
持久化存储需求 | ✔ | ✘ |
稳定网络标识需要 | ✔ | ✘ |
全节点覆盖要求 | ✘ | ✔ |