k8s 中的 PV 的动态供给

news2024/11/23 22:11:51

目录

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 deployed
  namespace: 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: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: nfs-pvc-dynamic     # 指定命名空间
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: 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 deployed
  namespace: 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 deployed
  namespace: nfs-pvc-dynamic     # 指定命名空间
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: nfs-pvc-dynamic     # 指定命名空间
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: 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-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace:  nfs-pvc-dynamic
spec:
  replicas: 1
   # 更新策略,此处设置为Recreate,表示更新时会先停止旧的Pod,然后再启动新的Pod
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      # 指定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-root
          nfs:
            server: 192.168.239.50
            path: /nfsdata

      containers:
        - name: nfs-client-provisioner # 使用的是制备器的镜像,并且此名称需要与storaClass中的存储类名一致
          image: sig-storage/nfs-subdir-external-provisioner:v4.0.2 # 需要用到的镜像,使用docker拉取
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes  # 将卷挂载到在容器内的这一个目录
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: 192.168.239.50
            - name: NFS_PATH
              value: /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-claim
  namespace: nfs-pvc-dynamic
spec:
  storageClassName: nfs-client # 与类名需要一致
  accessModes:
    - ReadWriteMany
  resources:
    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-test
  namespace: nfs-pvc-dynamic    # 指定命名空间
spec:
  volumes:
  - name: nfs-pvc
    persistentVolumeClaim:    # 指定 PVC 的名称
      claimName: test-claim

  containers:
  - image: nginx
    name: nginx-test-01
    volumeMounts:
    - 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.coloradmin.cn/o/2195843.html

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

相关文章

数据结构与算法——动态规划算法简析

1.初步了解动态规划 由于本篇博客属于动态规划的初阶学习&#xff0c;所以大多都是简单的表示&#xff0c;更深层次的学术用语会在之后深度学习动态规划之后出现&#xff0c;本文主要是带各位了解一下动态规划的大致框架 1.1状态表示 通常的我们会开辟一个dp数组来存储需要表示…

centos7 yum仓库无法使用的问题

1、问题 如下 2、按照csdn等网页说的做了没有用&#xff01;CentOS-yum源不可用报错&#xff1a;Could not retrieve mirrorlist 问题解决_yum could not retrieve mirrorlist-CSDN博客 3、使用b站博主的方法解决&#xff01; LinuxMirrors: GNU/Linux 一键更换系统软件源脚本…

切片辅助超推理-sahi库-slice_image使用

代码地址&#xff1a;https://github.com/obss/sahi slice_image是sahi库中一个函数&#xff0c;理解这个函数是理解切片的入口。 一、官方函数使用示例 from sahi.slicing import slice_imageimage_pathrsmall-vehicles1.jpeg output_dirrashi_result output_file_name1-#手…

LeetCode 3311. 构造符合图结构的二维矩阵

LeetCode 3311. 构造符合图结构的二维矩阵 给你一个二维整数数组 edges &#xff0c;它表示一棵 n 个节点的 无向 图&#xff0c;其中 edges[i] [ui, vi] 表示节点 ui 和 vi 之间有一条边。 请你构造一个二维矩阵&#xff0c;满足以下条件&#xff1a; 矩阵中每个格子 一一对应…

力扣之1336.每次访问的交易次数

题目&#xff1a; sql建表语句&#xff1a; Create table If Not Exists Visits (user_id int, visit_date date); Create table If Not Exists Transactions (user_id int, transaction_date date, amount int); Truncate table Visits; insert into Visits (user_id,…

如何让客户主动成为你的品牌大使

在销售领域&#xff0c;转介绍被公认为一把无坚不摧的利器&#xff0c;它不仅铸就了高成交率的辉煌&#xff0c;更以惊人的速度缩短了成交周期。一位精通转介绍艺术的销售员&#xff0c;其业绩自然熠熠生辉&#xff0c;工作之路亦显得游刃有余。 然而&#xff0c;面对这一宝藏…

Bianchi模型、python计算及ns3验证_关于2~10 STA验证的补充

