一、Volume 的概念

        对于大多数的项目而言,数据文件的存储是非常常见的需求,比如存储用户上传的头像、文件以及数据库的数据。在 Kubernetes 中,由于应用的部署具有高度的可扩展性和编排能力(不像传统架构部署在固定的位置),因此把数据存放在容器中是非常不可取的,这样也无法保障数据的安全。

        我们应该把有状态的应用变成无状态的应用,意思是指把数据从应用中剥离出来,把产生的数据文件或者缓存的信息都放在云端,比如常用的 NFS(生产环境中不建议使用,因为存在单点故障,推荐使用分布式的存储或者公有云的 NAS 服务 )、ceph、GlusterFS、Minio 等。

        在传统的架构中,如果要使用这些存储,需要提前在宿主机器挂载,然后程序才能访问,在实际使用时,经常碰到新加节点忘记挂载存储导致的一系列问题。而 Kubernetes 在设计之初就考虑了这些问题,并抽象出 Volume 的概念用于解决数据存储的问题。

        在容器中的磁盘文件是短暂的,当容器崩溃时,Kubelet 会重新启动容器,但是容器运行时产生的数据文件都会丢失,之后容器会以干净的状态启动。另外,当一个 Pod 运行多个容器时,各个容器可能需要共享一些文件,诸如此类的需求都可以使用 Volume 解决。

        Docker 也有卷的概念,但是在 Docker 中,卷只是磁盘上或另一个容器中的目录,其生命周期不受管理。虽然 Docker 已经提供了卷驱动程序,但是功能非常有限,例如从 Docker1.7 版本开始,每个容器只允许一个卷驱动程序,并且无法将一些特殊的参数传递给后端存储。

        另一方面,Kubernetes 卷具有明确的生命周期,与使用他的 Pod 相同,因此在 Kubernetes 中的卷可以比 Pod 中运行的任何容器的生命周期都长,并且可以在容器重启或者销毁之后保留数据。Kubernetes 支持多种类型的卷,并且 Pod 可以同时使用任意数量的卷。

        从本质上讲,和虚拟机或者物理机一样,卷被挂载后,在容器中也只是一个目录,可能包含一些数据,Pod 中的容器也可以对其进行增删改查操作,使用方式和裸机挂载几乎没有区别。要使用卷也非常简单,和其他参数类似,Pod 只需要通过 .spec.volumes 字段指定为 Pod 提供的卷,然后在容器中配置块,使用 .spec.containers.volumeMounts 字段指定卷的挂载目录即可。

二、Volume 的类型

        在传统架构中,企业内可能有自己的存储平台,比如 NFS、Ceph、GlusterFS、Minio 等。如果所在的环境在公有云,也可以使用公有云提供的 NAS、对象存储等。在 Kubernetes 中,Volume 也支持配置这些存储,用于挂载到 Pod 中实现数据的持久化。Kubernetes Volume 支持的卷的类型有很多。

卷名称特点
CephFS统一存储提供对象存储、块存储和文件存储多种接口,实现统一存储管理
横向扩展可通过添加存储节点轻松扩展存储容量和性能
高可用性采用分布式架构,数据多副本存储,保障数据安全,节点故障时能自动恢复
性能均衡数据均匀分布在各个存储节点上,避免单点性能瓶颈
GlusterFS横向扩展通过添加服务器节点实现存储容量和性能的线性增长
文件系统融合可以将多个物理存储资源整合为一个统一的命名空间,便于管理和使用
多协议支持支持 NFS、CIFS 等多种文件访问协议,方便不同操作系统的客户端访问
数据冗余支持数据复制和条带化,提供数据冗余保护和性能加速
iSCSI基于 IP 网络利用现有的 IP 网络基础设施,降低存储部署成本
远程存储访问允许服务器通过网络访问远程存储设备,如同访问本地硬盘一样
灵活性高方便在不同服务器之间共享存储资源,便于存储资源的集中管理
标准化协议遵循 iSCSI 标准协议,具有良好的兼容性和互操作性
CinderOpenStack 组件是 OpenStack 项目中负责块存储管理的组件,与 OpenStack 其他组件紧密集成
多后端支持支持多种后端存储设备,如 Ceph、NFS 等,提供灵活的存储选择
动态分配可以根据虚拟机的需求动态分配和调整存储容量
快照和备份支持创建卷快照和备份,便于数据保护和恢复
NFS简单易用基于 UNIX/Linux 系统,使用简单,易于部署和管理
文件共享允许不同的客户端通过网络共享文件,实现数据的集中存储和访问
跨平台支持除了 UNIX/Linux 系统外,也可以在 Windows 等其他操作系统上通过安装客户端软件来访问
性能较好对于文件的读取和写入操作有较好的性能表现,适用于文件共享场景
RBD(RADOS Block Device)Ceph 块存储

