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

k8s的配置和存储(ConfigMap、Secret、Hostpath、EmptyDir以及NFS的服务使用)

ConfigMap

简介

在 Kubernetes 中,ConfigMap 是一种用于存储非敏感信息的 Kubernetes 对象。它用于存储配置数据,如键值对、整个配置文件或 JSON 数据等。ConfigMap 通常用于容器镜像中的配置文件、命令行参数和环境变量等。

ConfigMap 可以通过三种方式进行配置数据的注入:

  1. 环境变量注入:将配置数据注入到 Pod 中的容器环境变量中。

  2. 配置文件注入:将配置数据注入到 Pod 中的容器文件系统中,容器可以读取这些文件。

  3. 命令行参数注入:将配置数据注入到容器的命令行参数中。

优缺点

优点:

  1. 代码与配置分离:ConfigMap允许将应用的配置信息从容器镜像中分离出来。这种分离使得配置可以独立于应用程序进行管理和更新,从而简化了配置管理流程,并避免了因配置更改而需要重新构建和部署容器镜像的繁琐过程。
  2. 统一的集群配置管理:ConfigMap提供了一个统一的机制,用于在Kubernetes集群中存储、管理和传递配置信息。这使得配置数据可以在多个Pod、容器或服务之间共享和重用,提高了配置的灵活性和可维护性。
  3. 提高可移植性:通过将配置信息与容器镜像分离,ConfigMap使得容器镜像更加通用和可移植。同一个容器镜像可以在不同的环境中使用,只需通过ConfigMap提供不同的配置即可,从而增强了应用的适应性和灵活性。
  4. 简化配置管理:ConfigMap支持以key-value对的形式存储配置数据,可以方便地通过kubectl命令行工具或YAML文件进行创建、查询、更新和删除。此外,ConfigMap还支持存储整个配置文件或JSON二进制对象,为复杂的配置管理提供了更大的灵活性。
  5. 支持多种使用场景:ConfigMap可以用于多种使用场景,如外部配置文件的管理、环境变量的设置、应用启动参数的动态传递等。这使得ConfigMap成为Kubernetes集群中不可或缺的配置管理工具,能够满足不同应用和服务的需求。
  6. 版本控制:由于ConfigMap是Kubernetes的API资源对象,因此可以使用Kubernetes的版本控制机制对其进行版本管理。这有助于跟踪和审计配置更改,确保集群的稳定性和可维护性。当配置发生更改时,可以轻松地回滚到之前的版本,降低了因配置错误而导致的风险。

然而,需要注意的是,ConfigMap不是加密的,不适合存储敏感信息(如密码、密钥等)。对于这类敏感信息,应该使用Kubernetes的Secret对象或其他加密手段进行存储和管理。此外,ConfigMap的大小也有限制(默认为1MB),需要根据实际情况进行规划和管理。

综上所述,ConfigMap在Kubernetes集群中具有诸多优点,是配置管理的重要工具之一。通过合理利用ConfigMap,可以大大提高应用的可维护性、灵活性和安全性。

缺点:

ConfigMap是Kubernetes中用于配置管理的资源对象,它允许将配置信息从容器镜像中解耦,使得配置可以独立于应用程序进行管理和更新。然而,ConfigMap也存在一些缺点,主要包括以下几点:

  1. 数据大小限制:ConfigMap保存的数据大小不能超过1MiB(默认为1MB),这对于一些需要存储大量配置信息的场景可能会构成限制。如果配置数据超过了这个大小限制,就需要考虑其他配置管理方案。
  2. 不适用于敏感数据:ConfigMap存储的配置数据不加密,因此不适合存储敏感信息,如密码、密钥等。对于这类敏感信息,应该使用Kubernetes的Secret对象或其他加密手段进行存储和管理。
  3. 热更新限制:虽然ConfigMap支持热更新,即可以在不重启Pod的情况下更新配置数据,但需要注意的是,如果ConfigMap是通过环境变量的方式注入到容器中的,那么更新后的值不会立即生效,需要重启Pod才能使新的配置生效。这可能会在某些需要频繁更新配置的场景中造成不便。

