k8s 中的 PV 的动态供给

目录

1 存储类 Storageclass 介绍

1.1 StorageClass 说明

1.2 StorageClass 的属性

2 存储分配器 NFS Client Provisioner

2.1 官网存储分配器的部署介绍

2.2 实现动态创建 PV 模版清单文件的介绍

2.2.1 Storageclass 存储类的模版

2.2.2 创建 Provisioner 制备器的模版

2.2.3 rbac 的模版

2.2.4 PVC 的模版

2.2.5 使用 pod 测试使用的模版

3 PV 动态供给的实践操作

3.1 修改完的声明步骤顺序:

3.2 rbac 创建sa权限

3.3 class 创建存储类

3.4 deployment(控制制备器)

3.5 PVC 创建卷申领

3.6 test-nginx (测试)


1 存储类 Storageclass 介绍

官网: https://github.com/kubernetes-sigs/nfs-subdir-external-provisionericon-default.png?t=O83Ahttps://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

1.1 StorageClass 说明

  • StorageClass提供了一种描述存储类(class)的方法,不同的class可能会映射到不同的服务质量等级和备份策略或其他策略等。

  • 每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在StorageClass需要动态分配 PersistentVolume 时会使用到

StorageClass存储类 和 Provisioner制备器 的关联以及NFS服务器与StorageClass存储类的关联

整个步骤如下图也说得很明白,无非就是StorageClass需要使用到provisioner制备器去选择到底使用的是那一块存储,而 provisioner 有一个镜像nfs-subdir-external-provisioner此镜像就是专门来进行选择存储的类型,在使用这个镜像可以使用多种资源类型来创建,如deployment,pod 等等,这次使用的为deployment控制器 在创建完资源类型之后需要手动去指定存储服务器的地址,如这次使用的就为NFS服务器,得在deployment清单文件的volumes.nfs.server 指定NFS的服务器地址与在containers.env 中以键值对的方式去指定NFS的地址为变量。

StorageClass 存储类 和 PVC 的关联

StorageClass 存储类 定义了自己的名字,在PVC中为了使用存储类,得指定存储类的名称spec.storageClassName

1.2 StorageClass 的属性

属性说明:存储类 | Kubernetes本文描述了 Kubernetes 中 StorageClass 的概念。 建议先熟悉卷和持久卷的概念。StorageClass 为管理员提供了描述存储类的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。 Kubernetes 本身并不清楚各种类代表的什么。Kubernetes 存储类的概念类似于一些其他存储系统设计中的"配置文件"。StorageClass 对象 每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在 StorageClass 需要动态制备 PersistentVolume 以满足 PersistentVolumeClaim (PVC) 时使用到。StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。 当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数。作为管理员,你可以为没有申请绑定到特定 StorageClass 的 PVC 指定一个默认的存储类: 更多详情请参阅 PersistentVolumeClaim 概念。storage/storageclass-low-latency.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: low-latency annotations: storageclass.kubernetes.io/is-default-class: "false" provisioner: csi-driver.example-vendor.example reclaimPolicy: Retain # 默认值是 Delete allowVolumeExpansion: true mountOptions: - discard # 这可能会在块存储层启用 UNMAP/TRIM volumeBindingMode: WaitForFirstConsumer parameters: guaranteedReadWriteLatency: "true" # 这是服务提供商特定的 默认 StorageClass 你可以将某个 StorageClass 标记为集群的默认存储类。 关于如何设置默认的 StorageClass, 请参见更改默认 StorageClass。icon-default.png?t=O83Ahttps://kubernetes.io/zh/docs/concepts/storage/storage-classes/

Provisioner(存储分配器):用来决定使用哪个卷插件分配 PV,该字段必须指定。可以指定内部分配器,也可以指定外部分配器。外部分配器的代码地址为: kubernetes-incubator/external-storage,其中包括NFS和Ceph等。

Reclaim Policy(回收策略):通过reclaimPolicy字段指定创建的Persistent Volume的回收策略,回收策略包括:Delete 或者 Retain,没有指定默认为Delete。

2 存储分配器 NFS Client Provisioner

2.1 官网存储分配器的部署介绍

访问 kubernetes 官网

源码地址:https://github.com/kubernetes-sigs/nfs-subdir-external-provisionericon-default.png?t=O83Ahttps://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

  • NFS Client Provisioner是一个automatic provisioner,使用NFS作为存储,自动创建PV和对应的PVC,本身不提供NFS存储,需要外部先有一套NFS存储服务。

  • PV以 ${namespace}-${pvcName}-${pvName}的命名格式提供(在NFS服务器上)

  • PV回收的时候以 archieved-${namespace}-${pvcName}-${pvName} 的命名格式(在NFS服务器上)

