【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模块来检查目录是否存在,并在不存在时创建它。下面是一个示例代码,演示了如何检查指定路径下的目录是否存在,若不存在则创建…...
点击router-link时候会发生什么?
当你点击链接或按钮时,将会导航到 User 组件,就会显示相应的用户 ID。 这里说一下执行流程,当点击一个 router-link 时,Vue Router会执行以下流程: 1)点击事件触发: 当你点击 router-link 组件时…...
【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…...
vue-cli搭建过程(HBuilder X搭建)
vue.js:前端主流框架(对某一方面技术完整的封装,是一套完善的解决方案) vue-cli搭建项目(官方提供脚手架) vue脚手架:是一套项目搭建的快捷方式,可以将项目中的依赖集成进来,生成统…...
MySQL索引:结构、语法、分类和优化
MySQL索引是数据库中非常关键的性能优化手段。它们提供了快速访问数据的方法,同时也可以极大地提高查询效率。本文将深入介绍MySQL索引的结构、语法、分类,以及如何使用Profile和EXPLAIN来优化查询性能,带有详细的实例演示。 索引结构 MySQ…...
Vue中添加旋转动画
// transform: scale(1.2) rotate(-180deg); 放大 旋转 // transform: rotate(-180deg); 旋转 <i class"el-icon-close"></i>i {font-size: 20px;line-height: 24px;transition: transform 0.2s linear;}i:hover {color: red;transform-origin: cen…...
基于SSM农产品商城系统
基于SSM农产品商城系统的设计与实现,前后端分离,文档 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 农产品列表 产品详情 个人中心 登陆界面 管…...
基于matlab创作简易表白代码
一、程序 以下是一个基于MATLAB的简单表白代码: % 表白代码 clc; % 清除命令行窗口 clear; % 清除所有变量 close all; % 关闭所有图形窗口 % 输入被表白者的名字 name input(请输入被表白者的名字:, s); % 显示表白信息 fprintf(\n); fprintf(亲爱的…...
pandas
一、pandas初级 安装matplotlib:pip install matplotlib 安装pandas:pip install pandas 本地C:\Users\Administrator\pip,在此目录配置清华园的远程下载 配置内容: [global] index-urlhttps://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-ho…...
使用关键字interface来声明使用接口-PHP8知识详解
继承特性简化了对象、类的创建,增加了代码的可重用性。但是php8只支持单继承,如果想实现多继承,就需要使用接口。PHP8可以实现多个接口。 接口类通过关键字interface来声明,接口中不能声明变量,只能使用关键字const声明…...
计算机毕业设计 基于SSM的高校毕业论文管理系统小程序的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻…...
【Java 进阶篇】JDBC查询操作详解
在数据库编程中,查询是一项非常常见且重要的操作。JDBC(Java Database Connectivity)提供了丰富的API来执行各种类型的查询操作。本篇博客将详细介绍如何使用JDBC进行查询操作,包括连接数据库、创建查询语句、执行查询、处理结果集…...
我的企业证书是正常的但是下载应用app到手机提示无法安装“app名字”无法安装此app,因为无法验证其完整性解决方案
我的企业证书是正常的但是下载应用app到手机提示无法安装“app名字”无法安装此app,因为无法验证其完整性解决方案 首先,确保您从可信任的来源下载并安装企业开发者签名过的应用程序。如果您不确定应用程序的来源,建议您联系应用程序提供者…...
wordpress下滑显示导航/输入关键词自动生成文章
一、进阶算法 1、贪心算法 买卖股票的最佳时机柠檬水找零 2、动态规划 不同路径K站中转内最便宜的航班二、算法的设计思想 1、分而治之 2、动态规划 3、贪心 4、回溯 三、算法在 js 中的应用场景...
个人网站建设 免费/域名大全免费网站
scrapy爬虫成长日记之将抓取内容写入mysql数据库前面小试了一下scrapy抓取博客园的博客(您可在此查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据),但是前面抓取的数据时保存为json格式的文本文件中的。这很显然不满足我们日常的实际应用ÿ…...
大数据平台网站建设/软件注册推广平台
1.实现目标: 选择用户角色,自动勾选权限。 2. (1)MySQL数据库的建立 (2)ng-repeat指令显示用户权限 (3)ng-checked指令控制用户权限 3.实例 (1)MySQL数据库的建立 t_role表 id rolename 1 系统管理员 2 总经理 r_right表 id …...
dedecms wap网站模板下载/全国最好网络优化公司
在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段ÿ…...
游戏落地页网站建设/网站市场推广
FreeNAS FreeNAS是一款基于网络附加存储技术(NAS)的共享存储小工具。当你安装FreeNAS软件之后,你需要首先配置FreeNAS服务器的IP地址,以便能够登陆到用来配置和管理共享存储的Web界面。输入默认的用户名(admin…...
网站流量下降的原因/seo外链发布
使用python中最有用的50个数据可视化图形,并且用代码清晰的演示了使用matplotlib和seaborn库的过程并且展示了最终的结果。 一、简介 下面的图表根据不同的目标被分成了7组。例如,如果你想画出一张两个元素的相互关系图,你可以在关联这一章…...