综上所述,虽然ConfigMap为Kubernetes中的配置管理提供了很大的便利,但也存在一些需要注意的缺点和限制。在使用ConfigMap时,需要根据实际情况进行规划和管理,以确保配置的正确性和安全性。

ConfigMap基本操作

创建configmap

1:直接用命令创建

configmap的简介cm

kubectl create cm cm名称 --from-literal=key1=value1 [--from-literal=key2=value2 ...]

kubectl create cm cm-1 --from-literal=name=test --from-literal=pwd=123456
查看cm
kubectl get cm cm-1

查看详细信息

Kubectl describe cm cm-1

查看日志

kubectl logs 名称
删除
kubectl delete cm my-config(cm 的名字)

如果使用的是yml文件的话,加上-f

kubectl delete -f my-config(cm 的名字).yaml

2:用文件的方式创建

先创建两个文件:username   password    各在文件里写入内容

语法:kubectl create cm cm名称 --from-file=  

kubectl create cm cm-2 --from-file=username --from-file=password

3:用文件夹的方式创建

在当前文件夹创建两个文件,和上面的文件内容一样

kubectl create cm cm-3 --from-file=/aaa/k8s/cm

4:用yml文件的方式创建

名字为cm-4.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: cm-4
data:key1: value1key2: value2
创建
kubectl apply -f cm-4.yaml

使用configmap

将configmap作为环境变量

创建cm

kubectl create cm cm-kv --from-literal=SERVER_PORT=9999 --from-literal=HOST=127.0.0.1

创建pod,我们在pod里使用我们刚才创建好的cm作为环境的值

apiVersion: v1
kind: Pod
metadata:name: pod-cm
spec:containers:- image: alpinename: cm-alpineenv:#定义环境变量名称- name: ENV_SERVER_PORT#定义环境变量的值来源于valueFrom:#来源于ConfigMap的key引用configMapKeyRef:#来源于哪个ConfigMapname: cm-kv#来源于哪个ConfigMap的key引用key: SERVER_PORT# 容器启动后打印环境变量和睡眠3600秒command: ["/bin/sh","-c","env;sleep 3600"]

把我们刚创建好的cm里的SERVER_PORT作为ENV_SERVER_PORT的值

创建pod

kubectl apply -f cm-kv.yaml

可以看到值也替换成了我们自己创建的cm环境值

Secret

简介

在Kubernetes(K8s)中,Secret是一种用于存储和管理敏感信息的对象资源类型

用于安全管理敏感数据的关键组件,它可以存储如密码、OAuth令牌、TLS证书等敏感数据。这些数据在存储时通常会进行Base64编码,以避免以明文形式直接暴露。如果etcd(Kubernetes的存储后端)被配置为加密存储,Secret数据也将被加密。

作用

  1. 安全存储和分发敏感数据:Secret可以存储数据库密码、API密钥、SSH私钥等机密信息,而无需将它们暴露在代码或Docker镜像中。这有助于保护敏感数据不被未经授权的用户访问。
  2. 与镜像仓库交互时管理认证信息:Secret可用于存储从私有Docker镜像仓库拉取镜像所需的认证信息,如用户名和密码。这使得Kubernetes集群能够安全地从私有仓库中获取镜像。
  3. 提供TLS/SSL证书:Secret可以管理HTTPS通信所需的TLS/SSL证书和私钥,确保服务间通信的安全性。
  4. 环境变量和文件挂载:Secret可以以环境变量的形式注入到Pod中,或者以文件的形式挂载到Pod的文件系统中。这使得应用程序能够安全地访问所需的敏感数据。

为什么要使用Secret

  1. 提高安全性:通过将敏感数据存储在Secret中,可以避免将它们硬编码在代码或Docker镜像中,从而降低数据泄露的风险。
  2. 简化管理:Secret提供了一种集中管理敏感数据的方式,使得集群管理员能够更容易地跟踪和更新这些数据。
  3. 增强合规性:许多行业和法规要求保护敏感数据的安全性。使用Secret可以帮助组织满足这些合规性要求。
  4. 灵活性:Secret可以与特定的Namespace关联,实现细粒度的权限控制和隔离。此外,Secret还支持动态更新和自动检查更新,使得应用程序能够动态读取最新的敏感数据。

