【赵渝强老师】K8s中的有状态控制器StatefulSet

在K8s中,StatefulSets将Pod部署成有状态的应用程序。通过使用StatefulSets控制器,可以为Pod提供持久存储和持久的唯一性标识符。StatefulSets控制器与Deployment控制器不同的是,StatefulSets控制器为管理的Pod维护了一个有粘性的标识符。无论这些Pod如何被调度,每个Pod的标识符都是永久不变的。这一特点可以满足一些特殊场景的需要,例如:使用存储卷为为Kubernetes集群提供持久型存储时,可以使用StatefulSets控制器作为解决方案的一种。
视频讲解如下:
| 【赵渝强老师】K8s中的有状态控制器StatefulSet |
|---|
| 【赵渝强老师】有状态控制器StatefulSet |
下表对比了无状态的控制器Deployment与有状态控的制器StatefulSets的主要异同。

下面列举了一些StatefulSets的典型应用场景:
- 需要唯一的、稳定的网络标识符,即:Pod重新调度后其Pod名称和主机名不变。
- 需要持久的、稳定的持久化存储,即:Pod重新调度后还是能访问到相同的持久化数据。
- 需要优雅的、有序的部署应用和扩容缩容,即:Pod的部署和启动是顺序要求的,在部署或者扩展的时候要依据定义的顺序依次依次进行。
- 需要自动的、有序的滚动更新和回滚应用。
视频讲解如下:
| 【赵渝强老师】有状态控制器StatefulSet的应用场景 |
|---|
| 【赵渝强老师】有状态控制器StatefulSet的应用场景 |
一、【实战】StatefulSets控制器的创建
下面通过一个示例来说明如何创建StatefulSets控制器。
(1)创建"statefulsets-demo.yaml"文件,输入下面的内容:
apiVersion: apps/v1
kind: StatefulSet
metadata:#StatefulSets控制器的名称name: statefulset-demo
spec:selector:matchLabels:#通过标签与Pod关联app: nginx #指定Service的名称serviceName: "nginx-service" replicas: 4template:metadata:labels:#定义Pod的标签app: nginx spec:terminationGracePeriodSeconds: 10containers:#定义Pod里容器的名称- name: nginx image: nginx:1.7.9ports:- containerPort: 80name: web
提示:参数".spec.terminationGracePeriodSeconds"表示关闭或者删除Pod之前,需要等待的时间。对于StatefulSets控制器来说,不应将该参数设置为0。 这种做法是不安全的,应该强烈阻止。
(2)执行命令创建StatefulSets。
kubectl apply -f statefulsets-demo.yaml
(3)查看StatefulSets的信息,如下图所示。
kubectl get statefulset,pod -o wide

