k8s StorageClass 存储类

文章目录

  • 一、概述
    • 1、StorageClass 对象定义
    • 2、StorageClass YAML 示例
  • 二、StorageClass 字段
    • 1、provisioner(存储制备器)
      • 1.1、内置制备器
      • 1.2、第三方制备器
    • 2、reclaimPolicy(回收策略)
    • 3、allowVolumeExpansion(允许卷扩展)
    • 4、mountOptions(挂载选项)
    • 5、volumeBindingMode(卷绑定模式)
      • 5.1、Immediate
      • 5.2、WaitForFirstConsumer
    • 6、allowedTopologies(允许的拓扑结构)
      • 6.1、示例
    • 7、parameters(存储参数)
      • 7.1、示例
      • 7.2、存储参数(AWSElasticBlockStore)
    • 8、设置默认的 StorageClass(storageclass.kubernetes.io/is-default-class)
      • 8.1、示例
      • 8.2、修改已有的 StorageClass
        • 8.2.1、将存在的 SC 设置为默认
        • 8.2.2、将存在的 SC 设置为非默认
  • 三、实例 -- 使用 NFS 类型的 StorageClass 动态创建 PV
    • 1、配置 NFS 服务端
      • 1.1、master 节点安装 nfs-utils 包
      • 1.2、master 节点创建共享目录
      • 1.3、编辑/etc/exports文件
      • 1.4、应用新的导出设置
      • 1.5、重启并设置 NFS 开机自启
      • 1.6、检查 NFS 共享
    • 2、配置 NFS 客户端
      • 2.1、安装 nfs-utils 包
      • 2.2、创建目录挂载 NFS 共享
        • 2.2.1、卸载错误的挂载点
      • 2.3、重启并设置 NFS 开机自启
      • 2.4、系统启动自动挂载 NFS 共享(非必要)
      • 2.5、查看挂载状态
    • 3、创建存储类
    • 4、创建 RBAC 权限
    • 5、创建 provisioner
    • 6、创建 PVC
    • 7、观察 PV 是否动态创建
    • 8、创建使用同一 PVC 的多个 Pod
    • 9、向共享存储写入数据
    • 10、从另一个 Pod 读取数据
    • 11、查看 nfs 服务端与客户端的共享目录
      • 11.1、PV 目录创建的流程
      • 11.2、PV 目录的结构
    • 12、修改 NFS 服务器共享目录内容查看容器内部变化
  • 四、实例 -- 动态创建 PVC 和 PV
    • 1、创建 Headless Service
    • 2、创建 StatefulSet
    • 3、观察 Pod状态
    • 4、观察到 PVC 与 PV 已经动态创建并相互绑定了
    • 5、每一个 Pod 都会通过绑定 PVC 获取一块独立的 PV

一、概述

集群级别资源,StorageClass 是 Kubernetes 中的一种资源对象,它定义了创建 Persistent Volume (PV) 的策略和方法。StorageClass 主要用于实现 PV 的动态供应,这意味着当用户创建了一个 Persistent Volume Claim (PVC) 时,Kubernetes 会根据所指定的 StorageClass 自动创建一个符合要求的 PV 并将其绑定到 PVC 上

StorageClass 作为对存储资源的抽象定义,对用户设置的 PVC 申请屏蔽后端存储的细节,一方面减少了用户对于存储资源细节的关注,另一方面减轻了管理员手工管理 PV 的工作,由系统自动完成 PV 的创建和绑定,实现动态的资源供应。基于 StorageClass 的动态资源供应模式将逐步成为云平台的标准存储管理模式。

1、StorageClass 对象定义

StorageClass 资源对象的定义主要包括:名称、后端存储的提供者 (provisioner)、后端存储的相关参数配置(parameters)和回收策略(reclaimPolicy)、卷绑定模式(volumeBindingMode)

  • StorageClass 的名称很重要,将在创建 PVC 时引用,管理员应该准确命名具有不同存储特性的 StorageClass。

  • StorageClass 一旦被创建,则无法修改,如需更改,则只能删除原 StorageClass 资源对象并重新创建。

