当前位置: 首页 > 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…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...