是 Ceph 存储系统提供的块存储接口,依托 Ceph 的分布式架构
高性能通过条带化等技术实现数据的并行读写,提供较高的 I/O 性能
高可用利用 Ceph 的多副本机制保障数据高可用性,确保数据的可靠性
动态调整可以根据业务需求动态调整存储设备的大小
HostPath本地存储直接使用主机节点的本地文件系统路径作为容器的存储,简单直观
测试方便常用于开发和测试环境,方便在本地快速验证应用对存储的需求
局限性数据仅存在于主机本地,缺乏数据的共享性和高可用性,不适用于生产环境大规模使用

当然也支持一些 Kubernetes 独有的类型:

资源类型作用描述
ConfigMap用于存储配置文件
Secret用于存储敏感数据
EmptyDir用于一个 Pod 内多个容器的数据共享
PersistentVolumeClaim对 PersistentVolume 的申请

三、通过 emptyDir 共享数据

        emptyDir 是一个特殊的 Volume 类型,与上述 Volume 不同的是,如果删除 Pod,EmptyDir 卷中的数据也将被删除,所以一般 emptyDir 用于 Pod 中不同容器共享数据,比如一个 Pod 存在两个容器 A 和容器 B,容器 A 需要使用容器 B 产生的数据,此时可以采用 emptyDir 共享数据,类似的使用如 Filebeat 收集容器内程序产生的日志。

        使用 emptyDir 卷时,直接指定 emptyDir 为 {} 即可

1、编写emptyDir的Deployment

cat <<EOF> /root/nginx-empty.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxnamespace: default
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.7.9imagePullPolicy: IfNotPresentname: nginx01volumeMounts:- mountPath: /optname: share-volume- image: nginx:1.7.9imagePullPolicy: IfNotPresentname: nginx02command:- sh- -c- sleep 3600volumeMounts:- mountPath: /mntname: share-volumevolumes:- name: share-volumeemptyDir: {}
EOF

volumeMounts:
mountPath: /mnt
name: share-volume
  ## 容器定义部分的卷挂载名称,此处的名称引用了 volumes 对应的名称

volumes:
name: share-volume
## 共享存储卷的名称

此案例会将 nginx01 中 /opt 中的数据,共享给 nginx02 中的 /mnt 目录

        此部署文件创建一个 Deployment,采用 spec.volume 字段配置了一个名字为 share-volume、类型为 emptyDir 的 volume,同时里面包含两个容器 nginx01 和 nginx02,并将该 volume 挂载到了 /opt 和 /mnt 目录下,此时 /opt 和 /mnt 目录的数据就实现了共享。
默认情况下,emptyDir 支持节点上的任何介质,可以使 SSD、磁盘或是网络存储,具体取决于自身环境。可以将 emptyDir.medium 字段设置为 Memory,让 Kubernetes 使用 tmpfs(内存支持的文件系统),虽然 tmpfs 非常快,但是在节点重启时,数据同样会被清除,并且设置的大小会被记入 Container 的内存限制中。

2、创建Deploymen

