当前位置: 首页 > news >正文

【kubernetes】kubernetes中的StatefulSet使用

@TOC

1 为什么需要StatefulSet

常规的应用通常使用Deployment,如果需要在所有机器上部署则使用DaemonSet,但是有这样一类应用,它们在运行时需要存储一些数据,并且当Pod在其它节点上重建时也希望这些数据能够在重建后的Pod上获取,毕竟没有哪个运维希望Pod重建后数据却丢失了。

对于Deployment和DaemonSet来说,它们创建的Pod是一模一样的,如果将PV关联到Pod的PVC,这两种资源都无法对多个Pod的PVC进行区分,因此,对于这种场景,最基本的需求就是每个Pod可以设置不同的PVC,同时,Pod在重建时最好主机名等也一样,因为多个存储之间需要进行数据同步,所有的Pod都需要知道其他Pod的主机名,如果Pod的名称变化了,其他Pod的配置都需要调整。

因此,对于这类应用至少有两个需求:

  • 每个Pod可以使用不同的PVC,绑定到不同的PV
  • Pod重建后,Pod名称和主机名不变

这就要使用到StatefulSet,简称sts。

2 StatefulSet的Yaml的关键字段

与Deployment相比,StatefulSet有几个比较特别的字段:

  • sts.spec.podManagementPolicy:Pod被创建和删除的顺序,可选的值有OrderedReady(按照0~N-1的顺序创建Pod,按照N-1~0的顺序删除Pod)、Parallel(并行创建和删除Pod)
  • sts.spec.serviceName:StatefulSet关联的服务名
  • sts.spec.updateStrategy.rollingUpdate.partition:分区滚动更新
  • sts.spec.volumeClaimTemplates:PVC模板,也就是说,这里不是单个PVC,而是一个模板,会根据Pod的数量创建对应的PVC

这里借用一本书里面的例子的镜像:luksa/kubia-pet,它运行一个nodejs应用,监听容器的8080端口,当发送POST请求时会将数据写入本地的/var/data/kubia.txt,当发送GET请求时,会从本地的/var/data/kubia.txt获取数据。

下面是用docker run启动该镜像后的使用方式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以发现:在保存数据时,会打印Pod的主机名;而在读取数据时,会打印读取数据的Pod的主机名以及写入的数据。

用以下的yaml创建StatefulSet以及对应的Service:

apiVersion: v1
kind: Service
metadata:name: kubia-svc
spec:clusterIP: Noneselector:app: kubiaports:- name: httptargetPort: 8080port: 80---apiVersion: apps/v1
kind: StatefulSet
metadata:name: kubialabels:app: kubia
spec:selector:matchLabels:app: kubiaserviceName: kubia-svcreplicas: 3template:metadata:labels:app: kubiaspec:containers:- name: kubia-ctrimage: luksa/kubia-petports:- name: httpcontainerPort: 8080volumeMounts:- name: datamountPath: /var/datavolumeClaimTemplates:- metadata:name: dataspec:resources:requests:storage: 1MiaccessModes:- ReadWriteOnce

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以发现:

  • Pod名称跟Pod中的主机名相同,都是StatefulSet资源名称和一个索引号,这里给定的replicas是3,因此,索引号就是0~2
  • 创建了3个Pod的同时,也创建了3个PVC和PV,kubia-0这个Pod绑定的PVC是data-kubia-0,开始的data就是PVC模板中的名称

然后再创建一个nginx的Pod,就可以在nginx的Pod上访问服务:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在原来服务的DNS前面再加一个Pod名称就可以直接解析到对应的Pod,然后就可以直接访问对应的Pod,而且,访问者可以认为,无论目标Pod是重启还是重建,目标Pod都是同一个:主机名和域名没有变化、存储也没有变化(PVC在关联PV后,只要PV不被删除,就会一致关联;由于Pod名称没有变化,因此,同一个PVC还是会关联到同一个Pod)。如果需要这些Pod组成集群,那么每个主机的名称是可以预期且不变的。

在Pod启动过程中,也会发现,3个Pod中,一定是kubia-0最先启动,kubia-2最后启动,同时,只有kubia-0正常运行了,才会继续创建kubia-1;而删除StatefulSet过程中,一定是kubia-2最先删除,kubia-0最后删除。

与Deployment类似,StatefulSet也可以使用kubectl scale进行扩容和缩容,与启动和删除过程类似,当扩容时,一定是从当前最大的序号的下一个序号的Pod开始创建,例如,现在就会从kubia-3开始创建,当缩容时,一定是从当前最大的序号的Pod开始删除,例如,现在就会从kubia-2开始删除。

