k8sday13数据存储(1.5/2)

目录

二、高级核心存储

1、PV

1.1配置文件

①、访问模式(accessModes)

②、回收策略(persistentVolumeReclaimPolicy)

③、存储类别

④、状态(Status)

1.2创建测试

①、准备NFS环境

②、创建PV

③、验证

2、PVC

1.1配置文件

1.2绑定引用测试

①、创建PVC

②、测试绑定

③、创建Pod准备测试

④、测试链路打通

3、注意事项

PV和PVC未绑定检查步骤

1、容量(Capacity)

2、访问模式(AccessModes)

3、可用状态(Status)

4、StorageClassName 必须完全一致

4、生命周期

①、资源供应

②、资源绑定

③、资源使用

④、资源释放

⑤、资源回收

5、补充动态供给


二、高级核心存储

​ 之前学过NFS提供存储配置,我们知道要进行存储数据要求用户会自己搭建NFS服务器,会在YAML文件中配置NFS,这显然对于用户来说,要求过高,而且k8s支持的存储系统类型多,要求用户熟知每个存储系统那是不现实的,所以k8s提出高级核心存储的概念(主要包含PV和PVC),二者通过连接绑定,最终实现用户只需要提出Pod的存储要求,而其底层实现由对应的管理员实现。如图:

1、PV

集群级资源,独立于 Pod 生命周期。可由管理员静态提前创建,也可通过 StorageClass 让系统自动动态供给。

1.1配置文件

以下给出一个NFS 类型的 PV 示例,供集群管理员提前“静态”创建,

  # persistent-volume-nfs.yaml# 应用侧只需在 PVC 中声明相同 storageClassName 即可绑定。apiVersion: v1kind: PersistentVolume        # 声明资源类型是 PVmetadata:name: pv-nfs-share          # PV 对象在集群中的名称,可自定义# 由于 PV 是集群级资源,所以没有 namespace 的概念labels:app: nfs-pv-demo          # 可按需添加 label,方便选择器匹配spec:capacity:storage: 2Gi              # 声明的容量,PVC 申请量需 ≤ 该值accessModes:                # 访问模式- ReadWriteMany           # 允许多节点同时读写persistentVolumeReclaimPolicy: Retain     # 回收策略storageClassName: nfs-slow  # 必须与下方对应 PVC 的 storageClassName 一致mountOptions:- nfsvers=4.1             # 挂载参数,按需调整- noatimenfs:                        # 存储类型server: 192.168.10.5      # NFS 服务器 IP 或域名path: /data/nfs/share     # NFS 导出的共享目录
①、访问模式(accessModes)

用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:

  • ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载

  • ReadOnlyMany(ROX):只读权限,可以被多个节点挂载

  • ReadWriteMany(RWX):读写权限,可以被多个节点挂载

需要注意的是,底层不同的存储类型可能支持的访问模式不同

②、回收策略(persistentVolumeReclaimPolicy)

当 PV 不再被使用了之后,对其的处理方式。目前支持三种策略:

  • Retain(保留):PVC 删除后仅解除绑定,数据仍在,需要管理员手工清理数据

  • Recycle(回收):清除 PV 中的数据,已废弃,不推荐使用

  • Delete(删除):与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务

需要注意的是,底层不同的存储类型可能支持的访问模式不同

③、存储类别

PV可通过storageClassName参数指定一个存储类别

  • 具有了特定类别的PV只能与请求了改特定类别的PVC绑定

  • 没有指定类别的PV只能与不请求任何类别的PVC绑定

④、状态(Status)

一个PV的生命周期内,可能会有4个状态阶段:

  • Available(可用):未被任何PVC绑定

  • Bound(已绑定):PV已经和PVC绑定

  • Released(已释放):PV和PVC已解绑,PVC被删除,但是资源未被集群重新声明

  • Failed(失败):PV自动回收失败

