K8S StatefulSet基本使用

news2024/12/22 20:38:33

K8S StatefulSet

清空K8S对象

为了避免之前学习的内容造成的影响,先手动把K8S集群中的所有对象清空,使用一个全新的环境来学习StatefulSet的基本使用。

查看对象

  • 查看service对象
kubectl get services

在这里插入图片描述

  • 查看ReplicaSet对象
kubectl get rs

在这里插入图片描述

  • 查看Replication Controller对象
kubectl get rc

在这里插入图片描述

还有其他K8S对象,就不一一罗列展示了

清空对象

  • 方法一 删除命名空间内所有的对象
# 1. 删除指定命名空间的所有对象
# kubectl delete all --all -n {namespace}
# 2. 删除默认命名空间(default) 所有对象
# kubectl delete all --all
kubectl delete all --all

在这里插入图片描述

  • 方法二 - 用户可以删除命名空间,然后重建
# 1. 删除命名空间
# kubectl delete namespace {namespace}
# 2. 重建命名空间
# kubectl create namespace {namespace}

在这里插入图片描述

注意:默认的命名空间不能删除,清空完毕后可以使用命令查看验证对象是否存在,如查看Pod对象

kubectl get pods

在这里插入图片描述

StatefulSet 基本概念

StatefulSet(有状态集)长用于部署有状态的应用程序,跟Deployment类似StatefulSet也可以管理多个Pod集群,不同的是StatefulSet为每一个Pod分配一个唯一的粘性标识。并管理Pod的扩容,并为每一个Pod赋予一个有序的Pod名称。如定义一个名为Redis的StatefulSet集群,指定三个Pod,那么创建出来的Pod名称就会为Redis-0、Redis-1、Redis-2.

如果想使用存储卷提供数据持久化服务,可以使用StatefulSet作为整体解决方案的一部分。尽管StatefulSet的单个Pod容易发生故障,但是持久Pod对象可以很容易的使存储卷匹配任何新创建的Pod对象。

使用指导

StatefulSet适用于以下需求的应用程序:

  • 稳定、唯一的网络标识
  • 稳定、持久话的数据存储
  • 有序、优雅的部署、扩容
  • 有序、自动滚动更新功能

如果应用程序并不要任何稳定的标识符、顺序部署、扩容扩展;应该使用无状态的K8S对象进行系统部署,如Deployment 或者 ReplicaSet。

使用限制

  • Pod 配置的存储必须根据实际需求使用 PersistentVolume Provisioner 进行定义,或者由管理员进行预分配
  • 删除、扩容StatefulSet 并不会删除关联的存储卷,其目的是 确保存储卷的数据安全
  • StatefulSet 需要 Headless Service 服务来创建Pod网络表示,开发者负责创建此服务
  • StatefulSet 不保证在删除StatefulSet时终止Pod,目的是为了实现有序、优雅停止Pod,可以在删除之前将集群数量设置为0
  • 当使用Pod默认管理策略(OrderedReady)进行滚动更新时,可能会进入需要手动干预才能修复的损坏状态

演示案例

配置文件

#vim StatefulSet.yaml 内容如下
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  minReadySeconds: 10 # by default is 0
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web

配置说明:

  • 定义一个名为nginx的Headless Service服务,用于控制网络服务
  • 定义一个名为web的StatefulSet对象,关联3个nginx容器,每个启动的容器有用唯一的名称
  • ClaimTemplates 使用PersistentVolumes提供稳定的存储功能

启动服务

  • 创建StatefulSet对象
kubectl apply -f StatefulSet.yaml

在这里插入图片描述

  • 检查新创建的StatefulSet对象
kubectl get sts

在这里插入图片描述

  • 检查关联的Pod对象
kubectl get pods

在这里插入图片描述

请细看以上Pod名称按照顺序从0到2开始,组成三个Pods集群。三个Pod按顺序启动,后续的Pod启动必须在前面Pod启动之后再启动,因此以上三个Pod的启动顺序为:web-0 > web-1 > web-2

  • 查看关联的Service对象