3 扩缩容失败的处理

在扩容过程中,如果Pod运行异常,则可以直接进行重建或者调度到其他机器上重建。

在缩容过程中,StatefulSet需要保证运行的Pod状态都是正常的。如果Pod运行异常,则缩容过程会阻塞,因为kubernetes无法判断Pod异常状态到底是瞬时状态还是永久性状态,如果是永久性状态,需要解决该问题才能继续推进缩容操作,如果此时继续推进缩容操作,那么运行的Pod数量可能跟实际期望的不同;如果是瞬时状态, 通常过一会儿就会恢复。总的来说就是,只有当Pod运行正常时才进行扩缩容操作。

4 分区滚动更新

ds.spec.updateStrategy.rollingUpdate可以设置Pod的最大超过数量和最大不可用的数量,但是在sts.spec.updateStrategy.rollingUpdate则用于设置分区滚动更新(1.24版本也提供了最大不可用数的设置)。

分区滚动更新就是分段更新,将StatefulSet的所有Pod分成两部分,在进行更新时一部分更新,另一部分不更新,因此,设置分区就是设置一个索引位置,也就是sts.spec.updateStrategy.rollingUpdate.partition:当该值为n时,索引值大于或者等于n的Pod才会被更新,小于n的Pod不会被更新。而且,当小于n的Pod重建时,还是会用旧的配置进行重建。

分区滚动更新的主要使用场景就是实现金丝雀部署,也就是新老版本需要同时运行,运行过程中,可以通过观察新版本的监控指标判断是否继续进行升级。

5 总结

对于需要持久化数据的应用,或者需要多Pod构成集群的应用,可以使用StatefulSet进行部署,每个Pod的主机名和域名在Pod重建后保持不变,也会绑定到同一个PV存储,这就使得Pod在异常重建或者漂移后可以认为还是同一个Pod,这就满足了“有状态服务”的需求。

相关文章:

【kubernetes】kubernetes中的StatefulSet使用

TOC 1 为什么需要StatefulSet 常规的应用通常使用Deployment,如果需要在所有机器上部署则使用DaemonSet,但是有这样一类应用,它们在运行时需要存储一些数据,并且当Pod在其它节点上重建时也希望这些数据能够在重建后的Pod上获取&…...

创建文件夹

/storage/emulated/0/代码文件/ 没有就创建 文件名命名方法:编号. 库 时间戳 使用Python的os模块来检查目录是否存在,并在不存在时创建它。下面是一个示例代码,演示了如何检查指定路径下的目录是否存在,若不存在则创建&#xf…...

点击router-link时候会发生什么?

当你点击链接或按钮时,将会导航到 User 组件,就会显示相应的用户 ID。 这里说一下执行流程,当点击一个 router-link 时,Vue Router会执行以下流程: 1)点击事件触发: 当你点击 router-link 组件时&#xf…...

【Spring】@Bean方法中存在继承如何分析

文章目录 1. 提问:如果让您分析Spring MVC的原理,您如何开始分析呢2. 如何破局3. 资料参考 本文主要介绍:如何分析 Bean方法存在继承 或 Bean方法中存在调用子类方法。 1. 提问:如果让您分析Spring MVC的原理,您如何…...

【Vim 插件管理器】Vim-plug和Vim-vbundle的区别

- vundle是一款老款的插件管理工具 - vim-plug相对较新,特点是支持异步加载,相比vundle而言 Vim-plug 是一个自由、开源、速度非常快的、极简的 vim 插件管理器。它可以并行地安装或更新插件。你还可以回滚更新。它创建浅层克隆shallow clone最小化磁盘…...

电子计算机核心发展(继电器-真空管-晶体管)

目录 继电器 最大的机电计算机之一——哈弗Mark1号,IBM1944年 背景 组成 性能 核心——继电器 简介 缺点 速度 齿轮磨损 Bug的由来 真空管诞生 组成 控制开关电流 继电器对比 磨损 速度 缺点 影响 代表 第一个可编程计算机 第一个真正通用&am…...

SDI-12协议与STM32 进行uart通信

场景是用stm32与一款温湿度传感器通信,不过是基于SDI-12协议,SDI-12时序和UART类似,故采用UART传输,原理图如下 其中DIR_OUT_SDI是一个IO引脚,控制UART_TX_SDI是否使能,U10是三态门IC,即拉低DIR…...