ku create -f nginx-empty.yaml
ku get pod

3、进入容器创建测试文件并验证

ku exec -it nginx-8f8dcfd8c-rx2qr -c nginx01 -- bash
cd /opt
touch aaaku exec -it nginx-8f8dcfd8c-rx2qr -c nginx02 -- bash
cd /mnt
ls

四、使用 HostPath 挂载宿主机文件

        HostPath 卷可以将节点上的文件或目录挂载到 Pod 上,用于实现 Pod 和宿主机之间的数据共享,常用的示例有挂载宿主机的时区至 Pod,或者将 Pod 的日志文件挂载到宿主机等。

1、编写 Deployment 文件,实现 HostPath 挂载

以下为使用 HostPath 卷的示例,实现将主机的 /etc/localtime 文件挂载到 Pod 的 /etc/localtime

cat <<EOF> /root/nginx-hostPath.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxnamespace: default
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.7.9imagePullPolicy: IfNotPresentname: nginxvolumeMounts:- mountPath: /etc/localtimename: timezone-timevolumes:- name: timezone-timehostPath:path: /etc/localtimetype: File
EOF

        关于时区的设置是通过配置 /etc/localtime 文件设置系统的时区,/etc/localtime 用于配置系统时区(此文件是一个链接文件,链接自 /usr/share/zoneinfo/Asia/Shanghai)。

在配置 HostPath 时,有一个 type 参数,用于表达不同的挂载类型

HostPath 卷常用的类型有:

类型(type)描述
空字符串默认选项,在挂载 HostPath 卷之前不会有任何检查
DirectoryOrCreate如果给定的 path 不存在任何东西,那么将根据需要创建一个权限为 0755 的空目录,和 kubelet 具有相同的组和权限
Directory目录必须存在于给定的路径下
FileOrCreate如果给定的路径不存在任何内容,则会根据需要创建一个空文件,权限设置为 0644,和 kubelet 具有相同的组和所有权
File文件,必须存在于给定的路径中
SocketUNIX 套接字,必须存在于给定的路径中
CharDevice字符设备,必须存在于给定的路径中
BlockDevice块设备,必须存在于给定的路径中

2、创建Deployment并查看

ku create -f nginx-hostPath.yaml
ku get pod

3、查看挂载

ku exec -it nginx-59f95c99b5-jlhgj -- bash
date

五、挂在NFS至容器

1、所有节点安装NFS

dnf -y install nfs-utils

2、创建共享目录

mkdir /opt/wwwroot
cd /opt/wwwroot/
echo "aaa">index.html
echo "/opt/wwwroot 192.168.10.0/24(rw,sync,no_root_squash)"> /etc/exports

3、编写nfs的Deployment

cat <<EOF> /root/nginx-nfsVolume.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxnamespace: default
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.7.9imagePullPolicy: IfNotPresentname: nginxvolumeMounts:- mountPath: /usr/share/nginx/htmlname: nfs-volumevolumes:- name: nfs-volumenfs:server: 192.168.10.101path: /opt/wwwroot
EOF

4、创建Deployment

ku create -f nginx-nfsVolume.yaml
ku get pod

5、验证

ku get pod -o wide
curl 10.244.58.197

六、PersistentVolume(PV,持久卷)

        对于很多复杂的需求,volume 可能难以实现,并且无法对存储的生命周期进行管理。另一个很大的问题是,在企业内使用 kubernetes 的不仅仅是 kubernetes 管理员,可能还有开发人员、测试人员以及初学 kubernetes 的技术人员,对于 kubernetes 的 volume 或者相关存储平台的配置参数并不了解,所以无法自行完成存储的配置。