kubectl get svc

在这里插入图片描述

Pod Selector

在StatefulSet中必须设置Pod选择器(.spec.selector)用来匹配器标签(.spec.template.metadata.labels),如果未指定匹配的Pod Selector 将导致StatefulSet在创建期间出现验证错误。

Minimum ready seconds

.spec.minReadySeconds是一个可选字段,默认值为0(Pod一准备就绪就被视为可用). 用于指定新创建的Pod在没有任何容器奔溃的情况下运行和准备就绪的最短秒数,以便将其视为可用。用于在使用滚动更新时检查更新进度

启动流程

StatefulSet管理的Pod部署和扩展规则如下:

  • 对于N个副本StatefulSet对象,将按照顺序从0到N-1开始创建Pod
  • 当删除Pod时,按照N-1到0逆序终止Pod
  • 在扩容伸缩Pod之前,必须保证之前的Pod处于Running状态
  • 在终止Pod之前,必须保证他它后续的Pod完全关闭

定义StatefulSet时,不应将参数 pod.Spec.TerminationGracePeriodSeconds指定为0,这种方式存在安全隐患,不鼓励使用。

当创建上面的Nginx实例时,将按照web-0、web-1、web-2的顺序部署三个Pod。在web-0处于Running或者Ready之前,web-1不会被创建;同理,web-2在web-1位处于Running状态之前不会被部署。如果web-1处于Running、Ready状态时,web-0变成Failed状态,那么web-2不会被启动,直到web-0恢复为Running状态。

如果用户将StatefulSet的replicas副本数设置为1,那么web-2首先将被终止,在web-2完全关闭之前,不会删除web-1.如果web-2终止关闭后,web-0突然失败,那么在web-0未恢复成Running状态前,web-1不会被删除

扩容伸缩

和Deployment一样,可以更过更新replicas字段扩容/伸缩StatefulSet,也可以使用kubectl scale、kubectl edit、kubectl patch来扩容/伸StatefulSet对象。

集群扩容

kubectl scale sts web --replicas=5

在这里插入图片描述

重新检查StatsfulSet 对象状态

kubectl get sts

在这里插入图片描述

重新检查扩容后Pod的数量及状态

kubectl get pod

在这里插入图片描述

根据上述几个图片显示web的节点从3变成了5,由此完成扩容。

集群缩容

使用patch命令将副本数重新设置为3

kubectl patch sts web -p '{"spec":{"replicas":3}}'

在这里插入图片描述

检查StatefulSet及其关联的Pod对象状态

在这里插入图片描述

StatefulSet 更新策略

StatefulSet也提供了多种更新策略,可以在**.spec.updateStrategy**指定更新策略。

OnDelete

当StatefulSet的.spec.updateStrategy.type设置为OnDelete时,StatefulSet控制器将不会自动更新StatefulSet中的Pod。用户必须手动删除Pod以使控制器创建新的Pod。

RollingUpdate

RollingUpdate更新策略自动更新StatefulSet中所有Pod的自动滚动更,这是默认的更新策略。采用与序号索引相反的顺序进行滚动更新。

  • 更新StatefulSet更新策略

比如更新一个名称为web的StatefulSet的使用RollingUpdate方式更新

kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}'
  • 查看更改后的StatefulSet
kubectl get sts web -o yaml | grep -A 1 "updateStrategy"

在这里插入图片描述

分段更新

Stateful可以使用RollingUpdate更新策略的partition参数来分段更新StatefulSet。分段更新将会使Stateful中其余的所有Pod(序号小于分区)保持当前版本,只更新序号大于等于分区的Pod,利用此特性可以简单实现金丝雀发布(灰色发布)

比如定义一个分区为3,可以使用patch直接对StatefulSet进行设置

kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":3}}}}'

在这里插入图片描述

删除Pod触发更新

kubectl delete po web-2

