【云原生-Kurbernetes篇】K8s的存储卷/数据卷+PV与PVC

news2024/12/23 13:53:17

这是一个目录标题

  • 一、Kurbernetes中的存储卷
    • 1.1 为什么需要存储卷?
    • 1.2 存储卷概述
      • 1.2.1 简介
      • 1.2.2 volume字段
    • 1.3 常用的存储卷类型
      • 1.3.1 emptyDir(临时存储卷)
      • 1.3.2 hostPath(节点存储卷)
      • 1.3.3 nfs
      • 1.3.4 cephfs
  • 二、持久数据卷——PV和PVC
    • 2.1 概念
    • 2.2 PV的生命周期和状态
    • 2.3 访问模式 (Access Modes) 和回收策略 (Reclaim Policy)
  • 三、静态创建PV
    • 3.1 创建思路
    • 3.2 创建实例:NFS使用PV和PVC
      • Step1 配置nfs存储
      • Step2 定义PV
      • Step3 定义PVC
      • Step4 访问测试
  • 四、动态创建PV
    • 4.1 创建思路
    • 4.2 StorageClass的概念
    • 4.3 Provisioner的概念
    • 4.4 实例:NFS 的动态 PV 创建
      • Step1 在master01节点上安装nfs,并配置nfs服务
      • Step2 创建 Service Account
      • Step3 使用 Deployment 创建 NFS Provisioner
        • 补充:报错解决方法
      • Step4 创建 StorageClass
      • Step5 创建 PVC ,进行Pod 测试
  • 五、小结
    • 5.1 PV、PVC的概念和状态
    • 5.2 静态和动态创建PV的思路

一、Kurbernetes中的存储卷

1.1 为什么需要存储卷?

容器部署过程中一般有以下三种数据:

• 启动时需要的初始数据:例如配置文件 (init container)

• 启动过程中产生的临时数据:该临时数据需要多个容器间共享

• 启动过程中产生的持久化数据:例如MySQL的data目录 (业务数据–很重要)

在这里插入图片描述

而容器中的文件在磁盘上是临时存放的,这给容器中运行比较重要的应用程序带来一些问题

问题1: 数据持久化问题,当容器升级或者崩溃时,kubelet会重建容器,容器内文件会丢失

问题2: 数据共享问题,一个Pod中运行多个容器并需要共享文件

Kubernetes中的数据卷(Volume),也可以称为存储卷,能够解决这两个问题。

1.2 存储卷概述

1.2.1 简介

存储卷是用于持久化存储容器中数据的一种机制,可以提供容器内持久化存储的能力,使容器可以在不同的生命周期中保留数据。

数据卷与容器相互独立,并且具有自己的生命周期。

当容器被销毁或重启时,数据卷的内容仍然保持不变,从而确保了容器内数据的持久性(解决了问题1)。

数据卷可以与一个或多个容器进行绑定,使它们可以共享数据(解决了问题2)。

1.2.2 volume字段

Kubernetes中的Volume提供了在容器中挂载外部存储的能力

Pod需要设置卷来源volume)和挂载点volumeMounts)两个信息后才可以使用相应的Volume。

kubectl explain pod.spec.volumes
常用字段名描述
name指定数据卷的名称,用于标识该数据卷
<不同类型的数据卷>Kubernetes 支持不同类型的数据卷,如 NFS、GCE Persistent Disk、AWS EBS等,用于满足特定的存储需求
kubectl explain pod.spec.containers.volumeMounts
常用字段名描述
name指定要挂载的数据卷的名称
mountPath指定挂载点的路径,即将数据卷挂载到容器内的哪个目录
readOnly指定挂载点是否为只读模式。如果设置为 true,则容器只能读取挂载的数据,不能写入

1.3 常用的存储卷类型

1.3.1 emptyDir(临时存储卷)

简介