2、StorageClass YAML 示例

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:# 存储类的名称,用户在 PVC 中引用name: example-storage-classstorageclass.kubernetes.io/is-default-class: "true"  # 设置为默认的 StorageClass
# 动态制备器的名称,需要与已安装的制备器匹配
provisioner: kubernetes.io/aws-ebs # 例子中使用的是 AWS EBS 制备器
# reclaimPolicy 定义了当 PVC 被删除时,PV 应该如何处理
reclaimPolicy: Delete # 可选值为 Retain 或 Delete
# 允许卷扩展
allowVolumeExpansion: true # 可选值为 true 或 false
# 定义了卷绑定到 Pod 的模式
volumeBindingMode: Immediate # 可选值为 Immediate 或 WaitForFirstConsumer
# 定义了存储系统需要的参数,这些参数会传递给制备器
parameters:# 存储类型,根据制备器和存储系统的要求设置type: gp2 # AWS EBS 的例子,对于其他系统可能有不同的值# 存储 IOPS 性能,某些存储系统可能需要这个参数iopsPerGB: "10" # 例子,具体值根据需求和制备器支持设置# 存储的最小 IOPS 值,某些存储系统可能需要这个参数minimumIOPS: "1000" # 例子,具体值根据需求和制备器支持设置# 存储的最大 IOPS 值,某些存储系统可能需要这个参数maximumIOPS: "20000" # 例子,具体值根据需求和制备器支持设置# 存储的加密选项,某些存储系统可能支持加密encrypted: "true" # 例子,具体值根据需求和制备器支持设置# 存储的区域,对于跨区域存储系统可能需要这个参数availabilityZone: "us-east-1a" # 例子,具体值根据制备器和存储系统的要求设置# 存储的性能等级,某些存储系统可能提供不同的性能等级performance: "high" # 例子,具体值根据制备器和存储系统的要求设置
# 定义了挂载选项,这些选项会在 PV 被挂载到节点时使用
mountOptions:- debug # 例子,具体值根据需求设置,可能包括 "debug", "defaults", "ro" 等# - other-option # 可以添加额外的挂载选项
# 允许的拓扑约束,定义了存储可以被哪些节点访问
allowedTopologies:- matchLabelExpressions:- key: topology.kubernetes.io/regionvalues:- us-east-1- key: topology.kubernetes.io/zonevalues:- us-east-1a

storageclass

二、StorageClass 字段

1、provisioner(存储制备器)

provisioner 指定了用于动态创建 PersistentVolume (PV) 的制备器(Provisioner)。制备器是一个插件,它负责在后端存储系统中根据 PersistentVolumeClaim (PVC) 的请求来创建存储资源,不同的存储插件支持不同的存储后端和服务提供商。当 PVC 被创建并且与之关联的 StorageClass 指定了一个制备器时,Kubernetes 会调用这个制备器来自动创建相应的 PV。

卷插件内置制备器配置示例
AWSElasticBlockStoreAWS EBS
AzureFileAzure文件(已弃用)
AzureDiskAzure Disk
CephFS--
CinderOpen Stack Cinder
FC--
FlexVolume--
GCEPersistentDiskgcePD
GlusterfsGlusterFS
iSCSI--
Local-Local
NFS-NFS
PortworxVolumeportworx-volume
RBDceph-rbd
VsphereVolumeVsphere

1.1、内置制备器

Kubernetes 内置支持的 Provisioner 的命名都以 “kubernetes.io/” 开头

  • kubernetes.io/aws-ebs:用于在 AWS 上创建 Elastic Block Store (EBS) 卷。
  • kubernetes.io/azure-disk:用于在 Azure 上创建磁盘。
  • kubernetes.io/gce-pd:用于在 Google Cloud Platform (GCP) 上创建持久磁盘。
  • kubernetes.io/cinder:用于在 OpenStack 上创建 Cinder 卷。

1.2、第三方制备器

为了符合 StorageClass 的用法,自定义 Provisioner 需要符合存储卷的开发规范,外部存储供应商的作者对代码、提供方式、运行方式、存储插件(包括Flex)等具有完全的自由控制权。

代码仓库 kubernetes-sigs/sig-storage-lib-external-provisioner 包含一个用于为外部制备器编写功能实现的类库。你可以访问代码仓库 kubernetes-sigs/sig-storage-lib-external-provisioner 了解外部驱动列表。