综上所述,Kubernetes中的Secret是一种非常重要的资源对象,它用于安全地存储和管理敏感数据,并提供了多种方式来访问这些数据。通过使用Secret,可以提高集群的安全性、简化管理、增强合规性,并为应用程序提供灵活的敏感数据访问方式。

创建Secret

1:使用命令创建Secret

kubectl create secret generic mysecret1 --from-literal=username=root --from-literal=password=123456
查看
kubectl get secret

查看详细情况

 kubectl describe secret mysecret1

 

可以发现看不到数据,只能看到有多少字节

kubectl get secret secret名称 -o yaml 

拿到password的明文

echo -n "MTIzNDU2" | base64 -d

 用明文查看具体信息

2:用yaml文件创建

文件名secret-my2.yaml

apiVersion: v1
kind: Secret
metadata:name: mysecret2
type: Opaque
data:username: YWRtaW4=   #base64 编码之后的用户名adminpassword: NjU0MzIx   # 编码之后的密码654321

创建

kubectl apply -f secret-my2.yaml

查看结果

kubectl get secret

3:使用文件创建secret 

创建文件

echo -n admin >./usernameecho -n 123456 > ./password

创建secret 

kubectl create secret generic mysecret --from-file=./username --from-file=./password

Docker私有仓库类型的Secret使用

之前的文章里有详细的创建镜像仓库步骤

进入我们之前创建的仓库里,这里可以看到我们的username,还有一个就是我们创建仓库时自己创建的密码

我们也要获取到服务器地址

创建docker

kubectl create secret docker-registry docker-sec  --docker-server=crpi-gncut4i1n4x11ps8.cn-beijing.personal.cr.aliyuncs.com  --docker-username=aliyun3410884371 --docker-password=密码

将这三个信息替换为自己的即可

Hostpath

工作原理:HostPath卷通过Volume抽象层将宿主机的存储空间关联到容器,使容器可以直接访问宿主机上的文件系统。当Pod被调度到某个节点上时,它会将宿主机上指定的目录或文件挂载到容器内部,使得容器可以像访问本地文件系统一样访问这些资源。

简介

HostPath是Kubernetes中的一种存储卷类型,它将容器所在宿主机的文件目录挂载到容器指定的挂载点中。

HostPath的作用

HostPath类型的存储卷可以独立于Pod资源的生命周期,具有持久性。这意味着即使Pod被删除,存储在HostPath中的数据仍然会保留在宿主机上。这使得HostPath在以下场景中非常有用:

  1. 容器需要访问Docker内部结构时,可以使用HostPath映射Docker的目录到容器中。
  2. 容器工作负载程序生成的日志文件需要永久保存时,可以使用HostPath将日志文件存储到宿主机上。
  3. 需要访问宿主机上特定文件或目录的容器工作负载,可以通过HostPath实现。

创建pod

创建yaml文件

apiVersion: v1
kind: Pod
metadata:name: pod-vm-hostpath
spec:containers: - image: nginx:1.22.0name: con-vm-hostpath#加载数据卷volumeMounts:#加载volumes中的哪个数据卷 - name: db-config#加载到容器中的哪个路径mountPath: "/usr/share/nginx/html"#定义容器可以用的容器卷volumes:#定义名称- name: db-confighostPath:#对应本机的一个文件夹路径path: /data1# 检查类型 在挂载前对目录做检查操作 DirectoryOrCreate type: DirectoryOrCreate

 因为我们搭建了集群,所以我们需要查看在哪台服务器上运行

在noded3中执行

这时候我们查看pod的信息

也就是说将pod容器里面的文件夹和我们本机的data1进行了绑定

如果 Pod 被销毀了,hostPath 对应的目录还是会被保留,从这一点来看,hostPath 的持久性比emptyDir 强。不过一旦Host 崩溃,hostPath 也就无法访问了。但是这种方式也带来另外一个问题增加了 pod 与节点的耦合。

EmptyDir

用于两个容器共享文件夹

容器间共享:Pod中的所有容器都可以读写EmptyDir卷,这使得它适合用作共享存储。例如,一个容器可以将数据写入EmptyDir,然后另一个容器可以从EmptyDir中读取这些数据。

简介