为此,kubernetes 引入了两个新的 API 资源:PersistentVolume(持久卷,简称 PV)和 PersistentVolumeClaim(持久卷声明,简称 PVC)。
PV 是 kubernetes 管理员设置的存储,PVC 是对 PV 的请求,标识需要什么类型的 PV。他们同样是集群中的一类资源,但其生命周期比较独立,管理员可以单独对 PV 进行增删改查,不受 Pod 的影响,生命周期可能比挂载它的其他资源还要长。如果一个 kubernetes 集群的使用者并非只有 kubernetes 管理员,那么可以通过提前创建 PV,用以解决对存储概念不是很了解的技术人员对存储的需求。和单独配置 volume 类似,PV 也可以使用 NFS、GFS、CEPH 等常见的存储后端,并且可以提供更为高级的配置,比如访问模式、空间大小以及回收策略等。目前 PV 的提供方式有两种:静态或动态。静态 PV 由管理员提前创建,动态 PV 无需提前创建。

1、PV 回收策略

        当用户使用完卷时,可以从 API 中删除 PVC 对象,从而允许回收资源。回收策略会告诉 PV 如何处理改卷。目前回收策略可以设置为 Retain、Recycle 和 Delete。静态 PV 默认的为 Retain,动态 PV 默认为 Delete。

Retain:保留

        该策略允许手动回收资源,当删除 PVC 时,PV 仍然存在,PV 中的数据也存在。volume 被视为已释放,管理员可以手动回收卷。

Recycle:回收

        如果 volume 插件支持,Recycle 策略会对卷执行 rm -rf 清理该 PV,卷中的数据已经没了,但卷还在,使其可用于下一个新的 PVC,但是本策略将会被弃用,目前只有 NFS 和 HostPath 支持该策略。

Delete:删除

        如果 volume 插件支持,删除 PVC 时会同时删除 PV,PV 中的数据自然也就没了。动态卷默认为 Delete,目前支持 Delete 的存储后端包括 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder 等

2、PV 访问策略

        在实际使用 PV 时,可能针对不同的应用会有不同的访问策略,比如某类 Pod 可以读写,某类 Pod 只能读,或者需要配置是否可以被多个不同的 Pod 同时读写等,此时可以使用 PV 的访问策略进行简单控制,目前支持的访问策略如下:

访问模式描述缩写
ReadWriteOnce单路可读可写,可以被单节点以读写模式挂载RWO
ReadOnlyMany多路只读,可以被多节点以只读模式挂载ROX
ReadWriteMany多路可读可写,可以被多个节点以读写模式挂载RWX
ReadWriteOncePod单节点只读(1.22+),只能被一个 Pod 以读写的模式挂载RWOP

        虽然 PV 在创建时可以指定不同的访问策略,但是也要后端的存储支持才行。比如一般情况下,大部分块存储是不支持 ReadWriteMany 的。
在企业内,可能存储很多不同类型的存储,比如 NFS、Ceph、GlusterFS 等,针对不同类型的后端存储具有不同的配置方式,这也是对集群管理员的一种挑战,因为集群管理员需要对每种存储都要有所了解。

3、PV 的配置方式

(1) 静态配置

        静态配置是手动创建 PV 并定义其属性,例如容量、访问模式、存储后端等。在这种情况下,Kubernetes 管理员负责管理和配置 PV,然后应用程序可以使用这些 PV。静态配置通常用于一些固定的存储后端,如 NFS。

(2) 动态配置

        动态配置允许 Kubernetes 集群根据 PVC 的需求自动创建 PV,在这种情况下,管理员只需为存储后端配置 StorageClass,然后应用程序就可以通过 PVC 请求存储。Kubernetes 将自动创建与 PVC 匹配的 PV,并将其绑定到 PVC 上。这种方法使得存储管理更加灵活和可扩展,允许管理员在集群中动态添加、删除、和管理存储资源

4、基于 HostPath 的 PV

        可以创建一个基于 HostPath 的 PV,和配置 NFS 的 PV 类似,只需要配置 hostPath 字段即可,其它配置基本一致。

(1) 所有node节点创建主机目录

mkdir /mnt/data

(2) 编辑hostpath类型的yaml文件

