目录

k8s持久化存储: PVC

1 k8s PV是什么?

2 k8s PVC是什么?

3 k8s PVC和PV工作原理

4 创建pod,使用pvc作为持久化存储卷

​三种回收策略详解​

1、创建nfs共享目录

2、如何编写pv的资源清单文件

3、创建pv

更新资源清单文件

查看pv资源

4、创建pvc,和符合条件的pv绑定

更新资源清单文件

查看pv和pvc,STATUS是Bound,表示这个pv已经被pvc绑定了

5、创建pod,挂载pvc

更新资源清单文件

查看pod状态

测试

创建另一个pod测试

删除pod-pvc  的这个pod,发现pvc还是存在的

删除pvc

删除pv


k8s持久化存储: PVC

1 k8s PV是什么?

PersistentVolume(PV)是群集中的一块存储,由管理员配置或使用存储类动态配置。 它是集群中的资源,就像pod是k8s集群资源一样。 PV是容量插件,如Volumes,其生命周期独立于使用PV的任何单个pod。

2 k8s PVC是什么?

PersistentVolumeClaim(PVC)是用户使用存储的请求。 它类似于pod。Pod消耗节点资源,PVC消耗存储资源。 pod可以请求特定级别的资源(CPU和内存)。 pvc在申请pv的时候也可以请求特定的大小和访问模式(例如,可以一次读写或多次只读)。

3 k8s PVC和PV工作原理

PV是群集中的资源。 PVC是对这些资源的请求。

PV和PVC之间的相互作用遵循以下生命周期:

(1)pv的供应方式

可以通过两种方式配置PV:静态或动态。

静态的:

集群管理员创建了许多PV。它们包含可供群集用户使用的实际存储的详细信息。它们存在于Kubernetes API中,可供使用。

动态的:

当管理员创建的静态PV都不匹配用户的PersistentVolumeClaim时,群集可能会尝试为PVC专门动态配置卷。此配置基于StorageClasses,PVC必须请求存储类,管理员必须创建并配置该类,以便进行动态配置。

(2)绑定

用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态

(3)使用

  • 需要找一个存储服务器,把它划分成多个存储空间;

  • k8s管理员可以把这些存储空间定义成多个pv;

  • 在pod中使用pvc类型的存储卷之前需要先创建pvc,通过定义需要使用的pv的大小和对应的访问模式,找到合适的pv;

  • pvc被创建之后,就可以当成存储卷来使用了,我们在定义pod时就可以使用这个pvc的存储卷;

  • pvc和pv它们是一一对应的关系,pv如果被pvc绑定了,就不能被其他pvc使用了;

  • 我们在创建pvc的时候,应该确保和底下的pv能绑定,如果没有合适的pv,那么pvc就会处于pending状态。

(4)回收策略

当我们创建pod时如果使用pvc做为存储卷,那么它会和pv绑定,当删除pod,pvc和pv绑定就会解除,解除之后和pvc绑定的pv卷里的数据需要怎么处理,目前,卷可以保留、回收或删除:

1、Retain  #保留
当删除pvc的时候,pv仍然存在,处于released状态,但是它不能被其他pvc绑定使用,里面的数据还是存在的,当我们下次再使用的时候,数据还是存在的,这个是默认的回收策略。
2、Delete  #删除
删除pvc时即会从Kubernetes中移除PV,也会从相关的外部设施中删除存储资产。

4 创建pod,使用pvc作为持久化存储卷

三种回收策略详解

策略行为适用场景数据安全性
RetainPVC删除后,PV进入Released状态,​保留数据需手动清理生产环境(数据库/关键数据)⭐⭐⭐⭐⭐
DeletePVC删除后,​自动删除PV及后端存储​(如云磁盘/EBS)临时测试环境⭐⭐
Recycle数据擦除后PV恢复为AvailableK8s 1.15+已废弃旧版本兼容

1、创建nfs共享目录