1.2创建测试
①、准备NFS环境
  # 获取已有节点,找到control-plane容器记下输出容器内 IP( INTERNAL-IP )例如 172.18.0.4 kubectl get node -o wide​# 进入控制面(control-plane)容器docker exec -it my-multi-node-cluster1-control-plane bash​# ---- 容器内执行 ------# 更新并安装NFS服务(如果你已经安装过了就不用这一步了)apt update && apt install -y nfs-kernel-server​# 创建共享目录mkdir /tmp/logs/{pv1,pv2,pv3} -pv# 把共享目录权限改成 “任何人可读可写可执行”chmod 777 /tmp/logs# 向 /etc/exports 追加一行 导出规则# 当然也可以手动进入 /etc/exports 然后编辑添加规则# 建议使用精准的网络白名单# 如172.18.0.0/24 只允许这一网段访问;写成 * 就是全网放通,风险高echo "/tmp/logs 172.18.0.0/24(rw,sync,no_subtree_check,no_root_squash)" > /etc/exports# 重新加载 /etc/exports 并立即生效exportfs -rav # 重启 NFS 服务进程systemctl restart nfs-kernel-server# 如果不可用systemctl,可改为:service nfs-kernel-server restart​# 退出控制面容器exit
②、创建PV
  # pv-nfs.yamlapiVersion: v1kind: PersistentVolume        # 声明资源类型是 PVmetadata:name: pv1-nfs               # PV 对象在集群中的名称,可自定义# 由于 PV 是集群级资源,所以没有 namespace 的概念labels:app: pv1          # 可按需添加 label,方便选择器匹配spec:capacity:storage: 1Gi              # 声明的容量,PVC 申请量需 ≤ 该值accessModes:                # 访问模式- ReadWriteMany           # 允许多节点同时读写persistentVolumeReclaimPolicy: Retain     # 回收策略nfs:                        # 存储类型server: 172.18.0.4        # NFS 服务器 IP 或域名path: /tmp/logs/pv1       # NFS 导出的共享目录storageClassName: nfs-static         # 存储类别---​apiVersion: v1kind: PersistentVolume        # 声明资源类型是 PVmetadata:name: pv2-nfs               # PV 对象在集群中的名称,可自定义# 由于 PV 是集群级资源,所以没有 namespace 的概念labels:app: pv2          # 可按需添加 label,方便选择器匹配spec:capacity:storage: 2Gi              # 声明的容量,PVC 申请量需 ≤ 该值accessModes:                # 访问模式- ReadWriteMany           # 允许多节点同时读写persistentVolumeReclaimPolicy: Retain     # 回收策略nfs:                        # 存储类型server: 172.18.0.4        # NFS 服务器 IP 或域名path: /tmp/logs/pv2       # NFS 导出的共享目录storageClassName: nfs-static         # 存储类别---​apiVersion: v1kind: PersistentVolume        # 声明资源类型是 PVmetadata:name: pv3-nfs               # PV 对象在集群中的名称,可自定义# 由于 PV 是集群级资源,所以没有 namespace 的概念labels:app: pv3         # 可按需添加 label,方便选择器匹配spec:capacity:storage: 3Gi              # 声明的容量,PVC 申请量需 ≤ 该值accessModes:                # 访问模式- ReadWriteMany           # 允许多节点同时读写persistentVolumeReclaimPolicy: Retain     # 回收策略nfs:                        # 存储类型server: 172.18.0.4        # NFS 服务器 IP 或域名path: /tmp/logs/pv3       # NFS 导出的共享目录storageClassName: nfs-static         # 存储类别
③、验证
  # 创建PVkubectl create -f pv-nfs.yaml​# 查看PVkubectl get pv -o wide

2、PVC

命名空间级资源,由用户/应用开发者创建。Kubernetes 的调度器负责把合适的 PV 绑定到这个 PVC 上。Pod 通过挂载 PVC,从而间接使用 PV

