Kubernetes --存儲入門

一、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;描述當前服務器上有哪些隊列。 定義隊列描述數據類 隊列名稱是否持久化標志是否獨占標志是否自…