[root@k8s-master pvc]# 
[root@k8s-master pvc]# cd /data
[root@k8s-master data]# ls
index.html#在宿主机创建NFS需要的共享目录
[root@k8s-master data]# mkdir /data/v{1..10} -p
[root@k8s-master data]# ls
index.html  v1  v10  v2  v3  v4  v5  v6  v7  v8  v9#配置nfs共享宿主机上的/data/v1..v10目录
[root@k8s-master data]# vim /etc/exports
/data 192.168.158.0/24(rw,no_root_squash)
/data/v1 192.168.158.0/24(rw,no_root_squash)
/data/v2 192.168.158.0/24(rw,no_root_squash)
/data/v3 192.168.158.0/24(rw,no_root_squash)
/data/v4 192.168.158.0/24(rw,no_root_squash)
/data/v5 192.168.158.0/24(rw,no_root_squash)
/data/v6 192.168.158.0/24(rw,no_root_squash)
/data/v7 192.168.158.0/24(rw,no_root_squash)
/data/v8 192.168.158.0/24(rw,no_root_squash)
/data/v9 192.168.158.0/24(rw,no_root_squash)
/data/v10 192.168.158.0/24(rw,no_root_squash)#重新加载配置,使配置成效
[root@k8s-master data]# exportfs -arv
exporting 192.168.158.0/24:/data/v10
exporting 192.168.158.0/24:/data/v9
exporting 192.168.158.0/24:/data/v8
exporting 192.168.158.0/24:/data/v7
exporting 192.168.158.0/24:/data/v6
exporting 192.168.158.0/24:/data/v5
exporting 192.168.158.0/24:/data/v4
exporting 192.168.158.0/24:/data/v3
exporting 192.168.158.0/24:/data/v2
exporting 192.168.158.0/24:/data/v1
exporting 192.168.158.0/24:/data

2、如何编写pv的资源清单文件

#查看定义pv需要的字段
[root@k8s-master ~]# kubectl explain pv
KIND:     PersistentVolume
VERSION:  v1
DESCRIPTION:PersistentVolume (PV) is a storage resource provisioned by anadministrator. It is analogous to a node. More info:[https://kubernetes.io/docs/concepts/storage/persistent-volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes)
FIELDS:apiVersion  <string>skind<string>metadata<Object>spec<Object>
#查看定义nfs类型的pv需要的字段
[root@k8s-master] ~]# kubectl explain pv.spec.nfs
KIND:     PersistentVolume
VERSION:  v1
RESOURCE: nfs <Object>
FIELDS:path<string> -required-readOnly<boolean>server  <string> -required-

3、创建pv

[root@k8s-master pvc]# vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: v1
spec:capacity:storage: 1Gi #pv的存储空间容量      #这两个必要条件accessModes: ["ReadWriteOnce"]     #访问模式:多节点读写nfs:path: /data/v1 #把nfs的存储空间创建成pvserver: 192.168.158.33 #nfs服务器的地址
---
apiVersion: v1
kind: PersistentVolume
metadata:name: v2
spec:capacity:storage: 2GiaccessModes: ["ReadWriteMany"]nfs:path: /data/v2server: 192.168.158.33
---
apiVersion: v1
kind: PersistentVolume
metadata:name: v3
spec:capacity:storage: 3GiaccessModes: ["ReadOnlyMany"]nfs:path: /data/v3server: 192.168.158.33
---
apiVersion: v1
kind: PersistentVolume
metadata:name: v4
spec:capacity:storage: 4GiaccessModes: ["ReadWriteOnce","ReadWriteMany"]nfs:path: /data/v4server: 192.168.158.33
---
apiVersion: v1
kind: PersistentVolume
metadata:name: v5
spec:capacity:storage: 5GiaccessModes: ["ReadWriteOnce","ReadWriteMany"]nfs:path: /data/v5server: 192.168.158.33
---
apiVersion: v1
kind: PersistentVolume
metadata:name: v6
spec:capacity:storage: 6GiaccessModes: ["ReadWriteOnce","ReadWriteMany"]nfs:path: /data/v6server: 192.168.158.33
---
apiVersion: v1
kind: PersistentVolume
metadata:name: v7
spec:capacity:storage: 7GiaccessModes: ["ReadWriteOnce","ReadWriteMany"]nfs:path: /data/v7server: 192.168.158.33
---
apiVersion: v1
kind: PersistentVolume
metadata:name: v8
spec:capacity:storage: 8GiaccessModes: ["ReadWriteOnce","ReadWriteMany"]nfs:path: /data/v8server: 192.168.158.33
---
apiVersion: v1
kind: PersistentVolume
metadata:name: v9
spec:capacity:storage: 9GiaccessModes: ["ReadWriteOnce","ReadWriteMany"]nfs:path: /data/v9server: 192.168.158.33
---
apiVersion: v1
kind: PersistentVolume
metadata:name: v10
spec:capacity:storage: 10GiaccessModes: ["ReadWriteOnce","ReadWriteMany"]nfs:path: /data/v10server: 192.168.158.33