例如,对NFS类型,Kubernetes没有提供内部的Provisioner,但可以使用外部的Provisioner。也有许多第三方存储提供商自行提供外部的Provisioner。

2、reclaimPolicy(回收策略)

通过动态资源供应模式创建的PV将继承在StorageClass资源对象上设置的回收策略,配置字段名称为“reclaimPolicy“,可以设置的选项包括Delete(删除)和 Retain(保留)。

  • 如果StorageClass没有指定reclaimPolicy,则默认值为Delete。
  • 对于管理员手工创建的仍被StorageClass管理的PV,将使用创建PV时设置的资源回收策略。

3、allowVolumeExpansion(允许卷扩展)

PV 可以被配置为允许扩容,当 StorageClass 资源对象的 allowVolumeExpansion字段被设置为true时,将允许用户通过编辑PVC的存储空间自动完成PV的扩容。

下表描述了支持存储扩容的Volume类型和要求的Kubernetes最低版本:

支持存储扩容的 Volume 类型Kubernetes 最低版本
gcePersistentDisk1.11
awsElasticBlock Store1.11
Cinder1.11
glusterfs1.11
RBD1.11
Azure File1.11
Azure Disk1.11
Portworx1.13
FlexVolume1.14(Alpha)
CSI1.16(Beta)

此功能仅可用于扩容卷,不能用于缩小卷。

4、mountOptions(挂载选项)

通过StorageClass资源对象的mountOptions字段,系统将为动态创建的PV设置挂载选项。

并不是所有 PV类型都支持挂载选项,如果 PV不支持但 StorageClass 设置了该字段,则 PV将会创建失败。另外,系统不会对挂载选项进行验证,如果设置了错误的选项,则容器在挂载存储时将直接失败。

5、volumeBindingMode(卷绑定模式)

StorageClass 资源对象的 volumeBindingMode 字段设置用于控制何时将 PVC 与动态创建的 PV 绑定。

目前支持的绑定模式包括: Immediate 和 WaitForFirstConsumer。

5.1、Immediate

存储绑定模式的默认值为 Immediate,表示当一个PersistentVolumeClaim (PVC)创建出来时,就动态创建PV并进行PVC与PV的绑定操作。

需要注意的是,对于拓扑受限 (Topology-limited) 或无法从全部Node访问的后端存储,将在不了解Pod调度需求的情况下完成PV的绑定操作,这可能会导致某些Pod无法完成调度。

5.2、WaitForFirstConsumer

WaitForFirstConsumer绑定模式表示PVC与PV的绑定操作延迟到第一个使用 PVC的Pod创建出来时再进行。

系统将根据Pod的调度需求,在Pod所在的Node上创建PV,这些调度需求可以通过以下条件(不限于)进行设置:

  • Pod对资源的需求

  • Node Selector

  • Pod亲和性和反亲和性设置

  • Taint和Toleration设置

目前支持 WaitForFirstConsumer 绑定模式的存储卷包括:

  • AWSElasticBlockStore
  • AzureDisk
  • GCEPersistentDisk.

另外,有些存储插件通过预先创建好的PV绑定支持WaitForFirstConsumer模式,比如:

  • AWSElasticBlockStore
  • AzureDisk
  • GCEPersistentDisk
  • Local

6、allowedTopologies(允许的拓扑结构)

在使用WaitForFirstConsumer模式的环境中,如果仍然希望基于特定拓扑信息(Topology)进行PV绑定操作,则在StorageClass的定义中还可以通过 allowedTopologies字段进行设置。

6.1、示例

下面的例子通过 matchLabelExpressions 设置目标 Node 的标签选择条件 (zone=us-central1-a或 us-central1-b) PV 将在满足这些条件的 Node 上允许创建

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: standard
provisioner: kubernetes.io/example
parameters:type: pd-standard
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:- key: topology.kubernetes.io/zonevalues:- us-central-1a- us-central-1b

7、parameters(存储参数)

后端存储资源提供者的参数设置,不同的 Provisioner 可能提供不同的参数设置。某些参数可以不显示设定,Provisioner 将使用其默认值。

目前 StorageClass 资源对象支持设置的存储参数最多为 512个,全部 key 和 value 所占的空间不能超过 256KiB。

7.1、示例