由于,web-2的需要小区分区3,所以Pod不会被更新,还是会使用以前的容器恢复Pod。

将分区改为1,此时会自动更新web-2,但不会更新web-0、web-1, 重新执行以上删除命令,如下图由于集群需要维护指定数量的副本,因此重新创建了一个web-2.

在这里插入图片描述

StatefulSet 删除

删除StatefulSet有两种方式,级联删除和非级联删除。使用非级联方式删除StatefulSet对象时,Stateful的Pod不会被删除;使用级联方式删除StatefulSet时,StatefulSet和它关联的pod都会被删除

非级联删除

# 使用以下命令进行非级联删除
kubectl delete statefulset web --cascade=false

在这里插入图片描述

此时三个Pod对象无法管理到StatefulSet对象,因此只能被手动删除,删除时也不会被重建

在这里插入图片描述

级联删除

# 1. 重新创建StatefulSet集群
kubectl apply -f StatefulSet.yaml
# 2. 检查Stateful及关联对象

在这里插入图片描述

# 使用以下命令进行级联删除 去掉--cascade=false即可
kubectl delete statefulset web 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦数据库导入dmp文件

找到达梦数据库安装文件的bin目录按着Shift键,右键输入以下命令(注意更改参数).\dimp DGYH(用户名)/DGYH(密码)127.0.0.1 FILEdmp所在文件夹路径\20230103.dmp fullY然后根据提示,写Y 或 N 回车即可注意:若导入成功,但…

Java9的新特性模块化(Module)

一、 模块化是什么? Java 9引入了模块化系统,称为"Java Platform Module System"(JPMS) 这个系统允许将Java程序分成模块,每个模块都有自己的规范,可以明确地声明它依赖于哪些其他模块&#xff…

小波分析在电力系统暂态信号处理中的应用

前面我们主要讲了小波分析在机械振动信号或者其他时间序列中的应用 基于小波包特征提取和随机森林的CWRU轴承数据集故障识别 - 哥廷根数学学派的文章 - 知乎 https://zhuanlan.zhihu.com/p/556172942 基于小波区间相关(Interval-Dependent)的信号降噪方…

nacos源码分析-心跳检测(服务端)

前言 前面我们讲了《nacos源码分析-服务注册(客户端)》 和 《nacos源码分析-服务注册(服务端)》,主要是讲的服务注册流程,本章节我们来讲服务心跳检测机制。 心跳续约客户端 其实我们在讲 nacos服务注册客户端的时候顺带就说了心跳,服务注…

iNav飞控AOCODARC-F7MINI固件编译

iNav飞控AOCODARC-F7MINI固件编译1. 编译目标(AOCODARC-F7MINI)2. 编译步骤Step 1 软件配置环境准备Step 2 获取开源代码Step 3 构建命令介绍Step 4 厂家目标板查询Step 5 目标固件编译Step 6 目标固件清理3. 参考资料iNav是一款非常出色的飞控航模开源软…

怎么恢复360删除的文件?360文件恢复,快速完成

日常生活和工作中,使用电脑总会保存着很多数据。其中有我们很多的文件,如果不小心删除了重要的文件,我们该怎么恢复呢? 很多人都喜欢在电脑上安装3 60安 全卫士,文件被误删,我们可以通过它来恢复数据。文件…

来看看我在CSDN上的好朋友们吧,看看有没有你

首先,感谢支持我的所有人,其次,感谢支持我的所有人,然后感谢支持我的所有人,最后,感谢支持我的所有人(我这是废话吗???不是吧) 今天就来看看我在…

基于transfomer架构的模型[GPT、BERT、VIT、ST、MAE等等]总结

Transformer首先我们来回顾一下Transformer模型架构图对于Transformer从宏观角度可以可以理解为6个Encoder6个Decoder组成各部分介绍输入部分主要就是词嵌入位置编码对于词嵌入比较简单,就是对一个句子里的每个词做一个嵌入操作映射到相应的维度。一般来说就是先把句…