二、StatefulSets的扩容与缩容
由于StatefulSets中的所有Pod都具有唯一的网络标识符,因此在对StatefulSets进行扩容与缩容时,Kubernetes将严格按照下面的顺序进行:
-
当创建具有N个副本的StatefulSets,其中的每一个Pod将按照0…(N-1)的顺序依次创建。
-
当删除具有N个副本的StatefulSets,其中的每一个Pod将按照(N-1)…0的逆序依次终止。
-
当StatefulSets的扩容操作应用到某一个Pod时,Kubernetes将保证前面所有Pod的状态必须是Running或者Ready状态。
-
当StatefulSets的缩容操作应用到某一个Pod时,Kubernetes将保证前面所有Pod必须完全关闭的状态。
2.1 StatefulSets的扩容过程
以"statefulsets-demo.yaml"创建的StatefulSets为例。当"statefulset-demo"的控制器被创建后,StatefulSets控制器会按照pod/statefulset-demo-0、pod/statefulset-demo-1、pod/statefulset-demo-2和pod/statefulset-demo-3的顺序部署四个Pod。
当启动pod/statefulset-demo-1时,pod/statefulset-demo-0的状态一定是Running或者Ready。同理,在pod/statefulset-demo-1进入Running或者Ready状态前不会部署pod/statefulset-demo-2。如果pod/statefulset-demo-1已经处于Running或者Ready状态,而pod/statefulset-demo-2尚未部署,在此期间发生了pod/statefulset-demo-0运行失败,那么pod/statefulset-demo-2 将不会被部署,要等到pod/statefulset-demo-0部署完成并进入Running或者Ready状态后,才会部署pod/statefulset-demo-2。
2.2 StatefulSets的缩容过程
当用户进行缩容操作的时候,例如将参数"replicas"设置为1。首先被终止的是pod/statefulset-demo-3。在pod/statefulset-demo-3没有被完全停止和删除前,pod/statefulset-demo-2不会被终止。当pod/statefulset-demo-3已被终止和删除,但pod/statefulset-demo-2尚未被终止,如果在此期间发生pod/statefulset-demo-1运行失败, 那么就不会终止pod/statefulset-demo-2,必须等到pod/statefulset-demo-0进入Running或者Ready状态后才会终止 pod/statefulset-demo-2。
三、StatefulSets的更新与回滚
StatefulSet的更新与滚动是通过设置字段".spec.updateStrategy"的方式来实现。通过该参数的设置允许开发人员配置和禁用掉自动滚动更新Pod的容器、标签、资源请求或限制、以及注解。该参数的取值有以下两个:
-
RollingUpdate:这是默认的更新策略,该策略将对StatefulSets控制器管理的所有Pod执行自动的滚动更新。
-
OnDelete:该策略将不会自动更新StatefulSets管理的所有Pod。要实现Pod的更新,必须手动删除旧的Pod以便让StatefulSets控制器创建新的Pod。该策略将按照与Pod终止相同的顺序进行更新,每次更新一个Pod。
相关文章:
【赵渝强老师】K8s中的有状态控制器StatefulSet
在K8s中,StatefulSets将Pod部署成有状态的应用程序。通过使用StatefulSets控制器,可以为Pod提供持久存储和持久的唯一性标识符。StatefulSets控制器与Deployment控制器不同的是,StatefulSets控制器为管理的Pod维护了一个有粘性的标识符。无论…...
机器学习笔记(持续更新)
使用matplotlib绘图: import matplotlib.pyplot as plt fig, axplt.subplots() #创建一个图形窗口 plt.show() #不绘制任何内容,直接显示空图 重复值处理: 重复值处理代码: import pandas as pd data pd.DataFrame({学号: [1…...
Nginx 配置之server块
在 Nginx 配置中使用两个 server 块是为了处理 HTTP 和 HTTPS 请求的不同需求。具体来说: 第一个 server 块: 监听 80 端口(HTTP)。将所有 HTTP 请求重定向到 HTTPS(443 端口)。 第二个 server 块ÿ…...
魅族Lucky 08惊艳亮相:极窄四等边设计引领美学新风尚
在这个智能手机设计趋于同质化的时代,魅族以其独特的设计理念和创新技术,再次为市场带来了一股清新之风。 近日,魅族全新力作——Lucky 08手机正式曝光,其独特的“极窄物理四等边”设计瞬间吸引了众多消费者的目光,而…...
自动化的抖音
文件命名 main.js var uiModule require("ui_module.js"); if (!auto.service) {toast("请开启无障碍服务");auto.waitFor();} var isRunning true; var swipeCount 0; var targetSwipeCount random(1, 10); var window uiModule.createUI(); uiMo…...
无人机之巡航控制篇
一、巡航控制的基本原理 无人机巡航控制的基本原理是通过传感器检测无人机的飞行状态和环境信息,并将其反馈给控制器。控制器根据反馈信息和任务需求,计算出无人机的控制指令,并将其发送给执行机构。执行机构根据控制器的控制指令,…...
面试必问的7大测试分类!一文说清楚!
在日常测试工作中,我们经常会听到“单元测试,集成测试,系统测试”之类的词汇,大家都知道这是按照开发阶段进行测试活动的划分。 这种划分完整的分类,其实是分为四种“单元测试,集成测试,系统测…...
深信服上网行为管理AC无法注销在线用户
下图用户认证成功后无法注销 很多入网的用户都是使用的这个账号 针对单个IP强制注销也不生效 解决步骤: 接入管理-用户管理-用户绑定管理-用户绑定 删除绑定免认证的配置 删除后所有用户会强制注销掉,重新登录即可 可添加主页联系方式帮忙远程解决问…...
使用GitLab CI构建持续集成案例
1. 部署GitLab (1)基础准备 解压软件包并导入镜像: [rootmaster ~]# curl -O http://mirrors.douxuedu.com/competition/Gitlab-CI.tar.gz [rootmaster ~]# tar -zxvf Gitlab-CI.tar.gz [rootmaster ~]# ctr -n k8s.io image import gitla…...
WSL2环境下Ubuntu的Docker安装与配置
检查是否存在安装残留,移除可能会造成冲突的组件。 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done从apt Docker仓库中安装官方GPG key: sudo apt-get update …...
使用vscode调试wails项目(golang桌面GUI)
文章目录 安装 Golang 环境安装 NPM安装 VSCode安装 Go 插件安装 Go 插件依赖工具安装 Wails系统检查 准备项目Visual Studio Code 配置安装和构建步骤参考资料 安装 Golang 环境 访问 golang 官网下载环境安装包:https://go.dev/dl/ 安装 NPM 从 Node 下载页面 …...
Java中注解与反射的详细介绍
注解和反射 一、注解 什么是注解?Annotation Override :表示一个方法声明打算重写超类的另一个方法声明Deprecated:表示不鼓励程序员使用这样的元素,(此注释可以用于修饰方法,属性,类…...
Redis 过期时间删除策略详解
在使用 Redis 时,设置键的过期时间是一项非常有用的功能。它可以帮助我们自动清理不再需要的数据,节省内存空间。那么,Redis 是如何处理这些带有过期时间的键呢?这就涉及到 Redis 的过期时间删除策略。 一、Redis 过期键的判定 R…...
C语言_内存函数
内存函数是 C 标准库中的一组函数,用于管理和操作内存。使用时需要包含头文件<string.h>。 1. memcpy的使用和模拟实现 函数形式如下: void* memcpy(void* destination, const void* source, size_tnum);函数解析和注意事项: memcp…...
基于s32ds平台指定变量储存位置
开启一段ram空间 打开ld文件 配置一段ram空间 开辟一个段 .shareable_data1 : {. ALIGN(4);KEEP(*(.mcal_shared_data1)) . ALIGN(4);} > int_sram_shareable1定义一个变量并将变量指定在段中 volatile uint32 u32SbcmGenState __attribute__((section (".mcal_s…...
什么是快充协议、支持多协议的USB Type-C受电端取电芯片
随着快充技术的不断发展,传统的慢充模式已经满足不了消费者对充电效率的要求。有了快充技术的支持很大程度的缩短了我们的充电时间,给我们的生活带来了很多便利。 什么是快充协议 快充协议是快充技术的核心,现如今市面上已经有很多种快充协议…...
在Vue CLI项目中使用ECharts:详细指南
在Vue CLI项目中使用ECharts:详细指南 ECharts 是一款由百度开源的数据可视化图表库,它提供了丰富的图表类型和高度的可定制性。在Vue CLI项目中集成ECharts,可以帮助我们快速地将数据以图形的方式展示给用户。以下是在Vue CLI项目中使用ECh…...
第二阶段:mysql(学完就隐藏版)
第一章:部署数据库系统(注意关闭防火墙,selinux安装) 安装mysql配置的相关文件:yum install https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm(centos9:yum install http…...
Spring Cloud微服务
引言 在过去的几十年中,软件架构的发展经历了从单体应用到微服务的演变。微服务架构是一种将应用程序分解为小的、独立的服务的方法,每个服务可以独立地部署和扩展。Spring Cloud为开发和部署基于Spring的微服务提供了一系列的工具和框架,使…...
后端复习资料
后端面试资料 语雀-图灵面试题 语雀-javaGuide 小林coding:https://www.xiaolincoding.com/ 面试鸭: https://www.mianshiya.com/ codehot香菜哥:https://codehot.cn/markdown/welfare 面试题: vizard自行整理 牛客Golang社招面…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