下面举常见存储提供商(Provisioner)提供的 StorageClass 存储参数示例(以AWSElasticBlockStore存储卷为例子):

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:csi.storage.k8s.io/fstype: xfstype: io1iopsPerGB: "50"encrypted: "true"
allowedTopologies:
- matchLabelExpressions:- key: topology.ebs.csi.aws.com/zonevalues:- us-east-2c

7.2、存储参数(AWSElasticBlockStore)

AWS EBS 存储参数

AWS EBS 存储参数

  • type (必需)

    • 定义 EBS 卷的存储类型(默认值gp3)。例如:
      • gp2:通用目的 SSD
      • io1:提供高 IOPS 的 SSD
      • io2:适用于需要大量 IOPS 的应用程序的新一代 SSD
      • st1:通过 HDD 存储优化的卷
      • sc1:通过冷 HDD 存储优化的卷
  • iopsPerGB (可选,仅当 type 为 io1 或 io2 时有效)

    • 定义每个 GiB 提供的 IOPS 数量。
    • 例如,如果 type 为 io1 并且 iopsPerGB 设置为 10,则 100 GiB 的卷将提供 1000 IOPS。
  • iops (可选,仅当 type 为 io1 时有效)

    • 直接定义卷的 IOPS 总数。例如,iops: “1000” 表示卷将提供 1000 IOPS。
  • throughput (可选,仅当 type 为 st1 时有效)

    • 定义卷的吞吐量,以 MiB/s 为单位。例如,throughput: “500” 表示卷的吞吐量为 500 MiB/s。
  • encrypted (可选)

    • 布尔值,指示是否应该加密 EBS 卷。例如,encrypted: “true”。
  • kmsKeyId (可选)

    • 指定用于加密 EBS 卷的 KMS 密钥 ID。例如,kmsKeyId: “arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab”。
  • fsType (可选)

    • 定义文件系统类型。例如,fsType: “ext4”。
  • volumeSize (可选)

    • 定义请求的卷大小(以 GiB 为单位)。例如,volumeSize: “100” 表示请求 100 GiB 的卷。
  • availabilityZone (可选)

    • 定义 EBS 卷应该创建在哪个可用区。例如,availabilityZone: “us-west-2a”。
  • multiAttachEnabled (可选)

    • 布尔值,指示是否启用多附加。例如,multiAttachEnabled: “true” 允许卷同时附加到多个实例。
  • snapshotId (可选)

    • 定义用于创建 EBS 卷的快照 ID。例如,snapshotId: “snap-0123456789abcdef0”。
  • tags (可选)

    • 定义一组键值对,用于标记 EBS 卷。例如:

    • tags:- key: "project"value: "myproject"- key: "owner"value: "myteam"
      

8、设置默认的 StorageClass(storageclass.kubernetes.io/is-default-class)

在创建 SC 的 YAML 文件时,需要在 metadata 部分添加一个注解,以标记该 SC 为默认。

8.1、示例

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: low-latencyannotations:storageclass.kubernetes.io/is-default-class: "false"
provisioner: csi-driver.example-vendor.example
reclaimPolicy: Retain # 默认值是 Delete
allowVolumeExpansion: true
mountOptions:- discard # 这可能会在块存储层启用 UNMAP/TRIM
volumeBindingMode: WaitForFirstConsumer
parameters:guaranteedReadWriteLatency: "true" # 这是服务提供商特定的

8.2、修改已有的 StorageClass

8.2.1、将存在的 SC 设置为默认
kubectl patch storageclass <sc-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
8.2.2、将存在的 SC 设置为非默认
kubectl patch storageclass <sc-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

如果你在集群中的多个 StorageClass 上将 storageclass.kubernetes.io/is-default-class 注解设置为 true,然后创建一个未设置 storageClassName 的 PersistentVolumeClaim (PVC), Kubernetes 将使用最近创建的默认 StorageClass。

三、实例 – 使用 NFS 类型的 StorageClass 动态创建 PV

角色主机名ip地址
nfs 服务端 + master 节点k8s-master1192.168.112.10
nfs 客户端 + node 节点k8s-node1192.168.112.20
nfs 客户端 + node 节点k8s-node2192.168.112.30

1、配置 NFS 服务端

1.1、master 节点安装 nfs-utils 包

yum install -y nfs-utils

