Deployment、StatefulSet和DaemonSet的更新策略

本文对比了Kubernetes中Deployment、StatefulSet和DaemonSet的更新策略,包括滚动更新、有序更新和全局更新等,并探讨了不同策略下的可用性、网络标识稳定性及持久化存储支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结

下面是一个关于 Kubernetes 中 Deployment、StatefulSet 和 DaemonSet 的更新策略的比较表格:

特性 / 更新策略DeploymentStatefulSetDaemonSet
升级策略滚动升级(Rolling Update)有序升级(Ordered Update)全局升级(Global Update)
更新时的可用性部分中断,Pod 逐步替换部分中断,按顺序更新 Stateful Pod无中断,每个节点一个 Pod
稳定的网络标识不保证,Pod 可能会有不同的 IP保证,每个 Pod 都有稳定的标识不保证,每个节点一个 Pod
持久化存储的支持通常与 PVC 配合使用有 PVC 支持,每个 Pod 有唯一的 PV通常与 PVC 配合使用
更新时的顺序并行更新多个 Pod,按副本数比例按顺序更新,一个一个更新并行更新,每个节点一个 Pod
是否支持无状态 Pod

这张表格总结了 Deployment、StatefulSet 和 DaemonSet 在更新策略方面的一些关键差异。在选择适合您应用需求的控制器类型和更新策略时,考虑这些差异非常重要。请注意,每个控制器类型都有其适用的使用场景和优劣势,根据实际需求做出选择。

稳定的网络标识是指在 Kubernetes 集群中,每个 Pod 在其生命周期内都拥有一个不变的网络标识,使其能够通过固定的网络地址和主机名进行识别和访问。这样的网络标识对于应用程序的可靠性、网络通信以及基于服务的架构非常重要。

在 Kubernetes 中,Pod 默认情况下没有稳定的网络标识。这是因为在一些场景下,Pod 可能会被删除、重新创建或重新调度到不同的节点上,导致其**网络标识(如 IP 地址和主机名)**发生变化。

然而,有些应用场景中,稳定的网络标识是必需的。这时就可以使用 StatefulSet 控制器来确保每个 Pod 都有稳定的网络标识。StatefulSet 会为每个 Pod 分配一个稳定的网络标识,通常通过设置 DNS 子域名来实现。这样,无论 Pod 被重新创建或重新调度到哪个节点,它都会保持相同的 DNS 名称和网络标识。

StatefulSet 的稳定网络标识特性对于需要保持持久化存储、有序启动和关闭、节点有限制的应用程序非常有用,例如数据库集群或消息队列系统。

总之,稳定的网络标识确保在 Kubernetes 集群中每个 Pod 都有一个不变的网络标识,从而使得应用程序能够以可靠的方式进行通信和访问。这对于某些应用场景非常关键。

下面是有关Deployment、StatefulSet和DaemonSet的更新策略的详细说明:

Deployment 更新策略:

更新Deployment的注意事项

在Deployment对象中,可以使用.spec.strategy.type字段来定义更新策略。以下是几种常见的更新策略:

  1. RollingUpdate(默认):这是默认的更新策略。在进行滚动更新时,Deployment会逐步升级或回滚Pods。新的Pods会被创建并且在它们就绪后,旧的Pods会被逐个删除。您可以通过.spec.strategy.rollingUpdate.maxUnavailable字段指定允许的不可用Pods的最大数量。

  2. Recreate:此策略会将所有旧的Pods一次性删除,然后创建新的Pods。在这种情况下,会有一个短暂的应用程序中断期。该策略通常用于无状态应用程序,对于有状态应用程序可能导致数据丢失。

StatefulSet 更新策略:

StatefulSet更新策略

StatefulSet具有两个更新策略,即.spec.updateStrategy.type字段:

  1. OnDelete:这是默认值,StatefulSet在手动触发更新时遵循此策略。当您手动删除StatefulSet控制器时,控制器将按顺序删除每个Pod,并创建新的Pod以替换它们。

  2. RollingUpdate:您可以将此策略用于自动滚动更新。它使用两个参数:.spec.updateStrategy.rollingUpdate.partition.spec.updateStrategy.rollingUpdate.maxUnavailable。Partition指定在升级期间要同时删除的Pods数量,而maxUnavailable则定义了允许的不可用Pods的最大数量。

DaemonSet 更新策略:

更新和回滚DaemonSet

