一、为什么需要这些控制器?

想象你要组织学校运动会:

  • 观众席座位要按班级顺序固定(类似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

重要特性说明:

  1. 按序部署(pod-0 → pod-1 → pod-2)
  2. 固定域名格式:<statefulset-name>-<ordinal>.<service-name>
  3. 持久卷与实例绑定生命周期

三、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 # 预先创建的自定义配置

关键优势点:

  1. 新节点自动部署实例
  2. 保障关键服务的全覆盖
  3. 资源按需分配不浪费

四、技术对比与选型指南

4.1 功能差异矩阵
特性 StatefulSet DaemonSet
部署目标 特定数量Pod 所有/部分节点
存储卷 支持动态模板 通常使用hostPath
网络标识 稳定域名/IP 不固定
典型应用 数据库/中间件 基础服务/监控
4.2 踩坑预警

StatefulSet注意事项:

  • 删除PVC需要手动操作(保护数据安全)
  • 滚动更新策略需配合partition参数分阶段
  • 拓扑约束影响调度顺序

DaemonSet避坑指南:

  • 避免使用资源占用大的镜像
  • 注意master节点的污点容忍
  • 升级可能引起瞬时服务中断

五、进阶联动玩法

5.1 组合应用案例

监控数据库集群的方案:

  1. StatefulSet部署PostgreSQL集群
  2. DaemonSet部署Prometheus节点监控
  3. 通过Service关联两种资源
# 混合部署架构示例
---
apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  clusterIP: None # Headless服务
  ports:
  - port: 5432
  selector:
    app: postgres
---
# StatefulSet定义(参考前文结构)
---
# DaemonSet定义(监控组件) 

六、总结与决策树

当你犹豫如何选择时,请回答:

  1. 需要保证每个实例的唯一性吗? → StatefulSet
  2. 需要在每个节点运行相同任务吗? → DaemonSet
  3. 两者都不符合 → 考虑Deployment

最后通过表格快速回顾:

决策因素 StatefulSet DaemonSet
持久化存储需求
稳定网络标识需要
全节点覆盖要求