【K8S系列】深入解析StatefulSet(二)

news2024/12/24 20:56:17

序言

那些看似不起波澜的日复一日,一定会在某一天让你看见坚持的意义。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

Kubernetes (k8s) 是一个容器编排平台,允许在容器中运行应用程序和服务。今天学习一下StatefulSet-存储状态。

希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流

这是这篇文章所在的专栏,欢迎订阅:【深入解析k8s】专栏

 专栏介绍

简单介绍一下这个专栏要做的事:

主要是深入解析每个知识点,帮助大家完全掌握k8s,一下是已更新的章节

序号文章
第一讲深入解析 k8s:入门指南(一)
第二讲深入解析 k8s:入门指南(二)
第三讲深入解析Pod对象(一)
第四讲深入解析Pod对象(二)
第五讲深入解析无状态服务
第六讲深入解析有状态服务
第七讲深入解析控制器

第八讲

深入解析 ReplicaSet
第九讲深入解析滚动升级
第十讲深入解析StatefulSet(一)

1 前情提要

 1.1 StatefulSet 两种状态

StatefulSet 的设计,它把真实世界里的应用状态,抽象为了两种:

  • 拓扑状态
  • 存储状态

在前面一篇文章中,我们已经了解了拓扑状态,今天主要学习一下存储状态

2 PVC

 StatefulSet 对存储状态的管理机制,主要使用的是一个叫作 Persistent Volume Claim 的功能。所以我们需要先来看下这个功能的介绍与使用。 

2.1 PVC基本介绍 

持久卷(Persistent Volume)是一种独立于 Pod 的存储资源。持久卷可以独立于 Pod 的生命周期存在,并且可以在 Pod 重新调度后仍然保留数据。

在 Kubernetes 中,要使用持久卷,需要创建一个持久卷声明(Persistent Volume Claim)

Persistent Volume Claim (PVC) 是一种用于声明对持久存储资源的需求的资源对象

PVC 允许将应用程序和存储资源的生命周期分开,以便在应用程序重新部署或迁移时保留持久存储数据

2.2 PVC 的工作原理

Persistent Volume Claim(PVC)是在 Kubernetes 中定义一个存储资源的方式。PVC 允许 Pod 请求特定大小和访问模式的存储。

PVC 实际上是一个声明,它声明了 Pod 需要的存储资源。

Kubernetes 系统会根据 PVC 的要求选择或创建一个相应的持久卷来满足 Pod 的需求

如果 PV 满足 PVC 的要求,则将 PV 绑定到 PVC,并将 PVC 暴露给应用程序使用。

PVC 可以在多个 Pod 之间共享,但每次只能绑定到一个 PV 上。

2.3 PVC 的访问模式

PVC 的访问模式指定了允许哪些节点以哪种方式使用持久卷。以下是 PVC 的三种访问模式:

  • ReadWriteOnce:允许单个节点以读写模式挂载持久卷。
  • ReadOnlyMany:允许多个节点以只读模式挂载持久卷。
  • ReadWriteMany:允许多个节点以读写模式挂载持久卷。

需要注意的是,不是所有的存储插件都支持所有的访问模式。因此,在使用 PVC 的时候,需要确保所使用的存储插件支持所需的访问模式。

2.4 PVC 和 Pod 的关系

  1. 关系:PVC 和 Pod 是紧密相关的。
  2. 请求:一个 Pod 可以请求一个或多个 PVC,并将 PVC 挂载到容器中。
  3. 挂载:在 Pod 被调度到节点上时,Kubernetes 系统会为 Pod 中声明的每个 PVC 创建一个持久卷,并将其挂载到 Pod 上。
  4. 删除当 Pod 被删除时,与之关联的 PVC 不会被删除,这些 PVC 可以在之后的 Pod 中继续使用

2.5 代码示例

2.5.1 yaml 示例

下面是一个 PVC 的 YAML 文件示例:

apiVersion: v1
kind: PersistentVolumeClaim # PVC资源类型
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

在这个示例中,创建了一个名为 my-pvc 的 PVC,并指定了访问模式为 ReadWriteOnce,请求的存储容量为 1Gi。

2.5.2 PVC 的 Pod yaml 

接下来,可以创建一个使用这个 PVC 的 Pod。

下面是一个使用 my-pvc 的 Pod 的 YAML 文件示例:

apiVersion: v1
kind: Pod                   #资源类型
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - name: my-pvc-volume
      mountPath: /data
  volumes:
  - name: my-pvc-volume     #当前pod对应的pvc名称
    persistentVolumeClaim:
      claimName: my-pvc     #使用刚刚创建声明的pvc

在这个示例中,创建了一个名为 my-pod 的 Pod,并将其容器的 /data 目录挂载到 my-pvc-volume 卷中。该卷使用 my-pvc PVC。

Tips: 

当创建 my-pod Pod 时,Kubernetes 会自动扫描所有可用的 PV,并选择一个 PV 来满足 my-pvc PVC 的要求

如果找到了可用的 PV,则将其绑定到 my-pvc,并将 my-pvc-volume 卷挂载到容器中的 /data 目录。

2.6 结论

PVC 是 Kubernetes 中非常有用的资源对象,它允许将应用程序和存储资源的生命周期分开,并在应用程序重新部署或迁移时保留持久存储数据

通过上面的示例,可以了解如何创建 PVC,并将其用于 Pod。

拓展一下: 

Kubernetes 中 PVC 和 PV 的设计,实际上类似于“接口”和“实现”的思想

  1. 开发者只要知道并会使用“接口”,即:PVC;
  2. 而运维人员则负责给“接口”绑定具体的实现,即:PV。

这种解耦就避免了因为向开发者暴露过多的存储系统细节而带来的隐患。

此外,这种职责的分离,往往也意味着出现事故时可以更容易定位问题和明确责任,从而避免“扯皮”现象的出现。

3 存储状态

3.1 问题

思考一下这个问题:

 3.2 问题解答

前面已经了解到,当 Pod 被删除时,与之关联的 PVC 不会被删除,这些 PVC 可以在之后的 Pod 中继续使用。

来看下StatefulSet 怎么做到的

首先: 

StatefulSet 的控制器直接管理的是 Pod。

因为,StatefulSet 里的不同 Pod 实例,不像 ReplicaSet 中那样都是完全一样的,而是有了细微区别的。

比如,每个 Pod 的 hostname、名字等都是不同的、携带了编号的。而 StatefulSet 区分这些实例的方式,就是通过在 Pod 的名字里加上事先约定好的编号。

 其次:

Kubernetes 通过 Headless Service,为这些有编号的 Pod,在 DNS 服务器中生成带有同样编号的 DNS 记录

只要 StatefulSet 能够保证这些 Pod 名字里的编号不变,那么 Service 里类似于

web-0.nginx.default.svc.cluster.local 这样的 DNS 记录也就不会变,而这条记录解析出来的 Pod 的 IP 地址,则会随着后端 Pod 的删除和再创建而自动更新。这是 Service 机制本身的能力,不需要 StatefulSet 操心。

最后: 

StatefulSet 还为每一个 Pod 分配并创建一个同样编号的 PVC

这样,Kubernetes 就可以通过 Persistent Volume 机制为这个 PVC 绑定上对应的 PV,从而保证了每一个 Pod 都拥有一个独立的 Volume。

在这种情况下,即使 Pod 被删除,它所对应的 PVC 和 PV 依然会保留下来

所以,当这个 Pod 被重新创建出来之后,Kubernetes 会为它找到同样编号的 PVC,挂载这个 PVC 对应的 Volume,从而获取到以前保存在 Volume 里的数据。

 3.3 yaml示例

apiVersion: apps/v1
kind: StatefulSet #资源类型
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.9.1
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: mypvc
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: #pvc声明
  - metadata:
      name: mypvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi

在这个yaml中:添加了一个 volumeClaimTemplates 字段。

它跟 Deployment 里 Pod 模板(PodTemplate)的作用类似。凡是被这个 StatefulSet 管理的 Pod,都会声明一个对应的 PVC;

而这个 PVC 的定义,就来自于 volumeClaimTemplates 这个模板字段。更重要的是,这个 PVC 的名字,会被分配一个与这个 Pod 完全一致的编号。

这个自动创建的 PVC,与 PV 绑定成功后,就会进入 Bound 状态,这就意味着这个 Pod 可以挂载并使用这个 PV 了。 

3.4 创建

 使用 kubectl create 创建了 StatefulSet 之后,就会看到 Kubernetes 集群里出现了两个 PVC:

kubectl create -f statefulset.yaml

3.5 查看结果

执行创建命令:

kubectl get pvc -l app=nginx

 结果如下:

NAME        STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE
mypvc-web-0   Bound     pvc-15c268c7-b507-11e6-932f-42010a800002   1Gi        RWO           48s
mypvc-web-1   Bound     pvc-15c79307-b507-11e6-932f-42010a800002   1Gi        RWO           48s

前面已讲到过,这个 StatefulSet 创建出来的所有 Pod,都会声明使用编号的 PVC

可以看到,这些 PVC,都以“<PVC 名字 >-<StatefulSet 名字 >-< 编号 >”的方式命名,并且处于 Bound 状态。 

3.6 总结

1. 可以看出StatefulSet 其实就是一种特殊的 Deployment,它的特别之处在于,赋予了pod在整个集群里唯一的、可被的访问身份主要通过它对创建的每个 Pod 都进行了编号

2. 就是这个编号给了pod一个唯一的身份,并且,这个编号还会体现在 Pod 的名字和 hostname 等标识信息上,这不仅代表了 Pod 的创建顺序,也是 Pod 的重要网络标识

3. 有了编号后,StatefulSet 就使用 Kubernetes 里的两个标准功能:

  1. Headless Service
  2. PV/PVC

实现了对 Pod 的拓扑状态和存储状态的维护。

4 投票

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

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

相关文章

用梯度下降的方式来拟合曲线

文章目录 1. 简述2. 理论原理以二次函数为例整体的梯度下降步骤&#xff1a; 3. 编码实现初始化权重矩阵计算损失和梯度更新权重 4. 结果首先对上一篇文章中的真实数据拟合。测试拟合高次曲线方程数据是2阶的&#xff0c;拟合方程是2阶的数据是4阶的&#xff0c;拟合方程也是4阶…

3年自动化测试(心路历程),从月薪10k到30k我经历了什么?

前言 2018年的时候&#xff0c;由于项目的原因&#xff0c;开始使用Robot Framework测试框架&#xff0c;正因为有Python的基础所以很快就理解了Robot Framework框架的工作原理&#xff0c;并可以根据项目的需要开发系统关键字。2019年随着移动App越来越流行&#xff0c;乘着换…

HTML5超链接和图片基础用法

一、HTML5 超链接&#xff08;链接&#xff09; 超链接可以是一个文本&#xff0c;也可以是一幅图像&#xff0c;您可以点击这些内容来跳转到新的页面或新的文档或者当前文档中的某个部分。 当您把鼠标指针移动到网页中的某个链接上时&#xff0c;箭头会变为一只小手。 1.我…

MATLAB | MATLAB配色不够用,近2000款配色来啦

MATLAB绘图配色不够多&#xff1f;很多python\R语言绘图包都会带着好几套配色方案&#xff0c;比如很常见的ggsci绘图包就自带45套离散配色&#xff0c;于是本工具收集了常见55个绘图包中的离散配色&#xff0c;制作出了这个包含了1967套配色的离散配色包slanCL。 基本使用 以…

机器学习(二):线性回归之梯度下降法

文章目录 专栏导读1、梯度下降法原理2、梯度下降法原理代码实现3、sklearn内置模块实现专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《机器学习案例》,本专栏精选了经典的机器学习算法进行讲解,针对大学生、初级数据分…

CleanMyMac4.13最新免费mac电脑系统优化软件

CleanMyMac免费mac下载版是一款简单实用的PC清洁管理工具&#xff0c;电脑刚装完系统的时候运行速度超级快&#xff0c;随着时间的推移&#xff0c;你会发现越来越慢&#xff0c;经常会反应卡顿&#xff0c;越来越多的垃圾文件占用了你的磁盘空间&#xff0c;各种过时的日志&am…

数组题目总结 -- 前缀和数组

目录 一. 区域和检索 - 数组不可变1. 思路和代码I. 博主的做法&#xff1a;II. 东哥的做法&#xff1a; 2. 总结 二. 二维区域和检索 - 矩阵不可变1. 思路和代码I. 博主的做法&#xff1a;II. 东哥的做法&#xff1a; 2. 总结 一. 区域和检索 - 数组不可变 题目链接&#xff1…

【方法一:二分+字符串哈希 优化】【dp——取不取问题-背包】最长公共子串【上海交通大学考研机试题】

