k8s存储卷-动态PV

news2024/11/17 21:53:49

pv和PVC,存储卷:

存储卷:

EmptyDir:容器内部,随着pod销毁,emptyDir也会消失,不能做数据持久化

HostPath:持久化存储数据,可以和节点上目录做挂载,pod被销毁了数据还在

NFS:一台机器,提供pod发起的挂载的请求

PV和PVC:

PVC就是pid发起挂载的反请求:

PV持久化存储的目录,ReadWriteMary

                     ReadOnlyMany

                     ReadwriteOnce

Nfs:可以支持三种方式

HostPath ReadwriteOnce

Iscsi不支持ReadwriteMany

pv的回收策略:

Retain released需要人工设置,调整回available

              Recyc 回收,自动调整回available

              Delete 删除

静态PV和PVC:

运维负责PV:创建好持久化存储卷,声明好读写和挂载类型,以及可以提供存储空间

PVC开发做,要和开发沟通好,你期望的读写和挂载类型,以及存储空间

当我发布PVC之后可以生成PV,还可以在共享服务器上直接生成挂载目录

PVC直接绑定和使用PV

动态PV需要两个组件:

  1. 卷插件,k8s本身支持的动态PV创建不包括NFS,需要声明和安装一个外部插件,叫做provisioner:存储分配器,可以动态创建PV,然后根据PVC的请求自动绑定和使用
  2. StorageClass:来定义PV的属性,存储类型,大小回收策略

今天还是用NFS来实现动态PV,NFS支持的方式NFS-Client,provisioner来适配NFS-Client

NFS-Client-provisioner卷插件

架构图:

实验演示:

/opt/k8s 20.0.0.0/24(rw,no_root_squash,sync)

vim /etc/exports

systemctl restart rpcbind

systemctl restart nfs

showmount -e

其他节点查看:

showmount -e 20.0.0.74

、创建 Service Account,用来管理 NFS Provisioner 在 k8s 集群中运行的权限,

设置 nfs-client 对 PV,PVC,StorageClass 等的规则

回到master节点:

创建serviceAccount:

Nfs provisioner:是一个插件,没有权限是无法再集群当中获取k8s的消息,插件要有权限能够监听apiserver,获取Get,list(获取集群的列表资源)创建一个资源账户

Rbac:Role-base ACCESS CONTORL 定义角色在集群当中可以使用的权限

#创建集群角色

kubectl explain ClusterRole  

#查看Kubernetes RBAC(Role-Based Access Control)的 ClusterRole 配置,

命名为 nfs-client-provisioner-clusterrole。这个 ClusterRole 定义了一组权限规则,

允许一个特定的服务账户(通常是用于 NFS 客户端 Provisioner 的账户)执行一些与存储相关的操作。

#创建集群角色

kubectl explain ClusterRole  

#查看Kubernetes RBAC(Role-Based Access Control)的 ClusterRole 配置,

命名为 nfs-client-provisioner-clusterrole。这个 ClusterRole 定义了一组权限规则,

允许一个特定的服务账户(通常是用于 NFS 客户端 Provisioner 的账户)执行一些与存储相关的操作。

vim nfs-client-rbac.yaml

apiVersion: v1

kind: ServiceAccount

metadata:

  name: nfs-client-provisioner

---

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

  name: nfs-client-provisioner-clusterrole

rules:

  - 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: ["list", "watch", "create", "update", "patch"]

  - apiGroups: [""]

    resources: ["endpoints"]

    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]

---

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

  name: nfs-client-provisioner-clusterrolebinding

subjects:

- kind: ServiceAccount

  name: nfs-client-provisioner

  namespace: default

roleRef:

  kind: ClusterRole

  name: nfs-client-provisioner-clusterrole

  apiGroup: rbac.authorization.k8s.io

部署插件:

NFS-privisioner , deployment来创建插件pod

1.20之后有一个新的机制

SelfLink:API的资源对象之一,表示资源对象在集群当中自身的一个连结,self-Link是一个唯一的标识号,可以用于标识k8s集群当中的每个资源的对象

Self Link的值是一个URL,指向该资源对象的k8s API路径

更好的实现资源对象的查找和引用

部署插件之前操作:

vim /etc/kubernetes/manifests/kube-apiserver.yaml

- --feature-gates=RemoveSelfLink=false

--feature-gates:在不破坏现有规则以及功能基础上引入新功能或者修改现有功能的机制,禁用不影响规则

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

kubectl delete pods kube-apiserver -n kube-system

kubectl get pods -n kube-system | grep apiserver

#创建 NFS Provisioner

接下来部署NFS-privisioner插件:

NFS的provisionner的客户端以pod的方式运行在集群当中,监听k8s集群当中PV的请求,然后动态的创建于NFS相关的PV

容器里使用的配置,在provisioner当中定义好环境变量,传给容器,storageclass的名称,NFS服务器的地址,NFS的目录

vim nfs-client-provisioner.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nfs1