emptyDir可实现Pod中的容器之间共享目录数据,但没有持久化数据的能力存储卷会随着Pod生命周期结束而一起删除

emptyDir`的一些用途

  • 缓存空间,例如基于磁盘的归并排序。
  • 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
  • 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

字段

kubectl explain pod.spec.volumes.emptyDir

在这里插入图片描述

emptyDir.medium 字段用于控制 emptyDir 卷的存储位置,有两个值:MemoryDefault

描述
Memory表示将 emptyDir 卷存储在主机的内存
数据只存在于 Pod 的生命周期内,并且不会被持久化到磁盘上
Default表示将 emptyDir 卷存储在主机的磁盘
数据会在 Pod 重新启动时保留,但不会在节点之间持久化

emptyDir.sizeLimit字段用于来限制卷的容量大小,但是不会自动调整底层存储的大小。

因此,如果设置的大小限制超过节点上的可用磁盘空间,可能会导致 Pod 失败启动或运行时出现错误。

emptyDir 配置示例

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: registry.k8s.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      sizeLimit: 500Mi

1.3.2 hostPath(节点存储卷)

hostPath将node节点上的目录/文件挂载到Pod容器的指定目录上。

有持久化数据的能力,但只能在单个node节点上持久化数据,不能实现跨node节点的Pod共享数据

hostPath卷配置示例

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: registry.k8s.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # 宿主机上目录位置
      path: /data
      # 此字段为可选
      type: Directory

支持的 type 值如下:

取值行为
空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。
DirectoryOrCreate如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息。
Directory在给定路径上必须存在的目录。
FileOrCreate如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 kubelet 相同的组和所有权。
File在给定路径上必须存在的文件。
Socket在给定路径上必须存在的 UNIX 套接字。
CharDevice在给定路径上必须存在的字符设备。
BlockDevice在给定路径上必须存在的块设备。

补充:FileOrCreate模式

FileOrCreate 模式不会负责创建文件的父目录。

如果欲挂载的文件的父目录不存在,Pod 启动会失败。

为了确保这种模式能够工作,可以尝试把文件和它对应的目录分开挂载,如 FileOrCreate 配置所示。

apiVersion: v1
kind: Pod
metadata:
  name: test-webserver
spec:
  containers:
  - name: test-webserver
    image: registry.k8s.io/test-webserver:latest
    volumeMounts:
    - mountPath: /var/local/aaa
      name: mydir
    - mountPath: /var/local/aaa/1.txt
      name: myfile
  volumes:
  - name: mydir
    hostPath:
      # 确保文件所在目录成功创建。
      path: /var/local/aaa
      type: DirectoryOrCreate
  - name: myfile
    hostPath:
      path: /var/local/aaa/1.txt
      type: FileOrCreate

1.3.3 nfs

nfs使用nfs服务存储卷挂载Pod容器的指定目录上

有持久化数据的能力,且也能实现跨node节点的Pod共享数据。

nfs卷的配置示例

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: registry.k8s.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /my-nfs-data
      name: test-volume
  volumes:
  - name: test-volume
    nfs:
      server: my-nfs-server.example.com
      path: /my-nfs-volume
      readOnly: true

注意:不能在 Pod spec 中指定 NFS 挂载可选项

可以选择设置服务端的挂载可选项,或者使用 /etc/nfsmount.conf。

此外,还可以通过允许设置挂载可选项的持久卷挂载 NFS 卷。

1.3.4 cephfs

cephfs 卷允许将现存的 CephFS 卷挂载到 Pod 中。

cephfs 卷可以被预先填充数据,且这些数据可以在 Pod 之间共享,同一 cephfs 卷可同时被多个挂载。

apiVersion: v1
kind: Pod
metadata:
  name: cephfs
spec:
  containers:
  - name: cephfs-rw
    image: kubernetes/pause
    volumeMounts:
    - mountPath: "/mnt/cephfs"
      name: cephfs
  volumes:
  - name: cephfs
    cephfs:
      monitors:
      - 10.16.154.78:6789
      - 10.16.154.82:6789
      - 10.16.154.83:6789
      # by default the path is /, but you can override and mount a specific path of the filesystem by using the path attribute
      # path: /some/path/in/side/cephfs
      user: admin
      secretFile: "/etc/ceph/admin.secret"
      readOnly: true

二、持久数据卷——PV和PVC

2.1 概念

在这里插入图片描述

持久卷(PersistentVolume,PV):K8S在指定的存储设备空间中逻辑划分创建出来的可持久化的存储资源对象。

持久卷声明(PersistentVolumeClaim,PVC):对PV存储资源对象的请求和绑定,也是Pod能够挂载使用的一种存储卷类型。

2.2 PV的生命周期和状态

生命周期

在这里插入图片描述

#PV和PVC之间的相互作用遵循这个生命周期
Provisioning(配置)---> Binding(绑定)---> Using(使用)---> Releasing(释放) ---> Recycling(回收)
生命周期描述
ProvisioningPV 的创建,可以直接创建 PV(静态方式),也可以使用StorageClass 动态创建
Binding将 PV 分配给 PVC
UsingPod 通过 PVC 使用该 Volume,并可以通过准入控制StorageProtection(1.9及以前版本为PVCProtection) 阻止删除正在使用的 PVC
ReleasingPod 释放 Volume 并删除 PVC
Reclaiming回收 PV,可以保留 PV 以便下次使用,也可以直接从云存储中删除

状态

PV的状态描述
Available(可用)表示为可用状态,PV已经被创建出来了,但是还未被PVC绑定
Bound(已绑定)表示PV已经被PVC绑定了,PV与PVC是一对一的绑定关系
Released(已释放)表示PVC被删除了,但是PV还没被回收
Failed(失败)表示PV被自动回收失败

2.3 访问模式 (Access Modes) 和回收策略 (Reclaim Policy)

访问模式

存储卷在挂载到宿主机系统上时,可以设置不同的访问模式 (Access Modes)

支持的访问模式描述
ReadWriteOnce (RWO)读写权限,并且只能被单个Node挂载
ReadOnlyMany (ROX)只读权限,允许被多个Node挂载
ReadWriteMany(RWX)读写权限,允许被多个Node挂载

回收策略

通过PV定义中的persistentVolumeReclaimPolicy字段进行设置。

回收策略描述
Retain(保留)保留数据,需要手工处理
Recycle(回收)简单清除文件的操作(例如运行rm -rf /thevolume/*命令),只有 NFS 和 HostPath 两种类型的 PV支持 Recycle 策略
Delete(删除)与PV相连的后端存储完成Volume的删除操作,AWSElasticBlockStore、 GCEPersistentDis、 AzureDisk和Cinder类型的PV支持 Delete策略

三、静态创建PV

3.1 创建思路

1)准备好存储设备和共享目录;

2)准备yaml配置文件创建PV资源,设置 存储类型访问模式(RWO RWX ROX RWOP)、 空间大小回收策略(Retain Delete Recycle) 、storageClassName等;

3)准备yaml配置文件创建PVC资源,设置 访问模式(必要条件,必须是PV能支持的访问模式)、空间大小(默认就近选择大于等于指定大小的PV) 、storageClassName等来绑定PV

4)创建Pod资源挂载PVC存储卷,设置存储卷类型为 persistentVolumeClaim ,并在容器配置中定义存储卷挂载点目录

3.2 创建实例:NFS使用PV和PVC

Step1 配置nfs存储

#创建共享目录
mkdir /opt/test
cd /opt/test
mkdir v{1,2,3,4,5}
#定义多个共享目录和对应的访问权限
vim /etc/exports
 
/opt/test/v1 192.168.2.0/24(rw,no_root_squash)
/opt/test/v2 192.168.2.0/24(rw,no_root_squash)
/opt/test/v3 192.168.2.0/24(rw,no_root_squash)
/opt/test/v4 192.168.2.0/24(rw,no_root_squash)
/opt/test/v5 192.168.2.0/24(rw,no_root_squash)
#重新加载共享目录,应用修改
exportfs -arv

showmount -e

在这里插入图片描述

Step2 定义PV

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

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

在这里插入图片描述

Step3 定义PVC

这里定义了pvc的访问模式为多路读写,该访问模式必须在前面pv定义的访问模式之中。

定义PVC申请的大小为2Gi,此时PVC会自动去匹配多路读写且大小为2Gi的PV,匹配成功获取PVC的状态即为Bound

vim pod-vol-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: my-ns
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-pvc
  namespace: my-ns
spec:
  containers:
  - name: myapp
    image: nginx
    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

在这里插入图片描述

Step4 访问测试

在存储服务器上创建index.html,并写入数据,通过访问Pod进行查看,可以获取到相应的页面。

#创建测试页面
cd /opt/test/v3/
echo "welcome to use pv3" > index.html
kubectl get pods -o wide -n my-ns

在这里插入图片描述

#访问测试
firefox http://10.244.2.82

在这里插入图片描述

四、动态创建PV

4.1 创建思路

1)准备好存储设备和共享目录;

2)如果是外置存储卷插件,需要先创建serviceaccount账户(Pod使用的账户)和做RBAC授权(创建角色授予相关资源对象的操作权限,再将账户与角色进行绑定),使sa账户具有对PV PVC StorageClass等资源的操作权限;

3)准备yaml配置文件创建外置存储卷插件的Pod,设置sa账户作为Pod的用户,并设置相关的环境变量(比如存储卷插件名称);

4)创建StorageClass(简称SC)资源,provisioner自动设置为存储卷插件名称 ;

以上操作是一劳永逸的,之后只需要创建PVC资源时引用StorageClass就可以自动调用存储卷插件动态创建PV资源了

5)准备yaml配置文件创建PVC资源,设置 访问模式、空间大小 storageClassName指定SC资源名称等来动态创建PV资源并绑定PV;

6)创建Pod资源挂载PVC存储卷,设置存储卷类型为 persistentVolumeClaim ,并在容器配置中定义存储卷挂载点目录。

4.2 StorageClass的概念

官方文档:存储类 | Kubernetes

简介

**存储类(Storage Class)**是 Kubernetes 中用于定义持久卷(Persistent Volume)的类型和行为的对象

它定义了动态分配的存储和卷的属性,并指定如何创建和管理这些存储资源。

关于默认的StorageClass

当一个 PVC 没有指定 storageClassName 时,会使用默认的 StorageClass。

集群中只能有一个默认的 StorageClass。

如果不小心设置了多个默认的 StorageClass, 当 PVC 动态配置时,将使用最新设置的默认 StorageClass

关于字段

每个 StorageClass 都包含 provisionerparametersreclaimPolicy 字段, 这些字段会在 StorageClass 需要动态制备 PersistentVolume 时会使用到。

功能

1)提供动态卷配置:存储类可以与动态卷配置程序(比如 CSI 驱动程序)集成,以便在创建 PVC(Persistent Volume Claim)时自动创建相应的 PV(Persistent Volume)

2)指定卷的参数: 存储类可以定义卷的各种参数和配置选项,如访问模式、卷大小、复制策略等。

3)**支持动态卷生命周期管理:**存储类可以定义如何动态创建、扩容和销毁卷,以及何时回收 PV 等。

4.3 Provisioner的概念

**Provisioner(存储分配器):**卷插件,用于指定 Volume 插件的类型,包括内置插件(如 kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)。

详见:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

Kubernetes 本身支持的动态 PV 创建不包括 NFS,所以需要使用外部存储卷插件分配PV。

4.4 实例:NFS 的动态 PV 创建

搭建 StorageClass + nfs-client-provisioner ,实现 NFS 的动态 PV 创建

Step1 在master01节点上安装nfs,并配置nfs服务

#创建共享目录
mkdir /opt/test2
chmod 777 /opt/test2/

#添加权限
vim /etc/exports
/opt/test2 192.168.2.0/24(rw,no_root_squash,sync)
#重启NFS服务
systemctl restart nfs

exportfs -var
showmount -e

在这里插入图片描述

Step2 创建 Service Account

Service Account 用来管理 NFS Provisioner 在 k8s 集群中运行的权限,设置nfs-clientPVPVCStorageClass 等的规则

#编写配置清单文件
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
##配置清单文件详解##
用于创建一个 Service Account 账户和相关的 Role、RoleBinding,用于管理 NFS Provisioner 在 Kubernetes 集群中的权限。

首先,创建了一个 Service Account 账户,命名为 "nfs-client-provisioner"

然后,创建了一个 Cluster Role,命名为 "nfs-client-provisioner-clusterrole"。
该角色定义了一组权限规则,包括对持久卷(persistentvolume)的获取、列表、监视、创建和删除操作,对持久卷声明(persistentvolumeclaim)的获取、列表、监视和更新操作,对存储类(storageclass)的获取、列表和监视操作,对事件(events)和端点(endpoints)的获取、列表、监视、创建、更新等操作。

最后,创建了一个 Cluster Role Binding,将上述角色与之前创建的 Service Account 进行绑定,并将其绑定到默认命名空间(namespace)中。
kubectl apply -f nfs-client-rbac.yaml
#Service Account "nfs-client-provisioner" 具备了管理 NFS Provisioner 所需的权限。

在这里插入图片描述

Step3 使用 Deployment 创建 NFS Provisioner

NFS Provisioner(即 nfs-client),有两个功能
1)在 NFS 共享目录下创建挂载点(volume),另一个则是将 PV 与 NFS 的挂载点建立关联。

编写资源配置清单文件

#编写配置清单文件
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: master01           #配置绑定的nfs服务器
            - name: NFS_PATH
              value: /opt/test2/          #配置绑定的nfs服务器目录
      volumes:              #申明nfs数据卷
        - name: nfs-client-root
          nfs:
            server: master01
            path: /opt/test2/

创建

kubectl apply -f nfs-client-provisioner.yaml 

kubectl get po 

在这里插入图片描述

补充:报错解决方法
#由于 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.2.100
.....

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

Step4 创建 StorageClass

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

#编写配置清单文件
vim nfs-client-storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client-storageclass
provisioner: nfs-storage     #这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
parameters:
  archiveOnDelete: "false"   #false表示在删除PVC时不会对数据目录进行打包存档,即删除数据;为ture时就会自动对数据目录进行打包存档,存档文件以archived开头
#声明式创建
kubectl apply -f nfs-client-storageclass.yaml

kubectl get storageclass

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Step5 创建 PVC ,进行Pod 测试

创建PVC

vim test-pvc-pod.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-nfs-pvc
  #annotations: volume.beta.kubernetes.io/storage-class: "nfs-client-storageclass"     #另一种SC配置方式
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 get pvc 

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查看 NFS 服务器上是否生成对应的目录

自动创建的 PV 会以 ${namespace}-${pvcName}-${pvName} 的目录格式放到 NFS 服务器上。

ls /opt/test2

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Pod测试

**测试思路:**进入 Pod 在挂载目录 /mnt 下写一个文件,然后查看 NFS 服务器上是否存在该文件

#进入Pod,创建测试文件
kubectl exec -it test-storageclass-pod sh

/ # cd /mnt/
/mnt # echo 'this is test file' > test.txt

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#进入到目录
cd /opt/test2/default-test-nfs-pvc-pvc-7a63142b-a4b4-4f07-966c-828ca60bbdcb

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

五、小结

5.1 PV、PVC的概念和状态

概念

PV: K8S在指定的存储设备空间中逻辑划分创建出来的可持久化的存储资源对象。

PVC: 对PV存储资源对象的请求和绑定,也是Pod能够挂载使用的一种存储卷类型。

创建方式简介

手动根据PV资源的yaml配置文件创建静态PV

根据PVC的配置通过StorageClass(简称SC)资源调用存储卷插件创建动态PV

PV的4种状态

PV的状态描述
Available(可用)表示为可用状态,PV已经被创建出来了,但是还未被PVC绑定
Bound(已绑定)表示PV已经被PVC绑定了,PV与PVC是一对一的绑定关系
Released(已释放)表示PVC被删除了,但是PV还没被回收
Failed(失败)表示PV被自动回收失败

5.2 静态和动态创建PV的思路

创建使用静态PV

1)准备好存储设备和共享目录;

2)准备yaml配置文件创建PV资源,设置 存储类型访问模式(RWO RWX ROX RWOP)、 空间大小回收策略(Retain Delete Recycle) 、storageClassName等;

3)准备yaml配置文件创建PVC资源,设置 访问模式(必要条件,必须是PV能支持的访问模式)、空间大小(默认就近选择大于等于指定大小的PV) 、storageClassName等来绑定PV

4)创建Pod资源挂载PVC存储卷,设置存储卷类型为 persistentVolumeClaim ,并在容器配置中定义存储卷挂载点目录

创建使用动态PV

1)准备好存储设备和共享目录;

2)如果是外置存储卷插件,需要先创建serviceaccount账户(Pod使用的账户)和做RBAC授权(创建角色授予相关资源对象的操作权限,再将账户与角色进行绑定),使sa账户具有对PV PVC StorageClass等资源的操作权限;

3)准备yaml配置文件创建外置存储卷插件的Pod,设置sa账户作为Pod的用户,并设置相关的环境变量(比如存储卷插件名称);

4)创建StorageClass(简称SC)资源,provisioner自动设置为存储卷插件名称 ;

以上操作是一劳永逸的,之后只需要创建PVC资源时引用StorageClass就可以自动调用存储卷插件动态创建PV资源了

5)准备yaml配置文件创建PVC资源,设置 访问模式、空间大小 storageClassName指定SC资源名称等来动态创建PV资源并绑定PV;

6)创建Pod资源挂载PVC存储卷,设置存储卷类型为 persistentVolumeClaim ,并在容器配置中定义存储卷挂载点目录。

通过陈述式管理资源配置的方式 修改或添加资源对象的配置
kubectl patch <资源类型> <资源名称> -p '{"第一层字段": {"第二层字段": {....}}}'

kubectl patch deployment deploy-test -p '{"spec": {"replicas": 0}}'
kubectl patch deployment deploy-test -p '{"spec": {"template": {"spec": {"containers": [{"name": "myapp", "image": "soscscs/myapp:v1"}]}}}}'

存储卷挂载点目录** 。

创建使用动态PV

1)准备好存储设备和共享目录;

2)如果是外置存储卷插件,需要先创建serviceaccount账户(Pod使用的账户)和做RBAC授权(创建角色授予相关资源对象的操作权限,再将账户与角色进行绑定),使sa账户具有对PV PVC StorageClass等资源的操作权限;

3)准备yaml配置文件创建外置存储卷插件的Pod,设置sa账户作为Pod的用户,并设置相关的环境变量(比如存储卷插件名称);

4)创建StorageClass(简称SC)资源,provisioner自动设置为存储卷插件名称 ;

以上操作是一劳永逸的,之后只需要创建PVC资源时引用StorageClass就可以自动调用存储卷插件动态创建PV资源了

5)准备yaml配置文件创建PVC资源,设置 访问模式、空间大小 storageClassName指定SC资源名称等来动态创建PV资源并绑定PV;

6)创建Pod资源挂载PVC存储卷,设置存储卷类型为 persistentVolumeClaim ,并在容器配置中定义存储卷挂载点目录。

通过陈述式管理资源配置的方式 修改或添加资源对象的配置
kubectl patch <资源类型> <资源名称> -p '{"第一层字段": {"第二层字段": {....}}}'

kubectl patch deployment deploy-test -p '{"spec": {"replicas": 0}}'
kubectl patch deployment deploy-test -p '{"spec": {"template": {"spec": {"containers": [{"name": "myapp", "image": "soscscs/myapp:v1"}]}}}}'

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

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

相关文章

为React Ant-Design Table增加字段设置 | 京东云技术团队

最近做的几个项目经常遇到这样的需求&#xff0c;要在表格上增加一个自定义表格字段设置的功能。就是用户可以自己控制那些列需要展示。 在几个项目里都实现了一遍&#xff0c;每个项目的需求又都有点儿不一样&#xff0c;迭代了很多版&#xff0c;所以抽时间把这个功能封装了…

用script去做前端html表格分页/排序

前言: 掘弃掉与后端交互做分页和互导,有利有弊吧; 在小数据的时候,如果不停来回朝服务端发送请求,会造成堵塞.于是,放弃了之前的前后端ajax方式去请求分页表格,使用script去弄一个,降低服务器的压力; 整体思路图: 代码构造: {% extends "order_header_same.html" …

​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第9章 软件可靠性基础知识&#xff08;P320~344&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

什么是美国服务器,有哪些优势,适用于什么场景?

​  在互联网发展的过程中&#xff0c;服务器扮演着至关重要的角色。而美国作为全球信息技术的中心&#xff0c;其服务器在全球范围内受到广泛关注。  美国服务器是指在美国本土机房搭建并运行的服务器。其拥有带宽大、优质硬件、售后运维好、位置优越、数据安全性高以及免备…

C/C++输出整数部分 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C输出整数部分 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C输出整数部分 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个双精度浮点数f&#xff0c; 输出其整…

MapApp 地图应用

1. 简述 1.1 重点 1&#xff09;更好地理解 MVVM 架构 2&#xff09;更轻松地使用 SwiftUI 框架、对齐、动画和转换 1.2 资源下载地址: Swiftful-Thinking:https://www.swiftful-thinking.com/downloads 1.3 项目结构图: 1.4 图片、颜色资源文件图: 1.5 启动图片配置图: 2. Mo…

腾讯云服务器多少钱一年?腾讯云服务器88元一年,附优惠购买入口

腾讯云服务器可以以低至88元一年的价格购买&#xff01;这个价格可以说是非常实惠。现在&#xff0c;让我们一起来了解腾讯云服务器的价格以及如何购买优惠的服务器。 如何购买88元一年的腾讯云服务器&#xff1f; 购买腾讯云服务器非常简单&#xff0c;只需按照以下步骤&…

SpringBoot实现IP地址归属地查询

SpringBoot实现IP地址归属地查询 功能特性 标准化的数据格式 每个 IP 数据段的 region 信息都固定了格式&#xff1a; 国家|区域|省份|城市|ISP&#xff0c;只有中国的数据绝大部分精确到了城市&#xff0c;其他国家部分数据只能定位到国家&#xff0c;后前的选项全部是 0。…

聊一聊前端面临的安全威胁与解决对策

前端是用户在使用您的网站或Web应用程序时首先体验到的东西。如果您的Web应用程序的前端受到侵害&#xff0c;它可能会影响整个布局&#xff0c;并造成糟糕的用户体验&#xff0c;可能难以恢复。集成前端安全变得越来越重要&#xff0c;本文将指导您通过可以应用于保护您的Web应…

基于SSM的教学管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

腾讯云服务器价格表查询,腾讯云服务器怎么买便宜?

你是否需要搭建一个属于自己的网站&#xff0c;但是又不知道该如何选择和购买服务器&#xff1f;腾讯云服务器价格表查询&#xff0c;让你轻松了解各款服务器的价格及配置信息&#xff0c;帮助你选择最合适的服务器。同时&#xff0c;我们还为你提供了腾讯云服务器的优惠购买入…

利用jquery对HTML中的名字进行替代

想法&#xff1a;将网页中经常要修改的名字放在一个以jquery编写的js文件中&#xff0c;如果需要修改名字&#xff0c;直接修改js文件中的名字即可。 新建name_07.html文件&#xff0c;写入下面的代码&#xff1a; <!DOCTYPE html> <html> <head><meta …

【docker启动的Jenkins时,遇到时区问题处理】

1、查看容器中的时区 [rootlocalhost jenkins]# docker exec -it jenkins cat /etc/timezone Etc/UTC而本地使用的是Asia/shanghai [rootlocalhost jenkins]# timedatectl | grep Time zoneTime zone: n/a (CST, 0800)###查看 [rootlocalhost jenkins]# cd /usr/share/zoneinf…

UnitTest + Selenium 完成在线加法器自动化测试

1. 任务概述 利用 UnitTest 与 Selenium 编写自动化用例&#xff0c;测试在线加法器中的整数单次加法功能【如123 】 人工操作流程&#xff08;测试 12 是否等于 3&#xff09;&#xff1a; 打开在线加法器点击按钮1&#xff0c;再点击按钮&#xff0c;再点击按钮2&#xff0c…

opencv(2): 视频采集和录制

视频采集 相关API VideoCapture()cap.read()&#xff1a; 返回两个值&#xff0c;第一个参数&#xff0c;如果读到frame&#xff0c;返回 True. 第二个参数为相应的图像帧。cap.release() VideoCapture cv2.VideoCapture(0) 0 表示自动检测&#xff0c;如果在笔记本上运行&…

PHP写一个电商 Api接口需要注意哪些?考虑哪些?

随着互联网的飞速发展&#xff0c;前后端分离的开发模式越来越流行。编写一个稳定、可靠和易于使用的 API 接口是现代互联网应用程序的关键。本文将介绍在使用 thinkphp6 框架开发 电商API 接口时需要注意的要点和考虑的问题&#xff0c;并提供详细的逻辑步骤和代码案例。 1. …

Dubbo协议详解

前言特点应用场景Dubbo协议示例Dubbo协议的不足拓展 前言 Dubbo协议是一种高性能、轻量级的开源RPC框架&#xff0c;主要设计目的是解决分布式系统中服务调用的一些常见问题&#xff0c;例如服务负载均衡、服务注册中心、服务的远程调用等。它支持多种语言&#xff0c;例如Jav…

人工智能基础_机器学习038_中国人寿保费预测(EDA数据探索)_导包_数据探索_---人工智能工作笔记0078

注意 EDA是Exploratory Data Analysis(探索性数据分析)的缩写,它是一种统计分析方法,旨在了解数据的基本特征,并发现数据中的规律和模式。EDA通常是数据分析流程的开始阶段,主要使用可视化工具和统计指标来描述数据的基本特征,如数据的分布、中位数、均值、方差等。通过…

pip 问题

升级pip命令&#xff1a; python -m pip install --upgrade pippip不能下载pytorch&#xff1a; 这个问题我一直没解决。不知道有哪位大佬可以留言给我。把whl文件下载到本地也没有&#xff0c;pip不会进行本地文件夹搜索。

用归并排序算法merge_sort( )求解 逆序对的数量 降低时间复杂度为 nlogn

题目简述 给定一个序列有n个数&#xff0c;求n个数中逆序对的个数&#xff0c;逆序对的定义&#xff1a;i < j && a[i] > a[j]。 输入格式 第一行包含一个整数n。 第二行包含 n 个整数&#xff08;所有整数均在1~1e9范围内&#xff09;&#xff0c;表示整数数…