定义:EmptyDir是一个在Pod被分配到Node(节点)时创建的空目录。它的初始内容为空,并且无需指定宿主机上对应的目录文件,因为Kubernetes会自动为其分配一个目录。

生命周期:EmptyDir的生命周期与Pod紧密相关。当Pod被创建时,EmptyDir也会被创建;当Pod被销毁时,EmptyDir中的数据也会被永久删除。

创建pod

apiVersion: v1
kind: Pod
metadata:name: pod-vm-emptydir
spec:containers: - image: busybox#imagePullPolicy: Nevername: con-vm-emptydir1#加载数据卷volumeMounts:#加载volumes中的哪个数据卷 - name: db-config#加载到容器中的哪个路径mountPath: "/data3"command: ["/bin/sh","-c","sleep 3600"]- image: busyboximagePullPolicy: Nevername: con-vm-emptydir2#加载数据卷volumeMounts:#加载volumes中的哪个数据卷 - name: db-config#加载到容器中的哪个路径mountPath: "/data4"command: ["/bin/sh","-c","sleep 3600"]#定义容器可以用的容器卷volumes:#定义名称- name: db-configemptyDir: {}

创建两个容器,并可以互相读取数据

分别进入两个容器

进入容器
kubectl exec -it pod-vm-emptydir -c con-vm-emptydir1 -- sh
kubectl exec -it pod-vm-emptydir -c con-vm-emptydir2 -- sh

分别进入两个data文件夹,随意操作就可以发现两个文件夹的内容时同步的

NFS

简介

NFS(Network File System)即网络文件系统,是一种允许不同计算机系统和设备之间通过网络共享文件和资源的协议

  1. 工作原理
    • NFS通过将文件系统挂载到远程服务器上,实现对文件和目录的访问和共享。
    • 客户端请求访问某个文件或目录时,NFS将该请求传递给服务器,服务器返回所需要的数据或信息。
    • 客户端和服务器之间通过RPC(Remote Procedure Call,远程过程调用)协议进行通信。

NFS作用

  1. 文件共享与协作
    • NFS允许不同操作系统和设备之间共享文件和资源,使得多台计算机可以方便地访问和操作同一份数据。
    • 这有助于提高工作效率和资源利用率,同时减少了数据冗余和管理成本。
  2. 集中化管理与维护
    • 通过NFS,可以将文件和资源集中管理在服务器上,并通过网络共享给多个客户端使用。
    • 这有助于实现集中化的管理和维护,减少了系统管理员的工作量。
  3. 高效的文件访问性能
    • NFS采用了异步I/O和数据缓存等技术,以提高文件访问效率和性能。
    • 经常访问的文件和目录可以被缓存到客户端本地,从而减少了对服务器的访问次数。
  4. 安全性与权限控制
    • NFS实现了基于权限的文件访问控制机制,只有合法用户才能访问和修改共享的文件和目录。
    • 这有助于确保数据的安全性和完整性,防止未经授权的访问和修改。

安装nfs

在我们集群的服务器上都安装上

 yum -y install  nfs-utils

启动

 systemctl start nfs-server

在主机上创建/opt/nfs/data文件夹

设置访问权限

# insecure:通过 1024 以上端口发送 rw: 读写 sync:请求时写入共享 no_root_squash:root用户有完全根目录访问权限echo  "/opt/nfs/data *(insecure,rw,sync,no_root_squash)" >> /etc/exports

让共享生效:

#重新挂载 使 /etc/exports生效exportfs -r

查看共享文件

 exportfs 

重启nfs-server服务

systemctl restart nfs-server

在其余两台服务器上创建/root/nfs/data目录

挂载远程nfs目录到本地

 mount -t nfs 192.168.227.100:/root/nfs/data /root/nfs/data

创建一个测试文件

 echo "hello nfs server" > /root/nfs/data/test.txt

查看主机上的文件

cat /root/nfs/data/test.txt

就可以发现文件共享了,主机的文件夹里也出现了这个test文件

取消挂载

 umount -f -l nfs目录

在/root/nfs/data中创建index.html并写入内容

echo hello>index.html

创建pod文件nfs.yml

