kubernetes(k8s)PVC

2023-09-21 11:37:53

概念

PVC 的全称是:PersistentVolumeClaim(持久化卷声明),PVC 是用户存储的一种声明,PVC 和 Pod 比较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请求 CPU 和内存,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。

准备工作

在使用 PVC 之前,我们还得把其他节点上的 nfs 客户端给安装上,比如我们这里:

[root@k8master1 ~]# kubectl get nodes
NAME                 STATUS   ROLES           AGE   VERSION
k8master1.meng.com   Ready    control-plane   22d   v1.28.1
k8node1.meng.com     Ready    <none>          22d   v1.28.1
k8node2.meng.com     Ready    <none>          22d   v1.28.1
k8node3.meng.com     Ready    <none>          22d   v1.28.1

需要在所有节点安装 nfs 客户端程序,必须在所有节点都安装 nfs 客户端,否则可能会导致 PV 挂载不上的问题。
安装命令如下:

yum -y install  nfs-utils rpcbind
systemctl start rpcbind.service 
systemctl start nfs.service 

在master节点创建一些文件夹,更改属主

mkdir -p /nfs1/data/01 /nfs1/data/02 /nfs1/data/03
chown -R nfsnobody.nfsnobody /nfs1/  

将新建的文件夹共享

[root@k8master1 ~]# vim /etc/exports

添加如下内容

/nfs1/data/01  192.168.8.0/24(rw,sync,root_squash,all_squash)
/nfs1/data/02  192.168.8.0/24(rw,sync,root_squash,all_squash)
/nfs1/data/03  192.168.8.0/24(rw,sync,root_squash,all_squash)

从node节点尝试访问master节点共享的NFS文件夹,所有的节点都需要测试一下

[root@k8node1 containerd]# showmount -e 192.168.8.81
Export list for 192.168.8.81:
/nfs1/data/03 192.168.8.0/24
/nfs1/data/02 192.168.8.0/24
/nfs1/data/01 192.168.8.0/24
[root@k8node1 containerd]# mount -t nfs 192.168.8.81:/nfs1/data/01 /mnt
[root@k8node1 /]# umount /mnt

部署PV

创建了3个PV,大小为10M,1G,3G

[root@k8master1 ~]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:
    storage: 10M
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs1/data/01
    server: 192.168.8.81
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs1/data/02
    server: 192.168.8.81
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03-3gi
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs1/data/03
    server: 192.168.8.81

创建PV

[root@k8master1 ~]# kubectl apply -f pv.yaml

查看PV状态

[root@k8master1 ~]# kubectl get pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv01-10m   10M        RWX            Retain           Available           nfs                     4s
pv02-1gi   1Gi        RWX            Retain           Available           nfs                     4s
pv03-3gi   3Gi        RWX            Retain           Available           nfs                     4s 

创建PVC

[root@k8master1 ~]# cat pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi
  storageClassName: nfs

运维YAML文件创建PVC

[root@k8master1 ~]# kubectl apply -f pvc.yaml

查看PV,已有一个PV处于绑定状态

[root@k8master1 ~]# kubectl get pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
pv01-10m   10M        RWX            Retain           Available                       nfs                     42h
pv02-1gi   1Gi        RWX            Retain           Bound       default/nginx-pvc   nfs                     42h
pv03-3gi   3Gi        RWX            Retain           Available                       nfs                     42h

发现这个pv02-1gi绑定了我们刚才的pvc,为什么是这个,因为我们申请的是200M,01太小,03太大,k8s帮我们自动做了选择

创建Pod绑定PVC

[root@k8master1 ~]# cat pvc-deploy2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: nginx-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-pvc
  labels:
    app: nginx-pvc
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: web              #容器端口或名字
  selector:
    app: nginx-pvc
[root@k8master1 ~]#

执行文件创建pod,创建deployment和service,并暴露给node

[root@k8master1 ~]# kubectl apply -f pvc-deploy2.yaml

我们进入到02里面新建个文件

[root@k8master1 ~]# cd /nfs1/data/02
[root@k8master1 ~]# echo 111 > index.html

交互访问docker,可以看到新创建的index文件

[root@k8master1 02]# kubectl exec -it nginx-deploy-pvc-7c466b8668-cfpsg  -- bash
root@nginx-deploy-pvc-7c466b8668-cfpsg:/# cd /usr/share/nginx/html/
root@nginx-deploy-pvc-7c466b8668-cfpsg:/usr/share/nginx/html# ls
index.html
root@nginx-deploy-pvc-7c466b8668-cfpsg:/usr/share/nginx/html#

创建的pod可以curl一下看看是否可以访问,如果不能访问可以参考K8S遇到的问题的文章。

