【探索 Kubernetes|作业管理篇 系列 14】StatefulSet 存储状态

news2024/11/19 19:43:45

前言

大家好,我是秋意零。

在上一篇中,我们讲解了 StatefulSet 的拓扑状态;我们发现,它的拓扑状态,就是顺序启动/删除、Pod 名称+编号命名、将 Pod 名称设为 Hostname 名称、通过 Service 无头服务的 DNS 记录访问。

今天,就来看看 StatefulSet 的存储状态。

最近搞了一个扣扣群,旨在技术交流、博客互助,希望各位大佬多多支持!

获取方式:

  • 1.在我主页推广区域,如图:

  • 2.文章底部推广区域,如图:

👿 简介

  • 🏠 个人主页: 秋意零
  • 🧑 个人介绍:在校期间参与众多云计算相关比赛,如:🌟 “省赛”、“国赛”,并斩获多项奖项荣誉证书
  • 🎉 目前状况:24 届毕业生,拿到一家私有云(IAAS)公司 offer,暑假开始实习
  • 🔥 账号:各个平台, 秋意零 账号创作者、 云社区 创建者
  • 💕欢迎大家:欢迎大家一起学习云计算,走向年薪 30 万

系列文章目录


【云原生|探索 Kubernetes-1】容器的本质是进程
【云原生|探索 Kubernetes-2】容器 Linux Cgroups 限制
【云原生|探索 Kubernetes 系列 3】深入理解容器进程的文件系统
【云原生|探索 Kubernetes 系列 4】现代云原生时代的引擎
【云原生|探索 Kubernetes 系列 5】简化 Kubernetes 的部署,深入解析其工作流程


更多点击专栏查看:深入探索 Kubernetes

正文开始

  • 快速上船,马上开始掌舵了(Kubernetes),距离开船还有 3s,2s,1s...

目录

前言

系列文章目录

一、解决的实际问题

二、PV、PVC 简单介绍

开发者使用 PVC

运维人员负载 PV

三、存储状态

创建 PV 与 StatefulSet

验证 StatefulSet 的存储状态

总结


一、解决的实际问题

StatefulSet 的存储状态,主要使用 Persistent Volume Claim(PVC 持久卷声明) 功能实现。

在前面介绍 Pod 时,要在一个 Pod 里生命 Volume,只要在 Pod 里加上 spec.voluems 字段即可。然后,在它里面定义一个具体类型的 Voluem,比如:hostPath。

可如果,你并不知道有那些 Volume 类型可以用,这要怎么办呢?

  • 具体的说,作为一个开发者,我可能对持久化存储项目(Ceph、GlusterFS等)一窍不通,对 Kubernetes 也不懂,自然也不知道对应的 Volume 定义文件。
  • 所谓“术业有专攻”,这些关于 Volume 的管理和远程持久化存储的知识,不仅超越了开发者的知识储备,还会有暴露公司基础设施秘密的风险。

二、PV、PVC 简单介绍

比如,下面这个例子,就是一个声明了 Ceph RBD 类型 Volume 的 Pod:

  • 1.如果,不懂 Ceph RBD 使用方法,那么这个 Pod 里 Volumes 字段,自然是看不懂的;
  • 2.这个 Ceph RBD 对应的存储服务器地址、用户名、授权文件的位置,也都暴露给了全公司的所有开发人员,这是一个典型的信息被“过度暴露”的例子。
apiVersion: v1
kind: Pod
metadata:
  name: rbd
spec:
  containers:
    - image: kubernetes/pause
      name: rbd-rw
      volumeMounts:
      - name: rbdpd
        mountPath: /mnt/rbd
  volumes:
    - name: rbdpd
      rbd:
        monitors:
        - '10.16.154.78:6789'
        - '10.16.154.82:6789'
        - '10.16.154.83:6789'
        pool: kube
        image: foo
        fsType: ext4
        readOnly: true
        user: admin
        keyring: /etc/ceph/keyring
        imageformat: "2"
        imagefeatures: "layering"