DaemonSet通常用于在集群中的每个节点上运行一个Pod副本。由于每个节点只有一个副本,所以更新策略相对简单。DaemonSet的更新策略可以通过.spec.updateStrategy.type字段进行控制:

  1. RollingUpdate:这是默认值,表示使用滚动更新策略。在这种策略下,新的Pods会被创建并且在就绪后旧的Pods会被逐个删除。

  2. OnDelete:该策略将在手动触发更新时使用。当您手动删除DaemonSet时,Kubernetes将按顺序删除每个Pod,并创建新的Pod以替换它们。

注意:更新策略可能因Kubernetes版本或集群配置而有所不同。请查阅Kubernetes文档以获取更多详细信息。

在这里插入图片描述

ks rollout restart ds cilium

在给定的上下文中,updateStrategy 是一个用于控制 Kubernetes DaemonSet 的更新策略的部分。DaemonSet 是一种 Kubernetes 控制器,用于确保集群中的每个节点都运行一个实例副本。

rollingUpdate 是其中的一种更新策略类型,通过逐步更新 DaemonSet 的实例来实现滚动更新。它具有以下参数:

  • maxUnavailable:指定在进行滚动更新时可以同时不可用的最大实例数。在这里,设置为2,表示在进行滚动更新过程中,最多允许同时有2个实例不可用。

type 指定了更新策略的类型,这里设置为 RollingUpdate,表示使用滚动更新策略。

综合起来,该配置指示 Kubernetes 使用滚动更新策略来更新 DaemonSet。通过在更新期间最多允许2个实例不可用,Kubernetes 将逐步更新 DaemonSet 的实例,以确保高可用性和服务的持续运行。

