当前位置: 首页 > news >正文

【k8s配置与存储--持久化存储(PV、PVC、存储类)】

1、PV与PVC 介绍

  • 持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。
  • 持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存)。同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以挂载为 ReadWriteOnce、ReadOnlyMany、ReadWriteMany 或 ReadWriteOncePod, 请参阅访问模式)。

在这里插入图片描述

2、生命周期

2.1 构建

2.1.1 静态构建

  • 集群管理员创建若干PV卷,这些卷对象带有直实存储的细节信息,并且对集群用户可用(可见)。PV卷对象存在于Kubernetes APl中,可供用户消费(使用)·

2.1.2 动态构建

  • 如果集群中已经有的PV无法满足PVC的需求,那么集群会根据PVC自动构建一个PV,该操作是通过StorageClass实现的。
  • 想要实现这个操作,前提是PVC必须设置StorageClass,否则会无法动态构建该PV,可以通过启用DefaultStorageClass来实现PV的构建。

2.2 绑定(PV和PVC如何使用?)

  • 当用户创建一个PVC对象后,主节点会监测新的PVC对象,并且寻找与之匹配的PV卷,找到PV卷后将二者绑定在一起。
  • 如果找不到对应的PV,则需要看PVC是否设置StorageClass来决定是否动态创建PV,若没有配置,PVC就会一致处于未绑定状态,直到有与之匹配的PV后才会申领绑定关系。

2.4 使用(POD和PVC如何使用?)

  • Pod将PVC当作存储卷来使用。集群会通过PVC找到绑定的PV,并为Pod挂载该卷。
  • Pod一旦使用PVC绑定PV后,为了保护数据,避免数据丢失问题,PV对象会受到保护,在系统中无法披删除。

2.5 回收策略

  • 当用户不再使用其存储卷时,他们可以从API中将PVC对象删除,从而允许该资源被回收再利用。PersistentVolume对象的回收策路告诉集群,当其被从申领中释放时如何处理该数据卷。
    目前,数据卷可以被Retained(保留)、Recycled(回收)或Deleted(除)。

2.5.1 保留(Retain)

  • 回收策路Retain使得用户可以主动回收资源。当PersistentVolumeClaim对象被删除时,PersistentVolume卷仍然存在,对应的数据卷被视为"已释放(released)"。由于卷上仍然存在这前一申领人的数据,该卷还不能用于其他申领。管理员可以通过下面的步家来手动回收该卷:
    • 1.侧除PersistentVolume对象。与之相关的、位于外部基础设施中的存储资产(伤如AWS EBS、GCE PD、Azure Disk或Cinder卷)在PV删除之后仍然存在。
    • 2.根据情况,手动清除所关联的存储资产上的数据。
    • 3.手动删除所关联的存档资产
  • 如果你希望重用该存储资产,可以基于存储资产的定义创建新的PersistentVolume卷对象。

2.5.2 删除(Delete)

  • 对于支持Delete回收策路的卷插件,册除动作会将PersistentVolume对象从Kubernetes中移除,同时也会从外部础设施(如AWS EBS、GCE PD、Azure Disk或Cinder卷)中移除所关联的存储资产。动态制备的卷会继承基StorageClass中设置的回收策略,该策路默认为Delete。管理员需要根据用户的期望来配置StorageClass: 否则PV卷被创建之后必须要被偏辑或者修补。