点击项目中的 deploy(部署)

2.2 实现动态创建 PV 模版清单文件的介绍

模版文件内容如下

这些只是模版,之后还需修改

2.2.1 Storageclass 存储类的模版

2.2.2 创建 Provisioner 制备器的模版

2.2.3 rbac 的模版

此次只需要在里面修改命名空间就可以了

2.2.4 PVC 的模版

2.2.5 使用 pod 测试使用的模版

3 PV 动态供给的实践操作

3.1 修改完的声明步骤顺序:

rbac(创建权限) --> class(创建存储类) --> deployment(使用制备器) --> pvc(pvc 关联存储类调用制备器) --> test-nginx(测试)

# 将 github 上的项目烤下来
[root@k8s-master storageClass-dynamic]# ls 
class.yaml  deployment.yaml  pvc.yaml  rbac.yaml  test-nginx.yml

3.2 rbac 创建sa权限

# 创建命名空间
[root@k8s-master storageClass-dynamic]# kubectl create namespace  nfs-pvc-dynamic# 修改模版参数
[root@k8s-master storageClass-dynamic]# vim rbac.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: nfs-pvc-dynamic    # 指定命名空间 
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: nfs-pvc-dynamic     # 指定命名空间
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: nfs-pvc-dynamic
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: nfs-pvc-dynamic     # 指定命名空间
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: nfs-pvc-dynamic     # 指定命名空间
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io# 声明 rbac 清单文件
[root@k8s-master storageClass-dynamic]# kubectl apply -f rbac.yaml 
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created# 查看是否成功创建
[root@k8s-master storageClass-dynamic]# kubectl get namespaces nfs-pvc-dynamic 
NAME              STATUS   AGE
nfs-pvc-dynamic   Active   118m[root@k8s-master storageClass-dynamic]# kubectl -n nfs-pvc-dynamic get sa
NAME                     SECRETS   AGE
default                  0         123m
nfs-client-provisioner   0         90m

3.3 class 创建存储类

[root@k8s-master storageClass-dynamic]# vim class.yaml apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client     # 指定存储类名
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # 制备器的名称
parameters:archiveOnDelete: "false"# 声明存储类
[root@k8s-master storageClass-dynamic]# kubectl apply -f class.yaml # 查看存储类
[root@k8s-master storageClass-dynamic]# kubectl get sc
NAME         PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           false                  88m

3.4 deployment(控制制备器)

[root@k8s-master storageClass-dynamic]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace:  nfs-pvc-dynamic
spec:replicas: 1# 更新策略,此处设置为Recreate,表示更新时会先停止旧的Pod,然后再启动新的Podstrategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:# 指定Pod使用的Service Account名称。Service Account用于Pod与API Server之间的认证,# 以便Pod能够调用API Server进行存储类型的选取等操作。# 注意:ServiceAccountName 需要与RBAC中定义的服务账户名称一致,# 以确保有足够的权限来执行存储相关的操作serviceAccountName: nfs-client-provisioner # 要与rbac中的sa名称相同,因为需要调用apiserver去选择使用哪一类型的存储,所以在这上面需要使用到创建的rbac的权限# 定义了一个存储卷volumes:- name: nfs-client-rootnfs:server: 192.168.239.50path: /nfsdatacontainers:- name: nfs-client-provisioner # 使用的是制备器的镜像,并且此名称需要与storaClass中的存储类名一致image: sig-storage/nfs-subdir-external-provisioner:v4.0.2 # 需要用到的镜像,使用docker拉取volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumes  # 将卷挂载到在容器内的这一个目录env:- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner- name: NFS_SERVERvalue: 192.168.239.50- name: NFS_PATHvalue: /nfsdata# 声明制备器
[root@k8s-master storageClass-dynamic]# kubectl apply -f deployment.yaml# 查看制备器是否正常运行
[root@k8s-master storageClass-dynamic]# kubectl -n nfs-pvc-dynamic get deployments.apps 
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
nfs-client-provisioner   1/1     1            1           121m

3.5 PVC 创建卷申领

[root@k8s-master storageClass-dynamic]# vim pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claimnamespace: nfs-pvc-dynamic
spec:storageClassName: nfs-client # 与类名需要一致accessModes:- ReadWriteManyresources:requests:storage: 1Gi# 声明 PVC
[root@k8s-master storageClass-dynamic]# kubectl apply -f pvc.yaml # NFS 服务端查看是否正常创建 PV 存储卷
# 可以发现在NFS服务器上是以 ${namespace}-${pvcName}-${pvName} 的命名格式提供
[root@harbor nfsdata]# ls /nfsdata/
nfs-pvc-dynamic-test-claim-pvc-29a134a4-a4dc-40f6-a378-820de948d34a 