spec:

  replicas: 1

  selector:

    matchLabels:

      app: nfs1

  strategy:

    type: Recreate

  template:

    metadata:

      labels:

        app: nfs1

    spec:

      serviceAccountName: nfs-client-provisioner          #指定Service Account账户

      containers:

        - name: nfs1

          image: quay.io/external_storage/nfs-client-provisioner:latest

          imagePullPolicy: IfNotPresent

          volumeMounts:

            - name: nfs

              mountPath: /persistentvolumes

          env:

            - name: PROVISIONER_NAME

              value: nfs-storage                #配置provisioner的Name,

            - name: NFS_SERVER

              value: 20.0.0.74             #配置绑定的nfs服务器

            - name: NFS_PATH

              value: /opt/k8s                   #配置绑定的nfs服务器目录

      volumes:                                  #申明nfs数据卷

        - name: nfs

          nfs:

            server: 20.0.0.74

            path: /opt/k8s

运行脚本

定义存储卷相关的请求数据,创建 StorageClass,负责建立 PVC 并调用 NFS provisioner 进行预定的工作,并让 PV 与 PVC 建立关联

apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

  name: nfs-client-storageclass

provisioner: nfs-storage

parameters:

  archiveOnDelete: "false"

reclaimPolicy: Retain

allowVolumeExpansion: true

vim nfs-client-storageclass.yaml

解析:

NAME: storageclass的名称

PROVISIONER: 对应的创建PV的provision的插件

RECLAIMPOLICY:回收策略,保留

VOLUMEBINDINGMODE:卷绑定模式,immediate表示PVC请求创建PV时,系统会立即绑定一个可用的PV

WaitForFirstConsumer:第一个使用出现之后再绑定PV

ALLOWVOLUMEEXPANSION:表示可以在运行时对PV进行扩容

创建 PVC 和 Pod 测试

vim test-pvc-pod.yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: nfs-pvc

spec:

  accessModes:

    - ReadWriteMany

  storageClassName: nfs-client-storageclass

  resources:

    requests:

      storage: 2Gi

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: test-storageclass-deployment

  labels:

    app: nginx1

spec:

  replicas: 1

  selector:

    matchLabels:

      app: nginx1

  template:

    metadata:

      labels:

        app: nginx1

    spec:

      containers:

      - name: nginx1

        image: nginx:1.22

        volumeMounts:

        - name: nfs-pvc

          mountPath: /usr/share/nginx/html

      volumes:

      - name: nfs-pvc

        persistentVolumeClaim:

          claimName: nfs-pvc

测试

共享成功

//查看 NFS 服务器上是否生成对应的目录,

自动创建的 PV 会以 ${namespace}-${pvcName}-${pvName} 的目录格式放到 NFS 服务器上

ls /opt/k8s/

再添加一条测试,看是否能够同时绑定多条

共享服务器查看

如何删除恢复

再次使用时数据并没有删除

如何修改回收策略

没有回收策略

动态PV的默认策略是删除,共享目录也会被删除

总结:动态PV

Provisioner插件---支持NFS

Stroageclass:定义PV的属性

动态PV的默认策略是删除,动态策略没有回收

动态PV删除PVC之后的状态,released

总的来说:

  1. 创建账号,给卷插件能够在集群内部运行,获取资源,监听时间,创建,删除,更新PV
  2. 创建插件pod,卷插件的pod创建PV
  3. Storageclass:给PV赋予权限(PVC被删除之后的状态,以及回收策略)
  4. 创建PVC----完成

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

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

相关文章

vue el-table 多选框回填

主要代码: //选中列,所有列,表名toggleSelection(selectRows, totalRows, tablename) {this.$refs.table.clearSelection();if (selectRows.length > 0) {this.$nextTick(() > {selectRows.forEach(item > {totalRows.forEach(item1 > {if (…

PyTorch常用操作

0. 先决条件 安装驱动、CUDA、cuDNN,请参考:https://blog.csdn.net/liugan528/article/details/128974129 import torch print(torch.__version__)#查看gpu是否可用 print(torch.cuda.is_available())#查看设备gpu个数 print(torch.cuda.device_count(…

数据结构学习 jz29 顺时针打印矩阵

关键词:模拟 题目:螺旋遍历二维数组 简单题做了超过40分钟 调了很久 不好 方法一: 我自己做的。 思路: xy_t: 记录xy的方向,往右走,往下走,往左走,往上走 t控制方…

Jupyter Notebook

2017年左右在大学里都听说过Jupyter Notebook,并且也安装用了一段时间,后来不知道什么原因没有用了。估计是那时候写代码的时候多一些,因为它可以直接写代码并运行结果,现在不怎么写代码了。 介绍 后缀名为.ipynb的json格式文件…

105、Zero-1-to-3: Zero-shot One Image to 3D Object

简介 官网  使用合成数据集来学习相对摄像机视点的控制,这允许在指定的摄像机变换下生成相同对象的新图像,用于从单个图像进行三维重建的任务。 实现流程 输入图像 x ∈ R H W 3 x \in \R^{H \times W \times 3} x∈RHW3,所需视点的相…

PyTorch——torchtext与PyTorch匹配的版本

一、匹配版本的对照表 二、按照对应版本的命令 例子: pip install torchtext0.9.1参考资料: Torchtext and PyTorch s Version Compatibility