更新资源清单文件

[root@k8s-master pvc]# kubectl apply -f pv.yaml 
persistentvolume/v1 created
persistentvolume/v2 created
persistentvolume/v3 created
persistentvolume/v4 created
persistentvolume/v5 created
persistentvolume/v6 created
persistentvolume/v7 created
persistentvolume/v8 created
persistentvolume/v9 created
persistentvolume/v10 created

查看pv资源

[root@k8s-master pvc]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                   32s
v10    10Gi       RWO,RWX        Retain           Available                                   32s
v2     2Gi        RWX            Retain           Available                                   32s
v3     3Gi        ROX            Retain           Available                                   32s
v4     4Gi        RWO,RWX        Retain           Available                                   32s
v5     5Gi        RWO,RWX        Retain           Available                                   32s
v6     6Gi        RWO,RWX        Retain           Available                                   32s
v7     7Gi        RWO,RWX        Retain           Available                                   32s
v8     8Gi        RWO,RWX        Retain           Available                                   32s
v9     9Gi        RWO,RWX        Retain           Available                                   32s
#这时还没有创建pvc
[root@k8s-master pvc]# kubectl get pvc
No resources found in default namespace.

#ROW是一次性读写,RWX是多次读写,ROX是多次只读,RWO是未知读写
#STATUS是Available,表示pv是可用的
NAME(名称)
通常用于标识某个特定的对象,在这里可能是指存储相关的实体(比如存储卷等)的具体名字,方便对其进行区分和引用。
CAPACITY(容量)
代表该对象所具备的存储容量大小,一般会以特定的存储单位(如字节、KB、MB、GB、TB 等)来衡量,表示其能够容纳的数据量多少。
ACCESS MODES(访问模式)
指的是允许对相应存储资源进行访问的方式,例如可以是只读、读写、可追加等不同模式,决定了用户或系统对其存储内容操作的权限范围。
RECLAIM POLICY(回收策略)#Retain保留
关乎当存储资源不再被使用或者释放时,对其所占用空间等资源的处理方式,常见的策略比如立即回收、延迟回收、按特定条件回收等,确保资源能合理地被再次利用。
STATUS(状态)
描述该存储相关对象当前所处的情况,例如可能是可用、不可用、正在初始化、已损坏等不同状态,便于了解其是否能正常工作。
CLAIM(声明)#pvc
在存储语境中,往往涉及对存储资源的一种请求或者占用声明,表明某个主体对相应存储资源有着相关权益或者正在使用它等情况。
STORAGECLASS(存储类别)
用于区分不同特性的存储分类,比如可以根据存储的性能(高速、低速)、存储介质(磁盘、磁带等)、存储成本(昂贵、廉价)等因素划分出不同的存储类,以满足不同场景的需求。
VOLUMEATTRIBUTESCLASS(卷属性类别)
主要是针对存储卷这一特定存储对象而言,涵盖了该卷在诸如容量属性、性能属性、安全属性等多方面的类别划分,体现其具备的各类特性。
REASON(原因)
如果存储对象处于某种特定状态(比如异常状态等),此处用于说明造成该状态的具体缘由,方便排查问题、分析情况。
AGE(时长)
一般是指从该存储对象创建开始到当前所经历的时间长度,可用于衡量其存在的时间阶段,辅助判断其使用情况等。

4、创建pvc,和符合条件的pv绑定

[root@k8s-master pvc]# vim pvc.yaml apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes: ["ReadWriteMany"]resources:requests:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc1
spec:accessModes: ["ReadWriteMany"]resources:requests:storage: 1Gi

#你也可以创建多个pvc

翻译:

apiVersion: v1                  # Kubernetes API 版本(核心API组)
kind: PersistentVolumeClaim     # 资源类型:持久化存储声明
metadata:name: my-pvc                  # PVC名称(自定义标识)
spec:accessModes: ["ReadWriteMany"] # 访问模式:多节点读写resources:requests:storage: 2Gi               # 申请存储空间大小:2GB

更新资源清单文件

[root@k8s-master pvc]# kubectl apply -f pvc.yaml 
persistentvolumeclaim/my-pvc created
persistentvolumeclaim/my-pvc1 created

查看pv和pvc,STATUS是Bound,表示这个pv已经被pvc绑定了

#下面显示为什么绑定的是v2和v4呢,那是因为v1和v3不符合条件,所以按照顺序v2被my-pvc占用,v4被my-pvc占用
[root@k8s-master pvc]# kubectl get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc    Bound    v2       2Gi        RWX                           34s
my-pvc1   Bound    v4       4Gi        RWO,RWX                       34s
[root@k8s-master pvc]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM             STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                             4m4s
v10    10Gi       RWO,RWX        Retain           Available                                             4m4s
v2     2Gi        RWX            Retain           Bound       default/my-pvc                            4m4s
v3     3Gi        ROX            Retain           Available                                             4m4s
v4     4Gi        RWO,RWX        Retain           Bound       default/my-pvc1                           4m4s
v5     5Gi        RWO,RWX        Retain           Available                                             4m4s
v6     6Gi        RWO,RWX        Retain           Available                                             4m4s
v7     7Gi        RWO,RWX        Retain           Available                                             4m4s
v8     8Gi        RWO,RWX        Retain           Available                                             4m4s
v9     9Gi        RWO,RWX        Retain           Available                                             4m4s
[root@k8s-master pvc]# 

5、创建pod,挂载pvc

注意:pvc和pv是一对一的关系,pvc和pod可以是一对一,也可以是一对多的关系

这里我们演示pvc和pod一对一的关系

[root@k8s-master pvc]# kubectl apply -f pod-pvc.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-pvc
spec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentvolumeMounts:- name: nginx-html    #这个要mountPath: /usr/share/nginx/htmlvolumes:- name: nginx-html     #和这个要一样persistentVolumeClaim:claimName: my-pvc    #pvc名

更新资源清单文件

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

查看pod状态

[root@k8s-master pvc]# kubectl get pod pod-pvc -o wide 
NAME      READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod-pvc   1/1     Running   0          17s   10.244.169.181   k8s-node2   <none>           <none>#通过上面可以看到pod处于Running状态,正常运行

测试

[root@k8s-master pvc]# curl 10.244.169.181
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.29.1</center>
</body>
</html>####在nfs服务器端写入index.html
#因为创建的pod是绑定在my-pvc上的,而my-pvc对应的是v2存储卷
#所以这里我们就往共享目录/data/v2目录中写入[root@k8s-master pvc]# echo pvc > /data/v2/index.html
[root@k8s-master pvc]# curl 10.244.169.181
pvc

创建另一个pod测试

[root@k8s-master pvc]# vim pod-pvc.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-pvc1
spec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentvolumeMounts:- name: nginx-html    #这个要mountPath: /usr/share/nginx/htmlvolumes:- name: nginx-html     #和这个要一样persistentVolumeClaim:claimName: my-pvc    #pvc名[root@k8s-master pvc]# kubectl apply -f pod-pvc.yaml 
pod/pod-pvc1 created[root@k8s-master pvc]# kubectl get pod -o wide | grep pod
pod-pvc                          1/1     Running   0             7m48s   10.244.169.181   k8s-node2   <none>           <none>
pod-pvc1                         1/1     Running   0             29s     10.244.36.95     k8s-node1   <none>           <none>#访问pod-pvc1的虚拟ip,返回pvc,证明多个pod可共享同一个pvc,实现目录共享
[root@k8s-master pvc]# curl 10.244.36.95
pvc

删除pod-pvc  的这个pod,发现pvc还是存在的