[root@k8master1 ~]# kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS        AGE   IP            NODE               NOMINATED NODE   READINESS GATES
demoapp-7c58cd6bb-7qlrd             1/1     Running   1 (16m ago)     22d   10.244.1.15   k8node1.meng.com   <none>           <none>
demoapp-7c58cd6bb-f84kp             1/1     Running   1 (4m50s ago)   22d   10.244.3.12   k8node3.meng.com   <none>           <none>
demoapp-7c58cd6bb-ldrzf             1/1     Running   1 (8m50s ago)   22d   10.244.2.13   k8node2.meng.com   <none>           <none>
mypod                               1/1     Running   1 (8m50s ago)   21d   10.244.2.12   k8node2.meng.com   <none>           <none>
nginx-deploy-pvc-64b6b6bb47-csrnr   1/1     Running   1 (4m50s ago)   20m   10.244.3.11   k8node3.meng.com   <none>           <none>
nginx-deploy-pvc-64b6b6bb47-wcsbc   1/1     Running   1 (16m ago)     20m   10.244.1.16   k8node1.meng.com   <none>           <none>
[root@k8master1 ~]# curl 10.244.1.16
111
[root@k8master1 ~]#
更多推荐

【Redis GEO】3、地理位置类型的性能优化及使用限制

在使用Redis的地理位置类型时,为了提高查询性能和降低资源消耗,需要进行一些优化和性能考虑1、使用合适的半径在执行GEOADD和GEORADIUS命令时,需要根据实际情况选择合适的半径。如果半径过大,可能会导致查询时间过长和资源消耗增加;如果半径过小,可能会导致查询结果不完整。因此,需要根据实际需求进行合理的配置。2

Excel VLOOKUP 初学者教程:通过示例学习

目录前言一、VLOOKUP的用法二、应用VLOOKUP的步骤三、VLOOKUP用于近似匹配四、在同一个表里放置不同的VLOOKUP函数结论前言Vlookup(V代表“垂直”)是excel中的内置函数,允许在excel的不同列之间建立关系。换句话说,它使您可以从一列数据中查找(查找)一个值,并从另一列中返回其相应或对应的

国产化BI平滑替代,某知名寿险Cognos替换项目分享

​长期使用国外BI软件可能存在安全风险,其中包括数据安全、信息安全以及系统安全等经营的风险。与数据库等环节不同,就整体替代难度而言,目前中国企业BI国产化替代可行性已今非昔比,完全可实现用100%自主可控、安全高效的亿信ABI产品取代甚至升级替换国外产品。面对国产化BI替代大势,亿信华辰抓住时代的要求,开发了Cogno

Python学习 -- 常用数据交换格式(CSV、XML、JSON)

数据交换格式是在不同系统之间交换数据时使用的一种标准化格式。在Python中,我们常用的数据交换格式有CSV、XML和JSON。本篇技术博客将介绍这三种数据交换格式的详细使用方法,并提供具体的代码案例,帮助初学者快速掌握这些格式的使用。CSV(逗号分隔值)格式CSV是一种简单的文本文件格式,使用逗号作为字段之间的分隔符

怎么压缩视频?视频过大跟我这样压缩

在日常生活中,我们常常会遇到需要上传或者发送视频的情况,然而,有时候视频文件过大,无法顺利上传或发送,这时候就需要对视频进行压缩。那么,如何有效地压缩视频呢?看完下面三个方法你就明白了。一、使用嗨格式压缩大师这是一款专业的视频压缩工具,可以轻松将视频压缩到指定大小,同时保持视频的质量。1、打开嗨格式压缩大师后,选择需要

今年嵌入式行情怎么样?

今年嵌入式行情怎么样?嵌入式技术今年可以说是IT领域中最炙手可热的之一。随着中年危机和内卷问题的出现,越来越多的互联网从业者将目光投向了嵌入式领域。国内的嵌入式市场一直受终端需求变化的影响而波动,但随着国内产业自主化的发展趋势,嵌入式技术的应用领域变得越来越广泛。社会信息化、智能化和网络化的趋势也推动着嵌入式市场的高速

【C++初阶】模板

​👻内容专栏:C/C++编程🐨本文概括:泛型编程的认识、函数模板、类模板。🐼本文作者:阿四啊🐸发布时间:2023.9.21泛型编程前面我们学过函数重载,我们可以使用同一个函数名Swap,实现多个重载函数,对int、char、double……类型进行交换,举例如下:voidSwap(int&left,int&ri

分布式共识算法

一、共识算法的目标为了保证集群中各个无服务器节点的一致性,达到不会应为服务器的故障导致数据丢失,大概有以下三种:Paxos、Raft、ZAB二、Raft2.1、Raft算法概述不同于Paxos算法直接从分布式一致性问题出发推导出来,Raft算法则是从多副本状态机的角度提出,用于管理多副本状态机的日志复制。Raft实现了

Linux知识

文章目录一、Apt1、查看操作系统信息2、换源3、比较4、用法5、ubuntu获取源码pkg-config一、Apt1、查看操作系统信息使用以下命令查看本机的操作系统和位数信息:uname-m&&cat/etc/*release输出:x86_64DISTRIB_ID=UbuntuDISTRIB_RELEASE=16.0

Pytest系列-使用自定义标记mark(6)

简介pytest可以支持自定义标记,自定义标记可以把一个web项目划分为多个模块,然后指定模块名称执行Pytest里面自定义标记用法:将@pytest.mark.标记名称放到测试函数或者类上面使用:执行时加上-m标记名进行用例筛选,例如加上-mapp,就执行标记名为app的用例。如果不运行app相关的用例,则加上-m“

面试中的冲突解决:展示你的调解能力

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

热文推荐