十、K8s集群资源合理化分配

文章目录

  • 十、K8s集群资源合理化分配
    • 1、K8s 资源限制 ResourceQuota
      • 1.1 什么是ResourceQuota?
      • 1.2 ResourceQuota通常用于如下场景:
      • 1.3 基于租户和团队的资源限制
      • 1.4 基于命名空间的资源限制
    • 2、K8s 资源限制 LimitRange
      • 2.1 设置容器默认的资源配置
      • 2.2 限制容器可以使用的最大和最小资源
      • 2.3 限制存储使用的大小范围
    • 3、K8s资源限制Qos
      • 3.1 什么是QoS?
      • 3.2 Qos级别
      • 3.3 实现 QoS 为 Guaranteed 的 Pod
      • 3.4 实现 QoS 为 Burstable 的 Pod
      • 3.5 实现 QoS 为 BestEffort 的 Pod
    • 4、常见问题
      • 4.1 说一下ResourceQuota、LimitRange、QoS是什么?使用场景等
      • 4.2 在生产环境中如何合理的资源限制?
      • 4.3 如何配置每个服务的内存和CPU?

1、K8s 资源限制 ResourceQuota

1.1 什么是ResourceQuota?

ResourceQuota是一个K8s用于资源管理的对象,主要用于限制命名空间中的资源使用量。K8s管理员可以使用ResourceQuota控制命名空间中的资源使用量,确保资源的合理分配和使用,防止某个命名空间或用户过度消耗集群资源。

1.2 ResourceQuota通常用于如下场景:

  • 限制资源使用:控制命名空间中可以使用的CPU、内存、存储等资源的总量。
  • 限制对象数量:控制命名空间中可以创建的对象数量,如Pod、ConfigMap、Secret、Service等。
  • 资源公平分配:确保资源在不同命名空间之间公平分配,避免资源争抢。
  • 防止资源耗尽:防止某个命名空间或者用户过度消耗资源,导致其他应用无法获得所需的资源。

1.3 基于租户和团队的资源限制

在一个 Kubernetes 集群中,可能会有不同的团队或者不同的租户共同使用,此时可以针对不同的租户和不同的团队进行资源限制。

# 首先创建一个 Namespace 模拟租户:
[root@k8s-master01 ~]# kubectl create namespace customer# 配置租户的资源限制
[root@k8s-master01 ~]# vim customer-resourcequota.yaml 
[root@k8s-master01 ~]# cat customer-resourcequota.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:name: customer-quotanamespace: customer
spec:hard:requests.cpu: "1"               # 限制最高CPU请求数requests.memory: 2Gi            # 限制最高内存的请求数limits.cpu: "2"                 # 限制最高CPU的limits上限limits.memory: 4Gi              # 限制最高内存的limits上限pods: "50"                      # 限制最多启动Pod的个数persistentvolumeclaims: "10"requests.storage: 40Gi          # PVC存储请求的总和services: "40"count/replicasets.apps: 1k# `count/<resource>.<group>`:用于非核心组的资源
# `count/<resource>`:用于核心组的资源[root@k8s-master01 ~]# kubectl create -f customer-resourcequota.yaml 
# 查看限制详情
[root@k8s-master01 ~]# kubectl get resourcequota -n customer
NAME             AGE     REQUEST                                                                                                                                                       LIMIT
customer-quota   2m44s   count/replicasets.apps: 0/1k, persistentvolumeclaims: 0/10, pods: 0/50, requests.cpu: 0/1, requests.memory: 0/2Gi, requests.storage: 0/40Gi, services: 0/40   limits.cpu: 0/2, limits.memory: 0/4Gi
# 创建一个 Deployment 测试
[root@k8s-master01 ~]# kubectl create deploy nginx --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:stable -n customer# 此时并没有 Pod 产生
[root@k8s-master01 ~]# kubectl get pod -n customer
No resources found in customer namespace.[root@k8s-master01 ~]# kubectl get rs -n customer
NAME               DESIRED   CURRENT   READY   AGE
nginx-67bfb68c7d   1         0         0       10m[root@k8s-master01 ~]# kubectl describe rs nginx -n customer
....Warning  FailedCreate  4m34s (x8 over 9m59s)  replicaset-controller  (combined from similar events): Error creating: pods "nginx-67bfb68c7d-8m2gh" is forbidden: failed quota: customer-quota: must specify limits.cpu for: nginx; limits.memory for: nginx; requests.cpu for: nginx; requests.memory for: nginx