2.5.3 回收(Recycled)

  • 警告:回收策路Recycle已被废弃。取而代之的建议方案是使用动态制备。
  • 如果下层的卷插件支持,回收策路Recycle会在卷上执行一些基本的擦除 ( rm-f /thevolume/* )操作,之后允许该卷用于新的PVC申领。

3、PV

3.1 配置文件

apiVersion: v1
kind: PersistentVolume
metadata:name: pv-01
spec:capacity:storage: 5Gi  # PV的容量volumeMode: Filesystem #存储类型为文件系统accessModes: # 访问模式:ReadWriteOnce、ReadWriteMany、ReadonlyMany- ReadWriteMany # 可被单节点独写persistentVolumeReclaimPolicy: Retain  # 回收策略storageClassName: slow   #创建PV的存储类名,需要与pvc的相同mountOptions: # 加载配置- hard- nfsvers=4.1nfs: # 连接到nfspath: /data/nfs/rw/pv-01  # 存储路径server: 10.10.10.100   # nfs服务地址

3.2 创建这个pv资源

[root@k8s-master pv]# kubectl create -f pv-01.yaml
persistentvolume/pv-01 created

3.3 查看PV的状态

  • Availabel:空闲,未被绑定
  • Bound:已经被PVC绑定
  • Released:PVC被删除,资源已回收,但是PV未被重新使用
  • Failed:自动回收失败
[root@k8s-master pv]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-01   5Gi        RWX            Retain           Available           slow                    16s

4、PVC

4.1 配置文件

  • PVC和PV绑定的时候需要注意yaml中这几个参数都需要一一对应
  • spec.accessModes: # 权限需要和对应的pv相同
  • spec.volumeMode: # 数据卷类型需要和pv相同
  • spec.resources.requests.storage: # 数据卷大小只能小于等于pv的大小,大于pv的大小也是无法匹配的。
  • spec.storageClassName: # 设置的属性名字必须和pv相同
apiVersion: v1
kind: PersistentVolumeClaim  # 资源类w为PVC
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteMany # 权限需要与对应的pv相同volumeMode: Filesystemresources:requests:storage: 5Gi # 资源可以小于pv的,但是不能大于,如果大于就会匹配不到pvstorageClassName: slow # 名字需要与对应的pv相同
#    selector: # 使用选择器选择对应的pw
#      matchLabels:
#        release: "stable"
#      matchExpressions:
#        - {key:environment,operator:In,values:[dev]}

4.2 创建这个pvc资源

[root@k8s-master pv]# kubectl create -f pvc-01.yaml
persistentvolumeclaim/nfs-pvc created

4.3 查看PVC的状态

  • 这里可以看到pvc的状态是Bound,并且挂在的数据卷是pv-01,他的属性是RWX(可读可写可执行)
[root@k8s-master pv]# kubectl get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc   Bound    pv-01    5Gi        RWX            slow           6s

4.4 查看pv的状态

  • 可以看到PV的状态已经变为了Bound(已经被PVC绑定)。
[root@k8s-master pv]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
pv-01   5Gi        RWX            Retain           Bound    default/nfs-pvc   slow                    16m

4.5 pod和pvc进行绑定

4.5.1 创建pod配置文件

apiVersion: v1
kind: Pod
metadata:name: nfs-pvc-pod
spec:containers:- image: nginx:1.20name: nginx-pvcvolumeMounts:- mountPath: /usr/share/nginx/html   # 挂载到容器哪个目录name: nfs-pvc    # 挂载的数据卷的名字volumes:- name: nfs-pvcpersistentVolumeClaim: # 关联PVCclaimName: nfs-pvc   # 关联到那个pvc,填写这个pvc的名字

4.5.2 创建这个pod资源

[root@k8s-master pv]# kubectl create -f nfs-pvc-pod.yaml
pod/nfs-pvc-pod created

4.5.3 查看pod资源信息

[root@k8s-master pv]# kubectl get po   -o wide
NAME                           READY   STATUS      RESTARTS       AGE     IP          NODE          NOMINATED NODE   READINESS GATES
configfile-po                  0/1     Completed   0              21h     10.2.1.69   k8s-node-02   <none>           <none>
dns-test                       1/1     Running     2 (31h ago)    3d15h   10.2.1.58   k8s-node-02   <none>           <none>
emptydir-volume-pod            2/2     Running     34 (47m ago)   17h     10.2.1.72   k8s-node-02   <none>           <none>
fluentd-59k8k                  1/1     Running     1 (31h ago)    2d22h   10.2.2.34   k8s-node-01   <none>           <none>
fluentd-hhtls                  1/1     Running     1 (31h ago)    2d22h   10.2.1.59   k8s-node-02   <none>           <none>
host-volume-pod                1/1     Running     0              18h     10.2.1.71   k8s-node-02   <none>           <none>
nfs-pvc-pod                    1/1     Running     0              16s     10.2.1.73   k8s-node-02   <none>           <none>
nfs-volume-pod-1               1/1     Running     0              16h     10.2.2.41   k8s-node-01   <none>           <none>
nfs-volume-pod-2               1/1     Running     0              16h     10.2.2.42   k8s-node-01   <none>           <none>
nginx-deploy-6fb8d6548-8khhv   1/1     Running     24 (41m ago)   24h     10.2.1.67   k8s-node-02   <none>           <none>
nginx-deploy-6fb8d6548-fd9tx   1/1     Running     24 (41m ago)   24h     10.2.2.40   k8s-node-01   <none>           <none>

4.5.4 访问这个pod资源

  • 由于创建的这个pv资源目录中没有文件信息,所以访问nginx服务的时候显示403。
[root@k8s-master pv]# curl 10.2.1.73
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.2</center>
</body>
</html>

4.5.5 创建一个文件在pv共享目录中

[root@k8s-master pv]# echo "这个是个pvc挂载的文件"  >> /data/nfs/rw/pv-01/index.html

4.5.6 再次访问这个pod资源,显示出信息

[root@k8s-master pv]# curl 10.2.1.73
这个是个pvc挂载的文件

5、存储类 StorageClass

  • StorageClass 为管理员提供了描述存储"类"的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。 Kubernetes 本身并不清楚各种类代表的什么。这个类的概念在其他存储系统中有时被称为"配置文件"。

5.1 制备器 (Provisioner)

  • 制备器是干啥的?
    • 如果我们的服务越来越多,每次都需要先创建pv,然后创建pvc,最后创建资源。每次都得这么操作的话会很麻烦,k8s给我们提供了一种方式:制备器。
    • 通过制备器,k8s可以根据我们的资源动态创建pv。
  • 每个StorageClass都有一个制备器(Provisioner),用来决定使用哪个卷插件制备PV。

5.2 动态制备器案例

5.2.1 创建Storageclass的配置文件(nfs-storage-class.yaml)

apiversion: storage.k8s.io/vl
kind: Storageclass
metadata:name: managed-nfs-storage
provisioner: fuseim.pri/ifs  # 外部制备器提供者,编写为提供者的名称
parameters:archiveOnDelete: "false"  # 是否存档,false表示不存档,会删除oldPath下面的数据,true表示存档,会重命名路径
reclaimPolicy: Retain # 回收策略,默认为Delete可以配置为Retain
volumeBindingMode: Immediate   #  默认为Immediate,表示创建PVC立即进行绑定,只有 azuredisk 和 AWSelasticblockstore 支持其他值

5.2.2 创建provisioner的配置文件 (nfs-provisioner-depolyment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionernamespace: kube-systemLabels:app: nfs-client-provisioner
spec:replicas: 1strategy:type: Recreate  selector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app:nfs-cLient-provisionerspec:serviceAccountName: nfs-client-provisionercontaners:- name: nfs-client-provisionerimage: quay.io/external_storage/nfs-client-provisioner:LatestvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumes   # 数据卷挂在到容器内的路径env:- name: PROVISIONER_NAME value: fuseim.pri/ifs  - name: NFS_SERVERvalue: 10.10.10.100- name: NFS_PATH value: /data/nfs/rwvolumes: - name: nfs-client-rootnfs:server: 10.10.10.100path: /data/nfs/rw

5.2.3 创建provisioner的rbac配置文件 (nfs-provisioner-rbac.yaml)

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: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
- 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: kube-system
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-provisioner
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-provisioner
subjects:
- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: kube-system
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io

5.2.4 创建nginx应用的配置文件( nfs-sc-demo-statefulset.yaml)

---
apiVersion: v1
kind: Service
metadata:name: nginx-sclabels:app: nginx-sc
spec:type: NodePortports:- name: webport: 80protocol: TCPselector:app: nginx-sc
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: nginx-sc
spec:replicas: 1serviceName: "nginx-sc"selector:matchLabels:app: nginx-sctemplate:metadata:labels:app: nginx-scspec:containers:- image: nginxname: nginx-scimagePullPolicy: IfNotPresentvolumeMounts:- mountPath: /usr/share/nginx/html # 挂载到容器的哪个目录name: nginx-sc-test-pvc # 挂载哪个 volumevolumeClaimTemplates:- metadata:name: nginx-sc-test-pvcspec:storageClassName: managed-nfs-storageaccessModes:- ReadWriteManyresources:requests:storage: 1Gi
[root@k8s-master sc]# ll
总用量 16
-rw-r--r--. 1 root root 1155 227 20:20 nfs-provisioner-depolyment.yaml
-rw-r--r--. 1 root root 1460 227 20:18 nfs-provisioner-rbac.yaml
-rw-r--r--. 1 root root  907 227 20:23 nfs-sc-demo-statefulset.yaml
-rw-r--r--. 1 root root  154 227 20:22 nfs-storage-class.yaml

5.2.5 权限初始化 (provisioner-rbac)

[root@k8s-master sc]# kubectl apply  -f nfs-provisioner-rbac.yaml
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created

5.2.6 创建制备器 (provisioner)

[root@k8s-master sc]# kubectl apply  -f nfs-provisioner-depolyment.yaml
serviceaccount/nfs-client-provisioner created
deployment.apps/nfs-client-provisioner created[root@k8s-master sc]# kubectl get serviceaccounts     -n kube-system    | grep nfs
nfs-client-provisioner               0         2m18s[root@k8s-master sc]# kubectl get deployments.apps    -n kube-system
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
coredns                  2/2     2            2           7d22h
metrics-server           1/1     1            1           2d23h
nfs-client-provisioner   0/1     1            0           25s

5.2.7 创建存储类 (Storageclass)

[root@k8s-master sc]# kubectl apply  -f nfs-storage-class.yaml
storageclass.storage.k8s.io/managed-nfs-storage created
[root@k8s-master sc]# kubectl get sc
NAME                  PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage   fuseim.pri/ifs   Delete          Immediate           false                  6s

5.2.8 创建应用nginx资源

[root@k8s-master sc]# kubectl  create -f nfs-sc-demo-statefulset.yaml
service/nginx-sc created
statefulset.apps/nginx-sc created
[root@k8s-master sc]# kubectl get svc
NAME                       TYPE           CLUSTER-IP     EXTERNAL-IP         PORT(S)        AGE
csdn-svc-external-domian   ExternalName   <none>         www.lan-he.com.cn   <none>         2d7h
kubernetes                 ClusterIP      10.1.0.1       <none>              443/TCP        7d22h
nginx-sc                   NodePort       10.1.94.155    <none>              80:31819/TCP   7s
nginx-svc                  NodePort       10.1.224.211   <none>              80:31231/TCP   2d22h
nginx-svc-external         ClusterIP      10.1.63.181    <none>              80/TCP         2d17h
[root@k8s-master sc]# kubectl get  po
NAME                           READY   STATUS      RESTARTS       AGE
configfile-po                  0/1     Completed   0              23h
dns-test                       1/1     Running     2 (32h ago)    3d17h
emptydir-volume-pod            2/2     Running     38 (40m ago)   19h
fluentd-59k8k                  1/1     Running     1 (32h ago)    3d
fluentd-hhtls                  1/1     Running     1 (32h ago)    3d
host-volume-pod                1/1     Running     0              20h
nfs-volume-pod-1               1/1     Running     0              18h
nfs-volume-pod-2               1/1     Running     0              18h
nginx-deploy-6fb8d6548-8khhv   1/1     Running     26 (35m ago)   26h
nginx-deploy-6fb8d6548-fd9tx   1/1     Running     26 (35m ago)   26h
nginx-sc-0                     0/1     Pending     0              52s

5.2.9 pod和pvc的状态都是Pending,pv并没有被创建出来

# pod的状态是Pending
[root@k8s-master sc]# kubectl get po | grep -E 'NAME|nginx-sc'
NAME                           READY   STATUS      RESTARTS       AGE
nginx-sc-0                     0/1     Pending     0              6m34s#  pvc的状态也是Pending
[root@k8s-master sc]# kubectl get pvc
NAME                           STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS          AGE
nginx-sc-test-pvc-nginx-sc-0   Pending                                      managed-nfs-storage   7m59s#  pv是没有动态创建出来的
[root@k8s-master sc]# kubectl get pv
No resources found

5.2.10 查看下pod的日志

[root@k8s-master sc]# kubectl describe po nginx-sc-0
Name:             nginx-sc-0
Namespace:        default
Priority:         0
Service Account:  default
Node:             <none>
Labels:           app=nginx-sccontroller-revision-hash=nginx-sc-865bd98db8statefulset.kubernetes.io/pod-name=nginx-sc-0
Annotations:      <none>
Status:           Pending
IP:
IPs:              <none>
Controlled By:    StatefulSet/nginx-sc
Containers:nginx-sc:Image:        nginxPort:         <none>Host Port:    <none>Environment:  <none>Mounts:/usr/share/nginx/html from nginx-sc-test-pvc (rw)/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-2kv55 (ro)
Conditions:Type           StatusPodScheduled   False
Volumes:nginx-sc-test-pvc:Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)ClaimName:  nginx-sc-test-pvc-nginx-sc-0ReadOnly:   falsekube-api-access-2kv55:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type     Reason            Age    From               Message----     ------            ----   ----               -------Warning  FailedScheduling  8m57s  default-scheduler  0/3 nodes are available: 3 pod has unbound immediate PersistentVolumeClaims. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling.Warning  FailedScheduling  8m56s  default-scheduler  0/3 nodes are available: 3 pod has unbound immediate PersistentVolumeClaims. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling.

5.2.11 为啥没有创建出pv?

  • 这就涉及到一个版本的问题,目前使用的k8s的版本是1.25,刚才创建的制备器镜像(registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:latest )这个版本涉及到需要使用k8s的一个功能叫SelfLink,但是从k8s v1.20以后它就把这个功能给禁用了,出于对性能、api调用请求方向的考虑。
5.2.11.1 解决方案1----配置SelfLink
  • 修改api-server 配置文件:/etc/kuberetes/manifests/kube-apiserver.yaml
spec:containers:- command:- kube-apiserver:- ---feature-gates=RemoveSelfLink: =false   # 新增该行
  • 修改后重新应用改配置
  • kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
5.2.11.2 解决方案2----修改镜像版本
  • registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0

在这里插入图片描述

  • 重新加载下配置
[root@k8s-master sc]# kubectl apply -f nfs-provisioner-depolyment.yaml
serviceaccount/nfs-client-provisioner unchanged
deployment.apps/nfs-client-provisioner configured

5.2.12 这次pv就自动创建好了

# 应用的状态
[root@k8s-master sc]# kubectl get po  | grep -Ei 'name|nginx-sc'
NAME                           READY   STATUS      RESTARTS       AGE
nginx-sc-0                     1/1     Running     0              27m# pv的状态
[root@k8s-master sc]# kubectl get pvc
NAME                           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
nginx-sc-test-pvc-nginx-sc-0   Bound    pvc-070c2e12-e5ef-47fe-bbbb-c5f864e311b5   1Gi        RWX            managed-nfs-storage   27m# pv的状态
[root@k8s-master sc]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                  STORAGECLASS          REASON   AGE
pvc-070c2e12-e5ef-47fe-bbbb-c5f864e311b5   1Gi        RWX            Delete           Bound    default/nginx-sc-test-pvc-nginx-sc-0   managed-nfs-storage            119s# 制备器的状态
[root@k8s-master sc]# kubectl get po -n kube-system   | grep -E 'NAME|nfs'
NAME                                      READY   STATUS    RESTARTS       AGE
nfs-client-provisioner-64f976f4cd-7gdq7   1/1     Running   0              4m36s

5.3 动态创建pv测试配置

5.3.1 配置文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: auto-pv-test-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 300MistorageClassName: managed-nfs-storage

5.3.2 动态创建PV

[root@k8s-master sc]# kubectl apply  -f auto-pv-test-pvc.yaml
persistentvolumeclaim/auto-pv-test-pvc created[root@k8s-master sc]# kubectl get pvc
NAME                           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
auto-pv-test-pvc               Bound    pvc-61e8aa2c-9d94-4404-bca6-909f31898638   300Mi      RWO            managed-nfs-storage   6s
nginx-sc-test-pvc-nginx-sc-0   Bound    pvc-070c2e12-e5ef-47fe-bbbb-c5f864e311b5   1Gi        RWX            managed-nfs-storage   37m[root@k8s-master sc]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                  STORAGECLASS          REASON   AGE
pvc-070c2e12-e5ef-47fe-bbbb-c5f864e311b5   1Gi        RWX            Delete           Bound    default/nginx-sc-test-pvc-nginx-sc-0   managed-nfs-storage            11m
pvc-61e8aa2c-9d94-4404-bca6-909f31898638   300Mi      RWO            Delete           Bound    default/auto-pv-test-pvc               managed-nfs-storage            10s

相关文章:

【k8s配置与存储--持久化存储(PV、PVC、存储类)】

1、PV与PVC 介绍 持久卷&#xff08;PersistentVolume&#xff0c;PV&#xff09; 是集群中的一块存储&#xff0c;可以由管理员事先制备&#xff0c; 或者使用存储类&#xff08;Storage Class&#xff09;来动态制备。 持久卷是集群资源&#xff0c;就像节点也是集群资源一样…...

【Vite】解决Vite http proxy error: Error: connect ECONNREFUSED

今天写bug&#xff0c;发现了这个问题 我经过我一晚上的搜索努力&#xff0c;在github上找到了解决办法&#xff0c;不得不说&#xff0c;交友网站还是很好用的。 参考 这一行是关键代码。 因为我连的是本地后台服务&#xff0c;所以最后配置成这样 server: {open: true,pro…...

FPGA领域顶级学术会议

FPGA领域顶级学术会议主要有FPGA,FCCM,FPL和FPT。 1 FPGA 会议全名是: ACM/SIGDA International Symposium on Field-Programmable Gate Arrays 网站是:https://dl.acm.org/conference/fpga FPGA常年在美国举办,每年2月,偏FPGA基础研究; 该会议的论文免费下载。这个比…...

罗技鼠标滚轮模式介绍 | 鼠标滚轮异响 - 解决方案

滚轮模式介绍 针对罗技的滚轮模式进行介绍&#xff1a; 普通滚轮&#xff1a;滚动时有明显段落感&#xff0c;无法快速滚动。 智能滚轮&#xff1a;滚动力量较弱时&#xff0c;与普通滚轮无异&#xff1b;滚动力量大时&#xff0c;鼠标会自动减小滚轮阻尼&#xff0c;从而使滚…...

Scrapy与分布式开发(2.2):正则表达式

使用Python的re模块进行正则表达式操作详细讲解 一、引言 正则表达式是一种强大的文本处理工具,它使用特定的模式来搜索、匹配和替换文本。Python的re模块(正则表达式模块)提供了正则表达式匹配操作的所有功能。下面我们将详细讲解如何使用re模块进行正则表达式的操作。 …...

今年“全国爱耳日”主题确定!立聪堂助听器组织社区义诊

2024年3月3日是第二十五个“全国爱耳日”。 今年的活动主题定为“科技助听&#xff0c;共享美好生活”&#xff0c;旨在倡导全社会关注听力健康&#xff0c;并鼓励听力受损人群利用科技手段实现早期康复。 为响应这一主题&#xff0c;知名助听器验配连锁机构立聪堂迅速行动起…...

区块链智能合约开发

一.区块链的回顾 1.区块链 区块链实质上是一个去中心化、分布式的可进行交易的数据库或账本 特征: 去中心化&#xff1a;简单来说&#xff0c;在网络上一个或多个服务器瘫痪的情况下&#xff0c;应用或服务仍然能够持续地运行&#xff0c;这就是去中心化。服务和应用部署在…...

Android 启动流程及 init 进程解析

一、Android 启动流程概括 按下电源键触发开机&#xff0c;从 ROM 加载引导程序 BootLoader 到 RAM 中&#xff0c;BootLoader 执行启动 Linux kernel&#xff0c;然后启动第一个用户进程 init&#xff0c;init 进程的工作包括挂载文件、创建文件目录、设置 selinux 安全策略&…...

Java设计模式:核心概述(一)

在软件开发中&#xff0c;设计模式是一种被广泛认可的解决方案&#xff0c;用于解决在软件设计中经常遇到的一些特定问题。Java作为一种面向对象的编程语言&#xff0c;特别适合于应用各种设计模式。本文将带您深入了解Java中的设计模式&#xff0c;包括它们的定义、出现的原因…...

计算机网络:IP

引言&#xff1a; IP协议是互联网协议族中的核心协议之一&#xff0c;负责为数据包在网络中传输提供路由寻址。它定义了数据包如何在互联网上从源地址传输到目的地址的规则和流程。IP协议使得各种不同类型的网络设备能够相互通信&#xff0c;实现了全球范围内的信息交换。 目录…...

CSS中使用变量的两个函数var和calc

CSS/CSS3 变量var()函数和calc()函数计算的使用 var()变量 var变量的定义语法 : --变量名 (两个短横线加上变量名) calc() 函数计算 calc使用的时候有几个地方需要注意: 1. 运算符前后都需要保留一个空格 2. 任何长度值都可以使用calc()函数进行计算&#xff1b; 3. 支持 - …...

了解docker与k8s

随着 k8s 作为容器编排解决方案变得越来越流行&#xff0c;有些人开始拿 Docker 和 k8s 进行对比&#xff0c;不禁问道&#xff1a;Docker 不香吗&#xff1f; k8s 是 kubernetes 的缩写&#xff0c;8 代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手两者相互依存…...

服务器防火墙的应用技术有哪些

服务器防火墙的应用技术有哪些 1.数据包过滤技术 数据包过滤是最基本的服务器防火墙技术之一&#xff0c;它根据一系列预定义规则过滤进出网络的数据包。数据包过滤器通常基于IP地址、端口号和协议类型等信息来判断数据包是否合法&#xff0c;如果不符合规则&#xff0c;则将被…...

打开 Camera app 出图,前几帧图像偏暗、偏色该怎样去避免?

1、问题背景 使用的安卓平台&#xff0c;客户的应用是要尽可能快的获取到1帧图像效果正常的图片。 但当打开 camera 启动出流后&#xff0c;前3-5帧图像是偏暗、偏色的&#xff0c;如下图所示&#xff0c;是抓取出流的前25帧图像&#xff0c; 前3帧颜色是偏蓝的&#xff0c;…...

SD-WAN技术:优化国内外服务器访问的关键

在全球化的商业环境中&#xff0c;企业经常需要在国内访问国外的服务器。然而&#xff0c;由于地理位置和网络架构的限制&#xff0c;这种跨国访问往往会遇到速度慢、延迟高等问题。SD-WAN&#xff08;软件定义广域网&#xff09;技术的兴起&#xff0c;为企业提供了一种新的解…...

【MySQL】学习和总结标量子查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-kLo6jykc7AcEVEQk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

vue3第三节(v-model 执行原理)

特殊说明&#xff1a; 以下vue3语法是基于 3.4之前版本进行使用的&#xff0c;3.4之后的版本 引入了 defineModel 宏&#xff0c;后续会介绍defineModel 1、vue3 与vue2 中v-model区别 vue3 中v-model绑定的不再是value&#xff0c;而是modelValue&#xff0c;接收的方法也不再…...

RunnerGo UI自动化测试脚本如何配置

RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建&#xff0c;内嵌高度可复用的测试脚本&#xff0c;测试团队无需复杂的代码编写即可开展低代码的自动化…...

Android 指南针校准进度计算实现

关于Android中指南针的实现&#xff0c;我们可以使用传感器来获取设备的方向信息&#xff0c;从而实现指南针功能。 Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);sensorManager (SensorManager) getSystemService(Conte…...

c++学习:Lambda练习和数组练习

练习一 进行加减乘除 普通方法 #include <iostream> using namespace std; int add(int a,int b) {return ab; } int min(int a,int b) {return a-b; } int mul(int a,int b) {return a*b; } float divRet(int a,int b) {return (float)a/b; } int main() {int a;int …...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...