JS中的强制类型转换

JavaScript 中有多种强制类型转换的方式,可以将一个数据类型转换为另一种数据类型。这可以通过一些内置函数或操作符来实现。 显式类型转换(强制类型转换): 显式类型转换是通过特定的函数或操作符来明确指定要进行的类型转换。以下…...

WebSocket实战之四WSS配置

一、前言 上一篇文章WebSocket实战之三遇上PAC ,碰到的问题只能上安全的WebSocket(WSS)才能解决,配置证书还是挺麻烦的,主要是每年都需要重新更新证书,我配置过的证书最长有效期也只有两年,搞不…...

veImageX 演进之路:Web 图片加载提速50%

背景说明 火山引擎veImageX演进之路主要介绍了veImageX在字节内部从2012年随着字节成长过程中逐步演进的过程,演进中包括V1、V2、V3版本并最终面向行业输出;整个演进过程中包括服务端、客户端、网络库、业务场景与优化等多个角度介绍在图像处理压缩、省成…...

WebSocket实战之五JSR356

一、前言 前几篇WebSocket例子服务端我是用NodeJS实现,这一篇我们用Java来搭建一个WebSocket服务端,从2011年WebSocket协议RFC6455发布后,大多数浏览器都实现了WebSocket协议客户端的API,而对于服务端Java也定义了一个规范JSR356,即Java API for WebSoc…...

flask-sqlalchemy结合Blueprint遇到循环引入问题的解决方案

想要用flask_sqlalchemy结合Blueprint分模块写一下SQL的增删改查接口,结果发现有循环引入问题。 一开始,我在app.py中使用db SQLAlchemy(app)创建数据库对象;并且使用app.register_blueprint(db_bp, url_prefix/db)注册蓝图。 这使得我的依…...

05_对象性能模式

对象性能模式 面向对象很好地解决了“抽象”的问题,但是必不可免地要付出定的代价。对于通常情况来讲,面向对象的成本大都可以忽略计。但是某些情况,面向对象所带来的成本必须谨慎处理。 典型模型: SingletonFlyweight Singleton 单件模式…...

快速选择排序

"你经过我每个灿烂时刻,我才真正学会如你般自由" 前些天有些无聊,想试试自己写的快排能否过leetcode上的排序算法题。结果是,不用截图可想而知,肯定是没过的,否则也不会有这篇文章的产出。 这份快排算法代码…...

国庆中秋特辑(六)大学生常见30道宝藏编程面试题

以下是 30 道大学生 Java 面试常见编程面试题和答案,包含完整代码: 什么是 Java 中的 main 方法? 答:main 方法是 Java 程序的入口点。它是一个特殊的方法,不需要被声明。当 Java 运行时系统执行一个 Java 程序时&…...

Centos7 安装mysql 8.0.34

Centos7 安装mysql 8.0.34 准备工作 centos7 服务器 xshell 安装教程 安装并配置 在安装MySQL之前,我们应该确保系统已经更新到最新的软件包和安全补丁。打开终端,输入以下命令来更新系统 yum update为了方便安装MySQL,我们需要下载并…...

如何在 Google Earth 中创建轨迹、路线并制作动画

如何创建航迹 https://kurviger.de/en Google 地球飞行教程(天桥动画) 选择合适的点 (可调整视图快照)点击录制,依次点击图标即可...

蓝桥杯每日一题2023.9.30

蓝桥杯大赛历届真题 - C&C 大学 B 组 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 对于此题,首先想到了dfs进行一一找寻,注意每次不要将重复的算进去,故我们每次循环可以记录一个开始的位置,下一次到这个位置时,…...

springboot和vue:十、vue2和vue3的差异+组件间的传值

首先用vue-cli创建一个vue2的项目。 vue2和vue3的差异 main.js的语法有所差别。 vue2是 import Vue from vue import App from ./App.vuenew Vue({render: h > h(App), }).$mount(#app)vue3是 import { createApp } from vue import App from ./App.vuecreateApp(App).…...

SQL:增、删、改、查 基本语句 Navicat建库(用法 + 例子)

文章目录 新建数据库新建表 增、删、改、查select 查找insert 添加delete 删除update 修改where 扩展 < > < > ! <> 比较运算符and or 逻辑运算符between...and... 介于..和..之间in 包含like 模糊查询is null 为空的 查询扩展order by 排序limit start coun…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...