3.6 test-nginx (测试)

[root@k8s-master storageClass-dynamic]# vim test-nginx.yml 
apiVersion: v1
kind: Pod
metadata:name: nginx-testnamespace: nfs-pvc-dynamic    # 指定命名空间
spec:volumes:- name: nfs-pvcpersistentVolumeClaim:    # 指定 PVC 的名称claimName: test-claimcontainers:- image: nginxname: nginx-test-01volumeMounts:- mountPath: /usr/share/nginx/html    # 容器挂载点name: nfs-pvc[root@k8s-master storageClass-dynamic]# kubectl apply -f test-nginx.yml # 这个时候由于是新的卷,不能直接去访问因为直接访问是没有默认发布文件,需要手动创建测试
[root@k8s-master storageClass-dynamic]# kubectl -n nfs-pvc-dynamic get pods -o wide 
NAME                                     READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
nfs-client-provisioner-8c78dc5f9-5hrpb   1/1     Running   0          5m57s   10.244.1.40   k8s-node1   <none>           <none>
nginx-test                               1/1     Running   0          76s     10.244.2.67   k8s-node2   <none>           <none># 在 NFS 服务器中创建index.html默认发布文件,这个卷会挂载到容器中的
# /usr/share/nginx/html/ 的目录中
[root@harbor nfsdata]# echo this is nfs-dynamic nginx > /nfsdata/nfs-pvc-dynamic-test-claim-pvc-29a134a4-a4dc-40f6-a378-820de948d34a/index.html[root@k8s-master storageClass-dynamic]# kubectl -n nfs-pvc-dynamic get pods -o wide 
NAME                                     READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
nfs-client-provisioner-8c78dc5f9-5hrpb   1/1     Running   0          5m57s   10.244.1.40   k8s-node1   <none>           <none>
nginx-test                               1/1     Running   0          76s     10.244.2.67   k8s-node2   <none>           <none>
[root@k8s-master storageClass-dynamic]# curl 10.244.2.67
this is nfs-dynamic nginx

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】文件IO系统[ 库函数 ]封装了[ 系统调用 ] +【区分文件结构体FILE和file与files_srtuct表】(读写接口盘点与介绍)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

世邦通信股份有限公司IP网络对讲广播系统RCE

漏洞描述 SPON世邦IP网络广播系统采用的IPAudio™技术, 将音频信号以数据包形式在局域网和广域网上进行传送&#xff0c;是一套纯数字传输的双向音频扩声系统。传统广播系统存在的音质不佳&#xff0c;传输距离有限&#xff0c;缺乏互动等问题。该系统设备使用简便&#xff0c…

AAA Mysql与redis的主从复制原理

一 &#xff1a;Mysql主从复制 重要的两个日志文件&#xff1a;bin log 和 relay log bin log&#xff1a;二进制日志&#xff08;binnary log&#xff09;以事件形式记录了对MySQL数据库执行更改的所有操作。 relay log&#xff1a;用来保存从节点I/O线程接受的bin log日志…

界面控件DevExpress中文教程 - 如何拓展具有AI功能的文本编辑器(一)

本文重点介绍了DevExpress在近年来最热门领域——人工智能(AI)和自然语言处理(NLP)的改进&#xff01; NLP是人工智能的一个分支&#xff0c;它允许计算机与人类语言进行交互&#xff0c;这包括以有意义/有用的方式理解、解释、生成和回应文本(和语音)的能力。基于NLP的功能允…

仿RabbitMQ实现消息队列客户端

文章目录 客⼾端模块实现订阅者模块信道管理模块异步⼯作线程实现连接管理模块生产者客户端消费者客户端 客⼾端模块实现 在RabbitMQ中&#xff0c;提供服务的是信道&#xff0c;因此在客⼾端的实现中&#xff0c;弱化了Client客⼾端的概念&#xff0c;也就是说在RabbitMQ中并…

认知战认知作战:激发认知战战术分享热情的秘诀

认知战认知作战&#xff1a;激发认知战战术分享热情的秘诀 认知战认知作战&#xff1a;激发认知战战术分享热情的秘诀 关键词&#xff1a;认知战, 认知作战, 创造独特体验, 融入社交元素, 情感共鸣策略, 分享激励机制, 战略形象塑造, 个性化内容推荐,认知作战,新质生产力,人类…

E. Tree Pruning Codeforces Round 975 (Div. 2)

