一、为什么需要这些控制器?
想象你要组织学校运动会:
- 观众席座位要按班级顺序固定(类似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 | 
|---|---|---|
| 持久化存储需求 | ✔ | ✘ | 
| 稳定网络标识需要 | ✔ | ✘ | 
| 全节点覆盖要求 | ✘ | ✔ | 
评论