云联惠 被查 消费积分合法化!——全新消费返利模式!共享购!

大家好 我是吴军 一家软件开发公司的产品经理 今天讲一讲,曾经盛极一时的云联惠,巅峰时期达到一千万的用户,资金6000亿。 前几年云联惠如火如荼,到处都是在宣传云联惠的,小编也略玩了一下下。 当时因为政策的不明朗…

SpringBoot:详解依赖注入和使用配置文件

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、&#x1f3…

【软件工程】《软件工程》期末复习提纲

《软件工程》期末复习提纲 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 第十章 第十一章 第十二章 第十三章 第十四章 小题参考 大题参考 《软件工程》期末复习提纲 第一章 1.在下列选项中,( )不是软…

10.9.2 std::function 代替函数指针 Page182~183

std::function是一个模板类&#xff0c;基本可作为函数指针的代替品&#xff0c;具备更多功能&#xff0c;特别是与函数对象及bind配合使用。使用std::function时&#xff0c;需要添加头文件 #include <functional> 1.定义函数指针 18行&#xff0c;定义了一个函数指针类…

Linux常用命令大全(三)

系统权限 用户组 1. 创建组groupadd 组名 2. 删除组groupdel 组名 3. 查找系统中的组cat /etc/group | grep -n “组名”说明&#xff1a;系统每个组信息都会被存放在/etc/group的文件中1. 创建用户useradd -g 组名 用户名 2. 设置密码passwd 用户名 3. 查找系统账户说明&am…

多模型图像特征可视化

特征图可视化是指将网络中某一层的特征图可视化出来&#xff0c;以便观察网络在不同层次上学到的特征。卷积可视化可以帮助深度学习研究者更好地理解卷积的概念和原理&#xff0c;从而更好地设计和优化卷积神经网络。通过可视化&#xff0c;研究者可以更清晰地看到卷积运算中的…

【现代密码学】笔记 补充7-- CCA安全与认证加密《introduction to modern cryphtography》

【现代密码学】笔记7-- CCA安全与认证加密《introduction to modern cryphtography》 写在最前面7 CCA安全与认证加密 写在最前面 主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充&#xff1a;骆婷老师的PPT 《introduction to modern cryphtography》…

【GitHub项目推荐--一行命令下载全网视频】【转载】

项目地址&#xff1a;https://github.com/soimort/you-get 首先声明&#xff0c;请不要使用该项目从事违法活动哦~仅供学习使用&#xff01; 解决痛点 如果你上网的时候看了一些东西不错&#xff0c;想下载下来&#xff0c;或者在线观看喜欢的视频&#xff0c;但是没有找到网…

坚持刷题|翻转二叉树

坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天先刷个简单的&#xff1a;翻转二叉树 题目 226.翻转二叉树 考察点 翻转二叉树又称为镜像二叉树&#xff0c;使用Java实现翻转二叉树通常是为了考察对二叉树的基本操作和递归的理解能力 递归的理解&#xff1a; 能够理解…

【JaveWeb教程】(26) Mybatis基础操作(新增、修改、查询、删除) 详细代码示例讲解(最全面)

目录 1. Mybatis基础操作1.1 需求1.2 准备1.3 删除1.3.1 功能实现1.3.2 日志输入1.3.3 预编译SQL1.3.3.1 介绍1.3.3.2 SQL注入1.3.3.3 参数占位符 1.4 新增1.4.1 基本新增1.4.2 主键返回 1.5 更新1.6 查询1.6.1 根据ID查询1.6.2 数据封装1.6.3 条件查询1.6.4 参数名说明 1. Myb…

大语言模型面试问题【持续更新中】

自己在看面经中遇到的一些面试题&#xff0c;结合自己和理解进行了一下整理。 transformer中求和与归一化中“求和”是什么意思&#xff1f; 求和的意思就是残差层求和&#xff0c;原本的等式为y H(x)转化为y x H(x)&#xff0c;这样做的目的是防止网络层数的加深而造成的梯…

Spring Boot中加@Async和不加@Async有什么区别?设置核心线程数、设置最大线程数、设置队列容量是什么意思?直接在yml中配置线程池

在 Spring 中&#xff0c;Async 注解用于将方法标记为异步执行的方法。当使用 Async 注解时&#xff0c;该方法将在单独的线程中执行&#xff0c;而不会阻塞当前线程。这使得方法可以在后台执行&#xff0c;而不会影响主线程的执行。 在您提供的代码示例中&#xff0c;a1() 和…

【conda】pip安装报错,网络延时问题解决记录(亲测有效)

【conda】pip安装报错&#xff0c;网络延时问题解决记录 1. pip install 报错如下所示2. 解决方案&#xff1a; 1. pip install 报错如下所示 pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out.…

Spring Boot 中批量执行 SQL 脚本的实践

在Spring Boot应用中&#xff0c;有时候我们需要批量执行存储在数据库中的 SQL 脚本。本文将介绍一个实际的案例&#xff0c;演示如何通过 Spring Boot、MyBatis 和数据库来实现这一目标。 0、数据库层 CREATE TABLE batchUpdate (id INT AUTO_INCREMENT PRIMARY KEY,update_…