1.1配置文件
  # PVC 示例# 功能:向集群申请一块 3 GiB 的 NFS 存储,用于 Pod 挂载apiVersion: v1kind: PersistentVolumeClaim # 声明资源类型是 PVCmetadata:name: pvc-logs            # PVC 在集群里的名字,Pod 通过这个名字引用namespace: default        # PVC 是命名空间级资源,按需改成自己的 nsspec:accessModes:- ReadWriteMany         # 必须与目标 PV 的 accessModes 完全一致resources:                # 请求空间requests:storage: 3Gi          # 申请的容量。只要 ≤ PV 的 capacity.storage 即可storageClassName: nfs-rwo # 存储类别# 1. 如果集群里给 NFS 手动创建的 PV 写了 storageClassName: nfs-rwo,#    这里就要写同样的值,才能匹配到该 PV(静态绑定)。# 2. 如果想走动态供给(StorageClass + NFS provisioner),#    则 storageClassName 指向对应的 StorageClass 名称即可;#    留空或写 "" 会落到集群的「默认 StorageClass」。# volumeName: pv-nfs-001  # 可选字段,强制绑定到某一台特定 PV# 写死后即使其他 PV 更匹配也不会变,一般不建议用# selector:               # 可选,用 label 做更灵活的选择#   matchLabels:#     app: nfs-pv-demo

PVC的存储类别、访问模式、回收策略都与PV相同

1.2绑定引用测试
①、创建PVC
 # pvc-nfs.yamlapiVersion: v1kind: PersistentVolumeClaim # 声明资源类型是 PVCmetadata:name: pvc1-nfs            # PVC 在集群里的名字,Pod 通过这个名字引用namespace: default        # PVC 是命名空间级资源,按需改成自己的 nsspec:accessModes:- ReadWriteMany         # 必须与目标 PV 的 accessModes 完全一致resources:                # 请求空间requests:storage: 1Gi          # 申请的容量。只要 ≤ PV 的 capacity.storage 即可storageClassName: nfs-static         # 存储类别---​apiVersion: v1kind: PersistentVolumeClaim # 声明资源类型是 PVCmetadata:name: pvc2-nfs            # PVC 在集群里的名字,Pod 通过这个名字引用namespace: default        # PVC 是命名空间级资源,按需改成自己的 nsspec:accessModes:- ReadWriteMany         # 必须与目标 PV 的 accessModes 完全一致resources:                # 请求空间requests:storage: 1Gi          # 申请的容量。只要 ≤ PV 的 capacity.storage 即可storageClassName: nfs-static         # 存储类别---​apiVersion: v1kind: PersistentVolumeClaim # 声明资源类型是 PVCmetadata:name: pvc3-nfs            # PVC 在集群里的名字,Pod 通过这个名字引用namespace: default        # PVC 是命名空间级资源,按需改成自己的 nsspec:accessModes:- ReadWriteMany         # 必须与目标 PV 的 accessModes 完全一致resources:                # 请求空间requests:storage: 4Gi          # 申请的容量。只要 ≤ PV 的 capacity.storage 即可# 当前第三个pvc的申请容量,超过所有pv的容量,所以无法绑定storageClassName: nfs-static         # 存储类别
②、测试绑定
  # 创建PVCkubectl create -f pvc-nfs.yaml​# 查看PVCkubectl get pvc -o wide# 查看PV绑定情况kubectl get pv -o wide

如图:

③、创建Pod准备测试
  # 提供一个 Pod 准备进行 PVC → PV → NFS 链路打通测试apiVersion: v1kind: Podmetadata:name: test-pvc-mount        # Pod 名称,可随意改spec:containers:- name: nginximage: nginx:1.24.0ports:- containerPort: 80volumeMounts:- name: html              # 与 volumes.name 对应mountPath: /usr/share/nginx/html   # 容器内挂载点volumes:- name: htmlpersistentVolumeClaim:claimName: pvc1-nfs     # 必须和已存在的 PVC 名字一致restartPolicy: Never        # 测试用,跑完即停;生产可用 Always
④、测试链路打通
  # 1. 应用文件,部署 Podkubectl apply -f pod-test-pvc.yaml​# 2. 验证部署成功kubectl get pod test-pvc-mount -w​# 3. 进入 Pod 写文件kubectl exec -it test-pvc-mount -- sh -c 'echo "hello from pod" > /usr/share/nginx/html/index.html'​# 4. 在 NFS 服务器或任何节点验证# 注意 my-multi-node-cluster1-control-plane 是我的 NFS 服务器名称,记得改为你自己的docker exec -it my-multi-node-cluster1-control-plane bashcat /tmp/logs/pv1/index.html# 应输出:hello from pod​# 5. 清理kubectl delete -f pod-test-pvc.yaml

测试结果如下:

说明PVC → PV → NFS 链路打通,用户对于 Pod 的数据操作,实际存储在了与 Pod 连接的 PV,与 PV 绑定的 PVC 的存储系统之中,即 :用户→Pod→ PVC → PV → NFS(底层存储系统)

3、注意事项

PV和PVC未绑定检查步骤
1、容量(Capacity)

PVC 申请的 storage 必须 ≤ PV 声明的 capacity.storage,否则不会绑定。

  kubectl get pv,pvc -o wide
2、访问模式(AccessModes)

PVC 的 accessModes 必须是 PV 声明的访问模式的子集。例:PV 只有 RWO,PVC 却要求 RWX,就会一直 Pending

  kubectl describe pvc <pvc-name>
3、可用状态(Status)

PV 必须是 Available;如果已被别的 PVC 绑走,就会是 Bound。• 若 PV 是 Released(前一个 PVC 被删但 reclaimPolicy=Retain),需要手动把它重新设为 Available

4、StorageClassName 必须完全一致

• 如果 PV 写了 storageClassName: nfs-rwo,PVC 必须也写 storageClassName: nfs-rwo。• 如果 PV 的 storageClassName: ""(空串),PVC 也必须写 storageClassName: "",不能省略。

  kubectl get pv <pv-name> -o jsonpath='{.spec.storageClassName}'kubectl get pvc <pvc-name> -o jsonpath='{.spec.storageClassName}'