cat <<EOF> /root/hostpath-pv.yaml
kind: PersistentVolume
apiVersion: v1
metadata:name: mypv-hostpathlabels:type: local
spec:storageClassName: pv-hostpathcapacity:storage: 10GiaccessModes:- ReadWriteOncehostPath:path: "/mnt/data"
EOF

        hostPath:宿主机的路径,使用 hostPath 类型需要固定 Pod 所在的节点,防止 Pod 漂移造成数据丢失。

        storageClassName:是一个用于标识 StorageClass 对象名称的标签。当你创建或配置 PersistentVolumeClaim(PVC)时,可以指定 storageClassName 来告诉 Kubernetes 你希望使用哪个 StorageClass 来配置存储。

(3) 创建pv

ku create -f hostpath-pv.yaml
ku get pv

5、基于NFS类型的pv

(1) 所有节点安装NFS

dnf -y install nfs-utils

(2) 创建共享目录

mkdir /opt/wwwroot
cd /opt/wwwroot/
echo "aaa">index.html
echo "/opt/wwwroot 192.168.10.0/24(rw,sync,no_root_squash)"> /etc/exports
systemctl start nfs
systemctl start rpcbind
netstat -anpt | grep rpcbind

(3) 编辑一个基于NFS的PV(yaml文件)

cat <<EOF> /root/nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: mypv-nfs
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: pvc-nfsmountOptions:- hard- nfsvers=4.1nfs:path: /opt/wwwroot/server: 192.168.10.101
EOF

        capacity: 容量配置
        volumeMode: 卷的模式,目前支持 Filesystem(文件系统)和 Block(块),其中 Block 类型需要后端存储支持,默认为文件系统
        accessModes: 该 PV 的访问模式
        storageClassName: PV 的类,一个特定类型的 PV 只能绑定到特定类别的 PVC
        persistentVolumeReclaimPolicy: 回收策略
        mountOption: 非必要,新版本中已经弃用
        nfs: NFS 服务配置,包括以下两个选项
path: NFS 上的共享目录
server: NFS 的 IP 地址

(4) 创建pv

ku create -f nfs-pv.yaml
ku get pv

七、PersistentVolumeClaim (PVC,持久卷声明)

        当 kubernetes 管理员提前创建好了 PV,我们又应该如何使用它呢?

        这里介绍 kubernetes 的另一个概念 PersistentVolumeClaim(简称 PVC)。PVC 是其他技术人员在 kubernetes 上对存储的申请,他可以标明一个程序需要用到什么样的后端存储、多大的空间以及什么访问模式进行挂载。这一点和 Pod 的 QoS 配置类似,Pod 消耗节点资源,PVC 消耗 PV 资源,Pod 可以请求特定级别的资源(CPU 和内存),PVC 可以请求特定的大小和访问模式的 PV。例如申请一个大小为 5G 且只能被一个 Pod 只读访问的存储。

        在实际使用时,虽然用户通过 PVC 获取存储支持,但是用户可能需要具有不同性质的 PV 来解决不同的问题,比如使用 SSD 硬盘来提高性能。所以集群管理员需要根据不同的存储后端来提供各种 PV,而不仅仅是大小和访问模式的区别,并且无须让用户了解这些卷的具体实现方式和存储类型,打扫了存储的解耦,降低了存储使用的复杂度。

        接下来我们来看看如何让 PVC 和前面创建的 PV 绑定。PVC 和 PV 进行绑定的前提条件是一些参数必须匹配,比如 accessModes、storageClassName、volumeMode 都需要相同,并且 PVC 的 storage 需要小于等于 PV 的 storage 配置。

1、hostpath类型PVC 的创建

(1) 为 hostpath 类型的 PV 编辑PVC(yaml文件)

cat <<EOF> /root/pvc-hostpath.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: mypvc-hostpath
spec:storageClassName: pv-hostpathaccessModes:- ReadWriteOnceresources:requests:storage: 3Gi
EOF

        storageClassName存储类名称需要和对应的 PV 中的名称一致,PV 和 PVC 进行绑定并非是名字相同,而是 StorageClassName 相同且其他参数一致才可以进行绑定

