使用 kube-downscaler 降低Kubernetes集群成本

news2024/11/28 16:53:19

2fca997e9f1b25e843458919579ecfd3.gif

新钛云服已累计为您分享772篇技术干货

391de9a2b36e5c2079effa35f5d3d28d.gif

34e0d3fa7d731312f1125fbea182afcb.png

介绍

Kube-downscaler 是一款开源工具,允许用户定义 Kubernetes 中 pod 资源自动缩减的时间。这有助于通过减少非高峰时段的资源使用量来降低基础设施成本。

在本文中,我们将详细介绍 kube-downscaler 的功能、安装和配置,以及它的用例和未来前景。

kube-downscaler的特点

Kube-downscaler 是一款基于调度的强大工具,用于在 Kubernetes 集群中对应用程序进行升级或降级。在本节中,我们将探讨该工具的一些关键功能:

与Kubernetes功能或工具的兼容性

Kube-downscaler 还支持水平 Pod 自动缩放 (HPA),并可以与 HPA 结合使用,以确保为应用程序维护所需的副本数量。这使得 kube-downscaler 能够为 Kubernetes 中的应用程序扩展提供额外的灵活性和细粒度的控制。

Karpenter 和 kube-downscaler 是两个可以结合使用的工具,可以为 Kubernetes 集群提供完整且强大的资源管理解决方案。通过结合使用 Karpenter 和 kube-downscaler,Kubernetes 集群可以从水平和垂直扩展中受益。 Downscaler 允许减少 Pod 数量,而 Karpenter 通过将 Pod 整合到更少或不同类型的机器上来优化节点利用率。

与Kubernetes功能或工具的兼容性

Kube-downscaler 还支持水平 Pod 自动缩放 (HPA),并可以与 HPA 结合使用,以确保为应用程序维护所需的副本数量。这使得 kube-downscaler 能够为 Kubernetes 中的应用程序扩展提供额外的灵活性和细粒度的控制。

Karpenter 和 kube-downscaler 是两个可以结合使用的工具,可以为 Kubernetes 集群提供完整且强大的资源管理解决方案。通过结合使用 Karpenter 和 kube-downscaler,Kubernetes 集群可以从水平和垂直扩展中受益。 Downscaler 允许减少 Pod 数量,而 Karpenter 通过将 Pod 整合到更少或不同类型的机器上来优化节点利用率。

根据定义的时间段自动扩展部署副本

Kube-downscaler 可以根据预定义的时间段自动扩展部署副本。这意味着我们可以设置一个计划,在一天、一周或一个月的特定时间增加或减少副本数量。

比如,如果我们知道应用程序在一天中的某些时段遇到高流量,则可以将 kube-downscaler 配置为在这些时段自动扩展副本,然后在流量减少时缩小副本。 

这可以允许在预期峰值负载的情况下进行扩展,而不是等待峰值负载发生并由 HPA 处理。这可以帮助优化资源使用并确保您的应用程序始终可用且响应迅速。

但是 Kube-downscaler 主要用于缩小副本并优化集群的成本,我们通常使用 HPA 来管理扩展。

kube-downscaler的安装和配置

kubernetes集群上kube-downscaler安装说明

  1. 从 GitHub 克隆 kube-downscaler 存储库:

 
 
git clone <https://codeberg.org/hjacobs/kube-downscaler.git>

‍‍‍

  1. 进入 kube-downscaler 目录:

 
 
cd kube-downscaler

‍‍‍

  1. 编辑 deploy/kube-downscaler.yaml 文件以根据您的具体需求自定义配置。例如,可以调整时区、计划和缩放规则。

  2. 将配置应用到您的 Kubernetes 集群:

 
 
kubectl apply -f deploy/

‍‍‍

此命令将部署 kube-downscaler 控制器并创建 kube-downscaler 部署。

可以通过检查 kube-downscaler 部署的日志来验证 kube-downscaler 控制器是否正在运行:

 
 
kubectl logs -f deployment/kube-downscaler

‍‍‍

安装完成后,需要进行一下配置。

根据具体用户需求配置kube-downscaler

Kube-downscaler 通过在 Kubernetes 部署对象上使用注释来提供扩展计划的定制。 

部署对象中的 downTimePeriod注释可用于指定不应扩展部署的停机时间段。