首先就是预设修改, NS3中bitrate是OfdmRate54Mbps,STA数目我设置了2-10,ack长度是14bytes,数据长36,头36(trace中只有1536和14两个长度,也就是数据长度1500,头36,ack14),SIFS和SLOT是16us和9us(在phy的定义中,11a的时候,sifs是16,slot是9),difs是34us(在bia…

2024Java最新面试题总结(针对于一些小厂、中厂)

这是根据个人面试经历总结出来的一些经验希望可以帮助到有需要的人。 面试的时候&#xff0c;会先让你进行自我介绍&#xff0c;这个大家准备一两分钟的面试稿就可以。然后就是正式面试&#xff0c;面试官一般是两个人以上&#xff0c;开始&#xff0c;面试官会先提问一些基本…

【NLP自然语言处理】01-基础学习路径简介

目的&#xff1a;让大家能够在 AI-NLP 领域由基础到入门具体安排&#xff1a; NLP介绍 文本预处理RNN 及其变体&#xff08;涉及案例&#xff09;Transformer 原理详解迁移学习 和 Bert 模型详解 &#xff08;涉及案例&#xff09;特点&#xff1a; 原理 实践每个文章会有练习…

Nat. Commun.:飞秒激光书写受蚂蚁启发的可重构微型机器人集体

背景介绍生物在各种环境中的集体行为十分普遍&#xff0c;它们能够自发有序地完成单个个体难以完成的任务。目前&#xff0c;生物集体的形成主要分为两大类。第一类生物个体之间没有直接接触&#xff0c;如蜜蜂、鱼和鸟类&#xff0c;这导致这些集体不稳定&#xff0c;容易受到…

Ubuntu24 Firefox和Window Firefox同步问题

由于平常开发在Ubuntu系统&#xff0c;但是日常学习查资料又在Window系统&#xff0c;查资料保存网页到浏览器中时&#xff0c;经常遇到两个平台标签同步问题&#xff0c;希望可以选一个支持Ubuntu、Window的浏览器。 选用Google Chrome浏览器&#xff0c;确实挺好用&#xff…

微服务seata解析部署使用全流程

官网地址&#xff1a; Seata 是什么&#xff1f; | Apache Seata 1、Seata术语 用来管理分布式事务&#xff0c;由阿里巴巴出品。 【1、TC (Transaction Coordinator) - 事务协调者】 用来维护事务的&#xff0c;包括主事务和分支事务。 【2、TM (Transaction Manager) - …

TCP与UDP协议(三次握手四次挥手)

TCP与UDP 简介TCP和UDP一、TCP1.1 TCP的三次握手问题来了&#xff1a;为啥是三次握手而不是两次呢&#xff1f; 1.2建立连接后的通信过程&#xff08;丢包与乱序问题&#xff09;1.3四次挥手问题来了&#xff1a;为什么要四次挥手&#xff1f; 二、UDP 简介TCP和UDP TCP、UDP都…

机器学习笔记(持续更新)

重复值处理&#xff1a; 重复值处理代码&#xff1a; import pandas as pd data pd.DataFrame({学号: [1, 2, 3, 4, 5, 6, 7, 7, 8],身高: [172,162,175,170,168,160,164,164,160],体重: [70,62,75,68,67,58,64,64,53] }) data.drop_duplicates([学号], keep last, inplaceT…

SQL第13课挑战题

1. 使用inner join&#xff0c;以检索每个顾客的名称&#xff08;customers表中的cust_name&#xff09;和所有的订单号&#xff08;orders表中的order_num). 2. 修改第一题&#xff0c;仅列出所有顾客&#xff0c;及时他们没有下过订单。 3. 使用outer join联结products表和or…

【Easy RL】Easy RL蘑菇书全书学习笔记

【Easy RL】Easy RL蘑菇书全书学习笔记 第一章 强化学习基础1.1 强化学习概述监督学习强化学习与监督学习的不同之处二者的区别总结强化学习的特征强化学习的优越性预演&#xff08;rollout&#xff09;和 轨迹&#xff08;trajectory&#xff09;的概念端到端的概念深度强化学…

BurpSuite内置浏览器打不开(实用解决法/简便)

也不知道出现了什么问题就是莫名其妙的内置浏览器打不开&#xff0c;有时候不想配置代理很麻烦&#xff0c;这里实用的解决办法. 任务一 报错情况&#xff08;反正也看不懂&#xff09; 任务二 我们先去尝试打开这个运行模式&#xff0c;然后我们再去重试&#xff0c;如果还是打…

【重学 MySQL】五十九、二进制字符串类型与 JSON 类型

【重学 MySQL】五十九、二进制字符串类型与 JSON 类型 二进制字符串类型JSON类型 在MySQL数据库中&#xff0c;二进制字符串类型与JSON类型各自具有独特的特点和用途。 二进制字符串类型 二进制字符串类型在MySQL中主要用于存储二进制数据。这类数据类型包括BINARY、VARBINAR…

使用 ChatGPT Canvas 辅助 ABAP 开发

ChatGPT Canvas 是最近 OpenAI 推出的一个新功能,它不仅仅是一个简单的聊天对话式窗口。 Canvas 旨在扩展 ChatGPT 平台的功能,超越简单的问答交互。 Canvas 可以在单独的窗口中打开专用工作区,用户能够更直观、更高效地与 ChatGPT 在复杂的写作或者编码项目进行协作。 有…

Nginx08-反向代理

零、文章目录 Nginx08-反向代理 1、概述 关于正向代理和反向代理&#xff0c;我们在前面已经介绍过了&#xff0c;简而言之就是正向代理代理的对象是客户端&#xff0c;反向代理代理的是服务端&#xff0c;这是两者之间最大的区别。 Nginx即可以实现正向代理&#xff0c;也可…