1.2、master 节点创建共享目录

mkdir -pv /data/nfs

image-20240924155320111

1.3、编辑/etc/exports文件

echo "/data/nfs 192.168.112.0/24(rw,sync,no_root_squash)" > /etc/exports

image-20240924155351594

1.4、应用新的导出设置

exportfs -arv

image-20240924155422292

1.5、重启并设置 NFS 开机自启

systemctl restart nfs && systemctl enable nfs

image-20240924155455473

1.6、检查 NFS 共享

showmount -e localhost

image-20240924155520947

2、配置 NFS 客户端

所有 node 节点

2.1、安装 nfs-utils 包

yum install -y nfs-utils

2.2、创建目录挂载 NFS 共享

mkdir -pv /mnt/nfsmount -t nfs 192.168.112.10:/data/nfs /mnt/nfs

image-20240924155629964

image-20240924155646500

2.2.1、卸载错误的挂载点

如果在执行 mount -t nfs 命令时出现了错误,比如使用了错误的参数或者路径,你可以通过卸载当前的挂载点然后再重新挂载来修正错误。

  • 确认当前的挂载状态

    • 使用 mount 命令查看当前的所有挂载情况,找到错误挂载的条目。

    • mount
      
  • 卸载错误的挂载点

    • # 知道错误的挂载点
      sudo umount /mnt/nfs
      
    • # 知道 nfs 服务端 IP 地址和共享目录路径
      sudo umount 192.168.112.10:/data/nfs
      
  • 卸载时遇到设备/文件正在使用中

    • umount -f /mnt/nfs
      
    • 强制卸载可能会导致数据丢失,因此只有在确定没有数据写入的情况下才这样做。

2.3、重启并设置 NFS 开机自启

systemctl restart nfs && systemctl enable nfs

image-20240924155723058

image-20240924155742122

2.4、系统启动自动挂载 NFS 共享(非必要)

echo '192.168.112.10:/data/nfs /mnt/nfs nfs defaults 0 0' >> /etc/fstab

2.5、查看挂载状态

mount | grep 192.168.112.10

image-20240924155822568

image-20240924155839917

3、创建存储类

cat >> nfs-storage.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-storagenamespace: defaultlabels:environment: test
provisioner: fuseim.pri/ifs
reclaimPolicy: Retain
volumeBindingMode: Immediate
EOF
kubectl apply -f nfs-storage.yaml

image-20240924160002838

4、创建 RBAC 权限

cat >> rbac.yaml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
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: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: default                                      
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: default                                        
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: default
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
EOF
kubectl apply -f rbac.yaml

image-20240924160138731

5、创建 provisioner

部署 NFS Client Provisioner,这是一个 Kubernetes 外部存储插件,用于动态创建 NFS PV。

cat >> nfs-provisioner.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisionernamespace: default
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: fuseim.pri/ifs       # 这里必须要填写storageclass中的PROVISIONER名称信息一致- name: NFS_SERVERvalue: 192.168.112.10       # 指定NFS服务器的IP地址- name: NFS_PATHvalue: /data/nfs            # 指定NFS服务器中的共享挂载目录volumes:- name: nfs-client-root           # 定义持久化卷的名称,必须要上面volumeMounts挂载的名称一致nfs:server: 192.168.112.10        # 指定NFS所在的IP地址path: /data/nfs               # 指定NFS服务器中的共享挂载目录
EOF
kubectl apply -f nfs-provisioner.yaml

image-20240924160318664

6、创建 PVC

cat >> nfs-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nginx-pvcnamespace: defaultlabels:environment: testapp: nginx
spec:storageClassName: nfs-storageaccessModes:- ReadWriteManyresources:requests:storage: 5Mi
EOF
kubectl apply -f nfs-pvc.yaml

image-20240924160452587

7、观察 PV 是否动态创建

kubectl get pvc,pv,sc

image-20240924160547824

发现使用 NFS Client Provisioner 可以动态创建 pv 并与 PVC 绑定处于 Bound 状态

8、创建使用同一 PVC 的多个 Pod

