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

【云原生】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 Servicenginx用来发布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-0Pod处于RunningReady状态后,web-1Pod才会被启动。
# 查看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 名称>-<序号索引>WebStatefulSet拥有两个副本,所以它创建了两个Pod:web-0web-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都是支持的&#xff0c;官方推的开发板有两种&#xff0c;一种 ESP-EYE ,没有LCD 另一种是ESP32S3-EYE,有带LCD屏 二、ESP32人脸识别选用ESP32的优势 ESP32S3带AI 加速功能&#xff0c;在人脸识别的速度是比ESP32快了不少 | S…...

编程学习指南:语言选择、资源推荐与高效学习策略

目录 一、编程语言选择 1. Java&#xff1a;广泛应用的基石 2. C/C&#xff1a;深入底层的钥匙 3. Python&#xff1a;AI与大数据的宠儿 4. Web前端技术&#xff1a;构建交互界面的艺术 二、学习资源推荐 1. 国内外在线课程平台 2. 官方文档与教程 3. 书籍与电子书 4…...

AWS开发人工智能:如何基于云进行开发人工智能AI

随着人工智能技术的飞速发展&#xff0c;企业对高效、易用的AI服务需求日益增长。Amazon Bedrock是AWS推出的一项创新服务&#xff0c;旨在为企业提供一个简单、安全的平台&#xff0c;以访问和集成先进的基础模型。本文中九河云将详细介绍Amazon Bedrock的功能特点以及其收费方…...

CentOS 8 的 YUM 源替换为国内的镜像源

CentOS 8 的 YUM 源替换为国内的镜像源 1.修改 DNS 为 114.114.114.1141.编辑 /etc/resolv.conf 文件&#xff1a;2.在文件中添加或修改如下内容&#xff1a;3.保存并退出编辑器。 2.修改 YUM 源为国内镜像1.备份原有的 YUM 源配置&#xff1a;2.下载新的 YUM 源配置3.清理缓存…...

网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程

前言 1.入行网络安全这是一条坚持的道路&#xff0c;三分钟的热情可以放弃往下看了。2.多练多想&#xff0c;不要离开了教程什么都不会了&#xff0c;最好看完教程自己独立完成技术方面的开发。3.有时多百度&#xff0c;我们往往都遇不到好心的大神&#xff0c;谁会无聊天天给…...

浅学爬虫-爬虫维护与优化

在实际项目中&#xff0c;爬虫的稳定性和效率至关重要。通过错误处理与重试机制、定时任务以及性能优化&#xff0c;可以确保爬虫的高效稳定运行。下面我们详细介绍这些方面的技巧和方法。 错误处理与重试机制 在爬虫运行过程中&#xff0c;网络不稳定、目标网站变化等因素可…...

STM32G070系列芯片擦除、写入Flash错误解决

在用G070KBT6芯片调用HAL_FLASHEx_Erase(&EraseInitStruct, &PageError)时&#xff0c;调试发现该函数返回HAL_ERROR&#xff0c;最后定位到FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE)函数出现错误&#xff0c;pFlash.ErrorCode为0xA0&#xff0c;即FLASH错误标…...

08.02_111期_Linux_NAT技术

NAT(network address translation)技术说明 IP报文在转发的时候需要考虑 源IP地址 和 目的IP地址&#xff0c; IP报文每到达一个节点&#xff0c;就会更改一次IP地址和目的IP地址&#xff0c;其中节点是指主机、服务器、路由器 那么这个更改是如何进行的呢&#xff1f; 除了…...

【2024蓝桥杯/C++/B组/小球反弹】

题目 分析 Sx 2 * k1 * x; Sy 2 * k2 * y; &#xff08;其中k1, k2为整数&#xff09; Vx * t Sx; Vy * t Sy; k1 / k2 (15 * y) / (17 * x)&#xff1b; 目标1&#xff1a;根据k1与k2的关系&#xff0c;找出一组最小整数组&#xff08;k1, k2&#xff09;&#xff…...

PHP中如何实现函数的可变参数列表

在PHP中&#xff0c;实现函数的可变参数列表主要有两种方式&#xff1a;使用func_get_args()函数和使用可变数量的参数&#xff08;通过...操作符&#xff0c;自PHP 5.6.0起引入&#xff09;。 1. 使用func_get_args()函数 func_get_args()函数用于获取传递给函数的参数列表&…...

串---链串实现

链串详解 本文档将详细介绍链串的基本概念、实现原理及其在 C 语言中的具体应用。通过本指南&#xff0c;读者将了解如何使用链串进行各种字符串操作。 1. 什么是链串&#xff1f; 链串是一种用于存储字符串的数据结构&#xff0c;它使用一组动态分配的节点来保存字符串中的…...

科技赋能生活——便携气象站

传统气象站往往庞大而复杂&#xff0c;需要专业人员维护&#xff0c;它小巧玲珑&#xff0c;设计精致&#xff0c;可以轻松放入背包或口袋&#xff0c;随身携带&#xff0c;不占空间。无论是城市白领穿梭于高楼大厦间&#xff0c;还是户外爱好者深入山林湖海&#xff0c;都能随…...

Golang——GC原理

1.垃圾回收的目的 将未被引用到的对象销毁&#xff0c;回收其所占的内存空间。 2.根对象是什么 全局变量&#xff1a;在编译器就能确定的存在于程序整个生命周期的变量。 执行栈&#xff1a;每个goroutine都包含自己的执行栈&#xff0c;这些执行栈上包含栈上的变量及指向分配…...

OpenStack概述

一、初识OpenStack OpenStack Docs: 概况 一&#xff09;OpenStack架构简述 1、理解OpenStack OpenStack既是一个社区&#xff0c;也是一个项目和一个开源软件&#xff0c;提供开放源码软件&#xff0c;建立公共和私有云&#xff0c;它提供了一个部署云的操作平台或工具集&…...

机器学习练手(三):基于决策树的iris 多分类和波士顿房价预测

总结&#xff1a;本文为和鲸python 可视化探索训练营资料整理而来&#xff0c;加入了自己的理解&#xff08;by GPT4o&#xff09; 原活动链接 原作者&#xff1a;vgbhfive&#xff0c;多年风控引擎研发及金融模型开发经验&#xff0c;现任某公司风控研发工程师&#xff0c;对…...

PS 2024 百种常用插件下载安装教程【免费使用,先到先得】

文章目录 软件介绍软件下载安装步骤 专栏推荐&#xff1a; 超多精品软件&#xff08;持续更新中…&#xff09; 软件推荐&#xff1a; PS 2024 PR 2024 软件介绍 PS常用插件 此软件整合了市面近百款ps处理插件&#xff0c;可实现&#xff1a;一键制作背景&#xff0c;一键抠图…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...