这也是为什么,Kubernetes 引入了一组叫 Persistent Volume Claim(PVC)和 Persistent Volume(PV)的 API 对象,大大降低了用户声明和使用持久化 Volume 的门槛。因为开发人员只需要关心 PVC 的声明,不需要关心 PV 的声明。

PV 和 PVC 之间的关系:

  • PVC 将 PV 看做是一个存储池,间接使用磁盘;而 PV 实际上才是真是直接使用磁盘和各种存储服务器的对象。

开发者使用 PVC

举个例子:有了 PVC 之后,一个开发人员想要使用一个 Volume,只需要简单的两步即可。

1.定义一个 PVC,声明想要的 Volume 的属性:

  • 可以看到,PVC 对象中不需要任何的 Volume 细节的字段,只有描述 Volume 的属性和定义。比如:storage: 1Gi,表示我要使用的 Volume 大小至少为 1 GiB;accessModes: [ReadWriteOnce],表示这个 Volume 的访问模式是可读写的,并且只能被挂载在一个节点上而非被多个节点挂载。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pv-claim
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

2.在应用的 Pod 中,声明使用这个 PVC:

  • 可以看到,Pod 中的 Volumes 字段定义了,persistentVolumeClaim 字段来使用 PVC 所请求的磁盘资源。只需要指定 PVC 的名字,而完全不必关心 Volume 本身的定义。
apiVersion: v1
kind: Pod
metadata:
  name: pv-pod
spec:
  containers:
    - name: pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: pv-storage
  volumes:
    - name: pv-storage
      persistentVolumeClaim:
        claimName: pv-claim

运维人员负载 PV

PVC 创建之后,会自动为它绑定一个符合条件的 Voluem(这个 Voluem 是 PV),从上述的 PV 和 PVC 的结构图中,这个 Volume 就是从 PV 中来的,并且由运维人员维护 PV 对象。PV 如下:

  • 可以看到,这个 PV 对象的 spec.rbd 字段,正是我们前面介绍过的 Ceph RBD Volume 的详细定义。而且,它还声明了这个 PV 的容量是 10 GiB。这样,Kubernetes 就会为我们刚刚创建的 PVC 对象绑定这个 PV(只要 PVC 请求的容量在 PV 所请求容量的范围内,PVC 就能自动与对应的 PV 绑定)。
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-volume
  labels:
    type: local
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  rbd:
    monitors:
    # 使用 kubectl get pods -n rook-ceph 查看 rook-ceph-mon- 开头的 POD IP 即可得下面的列表
    - '10.16.154.78:6789'
    - '10.16.154.82:6789'
    - '10.16.154.83:6789'
    pool: kube
    image: foo
    fsType: ext4
    readOnly: true
    user: admin
    keyring: /etc/ceph/keyring

PV 和 PVC 的设计,就类似于“接口”和“实现”的思想。开发者只要知道并会使用“接口”,不管“接口”背后的实现,类似: PVC;而运维人员负责给“接口”绑定具体的实现,类似:PV

这种解耦,就避免了因为向开发者暴露过多的存储系统细节而带来的隐患。此外,这种职责的分离,往往也意味着出现事故时可以更容易定位问题和明确责任,从而避免“扯皮”现象的出现

三、存储状态

由于 PV、PVC 的设计,我们就能使用 StatefulSet 利用 PV、PVC 来实现 StatefulSet 存储状态,如下所示:

  • 可以看到,StatefulSet 中我们使用了 spec.volumeClaimTemplates字段,从名字可以看出它和spec.template(PodTemplate)的作用类似,所以 StatefulSet 会自动创建 PVC 就像自动创建所期望的副本数 Pod 一样;
  • spec.template:一个 Pod 模板,控制器所创建管理的 Pod,都以这个配置为基础;
  • spec.volumeClaimTemplates:一个 PVC 模板,控制器所创建管理的 PVC,都以这个配置为基础;
  • 更重要的是,这个 PVC 的名字,会被分配一个与这个 Pod 完全一致的编号。并且对应编号的 Pod 和 PVC 都会与之匹配,使用对应编号的 PVC。比如:名叫 web-0 的 Pod 的 volumes 字段,它会声明使用名叫 www-web-0 的 PVC,从而挂载到这个 PVC 所绑定的 PV。
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi

这个自动创建的 PVC,与 PV 绑定成功后(前提是首先创建了 PV或通过 Dynamic Provisioning 的方式,自动为 PVC 匹配创建 PV),就会进入 Bound 状态,这就意味着这个 Pod 可以挂载并使用这个 PV 了(详细内容会在存储章节讲解)。PV 的 YAML 文件如下:

[root@master01 yaml]# cat > pv.yaml << EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv1
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/my-pv1
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv2
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/my-pv2
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv3
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/my-pv3
EOF

创建 PV 与 StatefulSet

1.创建 PV 与 StatefulSet:

[root@master01 yaml]# kubectl apply -f pv.yaml
persistentvolume/my-pv1 created
persistentvolume/my-pv2 created
persistentvolume/my-pv3 created

[root@master01 yaml]# kubectl apply -f statefulset-pvc.yaml
statefulset.apps/web created

2.查看 Pod 是否运行:

[root@master01 ~]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          13m
web-1   1/1     Running   0          13m
web-2   1/1     Running   0          13m

3.查看 PV 与 PVC:

  • PVC,根据 StatefulSet 控制器的 volumeClaimTemplates 字段,自动创建;并且可以看到 PVC,都以“<PVC 名字 >-<StatefulSet 名字 >-< 编号 >”的方式命名,并且与 PV 都处于 Bound 状态。前面提到过,StatefulSet 创建出来的所有 Pod,都会声明使用并使用对应编号的 PVC。
[root@master01 ~]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
my-pv1   10Gi       RWO            Retain           Bound    default/www-web-1                           14m
my-pv2   10Gi       RWO            Retain           Bound    default/www-web-0                           14m
my-pv3   10Gi       RWO            Retain           Bound    default/www-web-2                           14m
[root@master01 ~]# kubectl get pvc
NAME        STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
www-web-0   Bound    my-pv2   10Gi       RWO                           14m
www-web-1   Bound    my-pv1   10Gi       RWO                           14m
www-web-2   Bound    my-pv3   10Gi       RWO                           14m

验证 StatefulSet 的存储状态

现在,我们要做这样一件事。

  • 首先,在 Pod 中的 Volume 的 Web 目录中写入一个文件;
  • 其次,查看 Volume 的 Web 目录中的数据;
  • 最后,删除所以 Pod,并再次查看 Volume 中的数据是否还与之前 Pod 中的数据对应。

1.在 Pod 中的 Volume 的 Web 目录中写入一个文件:

$ for i in 0 1 2; do kubectl exec web-$i -- sh -c 'echo hello $(hostname) > /usr/share/nginx/html/index.html'; done
  • for 循环展开状态如下:

2.查看 Volume 的 Web 目录中的数据:

$ for i in 0 1 2; do kubectl exec -it web-$i -- curl localhost; done
hello web-0
hello web-1
hello web-2
  • for 循环展开状态如下:

3.删除所有 Pod,并再次查看 Volume 的 Web 目录中的数据是否还与之前 Pod 中的数据对应:

1、删除 Pod
[root@master01 ~]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          53m
web-1   1/1     Running   0          53m
web-2   1/1     Running   0          53m
[root@master01 ~]#
[root@master01 ~]# kubectl delete pod --all
pod "web-0" deleted
pod "web-1" deleted
pod "web-2" deleted
2、验证,访问 web 数据是否还一致

[root@master01 ~]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          22s
web-1   1/1     Running   0          20s
web-2   1/1     Running   0          18s
[root@master01 ~]#
[root@master01 ~]# for i in 0 1 2; do kubectl exec -it web-$i -- curl localhost; done
hello web-0
hello web-1
hello web-2

可以看到,我们再次查看访问 web 时,数据还是一致的。也就是说,我们重建之后的 Pod 还会与之前绑定过的 PVC 再次绑定。

这是怎么做到的呢?

  • 重建的 web-0 Pod 被创建出来之后,Kubernetes 为它查找名叫 www-web-0 的 PVC 时,就会直接找到旧 Pod 遗留下来的同名的 PVC,进而找到跟这个 PVC 绑定在一起的 PV。是通过 Pod 与 PVC 的命名编号判断是否与之绑定。