cat >> nfs-pod1.yaml << EOF
apiVersion: v1
kind: Pod
metadata:name: nfs-pod1
spec:containers:- name: container1image: nginx:1.16.0volumeMounts:- name: shared-datamountPath: /usr/share/nginx/htmlvolumes:- name: shared-datapersistentVolumeClaim:claimName: nginx-pvc
EOF
cat >> nfs-pod2.yaml << EOF
apiVersion: v1
kind: Pod
metadata:name: nfs-pod2
spec:containers:- name: container2image: nginx:1.16.0volumeMounts:- name: shared-datamountPath: /usr/share/nginx/htmlvolumes:- name: shared-datapersistentVolumeClaim:claimName: nginx-pvc
EOF
kubectl apply -f nfs-pod1.yaml -f nfs-pod2.yaml

image-20240924161233878

9、向共享存储写入数据

kubectl exec -it nfs-pod1 -- /bin/bash
echo "hello from nfs-pod1" > /usr/share/nginx/html/index.html
exit

10、从另一个 Pod 读取数据

kubectl exec -it nfs-pod2 -- /bin/bash
cat /usr/share/nginx/html/index.html
exit

image-20240924161407667

11、查看 nfs 服务端与客户端的共享目录

tree /data/nfs
tree /mnt/nfs

image-20240924162347114

image-20240924162410192

image-20240924162429327

这个新出现的目录(PV 目录) default-nginx-pvc-pvc-c8a8b825-1577-4f76-ba1f-a1302941b333 用于映射 PersistentVolume (PV) 到 NFS 服务器上的具体路径

11.1、PV 目录创建的流程

  • 创建 PVC:
    • 当你创建 PVC 时,Kubernetes 会根据 StorageClass 自动创建 PV。
  • Provisioner 创建 PV:
    • Provisioner 会在 NFS 服务器上的共享目录下创建一个新目录,目录名称包含了 PVC 的名称和 UUID。
  • 挂载到 Pod:
    • 创建的 PV 会被挂载到 Pod 中指定的路径。

11.2、PV 目录的结构

/<共享目录>/<命名空间>-<PVC名称>-<PV名称>
  • 共享目录:
    • 这是你在 NFS 服务器上创建并共享出去的目录,比如 nfs 服务端的 /data/nfs 以及 nfs 客户端的 /mnt/nfs
  • 命名空间:
    • 这是 Kubernetes 中的一个逻辑分组,用于隔离不同的应用程序和服务。PVC 所属的命名空间名称。
  • PVC 名称:
    • 这是在 Kubernetes 中创建的 PersistentVolumeClaim 的名称。
  • PV 名称:
    • 这是根据 PVC 动态创建出来的 PersistentVolume 的名称,通常是一个带有 UUID 的字符串。
kubectl get pvc nginx-pvc -o custom-columns='PVC-NAMESPACE:.metadata.namespace,PVC-NAME:.metadata.name'kubectl get pv pvc-c8a8b825-1577-4f76-ba1f-a1302941b333 -o custom-columns='PV-NAME:.metadata.name'

image-20240924165542755

12、修改 NFS 服务器共享目录内容查看容器内部变化

可以发现也是同步更新的

cd /data/nfs/default-nginx-pvc-pvc-c8a8b825-1577-4f76-ba1f-a1302941b333echo "hello from nfs-server" > index.htmlkubectl get pods -o widecurl 10.244.1.3curl 10.244.2.8

image-20240924170701945

四、实例 – 动态创建 PVC 和 PV

1、创建 Headless Service

cat >> nginx-headless.yaml << EOF
apiVersion: v1
kind: Service
metadata:name: nginx-headlesslabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
EOF
kubectl apply -f nginx-headless.yamlkubectl get svc -l app=nginx -o wide

image-20240924192752244

2、创建 StatefulSet

cat >> sts.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:serviceName: "nginx"replicas: 5selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.16.0ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates: # 通过模板化方式绑定- metadata:name: www # 指定pvc的名字annotations:volume.beta.kubernetes.io/storage-class: "nfs-storage" # 只指定了storageClassspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 5Mi
EOF
kubectl apply -f sts.yaml

3、观察 Pod状态

由于是 statefulset 控制器所以 pod 是按顺序创建的

kubectl get pods -l app=nginx -w

image-20240924192857717

4、观察到 PVC 与 PV 已经动态创建并相互绑定了

kubectl get pvc -l 'app=nginx,environment!=test'
kubectl get pv | grep -v "default/nginx-pvc"