资源YAML 里 不写 storageClassName 字段时,实际值说明
PV""(空字符串)明确等于空串,不会被当成任何 StorageClass,只能与同样为 "" 的 PVC 匹配。
PVC集群中 标记为 default 的 StorageClass(通常是 standard如果集群设置了 default StorageClass,PVC 会自动填上它的名字;如果没有 default,则也为 ""
  • PVC 没写 ⇒ 自动落到 standard

  • PV 也没写 ⇒ 等于 ""(空串)

    可能会导致二者无法匹配绑定

4、生命周期

PV和PVC遵循类似的生命周期:

①、资源供应
  • PV已创建,未绑定待使用

②、资源绑定
  • PV和对应的PVC绑定,如果找不到应绑定的PV,PVC会一直处于Pending状态,一旦绑定,PVC独占PV

③、资源使用
  • Pod使用PVC

④、资源释放
  • PVC使用完PV后,释放PV,PV处于Released状态

⑤、资源回收
  • 通过提前设定的回收策略回收PV,只有PV存储空间回收完成,才能提供给新的PVC绑定

5、补充动态供给

上方所讲的是静态供给策略,用户将需要的资源要求发送给PVC来进行PV的匹配,如果有符合的就绑定,没有就不绑定,如用户要2.88GI,现在有的PV只有3GI且没有和其他的PVC绑定,这个3GI的PV就会和2.88GI的PVC绑定,但是如果这时候又有用户要0.18GI,当前没有和他匹配的PV,就不会进行绑定。

​ 现在所讲的动态供给策略就是对静态供给的一种优化,因为静态补给是我们管理员已经提前创建好了PV,但不一定是用户所需要的,所以可能导致PV和PVC不绑定,即使满足绑定要求,也不一定是最好的,如3GI的PV和2.88GI的PVC绑定。而动态供给是用户提出需求给PVC,PVC和云供应商在集群内的抽象(存储类)沟通,这时候按照请求来“定制”一个PV,使之绑定。

精简总结:静态PV是管理员提前创建好的,动态PV是等提出需求后按照需求创建的

StorageClass 是 Kubernetes 用来 “抽象并自动化持久存储供给(Provisioning)” 的一组对象。一句话:告诉集群“我需要什么类型、什么性能、多少副本的存储”,集群就按这个模板自动给你创建 PV。

存储类核心功能说明
动态供给PVC(PersistentVolumeClaim)一旦声明 StorageClass,集群会自动创建匹配的 PV,无需管理员手工建 PV。
参数模板存储类型、IOPS、副本数、加密、磁盘格式等全部写在 StorageClass 里,PVC 只需引用名字。
回收策略可指定 PV 释放后 Delete / Retain / Recycle 的行为。

提供一个简单StorageClass的示例:

  apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: sc-test                      # PVC 通过这个名字引用(可自定义)provisioner: kubernetes.io/aws-ebs   # 底层存储驱动parameters:type: gp3                          # AWS EBS 的 gp3 SSDiops: "3000"encrypted: "true"reclaimPolicy: Delete                # PVC 删除后自动回收 EBS

常见命令:

  # 查看集群有哪些 StorageClasskubectl get sc​# 查看详情kubectl describe sc <你的存储类名称>​# 设置默认 StorageClasskubectl patch sc fast-ssd -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
常见云厂商provisioner 示例
AWSkubernetes.io/aws-ebs
GCPkubernetes.io/gce-pd
Azurekubernetes.io/azure-disk / azurefile
阿里云diskplugin.csi.alibabacloud.com
腾讯云com.tencent.cloud.csi.cbs
本地rancher.io/local-path, openebs.io/local, rook-ceph.rbd.csi.ceph.com

想使用动态供给还需要我们完成k8s集群安全机制的学习,进行授权管理等等,所以现在就不演示

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

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

相关文章

【力扣 Hot100】每日一题

D15 鲁迅曾说&#xff0c;尽量每天都让自己充实一点&#xff0c;你可以刷一个小时的短视频&#xff0c;打一个小时的王者荣耀&#xff0c;但尽量再留一个小时出来读一下书、教程、博客&#xff0c;让自己的大脑保持活跃&#xff0c;而不是垃圾场。如果真的没有事情做&#xff…

Sql server的行转列

业务场景&#xff1a;有如下一张表&#xff0c;希望汇总成下面的查询结果。 原始数据表 EmployeeTable&#xff1a;一个员工身兼多个岗位。 Employee Role Level 张三 工程师 3 张三 经理 5 李四 工程师 2 李四 主管…

某市-2025【网安·论道】决赛-misc1-翻转-wp

题目给了个图片以及一句提示 “斯蒂xx会帮助你” 直接就能想到 ste 开头的那几个工具&#xff0c;但是我比赛时候电脑什么ste开头的工具都没装&#xff0c;只能回来做了。 └─$ exiftool x.jpeg ExifTool Version Number : 13.00 File Name : …

[系统架构设计师]大数据架构设计理论与实践(十九)

[系统架构设计师]大数据架构设计理论与实践&#xff08;十九&#xff09; 一.传统数据处理系统的问题 1.传统数据库的数据过载问题 传统应用的数据系统架构设计时&#xff0c;应用直接访问数据库系统。当用户访问量增加时&#xff0c;数据库无 法支撑日益增长的用户请求的负载&…

UniAD

1. 算法动机及开创性思路 1&#xff09;UniAD算法简介 算法全称&#xff1a;Planning-oriented Autonomous Driving核心特点&#xff1a; 统一框架整合感知、预测、规划模块CVPR 2023最佳论文采用查询(query)方式连接各模块 名称含义&#xff1a; Unified&#xff1a;统一多模块…

ESP-NOW详解(esp-idf)

esp-now目前主要支持单播和广播&#xff0c;广播地址为ff:ff:ff:ff:ff:ff,广播可以向范围内所有拥有esp-now接收的设备发送数据 注意事项&#xff0c;网络模式是可以设置网络mac地址的&#xff0c;在单播中&#xff0c;目标设备网络模式选择为ap时&#xff0c;mac地址会发生改…

`strlen` 字符串长度函数

1) 函数的概念与用途 strlen 是 C 语言标准库中最基础且使用最频繁的字符串处理函数之一&#xff0c;它的名字来源于"string length"&#xff08;字符串长度&#xff09;。这个函数的功能非常明确&#xff1a;计算一个以空字符结尾的字符串的长度。 可以将 strlen 想…

TorchInductor - Introduction

PyTorch 2.x通过TorchDynamo通过Python Bytecode的动态变换实现了图捕获功能&#xff0c;需要搭配一个Compiler Backend完成图编译。 Pytorch尝试集成了多个后端&#xff0c;并使用一个轻量级的autotuner来选择最优的后端图编译结果。这个解决方案存在2个问题&#xff1a; 这…

Adobe Illustrator默认键盘快捷键