[root@k8s-master01 ~]# kubectl edit deploy nginx -n customer
....resources: requests:cpu: "1"memory: "512Mi"limits:cpu: "2"memory: "1024Mi"
....# pod已经成功创建
[root@k8s-master01 ~]# kubectl get pod -n customer
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7b95565d67-2kjlf   1/1     Running   0          85s# 查看目前空间资源使用情况
[root@k8s-master01 ~]# kubectl get resourcequota -n customer
NAME             AGE   REQUEST                                                                                                                                                           LIMIT
customer-quota   19m   count/replicasets.apps: 2/1k, persistentvolumeclaims: 0/10, pods: 1/50, requests.cpu: 1/1, requests.memory: 512Mi/2Gi, requests.storage: 0/40Gi, services: 0/40   limits.cpu: 2/2, limits.memory: 1Gi/4Gi

和租户与团队一致,一个集群也可能同时存在多个环境和项目,此时也可以基于环境和项目进行资源限制。

1.4 基于命名空间的资源限制

通常情况下,出于稳定性和安全性考虑,应该对每个 Namespace 不受控制的资源进行限制,比如 Pod 和 ReplicaSet,防止异常创建导致集群故障。

[root@k8s-master01 ~]# cat default-quota.yaml 
apiVersion: v1
kind: ResourceQuota
metadata:name: default-quota
spec:hard:count/pods: "1000"              # 限制pod数量count/replicasets.apps: 2k      # 限制rs的数量

2、K8s 资源限制 LimitRange

2.1 设置容器默认的资源配置

在 Kubernetes 集群中部署任何的服务,都建议添加 resources 参数,也就是配置内存和 CPU资源的请求和限制。

如果不想给每个容器都手动添加资源配置,此时可以使用 limitRange 实现给每个容器自动添加资源配置。

比如默认给每个容器默认添加 cpu 请求 0.5 核,内存请求 256Mi,cpu 最大使用量 1 核,内存最大使用量 512Mi:

[root@k8s-master01 ~]# vim cpu-mem-limit-range.yaml 
[root@k8s-master01 ~]# cat cpu-mem-limit-range.yaml 
apiVersion: v1
kind: LimitRange
metadata:name: cpu-mem-limit-range
spec:limits:- default:cpu: 1memory: 512MidefaultRequest:cpu: 0.5memory: 256Mitype: Container[root@k8s-master01 ~]# kubectl create -f cpu-mem-limit-range.yaml 
[root@k8s-master01 ~]# kubectl get limitRange
NAME                  CREATED AT
cpu-mem-limit-range   2025-06-25T12:07:26Z
# 创建一个没有资源配置的服务
[root@k8s-master01 ~]# kubectl create deploy redis --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/redis:7.2.5[root@k8s-master01 ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
redis-564b7bcf74-knw2l   1/1     Running   0          61s# 此时 Pod 里面的容器会被添加默认的 resources 配置(多个容器也会同时添加,已配置的参
数不会覆盖)
[root@k8s-master01 ~]# kubectl get po -oyaml | grep resources -A 6resources:limits:cpu: "1"memory: 512Mirequests:cpu: 500mmemory: 256Mi

2.2 限制容器可以使用的最大和最小资源

除了给容器配置默认的资源请求和限制,limitRange 还可以限制容器能使用的最大资源及可以配置的最小资源。

比如限制容器能配置最大内存是 1G,最大 CPU 是 800m,最小内存是 128M,最小 CPU 是10m:

[root@k8s-master01 ~]# vim min-max.yaml 
[root@k8s-master01 ~]# cat min-max.yaml 
apiVersion: v1
kind: LimitRange
metadata:name: min-max
spec:limits:- max:cpu: "800m"memory: "1Gi"min:cpu: "10m"memory: "128Mi"type: Container[root@k8s-master01 ~]# kubectl create -f min-max.yaml 
[root@k8s-master01 ~]# kubectl get limitRange
NAME                  CREATED AT
cpu-mem-limit-range   2025-06-25T12:07:26Z
min-max               2025-06-25T12:16:06Z
[root@k8s-master01 ~]# kubectl edit deploy redis
....resources: limits:cpu: "2"memory: 2Girequests:cpu: 1mmemory: 1Mi
....# 但实际并没有更新
[root@k8s-master01 ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
redis-564b7bcf74-knw2l   1/1     Running   0          4m18s# 查看rs更新了
[root@k8s-master01 ~]# kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
....
redis-74c66496     1         0         0       14s# 查看报错日志
[root@k8s-master01 ~]# kubectl describe rs redis-74c66496
....Warning  FailedCreate  13s (x4 over 31s)  replicaset-controller  (combined from similar events): Error creating: pods "redis-74c66496-tvc77" is forbidden: [minimum cpu usage per Container is 10m, but request is 1m, minimum memory usage per Container is 128Mi, but request is 1Mi, maximum cpu usage per Container is 800m, but limit is 2, maximum memory usage per Container is 1Gi, but limit is 2Gi]
# 改回正常配置
[root@k8s-master01 ~]# kubectl edit deploy redis
....resources:limits:cpu: 600mmemory: 512Mirequests:cpu: 100mmemory: 128Mi
....# pod已经更新
[root@k8s-master01 ~]# kubectl get pod 
NAME                     READY   STATUS    RESTARTS   AGE
redis-675c6487c6-d9xxx   1/1     Running   0          61s

2.3 限制存储使用的大小范围

除了限制 CPU 和内存,也会限制 PVC 的大小范围,此时把 type 改为 PersistentVolumeClaim 即可。

# 比如限制每个 PVC 只能使用大于等于 1G,小于等于 3G 的空间:
[root@k8s-master01 ~]# vim storage-limit.yaml 
[root@k8s-master01 ~]# cat storage-limit.yaml 
apiVersion: v1
kind: LimitRange
metadata:name: storagelimits
spec:limits:- max:storage: 3Gimin:storage: 1Gitype: PersistentVolumeClaim[root@k8s-master01 ~]# kubectl create -f storage-limit.yaml 
[root@k8s-master01 ~]# kubectl get limitRange
NAME                  CREATED AT
cpu-mem-limit-range   2025-06-25T12:07:26Z
min-max               2025-06-25T12:26:28Z
storagelimits         2025-06-25T12:52:33Z
# 创建一个申请 5G 的 PVC:
[root@k8s-master01 ~]# vim pvc-test.yaml
[root@k8s-master01 ~]# cat pvc-test.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-test
spec:resources:requests:storage: 5GivolumeMode: FilesystemstorageClassName: local-storageaccessModes:- ReadWriteMany# 此时会有如下报错:
[root@k8s-master01 ~]# kubectl create -f pvc-test.yaml 
Error from server (Forbidden): error when creating "pvc-test.yaml": persistentvolumeclaims "pvc-test" is forbidden: maximum storage usage per PersistentVolumeClaim is 3Gi, but request is 5Gi# 此时把 storage 改为限制范围内即可正常创建。

3、K8s资源限制Qos

3.1 什么是QoS?

Qos:Quality of Service,表示程序的服务质量。K8s集群中的每个Pod,都会有对应的Qos级别(在K8s中通过Resources参数即可配置QoS的级别),可用于决定Pod在资源紧张时的处理顺序,同时可以确保关键服务的稳定性和可靠性。

3.2 Qos级别

  • Guaranteed:最高服务质量,当宿主机内存不够时,会先kill掉QoS为 BestEffort 和 Bursttable 的Pod,如果内存还是不够,才会kill掉 Guaranteed ,该级别Pod的资源占用量一般比较明确,即 requests 的 cpu 和 memory 和 limits 的 cpu 和 memory 配置一致。
  • Bursttable:服务质量低于 Guaranteed ,当宿主机内存不够时,会先kill掉QoS为 BestEffort 的Pod,如果内存还是不够之后就会kill掉QoS级别为 Bursttable 的Pod,用来保证QoS质量为 Guaranteed 的Pod。该级别Pod一般知道最小资源使用量,但是当机器资源充足时,还是想尽可能的使用更多的资源,即 limits 字段的 cpu 和 memory 大于 requests 的 cpu 和 memory 的配置。
  • BestEffort:尽量而为,当宿主机内存不够时,首先kill的就是Qos的Pod,用以保证 Bursttable 和 Guaranteed 级别的Pod正常运行。

3.3 实现 QoS 为 Guaranteed 的 Pod

Guaranteed 级别的 Pod 具有最高的优先级,Kubernetes 会确保这些 Pod 获得足够的资源,也就是 Kubernetes 调度器会确保这些 Pod 调度到能够提供所需资源的节点上。

配置 Guaranteed 级别的 Pod,需要满足如下条件:

  • Pod 中的每个容器必须指定 limits.memory 和 requests.memory,并且两者需要相等
  • Pod 中的每个容器必须指定 limits.cpu 和 requests.cpu,并且两者需要相等
# 修改配置
[root@k8s-master01 ~]# kubectl describe deploy redis
....resources:limits:cpu: 200mmemory: 512Mirequests:cpu: 200mmemory: 512Mi
....# 查看级别
[root@k8s-master01 ~]# kubectl describe po redis-765db65df4-rkbkg | grep "QoS Class"
QoS Class:                   Guaranteed

3.4 实现 QoS 为 Burstable 的 Pod

Burstable 级别的 Pod 具有中等优先级,Kubernetes 会尽量满足其资源请求,但在资源紧张时可能会被驱逐,Kubernetes 调度器会确保这些 Pod 调度到能够提供所需资源的节点上,如果节点上有额外的资源,这些 Pod 可以使用超过其请求的资源。

配置 Burstable 级别的 Pod,需要满足如下条件:

  • Pod 不符合 Guaranteed 的配置要求
  • Pod 中至少有一个容器配置了 requests.cpu 或 requests.memory
# 修改配置
[root@k8s-master01 ~]# kubectl describe deploy redis
....resources:limits:cpu: 200mmemory: 512Mirequests:cpu: 100mmemory: 512Mi
....# 查看级别
[root@k8s-master01 ~]# kubectl describe po redis-7c578fff48-7hnnx | grep "QoS Class"
QoS Class:                   Burstable

3.5 实现 QoS 为 BestEffort 的 Pod

BestEffort 级别的 Pod 是最低优先级,Kubernetes 不保证这些 Pod 获得任何资源,在资源紧张时,这些 Pod 最先被驱逐。同时 Kubernetes 调度器会尝试将这些 Pod 调度到任何节点上,但不保证节点上有足够的资源。

配置 BestEffort 级别的 Pod,不配置 resources 字段即可。

4、常见问题

4.1 说一下ResourceQuota、LimitRange、QoS是什么?使用场景等

ResourceQuota资源限制、LimitRange资源使用范围及默认值、QoS服务质量。ResourceQuota用于在多租户环境下为命名空间设置资源总量限制,避免某个租户过度使用资源。LimitRange可以确保命名空间内的Pod有合理的资源请求和限制范围,避免不合理的配置。QoS用于根据Pod的资源配置确定其在资源紧张的优先级,确保关键任务的Pod能够获得资源。

4.2 在生产环境中如何合理的资源限制?

每个空间都需要限制Pod和RS的资源,之后根据需要限制内存和CPU。

4.3 如何配置每个服务的内存和CPU?

根据实际情况配置、适当超分、重要服务采用 Guaranteed 级别的服务


此博客来源于:https://edu.51cto.com/lecturer/11062970.html

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

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

相关文章

Android 13 设置界面会判断当前屏幕的大小,如果是大屏,则为左右屏显示

1.前言 在13.0的系统rom定制化开发中,在某些时候,在大屏设备中,设置新增了左右分屏的功能,就是 左边显示主菜单,右边显示一级菜单的功能,某些情况下不需要,接下来关闭这个功能 2.设置界面会判断当前屏幕的大小,如果是大屏,则为左右屏显示的核心类 packages/apps/Sett…

算法学习day15----蓝桥杯--进制转换

python代码&#xff1a;def jinzhizhuanhuan(x, n):ans 0while x > 0:ans x % nx // nreturn ans sum 0 for i in range(1, 2025):if jinzhizhuanhuan(i, 2) jinzhizhuanhuan(i, 4):sum 1 print(sum)虽然结束了期末周&#xff0c;但是又变懒了不少&#xff0c;水一个先…

OpenStack扩展

一、OpenStack &#xff08;开源云计算管理平台&#xff09;的核心服务组件及功能计算服务&#xff08;Compute - Nova&#xff09;功能&#xff1a;是 OpenStack 计算资源管理的核心组件&#xff0c;负责虚拟机实例全生命周期管理&#xff0c;像实例的创建、启动、暂停、迁移、…

【LeetCode 热题 100】41. 缺失的第一个正数——(解法二)原地哈希

Problem: 41. 缺失的第一个正数 题目&#xff1a;给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 【LeetCode 热题 100】41. 缺失的第一个正数——&#xff08;解法一&am…

C#上位机之Modbus通信协议!

文章目录前言一、Modbus概念二、使用步骤1.使用Modbus准备2.使用步骤三、Modbus RTU 与 Modbus ASCII对比前言 Modbus通信协议&#xff01; 一、Modbus概念 从站设备编码&#xff08;从站地址、单元ID&#xff09;&#xff0c;一主多从。 存储区&#xff1a;0-线圈状态、1-输…

前后端分离架构下的跨域问题与解决方案

在现代Web开发中&#xff0c;特别是随着前后端分离架构的普及&#xff0c;跨域问题成为了开发者必须面对的一个重要议题。本文将详细介绍什么是跨域问题、其产生的原因以及如何从前端和后端两个角度来解决这个问题&#xff0c;并提供一些实用的代码示例。一、跨域问题概述1. 定…

搜索数据建设系列之数据架构重构

导读 主要概述百度搜索业务数据建设的创新实践&#xff0c;重点围绕宽表模型设计、计算引擎优化和新一代业务服务交付模式&#xff08;图灵3.0开发模式&#xff09;三大方向&#xff0c;解决了传统数仓在搜索场景下面临的诸多挑战&#xff0c;实现了搜索数据建设的高效、稳定、…

2025年渗透测试面试题总结-2025年HW(护网面试) 29(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。、 目录 2025年HW(护网面试) 29 1. 样本分析思路 2. Linux GDB分析样本示例 3. 应急案例&#xff1a;WebShell后…

动态编程入门第二节:委托与事件 - Unity 开发者的高级回调与通信艺术

动态编程入门第一节&#xff1a;C# 反射 - Unity 开发者的超级工具箱 动态编程入门第二节&#xff1a;委托与事件 - Unity 开发者的高级回调与通信艺术 上次我们聊了 C# 反射&#xff0c;它让程序拥有了在运行时“看清自己”的能力。但光能看清还不够&#xff0c;我们还需要让…

降低网络安全中的人为风险:以人为本的路径

有效降低网络安全中的人为风险&#xff0c;关键在于采取以人为本的方法。这种方法的核心在于通过高效的培训和实践&#xff0c;使员工掌握安全知识、践行安全行为&#xff0c;并最终培育出安全且相互支持的文化氛围。 诚然&#xff0c;技术和政策必须为良好的安全行为提供支持、…

opencv裁剪和编译

opencv裁剪和编译 0. 准备工作 0.1 下载和安装Eigen 地址 https://eigen.tuxfamily.org/index.php?titleMain_Page对于opencv编译&#xff0c;需要增加EIGEN_INCLUDE_PATH和开启WITH_EIGEN -DWITH_EIGENON -DEIGEN_INCLUDE_PATH./3rd/eigen-3.4.01. 实际脚本 编译脚本如下: ch…

小白成长之路-mysql数据基础(三)

文章目录一、主从复制二、案例总结一、主从复制 1、master开启二进制日志记录2、slave开启IO进程&#xff0c;从master中读取二进制日志并写入slave的中继日志3、slave开启SQL进程&#xff0c;从中继日志中读取二进制日志并进行重放4、最终&#xff0c;达到slave与master中数据…

通过 Windows 共享文件夹 + 手机访问(SMB协议)如何实现

通过 Windows 共享文件夹 手机访问&#xff08;SMB协议&#xff09; 实现 PC 和安卓手机局域网文件共享&#xff0c;具体步骤如下&#xff1a; &#x1f4cc; 前置条件 电脑和手机连接同一局域网&#xff08;同一个Wi-Fi或路由器&#xff09;。关闭防火墙或放行SMB端口&#…

【Python3教程】Python3高级篇之正则表达式

博主介绍:✌全网粉丝23W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

Redis--黑马点评--达人探店功能实现详解

达人探店发布探店笔记探店笔记类似于点评网站的评价&#xff0c;往往是图文结合&#xff0c;对应的表有两个&#xff1a;tb_blog&#xff1a;探店笔记表&#xff0c;包含笔记中的标题、文字、图片等tb_blog_comments&#xff1a;其他用户对探店笔记的评价tb_blog表结构如下&…

一探 3D 互动展厅的神奇构造​

3D 互动展厅的神奇之处&#xff0c;离不开一系列先进技术的强力支撑 。其中&#xff0c;VR(虚拟现实)技术无疑是核心亮点之一。通过佩戴 VR 设备&#xff0c;观众仿佛被瞬间 “传送” 到一个全新的世界&#xff0c;能够全身心地沉浸其中&#xff0c;360 度无死角地观察周围的一…

C++ 网络编程(15) 利用asio协程搭建异步服务器

&#x1f680; [协程与异步服务器实战]&#xff1a;[C20协程原理与Boost.Asio异步服务器开发] &#x1f4c5; 更新时间&#xff1a;2025年07月05日 &#x1f3f7;️ 标签&#xff1a;C20 | 协程 | Boost.Asio | 异步编程 | 网络服务器 文章目录前言一、什么是协程&#xff1f;二…

【Java21】在spring boot中使用虚拟线程

文章目录 0.环境说明1.原理解析2.spring boot的方案3.注意事项&#xff08;施工中&#xff0c;欢迎补充&#xff09; 前置知识 虚拟线程VT&#xff08;Virtual Thread&#xff09; 0.环境说明 用于验证的版本&#xff1a; spring boot: 3.3.3jdk: OpenJDK 21.0.5 spring boot…

利器:NPM和YARN及其他

文章目录**1. 安装 Yarn&#xff08;推荐方法&#xff09;****2. 验证安装****3. 常见问题及解决方法****① 权限不足&#xff08;Error: EPERM&#xff09;****② 网络问题&#xff08;连接超时或下载失败&#xff09;****③ 环境变量未正确配置****4. 替代安装方法&#xff0…

跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能

众所周知&#xff0c;直播平台与短视频平台的贴纸功能不仅是用户表达个性的方式&#xff0c;更是平台提高用户粘性和互动转化的法宝。 可问题来了&#xff1a;如何让一个贴纸功能&#xff0c;在Android和iOS两大平台上表现一致、运行流畅、加载稳定&#xff1f;这背后&#xff…