【云原生】StatefulSet控制器详解
StatefulSet
文章目录
- StatefulSet
- 一、介绍与特点
- 1.1、介绍
- 1.2、特点
- 1.3、组成部分
- 1.4、为什么需要无头服务
- 1.5、为什么需要volumeClaimTemplate
- 二、教程
- 2.1、创建StatefulSet
- 2.2、查看部署资源
- 三、StatefulSet中的Pod
- 3.1、检查Pod的顺序索引
- 3.2、使用稳定的网络身份标识
- 3.3、查看主机明内部DNS地址
- 四、扩容/缩容StatefulSet
- 4.1、扩容
- 4.2、缩容
- 五、更新StatefulSet
- 5.1、滚动更新
一、介绍与特点
1.1、介绍
- RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字、启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态的集合,管理所有有状态服务,比如MySQL、MongoDB集群等。
- StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名称为网络标识(hostname),还必须要用到共享存储。
- 在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的是headless service即无头服务,与service的与别是它没有ClusterIP,解析它的名称时将返回该Headless Service对印的全部Pod的Endpoint(端点)列表。
- 除此之外,StatefulSet在Headless Service的基础上又为StatefulSet控制的每个Pod副本创建了一个DNS域名,这个域名的格式为$(podname).(headless server name)FQDN: (podname).(headless servername).namespace.svc.cluster.local
1.2、特点
-
Pod的一致性:包含次序(启停、停止次序)、网络一致性。此一致性与Pod相关,与 呗调度到哪个node节点无关。
-
稳定的次序:对于N个副本的StatefulSet,每个Pod都在[0-N]的范围内分配一个数字序号,且是唯一的。
-
稳定的网络:Pod的hostname模式为(StatefulSet名称)-(序号)。
-
稳定的存储:通过VolumeClaimTemplate为每个Pod创建一个PV。删除、减少副本,不会删除相关的卷。
1.3、组成部分
-
Headless Service:用来定义Po的网络标识(DNS domain)
-
volumeClaimTemplates:存储卷申请模板,创建PVC,指定pvc名称大小,将自动创建pvc,且pvc必须由存储类供应
1.4、为什么需要无头服务
- 在用Deployment时,每一个Pod名称是没有顺序的,是随机字符串,因此Pod名称是无序的,但是在StatefulSet中要求必须是有序的,每个Pod不能随意取代,Pod重建后Pod名称还是一样的。而Pod IP是变化的,所以是以Pod名称来识别,Pod名称是Pod唯一性的标识符,必须持久稳定有效,这时候要用到无头服务,它可以给每个Pod一个唯一的名称。
1.5、为什么需要volumeClaimTemplate
- 对于有状态的副本集都会用到持久存储,对于分布式系统来讲,它的最大特点是数据的不一样的,所以各个节点不能使用同一存储卷,每个节点有自己的专用存储,但是如果在Deployment中的Pod template里定义存储卷,是所有副本共有一个存储卷,数据是相同的,因为是基于模板来创建的,而StatefulSet中每个Pod都要自己的专有存储卷,所以StatefulSet的存储卷就不能再用Pod模板来创建了,于是StatefulSet使用volumeClaimTemplate,称为卷申请模板,它会为每个Pod生成不同的pvc,并绑定pv,从而实现各pod有专用存储。这就是为什么要用volumeClaminTemplate的原因。
二、教程
- 开始之前确保你已经正常部署Kubernetes集群
2.1、创建StatefulSet
- 作为开始,使用如下示例创建了一个StatefulSet(以及它所依赖的Service)。它和StatefulSet概念中的示例相似。它创建了一个Headless Service
nginx
用来发布StatefulSetweb
中的Pod的IP地址。
[root@master ~]# vim nginx-statefulset.yaml
apiVersion: "v1"
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: None # Service的类型设置为None将标识这是个Headless Service即无头服务selector: app: nginx # 表示这个Service关联的Pod,将会选择标签带有app=nginx的Pod---apiVersion: "apps/v1"
kind: StatefulSet
metadata:name: web
spec:serviceName: "nginx" # 声明它属于哪个Headless Service无头服务replicas: 2selector:matchLabels:app: nginx # 这个StatefulSet将会管理标签是app=nginx的Podtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresent# 定义挂载卷,这只是一个演示,生产环境一定不会这样用的volumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumes:- name: wwwhostPath:# 每个运行Pod的宿主机挂载容器中的目录路径path: /mnt
# 使用此命令加载资源
[root@master ~]# kubectl apply -f nginx-statefulset.yaml
2.2、查看部署资源
- StatefulSet默认以严格的顺序创建其Pod。
- 对于一个拥有
n
个副本的StatefulSet,Pod被部署时是按照{0…n-1}的序号顺序创建的 - 请注意,直到
web-0
Pod处于Running并Ready状态后,web-1
Pod才会被启动。
# 查看Pod
[root@master ~]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 2m50s
web-1 1/1 Running 0 2m48s
# 查看StatefulSet
[root@master ~]# kubectl get statefulset web
NAME READY AGE
web 2/2 2m6s
# 查看Service无头服务
[root@master ~]# kubectl get service nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx ClusterIP None <none> 80/TCP 3m29s
三、StatefulSet中的Pod
- StatefulSet中的每个Pod拥有一个唯一的顺序索引和稳定的网络身份标识。
3.1、检查Pod的顺序索引
- 如果StatefulSet盖尼奥中所提到的,StatefulSet中的每个Pod拥有一个具有黏性的、独一无二的身份标志,这个标志基于StatefulSet控制器分配给每个Pod的唯一顺序索引。Pod名称的格式为
<statefulset 名称>-<序号索引>
。Web
StatefulSet拥有两个副本,所以它创建了两个Pod:web-0
和web-1
[root@master ~]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 10m
web-1 1/1 Running 0 10m
3.2、使用稳定的网络身份标识
- 每个Pod都拥有一个基于顺序索引的稳定的主机名。使用
kubectl exex
在每个Pod中执行hostname
[root@master ~]# for i in 0 1; do kubectl exec "web-$i" -- sh -c 'hostname'; done
web-0
web-1
3.3、查看主机明内部DNS地址
- 使用
kubectl run
运行一个提供nslookup
命令的容器,该命令来自于dnsutils
包。通过对Pod的主机名执行nslookup
,你可以检查这些主机名在集群内部的DNS地址
# 命令终端中运行一个Pod终端
[root@master ~]# kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm# 使用以下命令解析web-0Pod的内部DNS地址
/ # nslookup web-0.nginx
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName: web-0.nginx
Address 1: 10.244.1.2 web-0.nginx.default.svc.cluster.local
四、扩容/缩容StatefulSet
- 扩容/缩容StatefulSet指增加或减少它的副本数。这通过更新
replicas
字段完成(水平缩放)。你也可以使用kubectl sacale
或者kubectl pathch
来缩容/缩容一个StatefulSet。
4.1、扩容
-
扩容意味着添加更多副本。如果你的应用程序能够在整个StatefulSet范围内分派工作,则新的更大的Pod及可以执行更多的工作。
-
StatefulSet控制器扩展了副本的数量。如同创建StatefulSet所述,StatefulSet按序号索引扩容各个Pod,并且会等待前一个Pod变为Running和Ready才会启动下一个Pod。
# 将Pod容扩容为5个
[root@master ~]# kubectl scale statefulset web --replicas=5
# 可以提前执行效果更加明显
# 可以看出,前一个Pod创建完成并且成功运行之后才会去创建下一个Pod,而且创建Pod顺序也有要求,仔细观察可以看出顺序是由低到高。
[root@master ~]# kubectl get pod -l app=nginx --watch
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 27m
web-1 1/1 Running 0 26m
web-2 0/1 Pending 0 0s
web-2 0/1 Pending 0 0s
web-2 0/1 ContainerCreating 0 0s
web-2 1/1 Running 0 2s
web-3 0/1 Pending 0 0s
web-3 0/1 Pending 0 0s
web-3 0/1 ContainerCreating 0 0s
web-3 1/1 Running 0 1s
web-4 0/1 Pending 0 0s
web-4 0/1 Pending 0 0s
web-4 0/1 ContainerCreating 0 0s
web-4 1/1 Running 0 1s
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 27m
web-1 1/1 Running 0 27m
web-2 1/1 Running 0 22s
web-3 1/1 Running 0 20s
web-4 1/1 Running 0 19s
4.2、缩容
- 缩容意味着减少副本数量。例如,你可能因为服务的流量水平已降低并且在当前规模下存在空闲资源的原因执行缩容操作。
# 将Pod缩容为3个
[root@master ~]# kubectl patch sts web -p '{"spec":{"replicas":3}}'
# 缩容的同时可以看出,一共5个Pod,缩容为3个之后,是由从高到底的顺序去缩容的
[root@master ~]# kubectl get pod -l app=nginx --watch
web-4 1/1 Terminating 0 3m43s
web-4 0/1 Terminating 0 3m44s
web-4 0/1 Terminating 0 3m44s
web-4 0/1 Terminating 0 3m44s
web-3 1/1 Terminating 0 3m45s
web-3 0/1 Terminating 0 3m46s
web-3 0/1 Terminating 0 3m46s
web-3 0/1 Terminating 0 3m46s
五、更新StatefulSet
- StatefulSet控制器支持自动更新。更新策略由StatefulSet API对象的
spec.updateStrategy
字段决定。这个特性能够用更新一个StatefulSet中Pod的容器镜像、资源请求和限制、标签和注解。 - 有两个有效的更新策略:
RollingUpdate(默认)
和OnDelete
5.1、滚动更新
RollingUpdate
更新策略会更新一个StatefulSet中的所有Pod,采用与序号索引相反的顺序并遵循StatefulSet的保证- StatefulSet里的Pod采用和序号相反的顺序更新。在更新下一个Pod前,StatefulSet控制器终止每个Pod并等待它们变成Running和Ready。请注意,虽然在顺序后继者变成Running和Ready之前StatefulSet控制器不会更新下一个Pod
# 执行patch操作再次该表容器镜像
[root@master ~]# kubectl patch statefulset web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"registry.k8s.io/nginx:1.20"}]'
# 查看滚动更新状态
[root@master ~]# kubectl rollout status statefulset web
partitioned roll out complete: 3 new pods have been updated...
# 查看pod状态
[root@master ~]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 64s
web-1 1/1 Running 0 66s
web-2 1/1 Running 0 9m17s
# 查看滚动更新后的Nginx版本
[root@master ~]# for p in 0 1 2; do kubectl get pod "web-$p" --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}'; echo; done
registry.k8s.io/nginx:1.20
registry.k8s.io/nginx:1.20
registry.k8s.io/nginx:1.20
相关文章:
【云原生】StatefulSet控制器详解
StatefulSet 文章目录 StatefulSet一、介绍与特点1.1、介绍1.2、特点1.3、组成部分1.4、为什么需要无头服务1.5、为什么需要volumeClaimTemplate 二、教程2.1、创建StatefulSet2.2、查看部署资源 三、StatefulSet中的Pod3.1、检查Pod的顺序索引3.2、使用稳定的网络身份标识3.3、…...
使用 Python 制作一个属于自己的 AI 搜索引擎
1. 使用到技术 OpenAI KEYSerper KEYBing Search 2. 原理解析 使用Google和Bing的搜搜结果交由OpenAI处理并给出回答。 3. 代码实现 import requests from lxml import etree import os from openai import OpenAI# 从环境变量中加载 API 密钥 os.environ["OPENAI_AP…...
rust读取csv文件,匹配搜索字符
1.代码 use std::fs::File; use std::io::{BufRead, BufReader}; use regex::{Regex};fn main() {let f File::open("F:\\0-X-RUST\\1-systematic\\ch2-fileRead\\data\\test.csv").unwrap();let mut reader BufReader::new(f);let re Regex::new("45asd&qu…...
隐藏采购订单类型
文章目录 1 Introduction2 code 1 Introduction The passage is that how to hiden purchase type . 2 code DATA: ls_shlp_selopt TYPE ddshselopt. IF ( sy-tcode ME21N OR sy-tcode ME22N OR sy-tcode ME23N or sy-tcode ME51N OR sy-tcode ME52N OR sy-tcode ME5…...
ESP32人脸识别开发- 基础介绍(一)
一、ESP32人脸识别的方案介绍 目前ESP32和ESP32S3都是支持的,官方推的开发板有两种,一种 ESP-EYE ,没有LCD 另一种是ESP32S3-EYE,有带LCD屏 二、ESP32人脸识别选用ESP32的优势 ESP32S3带AI 加速功能,在人脸识别的速度是比ESP32快了不少 | S…...
编程学习指南:语言选择、资源推荐与高效学习策略
目录 一、编程语言选择 1. Java:广泛应用的基石 2. C/C:深入底层的钥匙 3. Python:AI与大数据的宠儿 4. Web前端技术:构建交互界面的艺术 二、学习资源推荐 1. 国内外在线课程平台 2. 官方文档与教程 3. 书籍与电子书 4…...
AWS开发人工智能:如何基于云进行开发人工智能AI
随着人工智能技术的飞速发展,企业对高效、易用的AI服务需求日益增长。Amazon Bedrock是AWS推出的一项创新服务,旨在为企业提供一个简单、安全的平台,以访问和集成先进的基础模型。本文中九河云将详细介绍Amazon Bedrock的功能特点以及其收费方…...
CentOS 8 的 YUM 源替换为国内的镜像源
CentOS 8 的 YUM 源替换为国内的镜像源 1.修改 DNS 为 114.114.114.1141.编辑 /etc/resolv.conf 文件:2.在文件中添加或修改如下内容:3.保存并退出编辑器。 2.修改 YUM 源为国内镜像1.备份原有的 YUM 源配置:2.下载新的 YUM 源配置3.清理缓存…...
网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程
前言 1.入行网络安全这是一条坚持的道路,三分钟的热情可以放弃往下看了。2.多练多想,不要离开了教程什么都不会了,最好看完教程自己独立完成技术方面的开发。3.有时多百度,我们往往都遇不到好心的大神,谁会无聊天天给…...
浅学爬虫-爬虫维护与优化
在实际项目中,爬虫的稳定性和效率至关重要。通过错误处理与重试机制、定时任务以及性能优化,可以确保爬虫的高效稳定运行。下面我们详细介绍这些方面的技巧和方法。 错误处理与重试机制 在爬虫运行过程中,网络不稳定、目标网站变化等因素可…...
STM32G070系列芯片擦除、写入Flash错误解决
在用G070KBT6芯片调用HAL_FLASHEx_Erase(&EraseInitStruct, &PageError)时,调试发现该函数返回HAL_ERROR,最后定位到FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE)函数出现错误,pFlash.ErrorCode为0xA0,即FLASH错误标…...
08.02_111期_Linux_NAT技术
NAT(network address translation)技术说明 IP报文在转发的时候需要考虑 源IP地址 和 目的IP地址, IP报文每到达一个节点,就会更改一次IP地址和目的IP地址,其中节点是指主机、服务器、路由器 那么这个更改是如何进行的呢? 除了…...
【2024蓝桥杯/C++/B组/小球反弹】
题目 分析 Sx 2 * k1 * x; Sy 2 * k2 * y; (其中k1, k2为整数) Vx * t Sx; Vy * t Sy; k1 / k2 (15 * y) / (17 * x); 目标1:根据k1与k2的关系,找出一组最小整数组(k1, k2)ÿ…...
PHP中如何实现函数的可变参数列表
在PHP中,实现函数的可变参数列表主要有两种方式:使用func_get_args()函数和使用可变数量的参数(通过...操作符,自PHP 5.6.0起引入)。 1. 使用func_get_args()函数 func_get_args()函数用于获取传递给函数的参数列表&…...
串---链串实现
链串详解 本文档将详细介绍链串的基本概念、实现原理及其在 C 语言中的具体应用。通过本指南,读者将了解如何使用链串进行各种字符串操作。 1. 什么是链串? 链串是一种用于存储字符串的数据结构,它使用一组动态分配的节点来保存字符串中的…...
科技赋能生活——便携气象站
传统气象站往往庞大而复杂,需要专业人员维护,它小巧玲珑,设计精致,可以轻松放入背包或口袋,随身携带,不占空间。无论是城市白领穿梭于高楼大厦间,还是户外爱好者深入山林湖海,都能随…...
Golang——GC原理
1.垃圾回收的目的 将未被引用到的对象销毁,回收其所占的内存空间。 2.根对象是什么 全局变量:在编译器就能确定的存在于程序整个生命周期的变量。 执行栈:每个goroutine都包含自己的执行栈,这些执行栈上包含栈上的变量及指向分配…...
OpenStack概述
一、初识OpenStack OpenStack Docs: 概况 一)OpenStack架构简述 1、理解OpenStack OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集&…...
机器学习练手(三):基于决策树的iris 多分类和波士顿房价预测
总结:本文为和鲸python 可视化探索训练营资料整理而来,加入了自己的理解(by GPT4o) 原活动链接 原作者:vgbhfive,多年风控引擎研发及金融模型开发经验,现任某公司风控研发工程师,对…...
PS 2024 百种常用插件下载安装教程【免费使用,先到先得】
文章目录 软件介绍软件下载安装步骤 专栏推荐: 超多精品软件(持续更新中…) 软件推荐: PS 2024 PR 2024 软件介绍 PS常用插件 此软件整合了市面近百款ps处理插件,可实现:一键制作背景,一键抠图…...
逻辑推理之lora微调
逻辑推理微调 比赛介绍准备内容lora微调lora微调介绍lora优势代码内容 start_vllm相关介绍调用 运行主函数提交结果总结相应连接 比赛介绍 本比赛旨在测试参与者的逻辑推理和问题解决能力。参与者将面对一系列复杂的逻辑谜题,涵盖多个领域的推理挑战。 比赛的连接:…...
前端-防抖代码
//防抖debounce(fn, time 1000) {let timer null;return function (...args) {if (timer) clearTimeout(timer);timer setTimeout(() > {fn.apply(this, args);}, time);};},// 输入变化处理函数async inputChange(value) {if (!this.debouncedInputChange) {this.deboun…...
langchain 入门指南 - 让 LLM 自动选择不同的 Prompt
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 让 LLM 自动选择不同的 Prompt 在上一篇文章中,我们学会了如何让 langchain 来自动选择不同的 LLM Chain,以便回…...
web浏览器播放rtsp视频流,海康监控API
概述 这里记录一下如何让前端播放rtsp协议的视频流 项目中调用海康API,生成的视频流(hls、ws、rtmp等)通过PotPlayer播放器都无法播放,说明视频流有问题,唯独rtsp视频流可以播放。 但是浏览器本身是无法播放rtsp视频的,即使…...
操作系统原理:程序、进程、线程的概念
文章目录 程序、进程、线程的概念程序(Program)进程(Process)线程(Thread)关系总结 在日常对操作系统的使用中,大家肯定对程序、进程和线程多少有所耳闻。作为操作系统的重要一部分,…...
Golang是如何实现动态数组功能的?Slice切片原理解析
Hi 亲爱的朋友们,我是 k 哥。今天,咱们聊一聊Golang 切片。 当我们需要使用数组,但是又不能提前定义数组大小时,可以使用golang的动态数组结构,slice切片。在 Go 语言的众多特性里,slice 是我们经常用到的数…...
SQL注入 报错注入+附加拓展知识,一篇文章带你轻松入门
第5关--------------------------------------------> 前端直接不会显示账号密码的打印;但是在接收前端的数据的那部分后端那里,会看前端传递过来的值是否正确,如果不正确,后端接收值那里就会当MySQL语句执行错误,…...
springboot项目里的包spring-boot-dependencies依赖介绍
springboot项目里的包’spring-boot-dependencies‘依赖 我们一般是在项目的pom dependencyManagement标签里引入spring-boot-dependencies,或者根spring-boot-starter-parent里也是继承了它,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本…...
C# 下的限定符运算详解(全部,任意,包含)与示例
文章目录 1.限定符概述2. 全部限定符运算(All)3. 任意限定符运算(Any)4. 包含限定符运算(Contains)总结 当我们在C#编程中需要进行条件判断或集合操作时,限定符(qualifiersÿ…...
消息队列RabbitMQ部分知识
1.简述RabbitMQ的架构设计 RabbitMQ 是一个开源的消息代理,采用了高级消息队列协议(AMQP),其架构设计主要包括以下几个关键组件和概念: 1.消息生产者( Producer): 负责发送消息到…...
在哪找做调查赚钱的网站好/中关村在线app
2019独角兽企业重金招聘Python工程师标准>>> 查了下百度,跨站点脚本编制其实也就是在url后加入参数和js脚本实现一些坏坏的事情,至少appscan就是这么干的。 那么主要的工作就是把恶意代码给过滤了,作为javaweb开发,明显…...
wordpress禁止中国ip/近期国际新闻20条
2019独角兽企业重金招聘Python工程师标准>>> 所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围。 一、JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:…...
邯郸网站建设优化/纹绣培训班一般价格多少
由于HTTPS协议是由HTTP协议加上SSL/TLS协议组合而成,在阅读本文前可以先阅读一下HTTP服务器和SSL/TLS两篇博文,本文中的代码也是由这两篇博文中的代码组合而成。 HTTPS介绍 上一篇博文中介绍了SSL/TLS协议,我们平时接触最多的SSL/TLS协议的…...
网站建设费开票税收代码/十大营销手段
ArrayList和Vector的区别: ArrayList和Vector都是Java的集合类,都可以用来存放Java对象,这是他们的相同点,但是他们也有区别: 一:同步性: Vector是同步的。这个类中的一些方法保证了Vector中的对…...
wordpress 等级权限插件/班级优化大师免费下载电脑版
探探 Gopher China 2019 大会又准时和大家见面了,本次大会由探探独家冠名,gocn 社区和滴滴联合举办。感谢各位 Gopher 一路陪伴我们成长,也欢迎更多新的 Gopher 加入。每位 Gopher 的声音都会是我们进步的动力。Gopher China 是中国的最权威和…...
东莞做商城网站建设/条友网
前沿:为了清楚的讲明白java定时器的创建,下面以一个规定每天10点时候自动查询用户表的例子为例。步骤如下:1.配置监听器(web.xml里配置一个监听器)自动查询用户表监听器com.tcl.base.web.listener.TimerSendOrderListener2.实现上面配置的那个…...