apiVersion: v1
kind: Pod
metadata:name: pod-nfs
spec:containers: - image: nginx:1.19name: con-nfs#加载数据卷volumeMounts:#加载volumes中的哪个数据卷 - name: nfs-volume#加载到容器中的哪个路径mountPath: "/usr/share/nginx/html"#定义容器可以用的容器卷volumes:#定义名称- name: nfs-volumenfs:#nfs网络服务的地址server: 192.168.227.100#nfs网络服务器的路径 要在服务器上存在 并且已经启用共享path: /root/nfs/data#是否只读readOnly: false

创建pod

kubectl apply -f nfs-pod.yaml

查看所有的pod

 kubectl get pods -o wide

 

访问我们创建的pod

curl  10.244.2.38

我们写入的信息也就显示了出来

即使pod删除,NFS服务器上的对应的文件也不会删除,能够做到持久化存储。

总结

Emptydir  容器之间可以数据共享

Hostpath : 把容器内部的路径挂载到对应的节点的主机上面,操作主机上面的文件夹对应的容器就可以同步

Nfs:把容器内部的路径挂载到主机上面,操作主机上面的文件夹对应的容器就可以同步

主机是可以跨节点(在主机上运行,挂载到另一台服务器上面 )

nfs可以跨节点 hostpath 不可以

相关文章:

k8s的配置和存储(ConfigMap、Secret、Hostpath、EmptyDir以及NFS的服务使用)

ConfigMap 简介 在 Kubernetes 中,ConfigMap 是一种用于存储非敏感信息的 Kubernetes 对象。它用于存储配置数据,如键值对、整个配置文件或 JSON 数据等。ConfigMap 通常用于容器镜像中的配置文件、命令行参数和环境变量等。 ConfigMap 可以通过三种方…...

JS轮播图实现自动轮播、悬浮停止轮播、点击切换,下方指示器与图片联动效果

代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…...

使用 Kafka 和 MinIO 实现人工智能数据工作流

MinIO Enterprise Object Store 是用于创建和执行复杂数据工作流的基础组件。此事件驱动功能的核心是使用 Kafka 的 MinIO 存储桶通知。MinIO Enterprise Object Store 为所有 HTTP 请求&#xff08;如 PUT、POST、COPY、DELETE、GET、HEAD 和 CompleteMultipartUpload&#xf…...

力扣题86~90

题86&#xff08;中等&#xff09;&#xff1a; python代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def partition(self, head: Optional[Li…...

【JavaEE】【多线程】定时器

目录 一、定时器简介1.1 Timer类1.2 使用案例 二、实现简易定时器2.1 MyTimerTask类2.2 实现schedule方法2.3 构造方法2.4 总代码2.5 测试 一、定时器简介 定时器&#xff1a;就相当于一个闹钟&#xff0c;当我们定的时间到了&#xff0c;那么就执行一些逻辑。 1.1 Timer类 …...

CI/CD 的原理

一、CI/CD 的概念 CI/CD是一种软件开发流程&#xff0c;旨在通过自动化和持续的集成、测试和交付实现高质量的软件产品。 CI(Continuous Integration)持续集成 目前主流的开发方式是协同开发&#xff0c;即多位开发人员同事处理同意应用不同模块或功能。 如果企业在同一时间将…...

进一步认识ICMP协议

在日常工作中&#xff0c;我们经常需要判断网络是否连通&#xff0c;相信大家使用较多的命令就是 ping啦。ping命令是基于 ICMP 协议来实现的&#xff0c;那么什么是 ICMP 协议呢&#xff1f;ping命令又是如何基于 ICMP 实现的呢&#xff1f; 今天这篇文章&#xff0c;我们就来…...

NUUO网络视频录像机upload.php任意文件上传漏洞复现

文章目录 免责声明漏洞描述搜索语法漏洞复现nuclei修复建议 免责声明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 NUUO网络视频录像机&#xff08;Network Video Recorder&#xff0…...

WebGL 3D基础

1. 归一化函数 对一个向量进行归一化处理&#xff0c;即调整向量的模长&#xff08;长度&#xff09;为1&#xff0c;同时保持其方向不变。 // 归一化函数 function normalized(arr) {let sum 0;for (let i 0; i < arr.length; i) {sum arr[i] * arr[i];}const middle …...

