k8s 存储(PV、PVC、SC、本地存储、NFS)

2024-09-08 00:44

本文主要是介绍k8s 存储(PV、PVC、SC、本地存储、NFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

存储持久化相关三个概念:

  1. PersistentVolume (PV)
    是对具体存储资源的描述,比如NFS、Ceph、GlusterFS等,通过PV可以访问到具体的存储资源;
  2. PersistentVolumeClaim (PVC)
    Pod想要使用具体的存储资源需要对接到PVC,PVC里会定义好Pod希望使用存储的属性,通过PVC再去申请合适的存储资源(PV),匹配到合适的资源后PVC和PV会进行绑定,它们两者是一一对应的;
  3. StorageClass (SC)
    PV可以手动创建,也可以自动创建,当PV需求量非常大时,如果靠手动创建PV就非常麻烦了,SC可以实现自动创建PV,并且会将PVC和PV绑定。

SC会定义两部分内容:

  • pv的属性,比如存储类型、大小;
  • 创建该PV需要用到的存储插件(provisioner),这个provisioner是实现自动创建PV的关键。

API资源对象PV和PVC

  1. PV YAML示例:
    vi testpv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: testpvspec:storageClassName: test-storageaccessModes:- ReadWriteOncecapacity:storage: 500Mi  ##提供500Mi空间hostPath:path: /tmp/testpv/

说明:
storageClassName: 定义存储类名称,PV和PVC中都会有该字段,目的是为了方便两者匹配绑定在一起。
accessModes定义该pv的访问权限模式,有三种:

  • ReadWriteOnce:存储卷可读可写,但只能被一个节点上的 Pod 挂载;
  • ReadOnlyMany:存储卷只读不可写,可以被任意节点上的 Pod 多次挂载;
  • ReadWriteMany:存储卷可读可写,也可以被任意节点上的 Pod 多次挂载;
    capacity 定义该存储大小。
    hostPath 定义该存储访问路径,这里指的是本地的磁盘。
  1. PVC YAML示例:
    vi testpvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: testpvcspec:storageClassName: test-storageaccessModes:- ReadWriteOnceresources:requests:storage: 100Mi  ##期望申请100Mi空间

应用pv和pvc的YAML

kubectl apply -f testpv.yaml -f testpvc.yaml

查看状态

kubectl get pv,pvc

查看状态是否Bound,如果不是,详细查看:

kubectl describe puv testpvc

实验:
将testpvc的期望100Mi改为1000Mi,查看PV的STATUS

  1. PV和PVC匹配规则
    PV创建好后,会等待PVC与其进行绑定,PVC一旦找到合适的PV就会绑定。如果有多个PV时,PVC又是如何匹配PV的呢?它有如下一些规则:
  • 访问模式和存储类匹配:Kubernetes会筛选出访问模式(accessModes)和存储类(storageClassName)与PVC相匹配的PV。如果没有匹配的PV,PVC将保持未绑定状态。
  • 资源大小:在满足访问模式和存储类匹配的PV中,Kubernetes会选择资源大小大于或等于PVC请求大小的PV。
  • 最佳匹配:在满足访问模式、存储类和资源大小的PV中,Kubernetes会选择资源大小最接近PVC请求大小的PV。如果有多个PV具有相同的资源大小,Kubernetes会选择其中一个进行绑定。
  • 避免重复绑定:一个PV在任何时候只能被一个PVC绑定。一旦PV被绑定到一个PVC,它将不再可用于其他PVC。

API资源对象StorageClass

SC的主要作用在于,自动创建PV,从而实现PVC按需自动绑定PV。
下面我们通过创建一个基于NFS的SC来演示SC的作用。
要想使用NFS的SC,还需要安装一个NFS provisioner,provisioner里会定义NFS相关的信息(服务器IP、共享目录等)
github地址: https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

将源码下载下来:

git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisionercd nfs-subdir-external-provisioner/deploy
sed -i 's/namespace: default/namespace: kube-system/' rbac.yaml  ##修改命名空间为kube-system
kubectl apply -f rbac.yaml  ##创建rbac授权

修改deployment.yaml

sed -i 's/namespace: default/namespace: kube-system/' deployment.yaml ##修改命名空间为kube-system##你需要修改image、nfs_server、nfs_path、server共4处spec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: chronolaw/nfs-subdir-external-provisioner:v4.0.2  ##改为dockerhub地址volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner- name: NFS_SERVERvalue: 192.168.222.99  ##nfs服务器地址- name: NFS_PATHvalue: /data/nfs  ##nfs共享目录volumes:- name: nfs-client-rootnfs:server: 192.168.222.99  ##nfs服务器地址path: /data/nfs  ##nfs共享目录

应用yaml

kubectl apply -f deployment.yaml
kubectl apply -f class.yaml ##创建storageclass

SC YAML示例
cat class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:archiveOnDelete: "false"  ##自动回收存储空间

有了SC,还需要一个PVC
vi nfsPvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfspvcspec:storageClassName: nfs-clientaccessModes:- ReadWriteManyresources:requests:storage: 500Mi

下面创建一个Pod,来使用PVC
vi nfsPod.yaml

apiVersion: v1
kind: Pod
metadata:name: nfspod
spec:containers:- name: nfspodimage: nginx:1.23.2volumeMounts:- name: nfspvmountPath: "/usr/share/nginx/html"volumes:- name: nfspvpersistentVolumeClaim:claimName: nfspvc

配置完成,测试:

kubectl get po -w wide #查看po的ip
curl 10.187.168.151/test.html

总结:
pod想使用共享存储–>PVC(定义具体需求属性)–>SC(定义Provisionler)–> Provisioner(定义具体的访问存储方法)–> NFS-server
SC是自动创建PV

本地存储

之前PV YAML示例就是本地存储。本地存储类型的PV是Kubernetes中一种比较特殊的持久化存储,它允许将节点上的本地磁盘或目录用作PV。与其他PV类型(例如NFS、Ceph或云存储)不同,本地存储类型的PV直接使用节点上的存储资源,因此具有更低的延迟和更高的性能。

使用本地存储类型的PV时,需注意以下几个关键点:

  • 节点特性:本地存储类型的PV与特定的节点绑定,因为它直接使用节点上的存储资源。这意味着当创建PV时,需要指定与之关联的节点。可以在PV的spec部分设置nodeAffinity来实现的。
nodeAffinity:  ##定义节点亲和性required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node-name
  • 数据持久性:由于本地存储类型的PV与特定节点关联,当该节点发生故障时,存储在PV中的数据可能无法访问。因此,在使用本地存储类型的PV时,请确保采取适当的数据备份策略,以防止节点故障导致的数据丢失。
  • 调度限制:Pod使用本地存储类型的Persistent Volume Claim(PVC)时,Kubernetes会尝试将Pod调度到关联PV的节点上。如果节点上的资源不足以运行Pod,Pod将无法启动。因此,在使用本地存储类型的PV时,请确保关联的节点有足够的资源来运行Pod。
  • 回收策略:当PVC被删除时,PV的回收策略将决定如何处理关联的本地存储。对于本地存储类型的PV,建议使用Retain或Delete回收策略。Retain策略表示保留存储和数据,以便手动清理和管理;Delete策略表示删除存储和数据。需要注意的是,Recycle策略并不适用于本地存储类型的PV。
persistentVolumeReclaimPolicy: Retain

完整示例:
首先,确保在每个要使用本地存储的节点上创建一个本地目录。例如,在节点上创建/mnt/local-storage目录:

mkdir -p /mnt/local-storage

然后,创建一个PV资源配置文件,例如local-pv.yaml:

apiVersion: v1
kind: PersistentVolume
metadata:name: local-pvlabels:type: local
spec:storageClassName: local-storagecapacity:storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainlocal:path: /mnt/local-storagenodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostname  #这是内置的节点标签,表示节点的主机名operator: Invalues:- rocky9-2  #只有rocky9-2这个主机节点才满足要求

应用PV资源配置文件:

kubectl apply -f local-pv.yaml

再创建一个PVC资源配置文件,例如local-pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: local-pvc
spec:storageClassName: local-storageaccessModes:- ReadWriteOnceresources:requests:storage: 5Gi

应用PVC资源配置文件:

kubectl apply -f local-pvc.yaml

最后,创建一个Pod资源配置文件,例如local-pod.yaml:

apiVersion: v1
kind: Pod
metadata:name: local-pod
spec:containers:- name: local-containerimage: nginx:1.21.0volumeMounts:- name: local-storagemountPath: /datavolumes:- name: local-storagepersistentVolumeClaim:claimName: local-pvc

应用pod资源配置文件:

kubectl apply -f local-pod.yaml
kubectl get pod
kubectl get pod -o wide
kubectl describe po local-pod    #注意之前实验中的污点设置
kubectl exec -it local-pod -- bash

NFS存储

注意:在做本章节示例时,需要拿单独一台机器来部署NFS,具体步骤略。

[root@localhost ~]# cat /etc/exports
/data/nfs 192.168.56.0/24(rw,sync,no_root_squash)
/data/nfs2 192.168.56.0/24(rw,sync,no_root_squash)

NFS作为常用的网络文件系统,在多机之间共享文件的场景下用途广泛,毕竟NFS配置方便,而且稳定可靠。
NFS同样也有一些缺点:

  • 存在单点故障的风险;
  • 不方便扩容;
  • 性能一般。
    NFS比较适合一些简单的、对存储要求不高的场景,比如测试环境、开发环境。

完整示例:
首先部署好NFS服务,并且保证所有Kubernetes节点可以顺利挂载(showmount -e 192.168.56.124)。如果没有客户端,安装:yum install -y nfs-utils

定义基于NFS的PV
vi nfs-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv
spec:capacity:storage: 5GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: RetainstorageClassName: nfs-storagenfs:path: /data/nfs2server: 192.168.56.124

应用

kubectl apply -f nfs-pv.yaml

定义PVC
vi nfs-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc
spec:storageClassName: nfs-storageaccessModes:- ReadWriteManyresources:requests:storage: 5Gi

应用

kubectl apply -f nfs-pvc.yaml

定义Pod
vi nfs-pod.yaml

apiVersion: v1
kind: Pod
metadata:name: nfs-pod
spec:containers:- name: nfs-containerimage: nginx:1.21.0volumeMounts:- name: nfs-storagemountPath: /datavolumes:- name: nfs-storagepersistentVolumeClaim:claimName: nfs-pvc

应用

kubectl apply -f nfs-pod.yaml
kubectl get po -o widekubectl exec -it nfs-pod -- bash  #创建文件做测试

这篇关于k8s 存储(PV、PVC、SC、本地存储、NFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146629

相关文章

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

90、k8s之secret+configMap

一、secret配置管理 配置管理: 加密配置:保存密码,token,其他敏感信息的k8s资源 应用配置:我们需要定制化的给应用进行配置,我们需要把定制好的配置文件同步到pod当中容器 1.1、加密配置: secret: [root@master01 ~]# kubectl get secrets ##查看加密配置[root@master01 ~]# kubectl get se

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

开发板NFS挂载文件目录

文章目录 序NFS1. 安装 NFS 服务器和客户端在服务器上(NFS 服务器端)在客户端上(NFS 客户端) 2. 配置 NFS 服务器创建共享目录编辑 `/etc/exports` 文件启动 NFS 服务 3. 在客户端挂载 NFS 共享创建挂载点挂载 NFS 共享验证挂载 4. 设置开机自动挂载5. 解决权限问题 序 本节主要实现虚拟机(服务器)与开发板(客户端)通过N

云原生之高性能web服务器学习(持续更新中)

高性能web服务器 1 Web服务器的基础介绍1.1 Web服务介绍1.1.1 Apache介绍1.1.2 Nginx-高性能的 Web 服务端 2 Nginx架构与安装2.1 Nginx概述2.1.1 Nginx 功能介绍2.1.2 基础特性2.1.3 Web 服务相关的功能 2.2 Nginx 架构和进程2.2.1 架构2.2.2 Ngnix进程结构 2.3 Nginx 模块介绍2.4

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co