一次非典型的Netty内存泄露案例复盘

背景 作为后端开发相信大家或多或少都接触过Nettty,说起Netty真实又爱又恨,因为基于它可以很简单的开发高性能的Java网络通信服务,但同时要是不小心就会出现各种奇奇怪怪的问题,特别是由于特殊的内存管理机制很容易出现内存泄漏问…

数据大佬的成长经验分享 | ​我的非典型数据分析之路

小飞象交流会哪有什么错过的人,会离开的都是路人。哪有什么命运不公,都是懒惰让你变得无能。内部交流│19期数据大佬的成长经验分享我的非典型数据分析之路data analysis●●●●分享人:夏宇‍在大数据、人工智能热、5G、物联网的时代&#x…

1、Mavan项目管理工具

1.1 什么是 Maven 1.1.1 什么是 Maven Maven 的正确发音是[ˈmevən],而不是“马瘟”以及其他什么瘟。Maven 在美国是一个口语化的词 语,代表专家、内行的意思。 一个对 Maven 比较正式的定义是这么说的:Maven 是一个项目管理工具&#xff0…

Spring Boot学习篇(十)

Spring Boot学习篇(十) shiro安全框架使用篇(二)——登录实例(密码以密文方式存储,不含记住密码) 1.模拟注册时,生成密文到数据库中 1.1 在zlz包下创建util包,并在下面创建SHAUtil01类(初始里面无方法)和SHAUtil02类,其目录结构如下所示 1.2 两种生成密文的方式 1.2.1 自己…

一篇文章彻底搞懂折半查找法[二分查找法]算法~

算法实现的要求: 折半查找法又称为二分查找法,这种方法对待查找的列表有两个要求: 1:必须采用顺序存储结构 2:必须按关键字大小有序排列算法思想: 将表中间位置记录的关键字与查找关键字进行比较&#x…

性能测试时那些「难以启齿」的问题-CPU相关

NO.1 为什么cpu使用率可以>100%? 小白的我在进行压测的时候,查看服务的cpu总使用率如下,总使用率会超过100%,这个数据是怎么来的呢,为什么会有大于100%的情况呢? 作为小白的我刚开始觉得这个问题应该很基础&#x…

Go语言实现猜数字小游戏

目录 前言 一、设计思路 二、代码编写 2.1 产生随机数 2.2 用户输入数据 2.3 核心代码 三、 全部代码 四、效果图 总结 前言 最近在学习go语言,刚刚学完go语言的基础语法。编写了一个猜数字的小游戏来练习循环、分支语句、变量定义、输入输出等基础的go语…

4、变量与常量

目录 一、标识符和关键字 1.标识符 2.关键字 二、声明变量 三、声明常量 四、变量的有效范围 1. 成员变量 2. 局部变量 一、标识符和关键字 1.标识符 Java语言规定标识符由任意顺序的字母、下画线(_)、美元符号($)和数字…

【数据结构】手撕八大排序算法

作者:一个喜欢猫咪的的程序员 专栏:《数据结构》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 1.排序的概念: 2.八大排序的思路及其细节 2.1直接插入排序 …

适合编程初学者的开源项目:小游戏2048(安卓Compose版)

目标 为编程初学者打造入门学习项目,使用各种主流编程语言来实现。 2048游戏规则 一共16个单元格,初始时由2或者4构成。 1、手指向一个方向滑动,所有格子会向那个方向运动。 2、相同数字的两个格子,相遇时数字会相加。 3、每次…

SpringMVC面试题

概述 什么是Spring MVC?简单介绍下你对Spring MVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清…

如何在Linux上搭建C++开发环境

工欲善其事,必先利其器!我们要在Linux上开发C程序,就要先搭建好它的开发环境。 搭建环境步骤安装Linux安装开发工具写一个demo在项目根目录创建一个构建脚本build.sh使用CodeLite IDE打开项目安装Linux Linux的发行版本很多,萝卜…