[root@k8s-master pvc]# vim pod-pvc.yaml
[root@k8s-master pvc]# kubectl delete pod pod-pvc
pod "pod-pvc" deleted
[root@k8s-master pvc]# kubectl delete pod pod-pvc1
pod "pod-pvc1" deleted
[root@k8s-master pvc]# kubectl get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc    Bound    v2       2Gi        RWX                           24m
my-pvc1   Bound    v4       4Gi        RWO,RWX                       24m
[root@k8s-master pvc]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM             STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                             25m
v10    10Gi       RWO,RWX        Retain           Available                                             25m
v2     2Gi        RWX            Retain           Bound       default/my-pvc                            25m
v3     3Gi        ROX            Retain           Available                                             25m
v4     4Gi        RWO,RWX        Retain           Bound       default/my-pvc1                           25m
v5     5Gi        RWO,RWX        Retain           Available                                             25m
v6     6Gi        RWO,RWX        Retain           Available                                             25m
v7     7Gi        RWO,RWX        Retain           Available                                             25m
v8     8Gi        RWO,RWX        Retain           Available                                             25m
v9     9Gi        RWO,RWX        Retain           Available                                             25m

删除pvc

        pv仍然存在,处于released状态,但是它不能被其他pvc绑定使用,里面的数据还是存在的,当我们下次再使用的时候,数据还是存在的,这个是默认的回收策略。

[root@k8s-master pvc]# kubectl delete pvc my-pvc
persistentvolumeclaim "my-pvc" deleted
[root@k8s-master pvc]# kubectl delete pvc my-pvc1
persistentvolumeclaim "my-pvc1" deleted
[root@k8s-master pvc]# kubectl get pvc
No resources found in default namespace.#发现pv的状态发生了变化
[root@k8s-master pvc]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM             STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                             27m
v10    10Gi       RWO,RWX        Retain           Available                                             27m
v2     2Gi        RWX            Retain           Released    default/my-pvc                            27m
v3     3Gi        ROX            Retain           Available                                             27m
v4     4Gi        RWO,RWX        Retain           Released    default/my-pvc1                           27m
v5     5Gi        RWO,RWX        Retain           Available                                             27m
v6     6Gi        RWO,RWX        Retain           Available                                             27m
v7     7Gi        RWO,RWX        Retain           Available                                             27m
v8     8Gi        RWO,RWX        Retain           Available                                             27m
v9     9Gi        RWO,RWX        Retain           Available                                             27m

此时我们进入到nfs的共享目录,发现我们建立的index.html还是存在的

[root@k8s-master ~]# cd /data/v2
[root@k8s-master v2]# ls
index.html

如果想要彻底删除数据

[root@k8s-master pvc]# kubectl delete -f pv.yaml 
persistentvolume "v1" deleted
persistentvolume "v2" deleted
persistentvolume "v3" deleted
persistentvolume "v4" deleted
persistentvolume "v5" deleted
persistentvolume "v6" deleted
persistentvolume "v7" deleted
persistentvolume "v8" deleted
persistentvolume "v9" deleted
persistentvolume "v10" deleted
[root@k8s-master pvc]# kubectl get pv
No resources found
[root@k8s-master pvc]# kubectl apply -f pv.yaml 
persistentvolume/v1 created
persistentvolume/v2 created
persistentvolume/v3 created
persistentvolume/v4 created
persistentvolume/v5 created
persistentvolume/v6 created
persistentvolume/v7 created
persistentvolume/v8 created
persistentvolume/v9 created
persistentvolume/v10 created
[root@k8s-master pvc]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                   3s
v10    10Gi       RWO,RWX        Retain           Available                                   3s
v2     2Gi        RWX            Retain           Available                                   3s
v3     3Gi        ROX            Retain           Available                                   3s
v4     4Gi        RWO,RWX        Retain           Available                                   3s
v5     5Gi        RWO,RWX        Retain           Available                                   3s
v6     6Gi        RWO,RWX        Retain           Available                                   3s
v7     7Gi        RWO,RWX        Retain           Available                                   3s
v8     8Gi        RWO,RWX        Retain           Available                                   3s
v9     9Gi        RWO,RWX        Retain           Available                                   3s
[root@k8s-master pvc]# kubectl get pvc
No resources found in default namespace.

删除pv

kubectl delete pv pv_name,删除pv,不会删除pv里的数据

注:使用pvc和pv的注意事项

1、我们每次创建pvc的时候,需要事先有划分好的pv,这样可能不方便,那么可以在创建pvc的时候直接动态创建一个pv这个存储类,pv事先是不存在的