总结

StatefulSet 工作原理的三个方面:

  • 首先,StatefulSet 的控制器直接管理的是 Pod。
  • 其次,Kubernetes 通过 Headless Service,为这些有编号的 Pod,在 DNS 服务器中生成带有同样编号的 DNS 记录。
  • 最后,StatefulSet 还为每一个 Pod 分配并创建一个同样编号的 PVC。

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

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

相关文章

基于Python的海量豆瓣电影、数据获取、数据预处理、数据分析、可视化、大屏设计项目(含数据库)

目录 项目介绍研究背景国内外研究现状分析研究目的研究意义研究总体设计网络爬虫介绍豆瓣电影数据的采集数据预处理大数据分析及可视化豆瓣影评结构化分析 大屏可视化文本可视化总结每文一语 项目介绍 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博…

虹科DataHub:连接工业自动化的桥梁,引领企业数字化转型

一、前言 随着智能制造、工业互联网等新一代信息技术的不断发展&#xff0c;IT和OT融合已成为未来制造业数字化转型的重要趋势。得益于开放的系统架构和创新的软件应用&#xff0c;OT&#xff08;工业自动化技术&#xff09;和信息技术&#xff08;IT&#xff09;系统之间的数…

在windows系统中映射网络驱动器时,如何通过非455端口远程访问Linux服务器的Samba服务

声明 通常情况下&#xff0c;在windows中通过Linux服务器的Samba服务去映射网络驱动器时候&#xff0c;一般默认就是直接填入内网Linux服务器ip即可&#xff0c;它会默认445端口。若是我的windows并不和Linux服务器在一个网段时&#xff0c;该如何操作呢&#xff1f; 1 用管理…

一键转发微信好友朋友圈,自动跟圈

今天咱来讲一下如何实现一键转发朋友圈&#xff1f; 如何一键跟圈&#xff0c;多个微信快速同步发圈&#xff1f; 01 一键转发 浏览朋友圈&#xff0c;在此页面可以浏览所登录的微信号的好友朋友圈&#xff0c;可以实现快速点赞、评论、一键转发。 单击“转发”即可跳转到发…

D. Optical Experiment

题意&#xff1a; D. 光学实验 时间限制&#xff1a;5秒 内存限制&#xff1a;256兆字节 输入&#xff1a;标准输入 输出&#xff1a;标准输出 Phunsuk Wangdu教授进行了一些关于光线的实验。n条光线的实验装置如下&#xff1a; 有一个长方形盒子&#xff0c;在相对的两面…

windows的环回网卡(loopback adapter) 安装方法

0.说明&#xff1a;windows的环回网卡(loopback adapter)的作用&#xff1a; microsoft loopback adapter就是安装在本机上的一块虚拟网卡&#xff0c;它跟本机上的其它物理网卡、和物理网卡连接的网络是没有关系的&#xff0c;你可以理解成这块网卡上的网线接到了另外一个空白…

葡萄风味有奥秘,农科院用机器学习揭示基因渐渗过程

内容一览&#xff1a;基因渐渗与葡萄的驯化、遗传改良密切相关。先前研究揭示了欧洲栽培葡萄中&#xff0c;野生葡萄基因渐渗的基因组信号&#xff0c;但尚未深入研究这些渐渗事件发生的时间、方式、基因组模式和生物学效应。本文中&#xff0c;中国农业科学院深圳农业基因组研…

【杂谈理解】电源芯片设计选型

前言 看B站UP主达尔闻关于电源视频&#xff0c;做的笔记。下述内容中&#xff0c;如有芯片比较皆是性能层面的比较&#xff0c;暂未考虑成本。且老师在视频中&#xff0c;也多次建议说&#xff0c;可以多关注比较新兴的芯片&#xff0c;一般会是有更好的性能。讲的真的很好&…

【MySQL】MySQL数据库,RDBMS 术语,使用说明和报错解决的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

转型升级必备:智能客服外包服务的应用实践

