k8s存储卷-动态PV

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----完成

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

屏蔽/非屏蔽线、屏蔽/非屏蔽端口介绍

一、双绞线 双绞线(twisted pair,TP)是一种综合布线工程中最常用的传输介质,是由两根具有绝缘保护层的铜导线组成的。把两根绝缘的铜导线按一定密度互相绞在一起,每一根导线在传输中辐射出来的电波会被另一根线上发出的…

vivado 使用约束、添加和创建约束文件

使用约束 Vivado IDE支持Xilinx设计约束(XDC)和Synopsys设计约束(SDC)文件格式。SDC格式用于定时约束,而XDC格式用于两者时间和物理约束。约束可以包括位置、时间和I/O限制。您可以在设计流程的各个步骤中创建约束&am…

1 python计算机基础

计算机基础和环境搭建 1 计算机基础和环境搭建1.计算机基础1.1 基本概念1.2 编程语言1.3 编译器/解释器 2.学习编程的本质3.Python的介绍3.1 语言的分类3.2 Python3.3 Python的解释器种类(了解)3.4 CPython解释器的版本 4.环境搭建4.1 安装Python解释器4…

详解SpringCloud微服务技术栈:Nacos配置管理

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:Nacos服务搭建及服务分级存储模型 📚订阅专栏:微服务技术全家桶…

LaTeX系列1——主结构

初学,可交流,轻喷 \documentclass{book} \begin{document} \title{Book Title} \author{Author Name} \date{\today} \maketitle\chapter{Introduction} This is the introduction chapter of the book.\section{First Section} The first section of t…

学位论文中常用的参考文献格式

撰写学位论文中,要确保文献列表中列出的参考文献格式正确,为此这篇文章给出常用的参考文献格式。 目录 目录 一、学位论文中常用的文献类型: 1.1学位论文中常用的文献类型: 1.2作者名字的书写格式: 1.3特殊符号// …

JRTP实时音视频传输(1)-必做的环境搭建与demo测试

1.需求 1)支持协议自动切换。在网络优的情况下使用TCP、网络差的情况下使用UDP,满足实时音视频传输需求, 2)支持RTCP ,流量控制,阻塞控制等。需要能支持RTCP,这样便能在这个基础上,…

人工智能 | 生成式 AI 如何重塑开发流程和开发工具?

生成式 AI 如何重塑开发流程和开发工具? 生成式人工智能(Generative Artificial Intelligence,GAI)是一种基于大规模数据训练学习,从而生成新的原创内容的人工智能。生成式人工智能可以生成各种形式的数据&#xff0c…

Kafka-生产者

Kafka在实际应用中,经常被用作高性能、可扩展的消息中间件。 Kafka自定义了一套网络协议,只要遵守这套协议的格式,就可以向Kafka发送消息,也可以从Kafka中拉取消息。 在实践生产过程中,一套API封装良好、灵活易用的客…

CC工具箱使用指南:【添加图层名和路径到字段】

一、简介 如题,这个工具的目的就是将图层的名称和路径添加到字段值中。 有时候图层的名称和路径也是重要的信息,需要参与到字段的计算或是分析中,但是Arcgis Pro中没有一个方便的方法可以将其写入字段值,因此,就做了…

机器学习周刊第六期:哈佛大学机器学习课、Chatbot Ul 2.0 、LangChain v0.1.0、Mixtral 8x7B

— date: 2024/01/08 — 吴恩达和Langchain合作开发了JavaScript 生成式 AI 短期课程:《使用 LangChain.js 构建 LLM 应用程序》 大家好,欢迎收看第六期机器学习周刊 本期介绍10个内容,涉及Python、机器学习、大模型等,目录如下&#xff…

特征工程-特征处理(三)

特征处理 连续型变量处理(二) 多特征 降维 PCA PCA是一种常见的数据分析方式,通过数据分解,将高维数据降低为低维数据,同时最大程度保持数据中保存的信息。 from sklearn.decomposition import PCA A np.array([[84…

表单生成器基于(form-create-designer+ant design vue)

效果展示 1.源码地址: 前端:https://gitee.com/houshixin/form-design-ui 后端:https://gitee.com/houshixin/form-design-web 2.单独使用前端的时候就把请前后台的接口注释就可以 3.都启动的话: 1).先导入数据库 2.表…

altair,一个超级厉害的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 数据可视化是数据科学和数据分析中不可或缺的一部分。它帮助我们以可视化的方式理解和传达数据,从而更好地发现数据中的模式、趋势和见解。在Python生态系统中,有许多优秀的数据可视化工具…

Three.js 镜面反射Reflector 为MeshStandardMaterial增加Reflector能力

效果效果官方案例 区别:官方的案例更像一个镜子 没有纹理等属性 也没有透明度修改 根据源码进行修改为 MeshStandardMaterial实现反射 使用案例 createReflector() {const plane this.helper.create.plane(2, 2);this.helper.add(plane.mesh);plane.mesh.rotat…

vue中设置注释模板

参考地址 ctrlshiftp 打开编辑器配置输入configure user snippets - 选择 new global snipp files - 命名为 vueComment,弹出注释模板,即可自定义注释 如下/// 回车 即可在代码块中使用注释 { "Print to console": {"prefix": &q…

机器学习周刊第五期:一个离谱的数据可视化Python库、可交互式动画学概率统计、机器学习最全文档、快速部署机器学习应用的开源项目、Redis 之父的最新文章

date: 2024/01/08 这个网站用可视化的方式讲解概率和统计基础知识,很多内容还是可交互的,非常生动形象。 大家好,欢迎收看第五期机器学习周刊 本期介绍7个内容,涉及Python、概率统计、机器学习、大模型等,目录如下: 一个离谱的Python库看见概率,看见统计2024机器学习最…

智慧港口解决方案:PPT全文53页,附下载

关键词:智慧港口建设方案,港口信息化建设,智慧港口发展现状与展望,智慧码头 一、建设智慧港口的意义 1、提高运营效率:智慧港口利用先进的技术手段,如物联网、大数据、人工智能等,对港口进行智…

Kafka 集群部署

目录 1、环境准备 2、搭建ZooKeeper集群 配置文件 节点标记 环境变量 启动集群 数据同步测试 故障测试 3、搭建 Kafka 集群 配置文件 环境变量 配置其他机器 启动服务 4、集群测试 创建 Topic 显示 Topic 配置 创建 Producer 创建consumer 删除Topic 查看Z…

挂载mount、卸载umount,和rpm安装包

1.创建一个挂载目录dvd 2.把dev/cdrom 挂载到dvd 3.查看 4.挂载的格式 卸载挂载点 dvd 重新挂载到nsd30 rpm安装包的安装位置 可执行命令:一般安装到/usr/bin下 服务器程序,管理工具:一般安装到sbin下 配置文件:一般安装到etc下…