目录 默认键盘快捷键 常用的快捷键 处理文档 选择工具 查看图稿 处理所选对象 绘制 编辑形状 处理实时上色组 处理对象 创建可变宽度点 处理文字 使用面板 动作面板 “画笔”面板 “字符”和“段落”面板 “颜色”面板 “渐变”面板 “图层”面板 “色板”…

「数据获取」《中国能源统计年鉴》(1986-2023)(获取方式看绑定的资源)

01、数据简介一、年鉴基本定位与发展历程《中国能源统计年鉴》作为一部权威性极强的能源领域资料典籍&#xff0c;始终以全面、精准反映中国能源建设推进、生产运行、消费态势以及供需平衡状况为核心使命。其编纂工作发轫于 1986 年&#xff0c;最初由国家统计局工业交通统计司…

SpringBoot3系列---【SpringBoot3集成sqlite】

SpringBoot3集成sqlite 1.引入pom.xml <dependencies><dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.34.0</version></dependency><dependency><groupId>com.…

头部 TTS 开源项目深度对比

语音合成&#xff08;TTS&#xff09;开源项目是技术研究与产业落地的核心支撑&#xff0c;不同项目因技术路线、设计目标差异&#xff0c;在语言覆盖、合成自然度、可扩展性等方面表现悬殊。本文选取当前开源生态中应用最广、影响力最大的五大 TTS 项目——MaryTTS、Coqui TTS…

可视化-模块1-HTML-02

1-新建一个HTML文档&#xff0c;命名为&#xff1a;week1-12-<h1>标签<body><h1>这是标题 1</h1> <h2>这是标题 2</h2> <h3>这是标题 3</h3> <h4>这是标题 4</h4> <h5>这是标题 5</h5> <h6>这是…

搜索算法在实际场景中的应用

1. 数据库系统 B+树索引 应用场景:关系型数据库(MySQL、PostgreSQL等)的索引实现 算法特点: 平衡多路搜索树,优化磁盘I/O 支持范围查询和排序操作 典型实现: CREATE INDEX idx_name ON users(last_name); 哈希索引 应用场景:键值存储(Redis、Memcached)、等值查询 算…

基础IO

目录 一、进程和文件的关系 二、背景补充 三、打开文件接口 (1) FILE *fopen(const char* filename , const char *mode) &#xff08;2&#xff09;open 系统调用 文件描述符 open和fopen的关系 &#xff08;3&#xff09;size_t fwrite&#xff08;const void * ptr, …

SpringBoot快速上手

SpringBoot快速上手 环境准备 IDEA版本: 社区版:2021.1-2022.1.4 专业版:无要求 Maven 官方对于Maven的描述: Maven是一个项目管理工具,基于POM(Project Object Model,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告文档和项目管理工具软件. 人…

GitHub Actions workflow最佳实践

使用 GitHub Actions Workflow 时&#xff0c;遵循最佳实践可以显著提升自动化效率、安全性和可维护性。以下是经过实践验证的核心最佳实践&#xff0c;涵盖配置设计、性能优化、安全防护等维度&#xff0c;并附具体示例&#xff1a; 一、工作流组织与触发优化 1. 拆分工作流&a…

JAVA读取项目内的文件或图片

一、读取resources下的文件或图片&#xff1b;文件或图片位置&#xff1a;代码&#xff1a;InputStream fis Thread.currentThread().getContextClassLoader().getResourceAsStream("template/" xxx.jpg);二、读取项目内任意位置的文件或图片。文件或图片位置&…

Python如何将两个列表转化为一个字典

一、使用zip函数 zip函数是Python内置的一个强大工具&#xff0c;它可以将多个迭代器&#xff08;如列表、元组等&#xff09;“压缩”成一个迭代器&#xff0c;其中每个元素都是一个元组。使用zip函数将两个列表转换为字典是最常见的方法。 1、基本用法 keys [a, b, c] value…

Vue 3 useModel vs defineModel:选择正确的双向绑定方案

&#x1f4d6; 概述 useModel() 是 Vue 3.4 版本中引入的一个组合式 API 辅助函数&#xff0c;它是驱动 defineModel() 的底层实现。这个函数主要用于在非单文件组件中实现双向数据绑定&#xff0c;特别是在使用原始的 setup() 函数时。 ⚠️ 重要提示&#xff1a;如果使用 <…