Docker 部署MongoDb

1. 编写docker-compose.conf 文件 version: 3 services:mongo:image: mongo:latest # 指定 MongoDB 版本&#xff0c;确保 > 3.6container_name: mongo-replicarestart: alwayscommand: ["mongod", "--replSet", "rs0", "--oplogSize&…...

【Hadoop】hadoop的路径分不清?HDFS路径与本地文件系统路径的区别

/usr/local/hadoop /user/hadoop /home/hadoop/ 这里有些路径名很相似&#xff0c;帮我区分&#xff1f; 在Hadoop生态系统中&#xff0c;理解文件存储的位置对于有效管理数据至关重要。Hadoop分布式文件系统&#xff08;HDFS&#xff09;提供了一个高度可靠的存储系统&#xf…...

倪师学习笔记-天纪-易经八卦

一、简介 卦代表事情&#xff0c;爻代表时机&#xff0c;三爻为一卦八卦对应的天相&#xff0c;六十四卦对应人间事 二、八卦性 1、乾 天父亲向下看&#xff0c;无所求&#xff0c;雄心万丈始终如一&#xff0c;贞&#xff0c;坚心&#xff0c;专心至刚&#xff0c;天威&am…...

自动驾驶性能分析时,非常有用的两个信息

自动驾驶的关键路径如下&#xff0c;传感器的数据发送给感知模块&#xff1b;感知模块根据传感器数据来确定车辆所处的环境&#xff0c;比如前方有没有障碍物&#xff0c;是不是和车道线保持着适当的距离等&#xff1b;感知处理之后的数据传递给规控模块&#xff0c;规控根据车…...

数据结构 - 并查集

文章目录 一、并查集原理二、并查集实现三、并查集的应用 一、并查集原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复…...

canvas基础+应用+实例

文章目录 Canvas基础知识要点一、基本概念二、常用参数三、实例四、场景应用说明完结 Canvas基础知识要点 一、基本概念 Canvas是HTML5中的一个标签&#xff0c;用于在网页上通过JavaScript绘制图形、动画等。它提供了一个空白的、基于像素的绘图区域&#xff0c;就像一块画布…...

Linux命令 用户操作简介

目录 1. 添加新的用户账号 2. 删除用户账号 3. 修改用户账号 4. 用户口令的管理 示例汇总 添加新用户 删除用户 修改用户信息 更改用户口令 在 Linux 系统中&#xff0c;用户管理是一项重要的任务&#xff0c;包括添加新用户、删除用户、修改用户信息以及管理用户口令…...

大语言模型的Scaling Law【Power Low】

NLP-大语言模型学习系列目录 一、注意力机制基础——RNN,Seq2Seq等基础知识 二、注意力机制【Self-Attention,自注意力模型】 三、Transformer图文详解【Attention is all you need】 四、大语言模型的Scaling Law【Power Low】 文章目录 NLP-大语言模型学习系列目录一、什么是…...

windows环境下,使用docker搭建redis集群

参考: https://blog.csdn.net/weixin_46594796/article/details/137864842 https://www.cnblogs.com/niceyoo/p/14118146.html 史上最详细Docker搭建Redis Cluster集群环境 值得收藏 每步都有图,不用担心学不会-腾讯云开发者社区-腾讯云 一、基础环境描述 宿主机:192.168…...

Python(pandas库3)

函数 随机抽样 语法&#xff1a; n&#xff1a;要抽取的行数 frac&#xff1a;抽取的比例&#xff0c;比如 frac0.5&#xff0c;代表抽取总体数据的50% axis&#xff1a;示在哪个方向上抽取数据(axis1 表示列/axis0 表示行) 案例&#xff1a; 输出结果都为随机抽取。 空…...

WPF+MVVM案例实战(十)- 水波纹按钮实现与控件封装

文章目录 1、运行效果1、封装用户控件1、创建文件2、依赖属性实现2、使用封装的按钮控件1.主界面引用2.按钮属性设置3 总结1、运行效果 1、封装用户控件 1、创建文件 打开 Wpf_Examples 项目,在 UserControlLib 用户控件库中创建按钮文件 WaterRipplesButton.xaml ,修改 Us…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...