2、pvc和pv绑定,如果使用默认的回收策略retain,那么删除pvc之后,pv会处于released状态,我们想要继续使用这个pv,需要手动删除pv,kubectl delete pv pv_name,删除pv,不会删除pv里的数据,当我们重新创建pvc时还会和这个最匹配的pv绑定,数据还是原来数据,不会丢失。

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

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

相关文章

【系统架构设计师】数据库设计(一):数据库技术的发展、数据模型、数据库管理系统、数据库三级模式

数据库技术是研究数据库的结构、存储、设计、管理和应用的一门软件学科。 数据库系统本质上是一个用计算机存储信息的系统。 数据库管理系统是位于用户与操作系统之间的一层数据管理软件&#xff0c;其基本目标是提供一个可以方便、有效地存取数据库信息的环境。 数据库就是信息…

深入理解 Structured Outputs:基于 JSON Schema 的结构化输出实践指南

深入理解 Structured Outputs&#xff1a;基于 JSON Schema 的结构化输出实践指南 目录 引言Structured Outputs 概述应用场景与优势核心用法&#xff1a;结构化响应的获取功能对比&#xff1a;Structured Outputs 与 JSON 模式典型应用示例链式思维&#xff08;Chain of Tho…

大模型应用编排工具Dify之插件探索

1.前言 ​ dify 1.x版本以后插件功能丰富了很多&#xff0c;推出的插件市场上有各式各样的插件&#xff0c;比如 连接数据库、连接大模型、搜索和 mcp服务等。其中&#xff0c;有一个比较大的改动&#xff0c;模型供应商不再内置&#xff0c;而是通过插件的形式提供。因此&…

ubuntu2204安装搜狗拼音输入法

安装必要的软件包 sudo apt update sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-config-qt fcitx5-configtool -y安装搜狗拼音 下载最新 .deb 包&#xff08;官方地址&#xff1a;https://pinyin.sogou.com/linux/&#xff09;&#xff0c;安装&#xff1a; sudo dp…

三,设计模式-抽象工厂模式

目的 在 工厂模式 中&#xff0c;当需要创建新的产品时&#xff0c;则额外需要创建新的工厂&#xff0c;这种模式是对产品制造方法的抽象化&#xff0c;如果产品种类变多&#xff0c;则工厂数目变多&#xff0c;则代码规模会越来越大&#xff0c;且不同的产品类的生成依赖不同…

Vue3响应式编程核心:ref与reactive全方位对比

在Vue3的Composition API中&#xff0c;ref和reactive是构建响应式数据的核心工具。许多开发者对它们的选择存在困惑&#xff1a;何时用ref的.value&#xff1f;何时用reactive的直接访问&#xff1f;为何解构会丢失响应性&#xff1f;本文从原理、场景到实战陷阱&#xff0c;为…

Redis实战-缓存的解决方案(一)

1.什么是缓存缓存就是数据交换的缓存区&#xff0c;是存储数据的临时区域&#xff0c;读写性能高。浏览器会有缓存&#xff0c;tomcat服务器也会有缓存&#xff0c;数据库也会有缓存&#xff0c;CPU也会有缓存&#xff0c;磁盘也会有缓存&#xff0c;所以说缓存是无处不在的并且…

CI/CD企业案例详解

7.持续集成持续交付企业示例 为了让容器构建镜像可以持续集成并自动上传到harbor仓库&#xff0c;业务主机通过持续交付自动从仓库中下载镜像最近版本并实现业务更新7.1 在jenkins中添加registry节点 7.1.1 在业务节点中安装docker和java环境并配置其可以从仓库中下载镜像 # 新…

C++ 入门核心知识

一、C 课程概述与发展历史1. 发展历程&#xff1a;从 C 语言扩展到标准化C 的起源可追溯至 1979 年&#xff0c;由贝尔实验室的 Bjarne Stroustrup 主导开发。当时他为解决大型项目开发中 C 语言在可维护性和扩展性上的不足&#xff0c;在 C 语言基础上引入了面向对象编程特性。…

labelme数据标注保姆级教程:从安装到格式转换全流程,附常见问题避坑指南(含视频讲解)