minReplicas 注释可用于设置部署的最小副本数。 

这些字段与 kube-downscaler 注释结合使用,允许您根据特定的业务需求和资源利用模式创建自定义的扩展计划。 

通过调整这些字段,可以配置 kube-downscaler 以优化应用程序可用性和成本效率的方式扩展部署。

以下是使用 kube-downscaler 进行部署的简单配置。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: random-deployment
    annotations:
        # Kube-downscaler
        downscaler/downtimePeriod: "Mon-Fri 00:00-07:00 Europe/Berlin"
        downscaler/minReplicas: 1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: random
  template:
    metadata:
      labels:
        app: random
    spec:
      containers:
      - name: random-container
        image: random-image

‍‍‍

通过此配置,从周一到周五午夜到早上 7 点(在欧洲/柏林时间线上),副本数量将减少到 1 个。 

kube-downscaler 将根据定义的计划自动开始缩减 pod。 

目前我们已经在 Kubernetes 集群上安装并运行了 kube-downscaler。

算法

Kube-downscaler 如果满足以下所有条件,将缩减部署的副本:

  • current time不是“uptime”计划的一部分,也不是“downtime”计划的一部分。 如果为 true,则按以下顺序评估计划:

    • downscaler/downscale-period 或 downscaler/downtime 工作负载定义的注释

    • downscaler/upscale-period 或 downscaler/uptime 工作负载定义的注释

    • downscaler/downscale-period 或 downscaler/downtime 工作负载命名空间上的注释

    • downscaler/upscale-period 或 downscaler/uptime 工作负载命名空间上的注释

    • --upscale-period 或 --default-uptime CLI 参数

    • --downscale-period 或 --default-downtime CLI 参数

    • UPSCALE_PERIOD 或 DEFAULT_UPTIME 环境变量

    • DOWNSCALE_PERIOD 或 DEFAULT_DOWNTIME 环境变量

  • 工作负载的命名空间不是排除列表的一部分:

    • 如果提供排除列表,它将用于代替默认值(仅包括kube-system )。

  • 工作负载的标签与标签列表不匹配。

  • 工作负载的名称不是排除列表的一部分

  • 工作负载未标记为排除(注释 downscaler/exclude: "true" 或 downscaler/exclude-until: "2024-04-05"

  • 没有活动 Pod 强制整个集群进入正常运行时间(注释 downscaler/force-uptime: "true" )

Minimum replicas最小副本数

默认情况下,部署将缩减为零副本。这可以通过部署或其命名空间的注释进行配置, downscaler/downtime-replicas 也可以通过 CLI 使用 --downtime-replicas .

Ex: downscaler/downtime-replicas: "1"

Specific workload特定工作负载

在正常的情况下 HorizontalPodAutoscalers ,该字段不能设置为零, 因此downscaler/downtime-replicas 至少 1 应设置为 。 关于 CronJobs ,它们的状态将按照我们的预期进行定义 suspend: true 。

注意点

请注意,默认的宽限期为 15 分钟适用于新的 nginx 部署,即

  • 如果当前时间不在 ,它不会立即缩小 Mon-Fri 9-17 (Buenos Aires timezone) ,而是在 15 分钟后缩小。downscaler最终会记录如下内容:

 
 
INFO: Scaling down Deployment default/nginx from 1 to 0 replicas (uptime: Mon-Fri 09:00-17:00 America/Buenos_Aires, downtime: never)

‍‍‍

请注意,如果 HorizontalPodAutoscaler (HPA) 与部署一起使用,请考虑以下事项:

  • 如果需要缩减到 0 个副本,则应在 上 Deployment 应用注释。这是一种特殊情况,因为 minReplicas 不允许在 HPA 上为 0。将部署副本设置为 0 实质上会禁用 HPA。在这种情况下,HPA 将发出事件,例如 failed to get memory utilization: unable to get metrics for resource memory: no metrics returned from resource metrics API 没有 Pod 可以从中检索指标。

  • 如果需要缩小大于 0,则应在 HPA 上应用注释。这允许在停机期间根据外部流量动态扩展 Pod,并在停机期间保持较低的 minReplicas 流量,如果没有低流量。如果对部署而不是 HPA 进行批注,则会导致争用条件,即缩减部署, kube-downscaler HPA 在部署更高时 minReplicas 将其升级。

若要使用 在 HPA 上 --downtime-replicas=1 启用downscaler,请确保将以下注释添加到部署和 HPA。

$ kubectl annotate deploy nginx 'downscaler/exclude=true'
$ kubectl annotate hpa nginx 'downscaler/downtime-replicas=1'
$ kubectl annotate hpa nginx 'downscaler/uptime=Mon-Fri 09:00-17:00 America/Buenos_Aires'

‍‍‍

详细配置

Uptime/downtime spec

downscaler通过命令行参数、环境变量或 Kubernetes 注释进行配置。

时间定义(例如 DEFAULT_UPTIME )接受以逗号分隔的规范列表,例如,以下配置将缩小非工作时间的所有部署:

DEFAULT_UPTIME="Mon-Fri 07:30-20:30 Europe/Berlin"

‍‍‍

仅在周末和周五 20:00 后缩小:

DEFAULT_DOWNTIME="Sat-Sun 00:00-24:00 CET,Fri-Fri 20:00-24:00 CET'

‍‍‍

每个时间规范可以采用以下两种格式之一:

  • 重复规范格式 <WEEKDAY-FROM>-<WEEKDAY-TO-INCLUSIVE> <HH>:<MM>-<HH>:<MM> <TIMEZONE> .时区值可以是任何时区,例如“US/Eastern”、“PST”或“UTC”。

  • 绝对规范格式, <TIME_FROM>-<TIME_TO> 其中每个 <TIME> 格式都是ISO 8601日期和时间的格式 <YYYY>-<MM>-<DD>T<HH>:<MM>:<SS>[+-]<TZHH>:<TZMM> 。

基于periods的替代逻辑

您可以选择升级或缩减的时间段,而不是严格的正常运行时间或停机时间。时间定义是相同的。在这种情况下,放大或缩小只发生在时间段,其余时间将被忽略。

如果配置了升级或缩减周期,将忽略正常运行时间和停机时间。这意味着某些选项是互斥的,例如,您可以使用或 --default-downtime ,但不能同时使用 --downscale-period 两者。

此定义将在 19:00 到 20:00 之间缩减群集。如果手动升级集群,则在第二天 19:00-20:00 之前不会缩减集群。

DOWNSCALE_PERIOD="Mon-Sun 19:00-20:00 Europe/Berlin"

‍‍‍

命令行选项

可用的命令行选项:

  • --dry-run

    仅运行模式:不更改任何内容,只需打印将要执行的操作

  • --debug

    调试模式:打印更多信息

  • --once

    仅运行一次循环并退出

  • --interval

    循环间隔(默认:30 秒)

  • --namespace

    将downscaler限制为仅在单个命名空间(默认:所有命名空间)中工作。这主要适用于 kube-downscaler 的部署者只能访问给定命名空间(而不是集群访问权限)的部署场景。如果与 同时 --exclude-namespaces使用 ,则不应用任何应用。

  • --include-resources

    将此类资源缩小为逗号分隔列表。

  • --grace-period

    新部署在缩减部署之前的宽限期(以秒为单位)(默认值:15 分钟)。宽限期从创建部署时开始计算,即无论宽限期如何,更新的部署都将立即缩减。

  • --upscale-period

    仅在给定时间段内纵向扩展的替代逻辑(默认:从不),也可以通过环境变量 UPSCALE_PERIOD 或通过每个部署 downscaler/upscale-period 上的注释进行配置

  • --downscale-period

    仅在给定时间段内缩减的替代逻辑(默认:从不),也可以通过环境变量 DOWNSCALE_PERIOD 或通过每个部署 downscaler/downscale-period 上的注释进行配置

  • --default-uptime

    要纵向扩展的默认时间范围(默认:始终),也可以通过环境变量 DEFAULT_UPTIME 或通过每个部署 downscaler/uptime 上的注释进行配置

  • --default-downtime

    要缩减的默认时间范围(默认:从不),也可以通过环境变量 DEFAULT_DOWNTIME 或通过每个部署 downscaler/downtime 上的注释进行配置

  • --exclude-namespaces

    从降级中排除命名空间(正则表达式模式列表,默认:kube-system),也可以通过环境变量 EXCLUDE_NAMESPACES 进行配置。如果与 同时 --namespace 使用 ,则不应用任何应用。

  • --exclude-deployments

    从降级中排除特定部署/状态集/cronjobs(默认:kube-downscaler,downscaler),也可以通过环境变量 EXCLUDE_DEPLOYMENTS 进行配置。尽管名称如此,但此选项将与任何包含的资源类型(Deployment,StatefulSet,CronJob等)的名称匹配。

  • --downtime-replicas

    缩小到的副本的默认值,注释 downscaler/downtime-replicas 优先于此值。

  • --deployment-time-annotation

    可选:将使用的注释的名称,而不是资源的创建时间戳。如果您希望资源在部署后的宽限期 ( --grace-period ) 内保持纵向扩展,则应使用此选项。注释的时间戳值的格式必须与 Kubernetes 的格式完全相同: creationTimestamp %Y-%m-%dT%H:%M:%SZ 。建议:通过部署工具自动设置此批注。

  • --matching-labels

    可选:kube-downscaleer 范围涵盖的工作负载标签列表。标签与列表中的任何工作负载都不匹配的所有工作负载都将被忽略。为了向后兼容,如果未指定此参数,kube-downscaler 将应用于所有资源。

Namespace Defaults命名空间默认值

DEFAULT_UPTIME 、 DEFAULT_DOWNTIME 和 FORCE_UPTIME 排除也可以使用命名空间注释进行配置。在配置的情况下,这些值将取代其他全局默认值。

apiVersion: v1
kind: Namespace
metadata:
    name: foo
    labels:
        name: foo
    annotations:
        downscaler/uptime: Mon-Sun 07:30-18:00 CET

命名空间级别支持以下批注:

  • downscaler/upscale-period

  • downscaler/downscale-period

  • downscaler/uptime :为此命名空间中的所有资源设置“正常运行时间”

  • downscaler/downtime :为此命名空间中的所有资源设置“停机时间”

  • downscaler/force-downtime :强制缩减此命名空间中的所有资源 - 可以是 true / false

  • downscaler/force-uptime :强制向上扩展此命名空间中的所有资源 - 可以是 true / false

  • downscaler/exclude :设置为 以 true 排除命名空间中的所有资源

  • downscaler/exclude-until :暂时排除命名空间中的所有资源,直到给定的时间戳

  • downscaler/downtime-replicas :覆盖默认目标副本以缩小到(默认值:零)

使用案例

该工具的主要用例是通过优化 Kubernetes 集群资源的利用率来降低成本。不过,它也可以用来预热集群,避免过度依赖 HPA。 

虽然这不是其主要目的,但这种组合提供了一种替代解决方案,可确保应用程序的高可用性,同时最大限度地降低基础设施成本。

降低成本

kube-downscaler 的另一个用例是防止高峰使用期间的服务中断。通过定义在高需求期间扩展资源的计划,kube-downscaler 可以帮助预先扩展部署并避免 HPA 延迟,以确保应用程序即使在高峰使用期间也保持可用和响应。

服务中断预防

kube-downscaler 的另一个用例是防止高峰使用期间的服务中断。通过定义在高需求期间扩展资源的计划,kube-downscaler 可以帮助预先扩展部署并避免 HPA 延迟,以确保应用程序即使在高峰使用期间也保持可用和响应。

建议

基于预定义计划的扩展,这可能并不适合所有用例。此外,它不支持自动缩放,这意味着用户必须手动调整缩放计划以满足不断变化的需求。

另一种可供考虑的解决方案是 Keda。 Keda是一个开源项目,为Kubernetes应用程序提供动态自动伸缩功能。使用 Keda,用户可以根据各种指标(例如队列长度、CPU 使用率或自定义指标)设置自定义扩展规则。

这允许对资源使用进行更精细的控制,并确保应用程序始终能够正确扩展以满足需求。

此外,Keda 兼容广泛的 Kubernetes 应用程序,包括有状态和无状态应用程序,并支持多种事件源,例如 Azure Event Hubs、Kafka 和 RabbitMQ。

结论

Kube-downscaler 是管理 Kubernetes 集群中资源使用情况的强大工具。通过定义扩展计划,用户可以优化集群中的资源使用并降低成本,同时确保应用程序即使在高峰使用期间也保持可用和响应。

虽然 kube-downscaler 是管理 Kubernetes 集群中资源使用情况的一个有价值的工具,但它可能有一些限制。如果需要对资源扩展进行更精细的控制或需要自动扩展功能,那么可能值得考虑像 Keda 这样的替代解决方案。

    推荐阅读   

45fc4c4778ab5d39eae4315b1ea0431c.png

b78e7c8f27e5735c85cc46c6da59cd7b.png

    推荐视频    

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

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

相关文章

Vue全局事件总线实现任意组件间通信

一、安装全局事件总线 全局事件总线就像是一个工具&#xff0c;专门用于挂载自定义事件和。 想要所有的组件都能使用这个全局事件总线&#xff0c;就只有在Vue的原型身上添加一个能够绑定自定义事件的属性。 所以我们在创建Vue实例对象的时候就可以添加如下代码&#xff1a;…

C语言实现将密码译回原文,并输出密码和原文

完整代码&#xff1a; // 有一行电文&#xff0c;已按下面规律译成密码&#xff1a; // A→Z a→z // B→Y b→y // C→X c→x /*即第 1 个字母变成第 26 个字母&#xff0c;第 i 个字母变成第&#xff08;26-i1&#xff09;个字母&#xff0c;非字母字 符不变。要求编程序将…

UVa129 Krypton Factor(困难的串)

1、题目 2、题意 如果一个字符串包含两个相邻的重复子串&#xff0c;则称它是“容易的串”&#xff0c;其他串称为“困难的串”。例如&#xff0c;BB、ABCDACABCAB、ABCDABCD都是容易的的串&#xff0c;而D、DC、ABDAB、CBABCBA 都是困难的串。 输入正整数 k k k 和 L L L&a…

JavaScript_对象_Function_定义与参数

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Function对象</title><script>/*** Function&#xff1a;函数&#xff08;方法&#xff09;对象* 1.创建&#xff1a;* 1.…

cosover是什么?crossover23又是什么软件

cosover是篮球里的过人技巧。 1.crossover在篮球中的本意是交叉步和急速交叉步。crossover 是篮球术语&#xff0c;有胯下运球、双手交替运球&#xff0c;交叉步过人、急速大幅度变向等之意。 2.在NBA里是指包括胯下运球、变向、插花在内的过人的技巧。 NBA有很多著名的Cross…

3.5 Early-Z 与 Z Prepass

一、深度测试DepthTest 1.传统渲染管线中的深度测试 深度测试在逐片元操作中的第二步 2.解决物体可见遮挡性的问题 3.深度测试的逻辑 for(each triangle T) //对每一个三角形 { for(each fragment(x,y,z) in T)//对每一个三角形中的片元 { if(fragment.z < ZBuffe…

IOC课程整理-13 Spring校验

1. Spring 校验使用场景 2. Validator 接口设计 3. Errors 接口设计 4. Errors 文案来源 5. 自定义 Validator 6. Validator 的救赎 7. 面试题精选 Spring 校验接口是哪个 org.springframework.validation.Validator Spring 有哪些校验核心组件&#xff1f;

嵌入式项目电灯

1、原理&#xff0c;电灯有个正负极&#xff0c;当正确接入电源正负极就能点亮&#xff08;如正极5v,负极0v&#xff09;&#xff0c;单两边同时接入正极&#xff0c;就不会亮&#xff08;两端都是5v&#xff09;,所以通过控制电平&#xff0c;来实现控制led等的亮暗 cpu通过给…

Eclipse:编译前自动保存文件

Eclipse默认不会在编译前保存文件&#xff0c;所以有时修改了半天程序&#xff0c;但是忘记保存&#xff0c;结果编译报的问题与代码不一致&#xff0c;甚至调试半天才发现是文件没有保存&#xff0c;很是让人恼怒。 可以通过以下设置&#xff0c;让Eclipse在编译前自动保存文…

如何快速排查SSD IO延迟抖动问题?

一块固态硬盘设计背后&#xff0c;有硬件控制器&#xff0c;NAND闪存颗粒、DRAM&#xff0c;还有固件FTL算法等。SSD设计的本身其实是一件特别复杂的过程&#xff0c;需要考虑各种客户需求且要保证可靠性、性能、稳定性。 针对SSD的相关性能测试&#xff0c;SNIA也有专门针对SS…

制作自己的前端组件库并上传到npm上

最近实现了自己的一个前端组件库demo&#xff0c;目前只上传了几个小组件。话不多说&#xff0c;上图&#xff1a; 我分了三个项目&#xff1a;yt-ui组件库、使用文档、demo。线上地址如下&#xff1a; [yt-ui组件库](mhfwork/yt-ui - npm) [组件库使用文档](介绍 | mhfwork/y…

自动化项目实战 [个人博客系统]

自动化博客项目 用户注册登录验证效验个人博客列表页博客数量不为 0 博客系统主页写博客 我的博客列表页效验 刚发布的博客的标题和时间查看 文章详情页删除文章效验第一篇博客 不是 "自动化测试" 注销退出到登录页面,用户名密码为空 用户注册 Order(1)Parameterized…

【云备份|| 日志 day1】项目认识 环境准备

day1 项目总纲云备份实现目标 搭建环境词汇解释 项目总纲 云备份 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中。并且能够随时通过浏览器进行查看并且下载&#xff0c;其中下载过程支持断点续传功能&#xff0c;而服务器也会对上传文件进行热点管理&…

VScode远程连接错误:进程试图写入不存在的管道

使用VScode连接树莓派时&#xff0c;出现远程连接错误&#xff1a;进程试图写入不存在的管道 解决方案&#xff1a; &#xff08;1&#xff09;可以进入config所在文件夹&#xff0c;删除文件 &#xff08;2&#xff09;无法解决的化尝试下述方法 输入 Remotting-SSH:Settin…

使用 Python 连接到 PostgreSQL 数据库

本文介绍了创建与 PostgreSQL 上的数据库的连接的过程。 我们需要安装 PostgreSQL 和创建数据库等先决条件&#xff0c;如下所述。 在系统中安装 PostgreSQL 顾名思义&#xff0c;PostgreSQL 是一款为高效管理数据库系统而创建的 SQL 系统软件。 在连接Python之前需要创建数据…

C字符串函数内存函数的模拟实现和理解

目录 1. 字符串操作函数 1.1. 求字符串长度 1.1.1. strlen 1.2. 长度不受限制的函数 1.2.1. strcpy 1.2.2. strcat 1.2.3. strcmp 1.3. 长度受到限制的字符串函数 1.3.1. strncpy 1.3.2. strncat 1.3.3. strncmp 1.4. 字符串查找函数 1.4.1. strstr 1.4.2. strto…

辅助驾驶功能开发-功能规范篇(22)-3-L2级辅助驾驶方案功能规范

1.3.3 TLA系统功能定义 1.3.3.1 状态机 1.3.3.2 状态迁移图 1.3.3.3 功能定义 1.3.3.3.1 信号需求列表 1.3.3.3.2 系统开启关闭 1)初始化 车辆上电后,交通灯辅助系统(TLA)进行初始化,控制器需在 220ms 内发出第一帧报文,并在 3s 内完成内部自检,同时上电 3s 内不进行…

wps表格按分隔符拆分单元格

有数据如下&#xff1b;看选中区域&#xff0c;一个单元格中有一个v&#xff0c;空格&#xff0c;然后有三个数值&#xff0c;以空格分开&#xff1b;点击菜单中的数据-分列&#xff1b; 弹出分列向导&#xff1b;选择 分隔符号&#xff1b; 选择分隔符为空格&#xff1b;出现预…

【vtk学习笔记1】编译安装vtk9.2.6,运行官方例子

一、编译安装vtk-9.2.6 1. 下载VTK。推荐从github下载。目前从VTK官网只能下载最新的RC版或者以前的老版本&#xff0c;我是在github上下载的vtk9.2.6 tag版本。 2. 用Cmake-gui配置Visual Studio工程。主要注意配置VTK安装的路径、是否支持QT&#xff0c;需要的话正确配置Qt5…

3.6 纹理压缩——包体瘦身术

一、什么是纹理压缩 纹理压缩是为了解决内存、带宽问题&#xff0c;专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术。 二、为什么要纹理压缩 图片格式 图片格式是图片文件的存储格式&#xff0c;通常在磁盘、内存中存储和传输文件时使用。例如&#xff1a;JPG、PNG…