(2) 创建PVC

ku create -f pvc-hostpath.yaml
ku get pvc
ku get pv

2、nfs类型PVC 的创建

(1) 编辑yaml文件

cat <<EOF> /root/pvc-nfs.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: mypvc-nfs
spec:storageClassName: pvc-nfsaccessModes:- ReadWriteOnceresources:requests:storage: 3Gi
EOF

        storageClassName存储类名称需要和对应的 PV 中的名称一致,PV 和 PVC 进行绑定并非是名字相同,而是 StorageClassName 相同且其他参数一致才可以进行绑定

(2) 创建PVC

ku create -f pvc-nfs.yaml
ku get pvc

3、PVC 的使用--基于hostpath

        上述创建了 PV,并使用 PVC 与其绑定,现在还差一步就能让程序使用这块存储,那就是将 PVC 挂载到 Pod。和之前的挂载方式类似,PVC 的挂载也是通过 volumes 字段进行配置的,只不过之前需要根据不同的存储后端填写很多复杂的参数,而使用 PVC 进行挂载时,只填写 PVC 的名字即可,不需要再关心任何的存储细节,这样即使不是 Kubernetes 管理员,不懂存储的其他技术人员想要使用存储,也可以非常简单地进行配置和使用。比如我们将之前创建的 hostPath 类型的 PVC 挂载到 Pod 中,可以看到只需要配置一个         PersistentVolumeClaim 类型的 volumes,claimName 配置为 PVC 的名称即可

(1) 编辑Pod关联pvc的yaml文件

cat <<EOF> /root/pvc-pv-pod-hostpath.yaml
kind: Pod
apiVersion: v1
metadata:name: hostpath-pv-pod
spec:volumes:- name: task-pv-storagepersistentVolumeClaim:claimName: mypvc-hostpathcontainers:- name: task-pv-containerimage: nginx:1.7.9ports:- containerPort: 80name: "http-server"volumeMounts:- mountPath: "/usr/share/nginx/html"name: task-pv-storage
EOF

claimName: mypvc-hostpath 是基于 hostpath 创建的 PVC 的名字

(2) 创建Pod

ku create -f pvc-pv-pod-hostpath.yaml
ku get pod -o wide

(3) 测试

cd /mnt/data/
echo "qwertyuiop">index.html
curl 10.244.58.198

4、PVC 的使用--基于nfs

(1) 编辑Pod关联pvc的yaml文件

cat <<EOF> /root/pvc-pv-pod-nfs.yaml
kind: Pod
apiVersion: v1
metadata:name: pvc-nfs
spec:volumes:- name: pvc-nfs01persistentVolumeClaim:claimName: mypvc-nfscontainers:- name: task-pv-containerimage: nginx:1.7.9ports:- containerPort: 80name: "http-server"volumeMounts:- mountPath: "/usr/share/nginx/html"name: pvc-nfs01
EOF

(2) 创建pod

ku create -f pvc-pv-pod-nfs.yaml
ku get pod -o wide

(3) 测试

cd /opt/wwwroot/
echo "zxdctfvygbhunxctvybuhin7ui">index.html
curl 10.244.85.202

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

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

相关文章

蚂蚁 KAG 框架开源:知识图谱 + RAG 双引擎

引言&#xff1a;从RAG到KAG&#xff0c;专业领域知识服务的技术突破 在大语言模型&#xff08;LLM&#xff09;应用落地过程中&#xff0c;检索增强生成&#xff08;RAG&#xff09; 技术通过引入外部知识库有效缓解了模型幻觉问题&#xff0c;但在专业领域仍面临三大核心挑战…

V-Ray 7.00.08 for 3ds Max 2021-2026 安装与配置教程(含语言补丁)

