当前位置: 首页 > news >正文

K8s---存储卷(动态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卷插件。

框架

实验:

master:192.168.10.10

node01:192.168.10.20

node02:192.168.10.30

  1. 创建账号,给卷插件能够在集群内部通信,获取资源,监听事件,创建、删除、更新pv
  2. 创建卷插件pod:卷插件的pod插件pv
  3. storageclass:给pv赋予属性 (pvc被删除之后pv的状态,以及回收策略)
  4. 创建pvc-------完成。

node04:192.168.10.40

mkdir /opt/k8svim /etc/exports
/opt/k8s 192.168.10.0/24(rw,no_root_squash,sync)#注意按先后顺序
systemctl restart rpcbind
systemctl restart nfs#查看暴露的nfs共享文件
showmount -e

master:192.168.10.1

vim nfs-client-rbac.yaml

#创建 Service Account 账户,用来管理 NFS Provisioner 在 k8s 集群中运行的权限
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner
---
#创建集群角色
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: nfs-client-provisioner-role
rules:- apiGroups: [""]
#apigroup定义了规则可以使用哪个api组的权限,空字符""表示直接使用api的核心组的资源。resources: ["persistentvolumes"]verbs: ["get","list","watch","create","delete"]
#表示权限的当中- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["watch","get","list","update"]
#定义pv属性- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get","watch","list"]- apiGroups: [""]resources: ["events"]verbs: ["list","create","watch","update","patch"]- apiGroups: [""]resources: ["endpoints"]verbs: ["delete","create","get","watch","update","patch","list"]
---
#集群角色绑定 kubectl explain ClusterRoleBinding 查看字段详情
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: nfs-client-provisioner-bind
subjects:
- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-roleapiGroup: rbac.authorization.k8s.io

serviceAccount

NFS Provisioner 是一个插件,没有权限是无法再集群当中获取k8s的信息。插件要有权限能够监听apiserver,获取get,list(获取集群的列表资源)create delete。

rbac:Role-bases-access-control   定义角色在集群当中使用的权限

vim nfs-client-provisioner.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-provisionerlabels:app: nfs1
spec:replicas: 1selector:matchLabels:app: nfs1template:metadata:labels:app: nfs1spec:serviceAccountName: nfs-client-provisioner
#指定Service Account账户containers:- name: nfs1image: quay.io/external_storage/nfs-client-provisioner:latestvolumeMounts:- name: nfsmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: nfs-storage
#配置provisioner的账户名称,确保该名称与StorageClass资源中的provisioner名称保持一致- name: NFS_SERVERvalue: 192.168.10.40
#指定的是nfs共享服务器的地址- name: NFS_PATHvalue: /opt/k8s
#配置绑定的nfs服务器目录#声明nfs数据卷volumes:- name: nfsnfs:server: 192.168.10.40 path: /opt/k8s    

1.20之后有一个新的机制

selfLink: AP的资源对象之一,表示资源对象在集群当中自身的一个连接,selflink是一个唯一的表示符号,可以用于标识每一个资源对象

self link的值是一个URL,指向该资源对象的k8sapi的路径,更好的实现资源对象的查找和引用。

kubectl apply -f nfs-client-provisioner.yaml kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-cd6ff67-sp8qd   1/1     Running   0          14s

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

......
spec:containers:- command:- kube-apiserver- --feature-gates=RemoveSelfLink=false       #添加这一行- --advertise-address=192.168.10.10
......
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

vim nfs-client-storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client-storageclass
#匹配provisioner
provisioner: nfs-storage
parameters:archiveOnDelete: "false"
#pvc被删除之后,pv的状态,定义的是false,pvc被删除,pv的状态将是released,可以人工调用,继续使用
#如果是true,pv的将是Archived,表示pv不再可用
reclaimPolicy: Delete
#定义pv的回收策略,retain,另一个是delete,不支持回收
allowVolumeExpansion: true
#pv的存储空间可以动态扩缩容(仅云平台)。
kubectl apply -f nfs-client-storageclass.yaml [root@master01 auto-volumn]# kubectl get storageclasses.storage.k8s.io 
NAME                      PROVISIONER   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client-storageclass   nfs-storage   Delete          Immediate           true                   114m

vim pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteManystorageClassName: nfs-client-storageclassresources:requests:storage: 2Gi
#创建一个pvc,名称为nfs-pvc,使用的pv属性是nfs-client-storageclass
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx1name: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- image: nginx:1.22name: nginx1volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlpersistentVolumeClaim:claimName: nfs-pvc

kubectl apply -f test-pvc-pod.yaml//PVC 通过 StorageClass 自动申请到空间
kubectl get pvc
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS              AGE
nfs-pvc   Bound    pvc-7dcb826f-dbd8-4abb-8a3f-e4f669a741fd   2Gi        RWX            nfs-client-storageclass   55m

删除

kubectl delete deployments.apps nginx1
kubectl delete pvc nfs-pvc

删除后,如果是Retain,pv可以保留复用

              如果是Delete,pv将会被直接删除

动态pv的默认策略Delete。

总结:

provisioner插件-----支持nfs

stroageclass: 定义pv的属性

动态pv的默认策略是删除。没有回收

动态pv删除pvc后的状态,released

  1. 创建账号,给卷插件能够在集群内部通信,获取资源,监听事件,创建、删除、更新pv
  2. 创建卷插件pod:卷插件的pod插件pv
  3. storageclass:给pv赋予属性 (pvc被删除之后pv的状态,以及回收策略)
  4. 创建pvc-------完成。

http://www.lryc.cn/news/280420.html

相关文章:

  • JS判断对象是否为空对象的几种方法
  • 算法通关村第十五关—用4KB内存寻找重复元素(青铜)
  • 【PHP】判断字符串是否是有效的base64编码
  • 鼎盛合|测量精度SOC芯片开发中的技术问题整理
  • sql | 学生参加各科考试次数
  • uniapp(vue2)+VoerkaI18n多语言
  • C51--测速小车
  • ORACLE报错:ORA-04091 表XXX发生了变化,触发器/函数不能读它
  • Arm LDM和STM的寻址方式
  • 网络技术基础入门全套实验-厦门微思网络CCNA实验手册
  • 【已解决】C语言实现多线程检索数据
  • 用LM Studio:2分钟在本地免费部署大语言模型,替代ChatGPT
  • C语言经典算法之直接排序算法
  • 前端开发vscode 常用插件记录
  • 基于JavaWeb+BS架构+SpringBoot+Vue基于web的多媒体素材管理系统的设计和实现
  • 常用的dom操作
  • Hotspot源码解析-第十七章-虚拟机万物创建(三)
  • Spring MVC 的RequestMapping注解
  • navicat for oracle
  • 行业分享----dbaplus174期:美团基于Orchestrator的MySQL高可用实践
  • springboot集成钉钉通知
  • 直播预告丨看零售场,如何玩转 MaaS
  • 高创新!EI论文复现+改进:聚合温度调控策略的综合能源系统/微电网/虚拟电厂多目标优化调度程序代码!
  • 详解Matlab深度学习进行波形分割
  • 如何在Windows 10/11的防火墙中禁止和允许某个应用程序,这里提供详细步骤
  • vivado 添加现有IP文件、生成IP
  • C++右值引用,右值引用与const引用的区别
  • 启英泰伦推出「离线自然说」,离线语音交互随意说,不需记忆词条
  • Vulnhub-DC1
  • 【c++笔记】总结!c++与c语言的不同之处