PV与PVC

news2024/11/23 17:21:49

emptyDir存储卷 

概述:

当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir中的数据将被永久删除。
实例:

mkdir /opt/volumes
cd /opt/volumes

vim pod-emptydir.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-emptydir
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
	#定义容器挂载内容
    volumeMounts:
	#使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的这个存储卷
    - name: html
	  #挂载至容器中哪个目录
      mountPath: /usr/share/nginx/html/
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: html
	  #在容器内定义挂载存储名称和挂载路径
      mountPath: /data/
    command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 2;done']
  #定义存储卷
  volumes:
  #定义存储卷名称  
  - name: html
    #定义存储卷类型
    emptyDir: {}
	
	
kubectl apply -f pod-emptydir.yaml

kubectl get pods -o wide

//在上面定义了2个容器,其中一个容器是输入日期到index.html中,然后验证访问nginx的html是否可以获取日期。以验证两个容器之间挂载的emptyDir实现共享。
 

hostPath存储卷

概述

hostPath卷将 node 节点的文件系统中的文件或目录挂载到集群中。
hostPath可以实现持久存储,但是在node节点故障时,也会导致数据的丢失。
 

在 node01 节点上创建挂载目录

mkdir -p /data/pod/volume1
echo 'node01.kgc.com' > /data/pod/volume1/index.html

在 node02 节点上创建挂载目录

mkdir -p /data/pod/volume1
echo 'node02.kgc.com' > /data/pod/volume1/index.html

/创建 Pod 资源

vim pod-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
	#定义容器挂载内容
    volumeMounts:
	#使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的这个存储卷
    - name: html
	  #挂载至容器中哪个目录
      mountPath: /usr/share/nginx/html
	  #读写挂载方式,默认为读写模式false
	  readOnly: false
  #volumes字段定义了paues容器关联的宿主机或分布式文件系统存储卷
  volumes:
    #存储卷名称
    - name: html
	  #路径,为宿主机存储路径
      hostPath:
	    #在宿主机上目录的路径
        path: /data/pod/volume1
		#定义类型,这表示如果宿主机没有此目录则会自动创建
        type: DirectoryOrCreate
kubectl apply -f pod-hostpath.yaml

访问测试

kubectl get pods -o wide

curl 10.244.2.35
 

删除pod,再重建,验证是否依旧可以访问原来的内容

kubectl delete -f pod-hostpath.yaml  
kubectl apply -f pod-hostpath.yaml 
kubectl get pods -o wide

访问测试

curl  10.244.2.37 

nfs共享存储卷 

mkdir /data/volumes -p
chmod 777 /data/volumes

vim /etc/exports
/data/volumes 192.168.10.0/24(rw,no_root_squash)

systemctl start rpcbind
systemctl start nfs

showmount -e
Export list for stor01:
/data/volumes 192.168.10.0/24


//master节点操作
vim pod-nfs-vol.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-nfs
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: nginx
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: false
  nodeSelector:
    kubernetes.io/hostname: node01
  volumes:
  - name: html
    nfs:
      path: /opt/k8s/volumes
      server: 192.168.41.29

在nfs服务器上创建index.html

/master节点操作

删除nfs相关pod,再重新创建,可以得到数据的持久化存储

kubectl apply -f pod-nfs-vol.yaml

  

NFS使用PV和PVC

配置nfs存储
 

配置nfs存储
mkdir v{1,2,3,4,5}

vim /etc/exports
/data/volumes/v1 192.168.41.0/24(rw,no_root_squash)
/data/volumes/v2 192.168.41.0/24(rw,no_root_squash)
/data/volumes/v3 192.168.41.0/24(rw,no_root_squash)
/data/volumes/v4 192.168.41.0/24(rw,no_root_squash)
/data/volumes/v5 192.168.41.0/24(rw,no_root_squash)

exportfs -arv
showmount -e

2、定义PV
 

这里定义5个PV,并且定义挂载的路径以及访问模式,还有PV划分的大小。