本文介绍 V-Ray 7.00.08 渲染器在 3ds Max 2021-2026 各版本中的安装与使用配置步骤&#xff0c;适合需要进行可视化渲染工作的设计师、建筑师及相关从业者。附带语言补丁配置方式&#xff0c;帮助用户获得更顺畅的使用体验。 &#x1f4c1; 一、安装文件准备 软件名称&#xf…

Go-Elasticsearch Typed Client查询请求的两种写法强类型 Request 与 Raw JSON

1 为什么需要两种写法&#xff1f; 在 Golang 项目中访问 Elasticsearch&#xff0c;一般会遇到两类需求&#xff1a;需求场景特点最佳写法后台服务 / 业务逻辑查询固定、字段清晰&#xff0c;需要编译期保障Request 结构体仪表盘 / 高级搜索 / 模板 DSL查询片段由前端或脚本动…

Leaflet 综合案例-聚类图层控制

看过的知识不等于学会。唯有用心总结、系统记录&#xff0c;并通过温故知新反复实践&#xff0c;才能真正掌握一二 作为一名摸爬滚打三年的前端开发&#xff0c;开源社区给了我饭碗&#xff0c;我也将所学的知识体系回馈给大家&#xff0c;助你少走弯路&#xff01; OpenLayers…

React组件中的this指向问题

在 React 组件中&#xff0c;函数定义方式影响this指向的核心原因是箭头函数与普通函数的作用域绑定规则不同&#xff0c;具体差异如下&#xff1a;​ 1. 普通函数&#xff08;function定义&#xff09;需要手动bind(this)的原因​ 当用function在组件内定义方法时&#xff1…

Vue 项目中的组件引用如何实现,依赖组件间的数据功能交互及示例演示

在 Vue 项目中&#xff0c;组件间的引用与数据交互是核心功能之一。以下是组件引用和数据交互的详细实现方式及示例&#xff1a;一、组件引用方式 1. 基本组件引用 局部注册&#xff1a;在父组件中按需引入子组件并注册。 // ParentComponent.vue import ChildComponent from .…

✨ 使用 Flask 实现头像文件上传与加载功能

文章目录&#x1f9f1; 技术栈&#x1f5c2;️ 项目结构与配置&#x1f510; 用户身份校验逻辑&#x1f4e4; 头像上传接口&#xff1a;/file/avatar/upload&#x1f4e5; 加载头像接口&#xff1a;/file/avatar/load/<filename>&#x1f9ea; 示例请求&#xff08;使用 …

去除视频字幕 5: 使用 ProPainter, 记录探索过程

使用 ProPainter 去除视频上的字幕&#xff0c;效果演示&#xff08;比之前好多了。&#xff09;。 1. 项目目标 去除视频 (bear.webm) 中的硬字幕。 2. 初始尝试与关键失败&#xff1a;IOPaint 方法: 使用 IOPaint&#xff08;一个图像修复工具&#xff09;配合 PaddleOCR 逐…

JavaScript HTTP 请求:从老古董到新潮流

前端开发离不开跟后端打交道&#xff0c;HTTP 请求就是这座桥梁。JavaScript 提供了好几种方式来发请求&#xff0c;从老牌的 XMLHttpRequest (XHR) 到现代的 Fetch API&#xff0c;再到各种好用的第三方库&#xff08;像 Axios、Ky、Superagent&#xff09;。咱们一个一个聊清…

Windows10系统使用Cmake4.1.0构建工具+Visual Studio2022编译Opencv4.11教程

安装提示 后续安装本Cmake和Opencv版本及以上都可以。Microsoft Visual Studio2022已默认安装&#xff0c;没有安装给出教程链接。 一、Cmake4.1.0下载 1.官网下载&#xff1a;https://cmake.org/download/&#xff0c;找到cmake-4.1.0-rc3-windows-x86_64.zip版本 2.压缩包…

【性能测试】Jmeter+Grafana+InfluxDB+Prometheus Windows安装部署教程