随着信息技术的不断发展&#xff0c;人工智能技术在各个领域的应用越来越广泛&#xff0c;其中智能客服外包服务是一个备受关注的领域。智能客服外包服务是指将企业的客服业务交由专业的第三方服务商处理&#xff0c;并运用人工智能技术提供更高效、更优质的客服服务。本文将从…

FineReport学习2

当原始数据中存储的字段不适宜展现在报表上&#xff1b;或原始数据在数据查询时不易修改&#xff0c;但对显示在报表中的值有要求&#xff1b;或需要根据不同的原始数据在报表中显示不同的值时&#xff0c;就可以利用数据字典做巧妙的转化 设置数据字典 数据列的过滤&#xff…

解决程序错误‘找不到vcruntime140.dll,无法继续执行代码’的全面解决方案

在运行某些应用程序或代码时&#xff0c;你可能会遇到一个错误提示&#xff1a;“找不到vcruntime140.dll,无法继续执行代码”。其实遇到这种情况不需要担心&#xff0c;我们有多种方法可以进行解决&#xff0c;今天小编就来给大家详细的说说vcruntime140.dll文件的相关问题&am…

ABIDE Preprocessd 结构态MRI数据集介绍及下载(FreeSurfer流程)

引言 本博客书接上文&#xff1a;ABIDE Preprocessed 结构态MRI数据集介绍及下载&#xff0c;写前一篇的时候因为觉得FreeSurfer流程处理完成的数据过于庞杂&#xff0c;想要从中获得需要的ROI层面形态学特征过于复杂&#xff0c;所以只是简单说明了其下载方式&#xff0c;并未…

DAY34——贪心part3

1. class Solution {public int largestSumAfterKNegations(int[] nums, int K) {// 将数组按照绝对值大小从大到小排序&#xff0c;注意要按照绝对值的大小nums IntStream.of(nums).boxed().sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1)).mapToInt(Integer::intValue)…

8.12 IP协议与ethernet协议

目录 IP协议作用和意义 计算机网络体系结构 网络互联使用路由器 IP网的意义 分组在互联网中的传送 分组传输路径 ​编辑 IP 数据报首部格式 IP数据报的格式 IP数据报首部的固定部分中的各字段 IP 数据报分片 IP数据报首部中的协议 以太网协议 IP协议作用和意义 数…

13年测试老鸟经验,性能测试-性能调优各个方法详细,一篇通透...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 WebServer服务优化…

数学建模算法(基于matlab和python)之 变步长求积公式与龙贝格算法(3/10)

实验目的及要求&#xff1a; 深刻认识数值积分法的意义&#xff1b;明确数值积分精度与步长的关系&#xff1b;根据定积分的计算方法&#xff0c;可以考虑二重积分的计算问题。 实验内容&#xff1a; 1、利用quad函数作变步长方法计算定积分的近似值&#xff0c;计算精度为。 …

Axure制作一个滑动验证组件

一、案例效果 1、默认显示滑块、背景及提示文案&#xff1b; 2、滑块仅允许向右水平拖动&#xff0c;且不能超过背景区域&#xff1b; 3、滑块移动过程中&#xff0c;左侧区域样式跟随变化&#xff0c;右侧区域保持不变&#xff1b; 4、滑块为未拖动到最右侧时释放&#xff…

射频功率放大器——如何选择合适的射频功率放大器

射频功率放大器是一种用于增强射频信号的电子设备。在选择合适的射频功率放大器时&#xff0c;需要考虑多个因素&#xff0c;包括应用场景、频率范围、增益、带宽、噪声等。下面是一些关于如何选择合适的射频功率放大器的基本步骤&#xff1a; 1、确定应用场景和需求&#xff1…

CANoe使用记录(五):CANoe 如何调用诊断功能/ZCANPRO的诊断功能

目录 1、概述 2、Canoe调用诊断服务 2.1、查看是否存在license 2.2、新建工程步骤分解 3、ZCANPRO的诊断功能 1、概述 有那么一部分时候&#xff0c;需要通过Canoe来实现简单的诊断服务&#xff0c;当然大部分时候通过Canoe进行测试需要通过CAPL脚本实现复杂的UDS诊断服务。…