最长公共子串 二分方法字符串哈希的复习字符串哈希 如何理解 二分代码 dp方法字符串str1中以第i个字符为结尾的子串 与字符串str2中以第i个字符为结尾的子串的连续公共子串 二维一维优化 二分方法 由于这个题是要求求子串&#xff0c;而子串是连续的一段&#xff0c;所以用二分…

在微信小程序中怎么使用vant框架?

目录标题 首先介绍什么是vant一、第一步&#xff0c;打开我们小程序项目目录&#xff0c;找到所在的位置&#xff0c;打开终端二、对项目进行初始化三、进行安装依赖1、通过npm安装vant/weapp2、安装miniprogram 四、修改app.json五、修改project.config.json六、然后构建npm 需…

使用Word的一些技巧记录

本文主要用于记录书写毕业论文时&#xff0c;遇到的Word的使用技巧。 设置样式及多级列表 每个学校必然会对论文中的字体、字号、行间距提出要求&#xff0c;设置Word中样式解决此问题。 例如&#xff0c;本校的格式要求为&#xff1a; 正文中的一级标题&#xff08;章目&a…

【C#】GridControl动态更换DataSource,查询数据异常处理

系列文章 【C#】单号生成器&#xff08;编号规则、固定字符、流水号、产生业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

适应大、中、小型医院的手术麻醉临床信息管理系统源码

手术麻醉管理系统是一款专门用于医院手术麻醉管理的软件系统&#xff0c;它可以帮助医院和医生更好地管理手术麻醉过程&#xff0c;提高手术麻醉的质量和安全性。本文将介绍手术麻醉管理系统的实现、功能概述、主要功能、系统设置、麻醉管理、术中记录、苏醒室记录、PCA实施及管…

【微服务笔记20】微服务组件之Nacos配置中心基础环境搭建、配置持久化、动态刷新配置

这篇文章&#xff0c;主要介绍微服务组件之Nacos配置中心基础环境搭建、配置持久化、动态刷新配置。 目录 一、搭建Nacos配置中心环境 1.1、Nacos配置中心介绍 1.2、搭建Nacos配置中心客户端 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;添加配置信息 &…

图书管理系统的开发与设计(论文+源码)_kaic

摘 要 随着科学技术的快速发展&#xff0c;尤其是计算机技术的突飞猛进&#xff0c;计算机技术普及到日常生活、学习生活的方方面面。由此想到学校的相对于传统的图书管理系统&#xff0c;帮助到学校的读者和学校的图书管理员的系统。提升图书管工作人员的效率&#xff0c;满足…

【C++类和对象】类和对象(中):构造函数 {六个默认成员函数;构造函数的概念及特性;编译器自动生成的构造函数;默认构造函数}

一、类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

Pytorch深度学习笔记(六)用pytorch实现线性回归

目录 1.数据准备 2.设计模型 3.构造损失函数和优化器 4.训练周期&#xff08;前馈—>反馈—>更新&#xff09; 课程推荐&#xff1a;05.用PyTorch实现线性回归_哔哩哔哩_bilibili 线性通常是指变量之间保持等比例的关系&#xff0c;从图形上来看&#xff0c;变量之间…

为什么要学习微服务?

文章目录 1.认识微服务1.1微服务由来1.2为什么需要微服务&#xff1f; 2.两种架构2.1.单体架构2.2.分布式架构 3.微服务的特点4.SpringCloud5.总结最后说一句 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为…

类和对象(上篇)

类和对象----上篇 &#x1f506;面向过程和面向对象的初步认识&#x1f506;类的引入&#x1f506;类的定义&#x1f506;类的访问限定符及封装访问限定符封装 &#x1f506;类的作用域&#x1f506;类的实例化&#x1f506;类的对象大小的计算如何计算一个类的大小结构体内存对…

15天学习MySQL计划(多表联查)第四天

15天学习MySQL计划&#xff08;多表联查&#xff09;第四天 1.多表查询 1.1概述 ​ 指从多张表中查询数据 ​ 在项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互…

【HCIP】Huawei设备下IPV4IPV6共存实验

目录 方法一、普通的GRE将V6基于V4通讯 方法二、6to4的tunnel 方法三、双栈 方法一、普通的GRE将V6基于V4通讯 //方法一和方法二的前提&#xff0c;搭个简单的V4网络就行 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip address 12.1.1.1 24 [r1]router id 1.1.1.1 [r1-Gigabi…