vim pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  nfs:
    path: /data/volumes/v1
    server: stor01                                                                                                                                                                                                                   
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
  nfs:
    path: /data/volumes/v2
    server: stor01
  accessModes: ["ReadWriteOnce"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    path: /data/volumes/v3
    server: stor01
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
  labels:
    name: pv004
spec:
  nfs:
    path: /data/volumes/v4
    server: stor01
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
  labels:
    name: pv005
spec:
  nfs:
    path: /data/volumes/v5
    server: stor01
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 5Gi
kubectl apply -f pv-demo.yaml

kubectl get pv

3、定义PVC
//这里定义了pvc的访问模式为多路读写,该访问模式必须在前面pv定义的访问模式之中。定义PVC申请的大小为2Gi,此时PVC会自动去匹配多路读写且大小为2Gi的PV,匹配成功获取PVC的状态即为Bound
 

vim pod-vol-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-pvc
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
    - name: html
      persistentVolumeClaim:
        claimName: mypvc

kubectl apply -f pod-vol-pvc.yaml

kubectl get pv
kubectl get pvc

搭建 StorageClass + NFS,实现 NFS 的动态 PV 创建

Kubernetes 本身支持的动态 PV 创建不包括 NFS,所以需要使用外部存储卷插件分配PV。详见:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/
 

卷插件称为 Provisioner(存储分配器),NFS 使用的是 nfs-client,这个外部卷插件会使用已经配置好的 NFS 服务器自动创建 PV。
Provisioner:用于指定 Volume 插件的类型,包括内置插件(如 kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)。
 

1、在stor01节点上安装nfs,并配置nfs服务

mkdir /opt/k8s
chmod 777 /opt/k8s/

vim /etc/exports
/opt/k8s 192.168.41.0/24(rw,no_root_squash,sync)

systemctl restart nfs

2、创建 Service Account,用来管理 NFS Provisioner 在 k8s 集群中运行的权限,设置 nfs-client 对 PV,PVC,StorageClass 等的规则
 

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


kubectl apply -f nfs-client-rbac.yaml

3、使用 Deployment 来创建 NFS Provisioner
NFS Provisione(即 nfs-client),有两个功能:一个是在 NFS 共享目录下创建挂载点(volume),另一个则是将 PV 与 NFS 的挂载点建立关联。
#由于 1.20 版本启用了 selfLink,所以 k8s 1.20+ 版本通过 nfs provisioner 动态生成pv会报错,解决方法如下:

vim /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
  containers:
  - command:
    - kube-apiserver
    - --feature-gates=RemoveSelfLink=false       #添加这一行
    - --advertise-address=192.168.80.20
......

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
vim nfs-client-provisioner.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner   	  #指定Service Account账户
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: nfs-storage       #配置provisioner的Name,确保该名称与StorageClass资源中的provisioner名称保持一致
            - name: NFS_SERVER
              value: stor01           #配置绑定的nfs服务器
            - name: NFS_PATH
              value: /opt/k8s          #配置绑定的nfs服务器目录
      volumes:              #申明nfs数据卷
        - name: nfs-client-root
          nfs:
            server: stor01
            path: /opt/k8s
	
	
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


创建 NFS Provisioner

4、创建 StorageClass,负责建立 PVC 并调用 NFS provisioner 进行预定的工作,并让 PV 与 PVC 建立关联
 

apiVersion: /v1
kind: PersistentVolumeClain
metadata:
  name: nfs-client-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 1Gi
~                                          
  
kubectl apply -f nfs-client-storageclass.yaml

kubectl get storageclass

kubectl get storageclass

5、创建 PVC 和 Pod 测试
 

vim test-pvc-pod.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName:  nfs-client-storageclass  #关联StorageClass对象
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: test-storageclass-pod
spec:
  containers:
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command:
    - "/bin/sh"
    - "-c"
    args:
    - "sleep 3600"
    volumeMounts:
    - name: nfs-pvc
      mountPath: /mnt
  restartPolicy: Never
  volumes:
  - name: nfs-pvc
    persistentVolumeClaim:
      claimName: test-nfs-pvc      #与PVC名称保持一致
	  
	  
kubectl apply -f test-pvc-pod.yaml

kubectl apply -f test-pvc-pod.yaml

PVC 通过 StorageClass 自动申请到空间

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

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

相关文章

软件开发中常见的设计原则

软件开发中常见的设计原则 1. 单一责任原则2. 开放封闭原则3. 里氏替换原则4. 接口分离原则5. 依赖倒置原则6. 迪米特法则7. 合成复用原则8. 共同封闭原则9. 稳定抽象原则10. 稳定依赖原则 简写全拼中文翻译SRPThe Single Responsibility Principle单一责任原则OCPThe Open Clo…

Flink--Data Source 介绍

Data Source 简介 Flink 做为一款流式计算框架,它可用来做批处理,即处理静态的数据集、历史的数据集;也可以用来做流处理,即实时的处理些实时数据流,实时的产生数据流结果,只要数据源源不断的过来&#xff…

前端面试题之Javascript篇

一、JavaScript基础 1、数组有哪些方法 添加/删除元素 push() 向尾部添加元素pop() 从尾部提取一个元素shift() 从首端提取元素unshift() 从首端添加元素splice(start, deleteCount, item1...itemN) start表示开始计算的索引,deleteCount表示从start开始计算的元…

PTA_乙级_1006

思路&#xff1a;把数字的每一位都取出来&#xff0c;然后for循环把字符输入 #include <iostream> #include <string> using namespace std;int main() {int n;cin >> n;int b n / 100; // 计算百位数int s (n % 100) / 10; // 计算十位数int g n…

大学智能电表改造解决方案

随着科技的不断发展&#xff0c;我国高等教育院校在基础设施方面也在不断进行智能化升级。电力系统作为大学校园的重要组成部分&#xff0c;对其进行智能化改造已成为当前高校建设的热门话题。本文将详细介绍大学智能电表改造解决方案&#xff0c;以期为我国高校的电力系统智能…

Unity Input System最简单使用

开始学的是 Input Manager 比较好理解&#xff0c;Input System却不好理解&#xff0c;教程也找了很多&#xff0c;感觉都讲的不清楚&#xff0c;我这里做一个最简单的用 Input System 添加鼠标左键和右键的效果。 1. 安装 Input System 包 首先这个功能不是内置的&#xff0…

Linux内核有什么之内存管理子系统有什么第二回 —— 单刀直入

接前一篇文章&#xff1a;Linux内核有什么之内存管理子系统有什么第一回 —— 引言 一、单刀直入 —— 一切从malloc开始 想必大家都使用过malloc()&#xff0c;malloc的全称是memory allocation&#xff0c;中文叫做动态内存分配。其用于申请一块连续的指定大小的内存块区域以…

公众号生成链接

登录公众号 后点击左侧“设置与开发” 下 公众号设置&#xff0c;点击账号详情&#xff0c;然后查看源代码&#xff0c;搜索uin_base64 找到参数&#xff0c;然后设置到地址_biz上。在微信中打开就可以链接到微信公众号。 如下&#xff1a;

CSS 网页布局

网页布局有很多种方式&#xff0c;一般分为以下几个部分&#xff1a;头部区域、菜单导航区域、内容区域、底部区域&#xff1a; 1&#xff09;、头部区域位于整个网页的顶部&#xff0c;一般用于设置网页的标题或者网页的logo。 <style> body { margin: 0; } /* 头部样…

香港优才计划diy申请失败怎么回事?怎么办?那些后悔莫及的事儿!

香港优才计划diy申请失败怎么回事&#xff1f;怎么办&#xff1f;那些后悔莫及的事儿&#xff01; 今年香港优才计划申请由于政策放开&#xff0c;申请人数确实暴涨&#xff01;不过近期收获到不少客户申请被拒的倾诉&#xff0c;我能感受到他们对申请失败的失落心情&#xff0…

PODsys:大模型AI算力平台部署的开源“神器”

大模型是通用人工智能的底座&#xff0c;但大模型训练对算力平台的依赖非常大。大模型算力平台是指支撑大模型训练和推理部署的算力基础设施&#xff0c;包括业界最新的加速卡、高速互联网络、高性能分布式存储系统、液冷系统和高效易用的大模型研发工具和框架。在算力平台的部…

【k8s】pod控制器

一、pod控制器及其功用 Pod是kubernetes的最小管理单元&#xff0c;在kubernetes中&#xff0c;按照Pod的创建方式可以将其分为两类 自主式Pod&#xff1a; kubernetes直接创建出来的Pod&#xff0c;这种Pod删除后就没有了&#xff0c;也不会重建 控制器创建的Pod&#xff1a…

物联网水表有什么弊端吗?

物联网水表作为新一代智能水表&#xff0c;虽然在很大程度上提高了水资源的管理效率&#xff0c;但也存在一定的弊端。在这篇文章中&#xff0c;我们将详细讨论物联网水表的弊端&#xff0c;以帮助大家更全面地了解这一技术。 一、安全隐患 1.数据泄露&#xff1a;物联网水表通…

vue+java实现语音转文字思路

思路&#xff1a; 前端录音生成wav文件后端去解析 技术&#xff1a; 后端&#xff1a; Vosk是一个离线开源语音识别工具。它可以识别16种语言&#xff0c;包括中文。 API接口&#xff0c;让您可以只用几行代码&#xff0c;即可迅速免费调用、体验功能。 目前支持 WAV声音文件…

MobaXterm配置SSHTunnel

本地与远程服务器之间存在防火墙&#xff0c;防火墙只允许SSH端口通过&#xff0c;为访问远程服务器&#xff0c;我们可以借助MobaXterm来与SSH服务器建立隧道&#xff0c;使得防火墙外的用户能够访问远程服务器 配置 打开SSHTunnel 新建SSH tunnel 点击开启就生效了&…

数据链路相关技术

文章目录 数据链路相关技术MAC地址半双工通信与全双工通信共享介质型网络非共享介质网络根据MAC地址转发以太网无线通信 数据链路相关技术 MAC地址 MAC地址用于识别数据链路中互连的节点&#xff0c;以太网或FDDI中&#xff0c;根据IEEE802.3的规范使用MAC地址。其中IEEE指的…

详解交叉验证中【KFold】【Stratified-KFold】【StratifiedShuffleSplit】的区别

交叉验证是一种统计分析方法&#xff0c;它的目的是通过在同一数据集上重复并分割训练和测试数据&#xff0c;来评估机器学习模型的性能。以下是​这三种交叉验证方法的区别&#xff1a; KFold&#xff08;K-折叠&#xff09; 在KFold交叉验证中&#xff0c;原始数据集被分为K个…

思杰Citrix将全面退出中国市场,是真的吗?

引言&#xff1a;国内虚拟化市场依然有潜力&#xff0c;转换思路继续开发&#xff0c;这个可能性最大。 【科技明说 &#xff5c; 热点关注】 业内讨论说&#xff0c;虚拟化大佬思杰Citrix将全面退出国内市场&#xff0c;不知道消息是否属实&#xff1f; 另外假如消息属实的话…

串口调试助手和网络调试助手使用总结

串口调试助手和网络调试助手是用的比较多的两款工具。 先来看看串口调试助手。 本人用的比较多的串口助手是正点原子的XCOM以及大虾丁丁的SSCOM 首先&#xff0c;解决下串口收发时的统计问题。 注意&#xff1a;这里统计的单位是字节。 串口工具发送时&#xff0c;就只统计你…

05-MySQL-进阶-存储引擎索引SQL优化

一、存储引擎 涉及资料 链接&#xff1a;https://pan.baidu.com/s/1M1oXN_pH3RGADx90ZFbfLQ?pwdCoke 提取码&#xff1a;Coke ①&#xff1a;MySQL体系结构 1.连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 T…