<think>嗯,用户让我解释一下DaemonSet,这应该是在Kubernetes中的一个资源类型吧。我之前学过一点Kubernetes的基本概念,但需要仔细回忆一下。DaemonSet,从名字上看可能“守护进程”有关,类似于在每个节点上运行一个守护进程? 首先,用户之前问过OnDelete新策略,可能是在学习Kubernetes的控制器,比如StatefulSetDaemonSet新机制。现在他想了解DaemonSet,可能需要对比之前的OnDelete策略,或者了解DaemonSet的基本概念、作用以及使用场景。 记得Kubernetes中的控制器有不同的类型,比如DeploymentStatefulSetDaemonSet等。Deployment用于管理无状态应用,StatefulSet用于有状态应用,而DaemonSet可能是在每个节点上运行一个Pod的副本,比如日志收集、监控代理这样的需求。 那DaemonSet的主要特点是什么?应该是确保每个符合条件的节点上都运行一个Pod的实例,当有新节点加入集群时,DaemonSet会自动部署Pod到新节点上,而当节点被移除时,对应的Pod也会被回收。这样的话,适合运行集群级别的服务,比如网络插件、存储服务或者监控代理。 用户可能想知道DaemonSet的定义方式,如何编写YAML文件,以及它的使用场景注意事项。比如,用户可能需要在每个节点上运行一个日志收集器,如Fluentd,或者网络插件如Calico,这时候就会用到DaemonSet。 另外,DaemonSet新策略StatefulSet类似吗?之前用户了解过OnDelete,可能DaemonSet也支持RollingUpdate或者其他策略?需要确认一下。例如,DaemonSet默认的新策略是RollingUpdate,但也可以配置为OnDelete,这样只有手动删除Pod才会触发新。 可能还需要解释DaemonSetDeployment的区别,比如Deployment是管理多个Pod副本,而不管节点分布,而DaemonSet是每个节点一个Pod。此外,DaemonSet的Pod会忽略Deployment中的副本数设置,因为它是由节点数量决定的。 用户可能还想知道如何在实际中使用DaemonSet,比如如何创建、查看状态,以及如何回滚。给出一些具体的kubectl命令示例会比较好,比如创建、查看、删除等操作。 另外,注意事项方面,可能涉及到资源限制,因为每个节点都运行一个Pod,如果Pod资源需求过高,可能导致节点资源紧张。还有节点亲污点的配置,如何让DaemonSet的Pod只在特定节点上运行,比如通过nodeSelector或者容忍污点。 总结一下,回答的结构可能需要包括DaemonSet的定义、作用、典型使用场景、YAML示例、新策略、与其它控制器的对比、操作命令以及注意事项。这样用户能全面了解DaemonSet的概念应用。</think>--- ### **DaemonSet 是什么?** **DaemonSet** 是 Kubernetes 中的一种控制器,用于确保集群中符合条件的 **每个节点**(或特定节点)上都运行一个指定的 Pod 副本。 - **核心目标**:部署管理集群级别的服务(如日志收集、网络插件、监控代理等)。 - **关键行为**: - 当新节点加入集群时,自动在该节点上创建 Pod。 - 当节点被移除时,自动删除该节点上的 Pod。 - 确保每个节点上的 Pod 始终与模板定义的状态一致。 --- ### **DaemonSet 的核心特性** #### 1. **每个节点一个 Pod** - 默认情况下,DaemonSet 会在集群的 **所有节点** 上运行一个 Pod。 - 可通过 `nodeSelector` 或 `affinity` 规则限定 Pod 仅在特定节点上运行(如 GPU 节点、边缘节点)。 #### 2. **自动适配节点变化** - **新增节点**:自动部署 Pod。 - **删除节点**:自动清理 Pod。 - **节点标签变**:根据规则动态调整 Pod 分布。 #### 3. **与 Deployment 的区别** | **控制器** | **目标** | **副本管理** | 典型场景 | |------------|-----------------------------------|----------------------------------|-------------------------| | Deployment | 管理无状态应用的多个副本 | 副本数由用户指定,随机分布到节点 | Web 服务、API 后端 | | DaemonSet | 管理集群级别的单节点服务 | 每个节点运行一个 Pod | 日志收集、网络插件、监控 | --- ### **DaemonSet 的典型使用场景** 1. **集群基础设施服务** - 网络插件(如 Calico、Flannel)。 - 存储插件(如 Ceph、GlusterFS)。 2. **日志与监控** - 日志收集器(如 Fluentd、Filebeat)。 - 监控代理(如 Prometheus Node Exporter)。 3. **安全与合规** - 安全审计工具(如 Falco)。 - 漏洞扫描代理。 4. **节点定制化任务** - 节点级别的缓存清理。 - 硬件驱动管理(如 GPU 节点)。 --- ### **DaemonSet 的 YAML 示例** ```yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd-logging labels: app: fluentd spec: selector: matchLabels: name: fluentd template: metadata: labels: name: fluentd spec: tolerations: # 允许在含污点的节点上运行(如 master 节点) - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: fluentd image: fluentd:v1.14 resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi # 仅在含特定标签的节点上运行 nodeSelector: logging: "true" ``` #### 关键字段说明: - `tolerations`:允许 Pod 调度到含特定污点(Taint)的节点(如 Master 节点)。 - `nodeSelector`:限定 Pod 仅在含 `logging: "true"` 标签的节点上运行。 --- ### **DaemonSet新策略** DaemonSet 支持两种新策略(通过 `updateStrategy` 配置): 1. **RollingUpdate(默认)** - 自动逐步替换旧 Pod,可配置 `maxUnavailable` 控制并行新数。 - 示例配置: ```yaml updateStrategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 ``` 2. **OnDelete** - 需手动删除旧 Pod 后才会创建新 Pod(与 StatefulSet 的 `OnDelete` 策略类似)。 - 适用于需严格人工控制的新场景。 --- ### **操作 DaemonSet 的常用命令** | **操作** | **命令示例** | |------------------------|--------------------------------------------------| | 创建 DaemonSet | `kubectl apply -f daemonset.yaml` | | 查看 DaemonSet 状态 | `kubectl get daemonset -n <namespace>` | | 查看 Pod 分布 | `kubectl get pods -l name=fluentd -o wide` | | 删除 DaemonSet | `kubectl delete daemonset fluentd-logging` | | 新镜像触发滚动新 | `kubectl set image ds/fluentd-logging fluentd=fluentd:v1.15` | --- ### **注意事项** 1. **资源限制** - 每个节点运行一个 Pod 可能导致资源消耗较大(尤其是内存密集型应用),需合理配置 `requests` `limits`。 2. **节点选择与污点容忍** - 若需在 Master 节点运行,需添加污点容忍配置(Master 节点默认有 `NoSchedule` 污点)。 3. **新兼容性** - DaemonSet 模板时,需确保新版本 Pod 兼容旧数据或配置(如存储卷)。 4. **与静态 Pod 的对比** - DaemonSet 由 Kubernetes 控制平面管理,而静态 Pod(如 kube-apiserver)由节点上的 kubelet 直接管理。 --- ### **总结** - **DaemonSet 的定位**:确保集群中每个节点运行相同的系统级服务。 - **核心能力**:自动适配节点变化,提供节点级别的服务部署。 - **适用场景**:网络插件、日志收集、监控代理等需覆盖全节点的服务。 - **灵活性**:支持节点选择、污点容忍灵活的新策略
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值