鱼弦:全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

k8s 说一下deployment,statefulset,daemonset 的区别_原力计划

在 Kubernetes(K8s)中,Deployment、StatefulSet和DaemonSet是三种常用的控制器对象,用于管理应用程序的部署和运行。它们在不同的场景下有不同的特点和用途。

  1. Deployment(部署):
    Deployment是Kubernetes中最常用的控制器之一,用于管理无状态的应用程序。它提供了应用程序的副本管理、自动扩展、滚动升级等功能。Deployment通过ReplicaSet实现副本管理,可以确保指定数量的Pod副本正在运行,并处理Pod的创建、删除和更新。Deployment适用于无状态应用程序,如Web服务、API服务等。
  2. StatefulSet(有状态集合):
    StatefulSet用于管理有状态的应用程序,这些应用程序通常需要持久性存储和稳定的网络标识。与Deployment不同,StatefulSet为每个Pod提供唯一的标识符和稳定的网络标识,以便在Pod重新启动或迁移时保持状态的稳定性。它还支持有序部署和扩展,并提供有状态应用程序所需的有序启动和终止策略。StatefulSet适用于数据库、消息队列、存储节点等有状态应用程序。
  3. DaemonSet(守护进程集合):
    DaemonSet用于在Kubernetes集群的每个节点上运行一个Pod副本,确保每个节点上都有一个Pod的副本在运行。与Deployment和StatefulSet不同,DaemonSet不关心副本数量,而是关注集群中的每个节点。当新节点加入集群时,DaemonSet会自动在新节点上创建Pod副本;当节点从集群中删除时,相应的Pod副本也会被删除。DaemonSet适用于运行系统级别的守护进程、日志收集器、监控代理等。

 

Deployment(部署)原理解释:
        Deployment是Kubernetes中用于管理无状态应用程序的控制器对象。它的主要原理是通过定义一个期望的状态(Desired State)来管理Pod的副本数量,并确保实际运行的Pod副本与期望状态保持一致。Deployment使用ReplicaSet来实现副本管理,ReplicaSet则使用Pod模板创建和管理Pod副本。

流程图:

+----------------------+
                                      |                      |
                                      |   Deployment         |
                                      |                      |
                                      +----------+-----------+
                                                 |
                                                 |
                                                 |
                                                 v
                                      +----------+-----------+
                                      |                      |
                                      |   ReplicaSet         |
                                      |                      |
                                      +----------+-----------+
                                                 |
                                                 |
                                                 |
                                                 v
                                      +----------+-----------+
                                      |                      |
                                      |   Pod                |
                                      |                      |
                                      +----------------------+

使用场景:

  • 适用于无状态应用程序,如Web服务、API服务等。
  • 需要进行副本管理、自动扩展和滚动升级的应用程序。

代码示例实现:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx:latest

文献材料链接:

当前使用Deployment的产品:

  • Kubernetes本身是使用Deployment来管理Kubernetes集群中的核心组件和应用程序。
  • 很多云服务提供商(如AWS、Azure、Google Cloud等)的Kubernetes托管服务也使用Deployment来管理用户的应用程序部署。
  • 许多企业和组织在生产环境中使用Kubernetes时,也广泛使用Deployment来管理应用程序的部署。
  1. StatefulSet(有状态集合)原理解释:
    StatefulSet是Kubernetes中用于管理有状态应用程序的控制器对象。它的主要原理是为每个Pod提供唯一的标识符和稳定的网络标识,以保持状态的稳定性。StatefulSet通过控制Pod的创建、删除和更新,以及提供有序启动和终止策略来管理有状态应用程序。每个Pod都有一个唯一的标识符和网络标识,这使得Pod在重新启动或迁移时能够保持稳定的状态。

流程图:

+----------------------+
                                      |                      |
                                      |   StatefulSet        |
                                      |                      |
                                      +----------+-----------+
                                                 |
                                                 |
                                                 |
                                                 v
                                      +----------+-----------+
                                      |                      |
                                      |   PersistentVolume   |
                                      |                      |
                                      +----------------------+
                                                 |
                                                 |
                                                 |
                                                 v
                                      +----------+-----------+
                                      |                      |
                                      |   Pod                |
                                      |                      |
                                      +----------------------+

使用场景:

  • 适用于有状态应用程序,如数据库、消息队列、存储节点等。
  • 需要提供有序部署、有序扩展和稳定的网络标识的应用程序。

代码示例实现:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-statefulset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  serviceName: my-service
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx:latest

文献材料链接:

当前使用StatefulSet的产品:

  • 许多数据库产品(如MySQL、PostgreSQL)在Kubernetes中使用StatefulSet来管理数据库实例的部署和运行。
  • 一些消息队列系统(如Kafka)也使用StatefulSet来管理节点的部署和运行。
  • 企业和组织在需要管理有状态应用程序的场景中广泛使用StatefulSet来管理应用程序的部署。
  1. DaemonSet(守护进程集合)原理解释:
    DaemonSet是Kubernetes中用于在每个节点上运行一个Pod副本的控制器对象。它的主要原理是在集群中的每个节点上创建一个Pod副本,以确保每个节点都有一个Pod运行。当新节点加入集群时,DaemonSet会自动在新节点上创建Pod副本;当节点从集群中删除时,相应的Pod副本也会被删除。DaemonSet适用于运行系统级别的守护进程、日志收集器、监控代理等任务。

流程图:

+----------------------+
                                      |                      |
                                      |   DaemonSet          |
                                      |                      |
                                      +----------+-----------+
                                                 |
                                                 |
                                                 |
                                                 v
                                      +----------+-----------+
                                      |                      |
                                      |   Pod                |
                                      |                      |
                                      +----------------------+

使用场景:

  • 适用于在每个节点上运行一个Pod的任务,如守护进程、日志收集器、监控代理等。
  • 需要在集群中动态管理节点上的任务的部署和运行。

代码示例实现:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: my-daemonset
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx:latest

文献材料链接:

当前使用DaemonSet的产品:

  • 许多日志收集器和监控代理(如Fluentd、Prometheus Node Exporter)在Kubernetes中使用DaemonSet来在每个节点上运行相应的Pod副本。
  • 一些网络代理和边缘计算相关的产品也使用DaemonSet来在节点上运行相应的任务。
  • 企业和组织在需要在每个节点上运行特定任务的场景中,使用DaemonSet来管理任务的部署和运行。