原题 E. Tree Pruning 解析 本题题意很简单, 思路也很好想到, 假设我们保留第 x 层的树叶, 那么对于深度大于 x 的所有节点都要被剪掉, 而深度小于 x 的节点, 如果没有子节点深度大于等于 x, 那么也要被删掉 在做这道题的时候, 有关于如何找到一个节点它的子节点能通到哪里,…

用Arduino单片机制作一个简单的音乐播放器

Arduino单片机上有多个数字IO针脚&#xff0c;可以输出数字信号&#xff0c;用于驱动发声器件&#xff0c;从而让它发出想要的声音。蜂鸣器是一种常见的发声器件&#xff0c;通电后可以发出声音。因此&#xff0c;单片机可以通过数字输出控制蜂鸣器发出指定的声音。另外&#x…

马丁代尔药物大典数据库

马丁代尔药物大典是一本由Pharmaceutical Press出版的参考书&#xff0c;拥有全球使用的近 6000 种药物和药品&#xff0c;包括超过 125,000 种专有制剂的详细信息。其中还包括近 700 篇疾病治疗评论。 它于 1883 年首次出版&#xff0c;马丁代尔包含全球临床用药信息&#xff…

【qt】QQ仿真项目2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 一览全局: QQ仿真项目 一.主窗口的创建二.主窗口的ui设计三.初始化状态,等级,app…

<Rust>iced库(0.13.1)学习之部件(三十一):picklist部件的使用及可变style设置

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 注:新版本已更新为0.13 概述 这是本专栏的第三十一篇,主要说明下…

俗人,精气神,歌曲《错的人》

精气神&#xff0c;在人体中&#xff0c;精指构成人体生命活动的各层次的有形元素&#xff0c;常呈固体或液体状态。 哲学前提&#xff1a;世界上的一切&#xff0c;从微观上讲&#xff0c;都是由精微物质构成的&#xff0c;比如基本粒子。 关于有形与无形、与主观关注点相关…

DHCP安装

步骤 1&#xff1a;安装DHCP服务器 在系统上安装DHCP服务。以下是安装命令&#xff1a; # 安装DHCP软件包 yum install dhcp步骤 2&#xff1a;配置DHCP服务器 安装完成后&#xff0c;需要配置DHCP服务器来绑定MAC地址和IP地址。 # 备份原始的DHCP配置文件 cp /etc/dhcp/dh…

迁移学习案例-python代码

大白话 迁移学习就是用不太相同但又有一些联系的A和B数据&#xff0c;训练同一个网络。比如&#xff0c;先用A数据训练一下网络&#xff0c;然后再用B数据训练一下网络&#xff0c;那么就说最后的模型是从A迁移到B的。 迁移学习的具体形式是多种多样的&#xff0c;比如先用A训练…

HCIA综合实验

实验步骤 1.划分网段 内网部分---三个大块 2.先配交换机 左边&#xff1a;3个vlan &#xff0c;3个access&#xff0c;1个trunk 右边&#xff1a;2个vlan &#xff0c;2个access&#xff0c;1个trunk 3.再配路由 3.1 r5先配接口ipg/0/0/0 口配子接口 g0/0/0.1-0.3 g0/0/1 …

【YOLOv8实时产品缺陷检测】

YOLOv8应用于产品缺陷检测实例 项目概况项目实现YOLOv8安装及模型训练关键代码展示动态效果展示 项目概况 本项目是应用YOLOv8框架实现训练自定义模型实现单一零件的缺陷检测&#xff0c;软件界面由PyQt5实现。 功能已正式使用&#xff0c;识别效果达到预期。 项目实现 项目…

手机误删照片?试试这5款免费数据恢复神器!

大家好&#xff01;今天咱们来聊聊一个大家都关心的话题——免费数据恢复工具。不论是误删照片、视频&#xff0c;还是丢失重要文件&#xff0c;数据恢复都是个让人头疼的问题。但好消息是&#xff0c;现在有众多免费的数据恢复工具能帮助我们找回失去的数据。今天我就来为大家…

力扣16~20题

题16&#xff08;中等&#xff09;&#xff1a; 思路&#xff1a; 双指针法&#xff0c;和15题差不多&#xff0c;就是要排除了&#xff0c;如果total<target则排除了更小的&#xff08;left右移&#xff09;&#xff0c;如果total>target则排除了更大的&#xff08;rig…

pycharm 远程ssh时,mujuco提示mujoco.FatalError: gladLoadGL error

在ubuntu系统运行时完全没问题&#xff0c;但是使用pycharm远程ssh登录时就会提示这个。 解决方法&#xff1a; 1. 可以修改环境变量 2. export LD_PRELOAD/usr/lib/x86_64-linux-gnu/libstdc.so.6 参考【Mujuco】WSL2安装Mujoco用于python,遇到FatalError,以及图形驱动架构…