引言&#xff1a;为什么选择labelme&#xff1f; 在人工智能和机器学习领域&#xff0c;高质量的标注数据是训练优秀模型的基础。而 labelme作为一款开源、跨平台的图像标注工具&#xff0c;凭借其强大的功能和易用性&#xff0c;成为了数据标注领域的热门选择。 它支持多种标…

人工智能-python-深度学习-自动微分

自动微分&#xff1a;基础概念与应用 自动微分&#xff08;Autograd&#xff09;是现代深度学习框架&#xff08;如PyTorch、TensorFlow&#xff09;中的一个核心功能。它通过构建计算图并在计算图上自动计算梯度&#xff0c;简化了反向传播算法的实现。以下是自动微分的基本概…

k8s原理及操作

简介 kubernetes的本质是一组服务器集群&#xff0c;它可以在集群的每个节点上运行特定的程序&#xff0c;来对节点中的容器 进行管理。目的是实现资源管理的自动化&#xff0c;主要提供了如下的主要功能&#xff1a; 自我修复&#xff1a;一旦某一个容器崩溃&#xff0c;能够在…

理解音频响度:LUFS 标准及其计算实现

LUFS 及其重要性 1.1、什么是 LUFS&#xff1f; LUFS&#xff08;Loudness Units relative to Full Scale&#xff09;是音频工程中用于测量感知响度的标准单位。它已成为广播、流媒体和音乐制作领域的行业标准&#xff0c;用于确保不同音频内容具有一致的响度水平。 LUFS 是 I…

【在ubuntu下使用vscode打开c++的make项目及编译调试】

在ubuntu下使用vscode打开c的make项目及编译调试第一步&#xff1a;安装必要的软件第二步&#xff1a;示例项目准备1. 创建C源文件&#xff1a; main.cpp2. 创建头文件&#xff1a; utils.h3. 创建实现文件&#xff1a; utils.cpp第三步&#xff1a;使用 VS Code 打开项目第四步…

3-2.Python 函数 - None(None 概述、None 应用场景)

一、None 概述在 Python 中&#xff0c;None 是一个特殊的常量&#xff0c;用于表示空值或无值None 是 Python 中唯一的一个 NoneType 类型的实例二、None 应用场景 1、定义变量 None 常用于初始化变量&#xff0c;表示该变量暂时不需要有具体值 name Noneprint(name) print(t…

js获取html元素并设置高度为100vh-键盘高度

获取HTML元素并设置高度为(100vh - 键盘高度) 我将设计一个页面&#xff0c;展示如何获取HTML元素并动态设置其高度为视口高度减去键盘高度&#xff0c;这在移动设备上特别有用&#xff0c;可以避免键盘遮挡内容。 设计思路 创建一个带有输入框的界面&#xff0c;模拟键盘弹…

基于SpringBoot的校园博客管理系统

&#x1f517; 目录 一. 前言   二. 前端框架、后端框架以及存储框架使用情况说明   三. 核心技术     1. ✅Java开发语言     2. ✅MyBatis     3. ✅Mysql     4. ✅Vue     5. ✅部署项目   四. 演示效果     1. 管理员功能模块       …

Nginx + Certbot配置 HTTPS / SSL 证书

前提条件&#xff1a; 1.已有域名 2.Nginx 已安装并正在运行&#xff0c;且有对应的 Server 配置 3.防火墙开放 80 和 443 端口 安装 EPEL 仓库&#xff1a; sudo yum install epel-release -y安装 Snapd sudo yum install snapd -y启用并启动 Snapd Socket sudo systemctl ena…

图结构使用 Louvain 社区检测算法进行分组

图结构使用 Louvain 社区检测算法进行分组 flyfish Louvain 算法是一种基于模块度最大化的社区检测算法&#xff0c;核心目标是在复杂网络中找到“内部连接紧密、外部连接稀疏”的社区结构。它的优势在于高效性&#xff08;可处理百万级节点的大规模网络&#xff09;和近似最优…

layui.formSelects自定义多选组件在layer.open中使用、获取、复现

layui.formSelects自定义多选组件在layer.open中使用、获取、复现 引入css和js //<th:block th:include"include :: layui-formSelects-css"/> <link th:href"{/ajax/libs/layui-formSelects/formSelects-v4.css}" rel"stylesheet"/>…