一、工具作用与整体架构 1.1 各工具核心作用 工具作用描述关键特性Jmeter性能测试工具&#xff0c;模拟多用户并发请求&#xff0c;生成测试数据支持HTTP/HTTPS、数据库等多种协议&#xff0c;可自定义测试场景InfluxDB时序数据库&#xff0c;专门存储时间序列数据&#xff0…

【Kubernetes】使用Deployment进行的资源调度,资源清理,伸缩与更新管控

Kubernetes Deployment 实战&#xff1a;从资源清理到伸缩与更新管控 一、基础准备&#xff1a;清理闲置 ReplicaSet 在使用 Deployment 时&#xff0c;每次更新都会生成新的 ReplicaSet&#xff08;简称 RS&#xff09;&#xff0c;旧的 RS 会被保留但设置为 DESIRED0。这些闲…

stm32使用USB虚拟串口,因电脑缺少官方驱动而识别失败(全系列32单片机可用)

驱动下载地址 官网地址&#xff1a;https://www.st.com/en/development-tools/stsw-stm32102.html

枚举中间位置基础篇

参考资料来源灵神在力扣所发的题单&#xff0c;仅供分享学习笔记和记录&#xff0c;无商业用途。 核心思路&#xff1a; 一&#xff1a;直接直接用数据结构记录需要的数据&#xff0c;在枚举右&#xff0c;维护左的循环中&#xff0c;删除当前位置的元素即可达成一样效果 二…

企业选择将服务器放在IDC机房托管的优势

在服务器作为数据存储和传输的核心设备的社会环境中&#xff0c;服务器的稳定性和安全性会直接影响到企业业务的连续性和用户的满意程度&#xff0c;随着云计算技术和大数据的兴起&#xff0c;企业对于服务器的需求也在日益增加&#xff0c;而如何高效、安全的管理服务器则是各…

自动化UI测试工具TestComplete的AI双引擎:即时数据集 + 自愈测试

随着敏捷开发和持续交付模式的普及&#xff0c;传统的软件测试方法正面临着前所未有的挑战。测试团队在追求快速迭代的同时&#xff0c;往往陷入测试数据准备和测试维护的泥潭&#xff0c;严重制约了交付效率和质量保障能力。 TestComplete作为业界领先的自动化测试工具&#…

用KNN实现手写数字识别:基于 OpenCV 和 scikit-learn 的实战教学 (超级超级超级简单)

用KNN实现手写数字识别&#xff1a;基于 OpenCV 和 scikit-learn 的实战教学在这篇文章中&#xff0c;我们将使用 KNN&#xff08;K-Nearest Neighbors&#xff09;算法对手写数字进行分类识别。我们会用 OpenCV 读取图像并预处理数据&#xff0c;用 scikit-learn 构建并训练模…

数据结构自学Day15 -- 非比较排序--计数排序

一、计数排序&#xff08;Counting Sort&#xff09;计数排序是一种非比较型的排序算法&#xff0c;它的核心思想是&#xff1a;利用“元素的值”来确定它在结果数组中的位置&#xff0c;通过“统计每个数出现的次数”来完成排序。二、如何实现计数排序&#xff08;核心步骤&am…

k8s的权限

来自博客&#xff1a;25-k8s集群中-RBAC用户角色资源权限_权限 资源 角色-CSDN博客 一.RBAC概述&#xff08;基于角色的访问控制&#xff09; 1.图解 用户&#xff1a; 1.user 2.serviceAccount 3.Group 用户角色 1.Role:局部资源角色 2.clusterRole:全局资源角色额 角色绑…

C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(三)

目录 队列数据管理 代码实现 测试代码 绑定信息(交换机-队列)管理 代码实现 测试代码 队列数据管理 当前队列数据的管理&#xff0c;本质上是队列描述信息的管理&#xff0c;描述当前服务器上有哪些队列。 定义队列描述数据类 队列名称是否持久化标志是否独占标志是否自…