image-20240924193217284

5、每一个 Pod 都会通过绑定 PVC 获取一块独立的 PV

kubectl get pod web-0 -o custom-columns='PVC-NAME:.spec.volumes[*].persistentVolumeClaim.claimName'kubectl get pod web-1 -o custom-columns='PVC-NAME:.spec.volumes[*].persistentVolumeClaim.claimName'kubectl get pod web-2 -o custom-columns='PVC-NAME:.spec.volumes[*].persistentVolumeClaim.claimName'kubectl get pod web-3 -o custom-columns='PVC-NAME:.spec.volumes[*].persistentVolumeClaim.claimName'kubectl get pod web-4 -o custom-columns='PVC-NAME:.spec.volumes[*].persistentVolumeClaim.claimName'

image-20240924193309657

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

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

相关文章

SpringBoot项目创建

1. Spring 介绍 Spring的官网&#xff1a; https://spring.io Spring的官方提供很多开源的项目&#xff0c;我们可以点击上面的projects&#xff0c;看到spring家族旗下的项目&#xff0c; 按照流行程度排序为&#xff1a; Spring发展到今天已经形成了一种开发生态圈&#x…

腾讯云新开端口

检查防火墙设置 890 2024-09-30 20:47:18 netstat -tuln | grep 1213891 2024-09-30 20:47:49 ping 110.40.130.231892 2024-09-30 20:48:38 sudo firewall-cmd --zonepublic --add-port1213/tcp --permanent893 2024-09-30 20:48:51 sudo firewall-cmd --reload894 2024-…

K8S:开源容器编排平台,助力高效稳定的容器化应用管理

云计算de小白 Kubernetes&#xff08;简称K8s&#xff09;是一个开源容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。 K8S诞生于Google&#xff0c;基于其多年在生产环境运行容器的经验&#xff0c;目前已成为现代微服务架构和云原生应用的核心技术。 图…

MKV转MP4丨FFmpeg的简单命令使用——视频格式转换

MKV是一种视频封装格式&#xff0c;很好用&#xff0c;也是OBS的默认推荐录制格式&#xff0c;因为不会突然断电关机而导致整个视频录制文件丢失。 但是MKV无法直接导入PR中剪辑&#xff0c;最直接的方法是将MKV转换为MP4格式&#xff0c;最方便且安全无损的转换方法便是用FFmp…

[Notepad++] 文本编辑器的下载及详细安装使用过程(附有下载文件)

程序员常用的文本编辑器Notepad&#xff0c;用于修改配置文件等 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 解压文件&#xff0c;得到 双击exe文件 选择简体中文&#xff0c;点击OK 点击下一步 点击“我接受” 更改安装目录&#xff0c;不…

什么是 Apache Ingress

Apache Ingress 主要用于管理来自外部的 HTTP 和 HTTPS 流量&#xff0c;并将其路由到合适的 Kubernetes 服务。 容器化与 Kubernetes 是现代云原生应用程序的基础。Kubernetes 的主要职责是管理容器集群&#xff0c;确保它们的高可用性和可扩展性&#xff0c;同时还提供自动化…

针对考研的C语言学习(定制化快速掌握重点5)

顺序表 特点&#xff1a; 写代码主要就是增删改查&#xff01;&#xff01;&#xff01; 写代码的边界性非常重要以及考研插入和删除的位置都是从1开始&#xff0c;而数组下标是从0开始 【注】下标和位置的关系 线性表最重要的是插入和删除会涉及边界问题以及判断是否合法 …

vue仿chatGpt的AI聊天功能--大模型通义千问(阿里云)

vue仿chatGpt的AI聊天功能–大模型通义千问&#xff08;阿里云&#xff09; 通义千问是由阿里云自主研发的大语言模型&#xff0c;用于理解和分析用户输入的自然语言。 1. 创建API-KEY并配置环境变量 打开通义千问网站进行登录&#xff0c;登陆之后创建api-key&#xff0c;右…

CSS面试真题 part1

CSS面试真题 part1 1、说说你对盒子模型的理解2、谈谈你对BFC的理解3、什么是响应式设计&#xff1f;响应式设计的基本原理是什么&#xff1f;如何做&#xff1f;4、元素水平垂直居中的方法有哪些&#xff1f;如果元素不定宽高呢&#xff1f;5、如何实现两栏布局&#xff0c;右…

