Kubernetes 中的 DaemonSet 和 StatefulSet

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

什么是 DaemonSet

DaemonSet 是 Kubernetes 中一种控制器对象,可以确保一个 Pod 在某些或所有节点上运行。DaemonSet 能够在所有节点上自动创建 Pod 并保证 Pod 的数量与节点数量一致,而且在一个节点上只会运行一个 Pod 实例。当一个节点新增或删除时,DaemonSet 会自动地在这个增加或减少的节点上创建或者移除一个 Pod。

我们可以利用 DaemonSet 在集群节点上部署一些系统性或者监控性的服务,比如 fluent-bit,fluentd 这些日志采集工具或者 Prometheus 等度量指标监控工具。

什么是 StatefulSet

StatefulSet 是 Kubernetes 中一种控制器对象,与 Deployment 和 ReplicaSet 相似,但有两个绝对不同的特征:

  1. StatefulSet 维护了唯一的稳定的网络标识符和稳定的存储。

  2. StatefulSet 中的每个 Pod 在创建时被分配了一个持久化唯一的序号(例如,它们的主机名)。

以上这两个特征允许 StatefulSet 为应用程序分配固定的网络标识符和存储,以及允许有状态应用程序进行有序的滚动升级和有序的缩放。

DaemonSet 和 StatefulSet 的不同

两者之间的不同在于它们管理 Pod 的方式和 Pod 的稳定状态。DaemonSet 管理的 Pod 是无状态的,任何 Pod 实例之间的自我标识和标签都是相同的(都是对应某个 DaemonSet 中定义的 spec.selector.matchLabels)。对比而言,StatefulSet 管理的 Pod 是有状态的,每个 Pod 实例会被分配一个唯一的标识符,这个标识符通常是这样的形式: ${statefulset_name}-${ordinal},其中 ordinal 是有序的编号。

另一个显著的区别是,相比 DaemonSet 具有比较广泛的用处,StatefulSet 内置了许多与 volume、有状态应用的升级和缩放相关的特性,这使得它对于有状态的应用程序比较有用,例如数据存储数据库等应用程序。

示例代码

DaemonSet 示例

首先,我们将通过以下 yaml 文件创建一个 DaemonSet:

----------- -------
----- ---------
---------
  ----- ----------
  -------
    ---- ----------
-----
  ---------
    ------------
      ---- ----------
  ---------
    ---------
      -------
        ---- ----------
    -----
      -----------
      - ----- ----------
        ------ ---------------------
        ----------
          -------
            ------- -------  
          ---------
            ---- ----
            ------- -------
        -------------
        - ----- ------
          ---------- ---------
        - ----- ----------------------
          ---------- ---------------------------
          --------- ----
      ------------------------------ --
      --------
      - ----- ------
        ---------
          ----- ---------
      - ----- ----------------------
        ---------
          ----- ---------------------------

在这个 yaml 文件中,我们定义了一个 DaemonSet 对象,名字是 fluent-bit。我们将用 fluent-bit 数据采集工具部署在所有节点上,用于收集日志。这个 DaemonSet 对象中,我们指定了 fluent-bit 容器的名字和镜像地址,以及资源限制和请求。我们在这个容器中定义了两个 volume,分别是 /var/log 和 /var/lib/docker/containers,用于挂载宿主机的 log 文件以及 docker 容器内部日志。

StatefulSet 示例

我们可以通过以下 yaml 文件来创建一个基于 mysql 镜像的有状态应用程序:

----------- -------
----- -----------
---------
  ----- -----
  -------
    ---- -----
-----
  ------------ -----
  --------- -
  ---------
    ------------
      ---- -----
  ---------
    ---------
      -------
        ---- -----
    -----
      -----------
      - ----- -----
        ------ -----
        --------
        - ----
        - ----
        - --- ---------------------------- ------ ------------
        ------
        - -------------- ----
        ----
        - ----- -------------------
          ------ ----------
        -------------
          - ----- ----
            ---------- --------------
      --------
      - ----- ----
        ----------------------
          ---------- --------------
  ---------------------
  - ---------
      ----- --------------
    -----
      ------------ - --------------- -
      ----------
        ---------
          -------- ---

在这个 yaml 文件中,我们定义了一个 StatefulSet 对象,名字是 mysql,他依赖于一个 Service 对象,用来配置集群内部负载均衡,同时定义了一个 mysql 容器,同时定义了一个 volumeClaimTemplates,用于将持久化的存储挂载到 Pod 上。

结论

DaemonSet 和 StatefulSet 是 Kubernetes 控制器对象的两种类型,它们都有各自不同的实现方式和目的。DaemonSet 用来部署一些具有广泛用途的服务,比如日志收集工具等,而 StatefulSet 则适用于具有状态的应用程序,例如数据库和队列管理器等。在实际应用中,我们应该根据需求选择合适的控制器对象来管理我们的应用程序。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/671a3bfd9babaf620fa22641


猜你喜欢

  • PM2 进程管理和监控的最佳实践与安全性处理

    前言 在 Web 前端开发中,我们经常需要启动多个进程来执行不同的任务。而 PM2 作为目前被广泛使用的进程管理器,可以大大简化进程管理的复杂度。本文将介绍 PM2 的基本用法以及最佳实践和安全性处理...

    15 天前
  • 在 Node.js 项目中使用 Mocha 和 Supertest 进行 API 集成测试的实践

    什么是 API 集成测试? API 集成测试是一种软件测试方法,用于测试多个应用程序之间的交互。在网络应用程序中,API 集成测试用于测试服务器端和客户端之间的数据通信是否正常,以及用于检查应用程序能...

    15 天前
  • Material Design 中的按钮组件设计原则和应用技巧总结

    Material Design 是一种设计语言,由 Google 推出,主要应用于移动端和 Web 应用程序的设计。其中,按钮是 Material Design 中非常重要的一部分,也是用户与应用程序...

    15 天前
  • 长期支持版的 Babel 7.10.0 已发布:修复 11 个 Bug

    Babel 7.10.0 已经发布,这是一个长期支持版(LTS)的版本,它将在未来几年内得到支持和更新。本次发布修复了 11 个 Bug,包括一些内部工具和插件的更新,还增加了一些新特性和改进。

    15 天前
  • RESTful API 设计模式:分页处理

    前言 RESTful API 是现代 Web 应用程序开发的重要组成部分。其中一个常见的问题是如何处理大量数据的 API 请求。当用户需要查询或者展示数百或数千条数据时,全量返回数据可能会导致性能问题...

    15 天前
  • 如何使用 Chai.js 和 Supertest 进行 Express.js RESTful API 测试?

    在现代的web应用程序中, RESTful API 是不可避免的一部分。为了保持正确的功能和高质量的应用程序,我们需要对API进行测试。本文将介绍如何使用Chai.js和supertest测试你的Ex...

    15 天前
  • ECMAScript 2018: catch 绑定和 Rest/Spread Properties

    ECMAScript 2018 版本包含了许多新的特性,其中两个特性是 catch 绑定和 Rest/Spread Properties。在本篇文章中,我们将讨论这两个特性并提供相关的实例。

    15 天前
  • Node.js 中如何解决内存泄漏

    在 Node.js 应用程序中,内存泄漏是一种非常常见的问题。随着应用程序运行的时间和资源的利用,应用程序的内存使用量可能会无限制地增长,最终导致内存不足或应用程序崩溃。

    15 天前
  • 如何使用 MongoDB 实现用户行为数据的可扩展性存储

    在现代 Web 应用程序中,收集和存储关于用户行为的数据是非常重要的。这些数据可以帮助我们了解用户的偏好和行为模式,从而可以提高用户体验、优化产品功能和增加收入。但是,如何存储和管理这些数据是一个具有...

    15 天前
  • TypeScript 中的类型别名及其使用详解

    什么是类型别名 TypeScript 中的类型别名可以用来给一个类型起个新的名称。它有点类似于变量中的别名,可以方便地引用一个复杂的类型。 比如,我们可以用类型别名来定义一个新的类型Color,代表颜...

    15 天前
  • ECMAScript 2017:解析 ES8 的新特性和语法

    随着前端技术的发展,ECMAScript 的新版本也在不断推出。ES8是 ECMAScript 的第8个版本,也是最新的版本之一。本文将为您详细解析ES8的新特性和语法,让你可以更好地了解ES8。

    15 天前
  • SASS 编译器的性能优化技巧

    在前端开发中,SASS 是一种非常受欢迎的 CSS 预处理器。它提供了许多功能,如变量、嵌套等,可以显著提高 CSS 代码的可维护性和重用性。然而,随着项目规模的增长,SASS 的编译速度也会变慢,影...

    15 天前
  • ES12 中新增的逻辑赋值运算符 &&= 和 ||=,你清楚它们的原理吗?

    JavaScript ECMAScript 2021(ES12)引入了两个新的逻辑赋值运算符:&&= 和 ||=。这两个运算符可以使代码变得更加简洁和易读。

    15 天前
  • PM2 如何设置不同进程的启动参数和配置

    在前端开发中,我们经常需要启动多个进程来完成不同的任务。而 PM2 是一个流行的进程管理工具,可以方便地启动、停止、重载和监控进程,同时提供了丰富的配置选项来满足不同的需求。

    15 天前
  • 如何避免 RESTful API 的安全漏洞?

    RESTful API 作为 Web 应用程序的一种核心架构模式,已经被广泛采用。但是,正是因为它的灵活性,RESTful API 又容易造成一些安全漏洞,例如 SQL 注入、XSS 攻击、CSRF ...

    15 天前
  • 如何在 Hapi.js 中实现数据分页

    在现代 Web 应用程序中,数据分页是一个非常常见的需求。当处理大量数据时,需要将数据分页以提高性能和用户体验。在本文中,我们将探讨在 Hapi.js 框架中实现简单的数据分页的最佳实践。

    15 天前
  • Cypress 进阶 - 写一个可靠的 Cypress 测试套件

    前言 Cypress 是一个流行的 JavaScript 端到端测试框架,它能够让您更快地编写、运行和调试测试。但是,即使您已经有了一些 Cypress 测试的经验,编写可靠的测试套件还是一项挑战。

    15 天前
  • 使用 Socket.io 实现多人游戏联机功能

    随着互联网的发展,多人游戏越来越受到玩家的关注。而多人游戏的一个重要特点就是需要联机功能,即多个玩家能够在同一个游戏中实时交互。本文将介绍如何使用 Socket.io 实现多人游戏联机功能,包括实现思...

    15 天前
  • MongoDB 内存使用率的异常情况及其处理

    前言 MongoDB 是一种基于分布式文件存储的 NoSQL 数据库,常常被用于 Web 应用程序的后端服务中。由于 MongoDB 数据库在操作大数据时通常需要消耗大量内存,因此,监控 MongoD...

    15 天前
  • 数据库查询优化的实用技巧

    前言 在前端开发过程中,对于数据库查询优化的需求越来越高。尤其是在大型应用中,查询效率的提升能够显著减轻服务器负担,提高用户体验。因此,本文将介绍一些实用的数据库查询优化技巧,帮助开发者提高查询效率并...

    15 天前

相关推荐

    暂无文章