目标检测——VOC2007数据集

目标检测入门code 文件目录 下载数据集——在官网下载VOC2007数据集 下载训练数据集 TRAIN data 下载测试数据集 TEST data 解压数据集 解压——训练数据集&#xff0c;在服务器上&#xff0c;目录为VOCdevkit 部分文件目录 全部文件总目录 解压——测试数据集 &#xff08;…

Unity 与虚幻引擎对比:两大游戏开发引擎的优劣分析

在游戏开发领域&#xff0c;Unity 和虚幻引擎&#xff08;Unreal Engine&#xff09;是两款最为知名且广泛使用的引擎。它们各有特点&#xff0c;适合不同类型的开发者和项目。在这篇博客中&#xff0c;我们将深入探讨这两大引擎的核心功能、适用场景、优缺点&#xff0c;以及如…

Python酷玩之旅_如何连接MySQL(mysql-connector-python)

前言 Python作为数据科学、机器学习等领域的必选武器&#xff0c;备受各界人士的喜爱。当你面对不同类型、存储于各类介质的数据时&#xff0c;第一时间是不是要让它亮个相&#xff1f;做个统计&#xff0c;画个图表&#xff0c;搞个报表… 等等。 正如Java中的JdbcDriver一样…

真正的Open AI ——LLaMA颠覆开源大模型

1. LLaMA 简介 LLaMA&#xff08;Large Language Model Meta AI&#xff09;是由Meta&#xff08;原Facebook&#xff09;推出的一个大型语言模型系列&#xff0c;旨在通过更小的模型规模和更少的计算资源&#xff0c;实现与其他主流语言模型&#xff08;如GPT&#xff09;相媲…

《后端程序猿 · Spring事务失效场景》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

2024/9/29周报

文章目录 摘要Abstract污水处理工艺流程整体介绍粗格栅细格栅曝气沉砂池提升泵房峰谷平策略 初沉池&#xff08;一级处理&#xff09;工作原理运行管理 氧化沟生化池&#xff08;二级处理&#xff09;二沉池工作原理运行参数 高效沉淀池功能与特点工作原理 深度处理&#xff08…

LeetCode 918. 环形子数组的最大和

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给定一个长度为 n 的环形整数数组 nums &#xff0c;返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上&#xff0c; nums[i] 的下一个元素是 nums[(i 1) % n…

防止错误输入!Excel单元格限制输入内容的三种有效方式

在Excel中&#xff0c;限制单元格输入内容可以帮助避免数据输入错误&#xff0c;确保数据的一致性和准确性。今天小编分享三种方法&#xff0c;可以轻松限制Excel单元格的输入内容&#xff0c;确保数据输入符合预期要求&#xff0c;一起来看看吧&#xff01; 方法一&#xff1a…

Register Two Point Sets 注册两个点集

文章目录 Register Two Point Sets 注册两个点集Visualize Gradient Descent 可视化梯度下降Hyperparameter Search 超参数搜索JensenHavrdaCharvatTsallisPointSetToPointSetMetricv4类说明 原文url: https://examples.itk.org/src/registration/metricsv4/registertwopointse…

【AI驱动TDSQL-C Serverless数据库技术实战】 AI电商数据分析系统——探索Text2SQL下AI驱动代码进行实际业务

目录 一、Text2SQL简介二、基于TDSQL-C Serverless的Text2SQL实战2.1、程序流程图2.2、实践流程2.2.1、配置TDSQL-C2.2.2、部署LLAMA模型2.2.3、本地依赖安装2.2.4、应用构建 2.3、运行效果 三、Text2SQL下的AI驱动 Text2SQL 是一种将自然语言查询转换为 SQL 查询的技术&#x…

中航资本:沪市主板代码以几开头?各板块开头代码是多少

各板块开始代码&#xff1a; 场内商场&#xff1a; 1、沪市主板&#xff1a;股票代码以600、601、603、605开始。 60开始的股票都是在上海证券交易所上市的股票。 600开始是上海证券交易所上市的一般股票&#xff0c;601开始的股票是主板股票&#xff0c;一般是大盘股蓝筹股…