0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Kubernetes容器垃圾回收的策略

马哥Linux运维 来源:博客园 作者:博客园 2022-08-15 09:16 次阅读

一、Tips

  1. Kubernetes的垃圾回收由kubelet进行管理,每分钟会查询清理一次容器,每五分钟查询清理一次镜像。在kubelet刚启动时并不会立即进行GC,即第一次进行容器回收为kubelet启动一分钟后,第一次进行镜像回收为kubelet启动五分钟后。

  2. 推荐使用其它管理工具或手工进行容器和镜像的清理,因为kubelet需要通过容器来判断pod的运行状态,如果使用其它方式清除容器有可能影响kubelet的正常工作。

  3. 镜像的回收针对node结点上由docker管理的所有镜像,无论该镜像是否是在创建pod时pull的。而容器的回收策略只应用于通过kubelet管理的容器。

  4. Kubernetes通过kubelet集成的cadvisor进行镜像的回收,有两个参数可以设置:--image-gc-high-threshold--image-gc-low-threshold。当用于存储镜像的磁盘使用率达到百分之--image-gc-high-threshold时将触发镜像回收,删除最近最久未使用(LRU,Least Recently Used)的镜像直到磁盘使用率降为百分之--image-gc-low-threshold或无镜像可删为止。默认--image-gc-high-threshold为90,``--image-gc-low-threshold`为80。

  5. 容器的回收有三个参数可设置:--minimum-container-ttl-duration--maximum-dead-containers-per-container--maximum-dead-containers。从容器停止运行时起经过--minimum-container-ttl-duration时间后,该容器标记为已过期将来可以被回收(只是标记,不是回收),默认值为1m0s。一般情况下每个pod最多可以保留--maximum-dead-containers-per-container个已停止运行的容器集,默认值为2。整个node节点可以保留--maximum-dead-containers个已停止运行的容器,默认值为100。

  6. 如果需要关闭容器的垃圾回收策略,可以将--minimum-container-ttl-duration设为0(表示无限制),--maximum-dead-containers-per-container--maximum-dead-containers设为负数。

  7. --minimum-container-ttl-duration的值可以使用单位后缀,如h表示小时,m表示分钟,s表示秒。

  8. --maximum-dead-containers-per-container--maximum-dead-containers冲突时,``--maximum-dead-containers`优先考虑。

  9. 对于那些由kubelet创建的但由于某些原因导致无名字()的容器,会在到达GC时间点时被删除。

  10. 回收容器时,按创建时间排序,优先删除那些创建时间最早的容器。

  11. 到达GC时间点时,具体的GC过程如下:1)遍历所有pod,使其满足--maximum-dead-containers-per-container;2)经过上一步后如果不满足--maximum-dead-containers,计算值X=(--maximum-dead-containers)/(pod总数),再遍历所有pod,使其满足已停止运行的容器集个数不大于X且至少为1;3)经过以上两步后如果还不满足--maximum-dead-containers,则对所有已停止的容器排序,优先删除创建时间最早的容器直到满足--maximum-dead-containers为止。

  12. 当某个镜像重新pull或启动某个pod用到该镜像时,该镜像的最近使用时间都会被更新。

  13. Kubernetes的垃圾回收在1.1.4版本开始才渐渐完善,之前的版本存在比较多bug甚至不能发挥作用。

  14. 关于容器的回收需要特别注意pod的概念,比如,通过同一个yaml文件create一个pod,再delete这个pod,然后再create这个pod,此时之前的那个pod对应的容器并不会作为新创建pod的已停止容器集,因为这两个pod虽然同名,但已经不是同一个pod了。只有同一个pod中在运行过程中由于意外或其它情况停止的容器才算是这个pod的已停止容器集。

二、Experiments

  1. 镜像回收(使用docker默认 --graph 参数:/var/lib/docker

结点上运行的docker设置的参数 --graph 使用默认的/var/lib/docker,指向/var文件系统,通过df -lh查看目前 /var 磁盘使用率为30%,启动kubelet设置镜像回收相关参数如下:

--image-gc-high-threshold=40--image-gc-low-threshold=35

此时任意创建两个使用不同镜像的pod,在node节点上可以看到新pull了三个images(pause镜像是启动pod必需的):

[@tc-151-100/opt/domeos/openxxs/k8s-1.1.7-flannel]#dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
10.11.150.76:5000/openxxs/iperf1.21783511c56f83monthsago279MB
10.11.150.76:5000/centos75ddf34d4d69b8monthsago172.2MB
pub.domeos.org/kubernetes/pauselatestf9d5de07953920monthsago239.8kB

此时查看/var磁盘使用率达到了41%,然后将使用10.11.150.76:5000/centos:7镜像的pod删除,等待GC的镜像回收时间点。然而五分钟过去了,什么事情也没有发生=_=!!。还记得 docker rmi 镜像时有个前提条件是什么吗?没错,要求使用该镜像的容器都已经被删除了才可以。前面删除pod只是停止了容器,并没有将容器删除。因此手工将对应的容器docker rm掉,再等待五分钟后,可以看到镜像已经被删除回收了:

[@tc-151-100/opt/domeos/openxxs/k8s-1.1.7-flannel]#dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
10.11.150.76:5000/openxxs/iperf1.21783511c56f83monthsago279MB
pub.domeos.org/kubernetes/pauselatestf9d5de07953920monthsago239.8kB

结论:只有相关联的容器都被停止并删除回收后,才能将Kubernetes的镜像垃圾回收策略应用到该镜像上。

  1. 镜像回收(使用自定义docker --graph 参数:/opt/docker

结点上运行的docker设置的参数--graph指向 /opt 磁盘,通过 df -lh 查看目前 /opt 磁盘使用率为 48% ,启动 kubelet 设置镜像回收相关参数如下:

--image-gc-high-threshold=50--image-gc-low-threshold=40

此时任意创建两个使用不同镜像的pod,在node节点上可以看到新pull了三个images:

[@tc-151-100/opt/domeos/openxxs/k8s-1.1.7-flannel]#dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
10.11.150.76:5000/openxxs/iperf1.21783511c56f83monthsago279MB
10.11.150.76:5000/centos75ddf34d4d69b8monthsago172.2MB
pub.domeos.org/kubernetes/pauselatestf9d5de07953920monthsago239.8kB

此时查看/opt磁盘使用率达到了51%,然后将使用10.11.150.76:5000/centos:7镜像的pod删除,手工将对应的容器docker rm掉,等待GC的镜像回收时间点。然而五分钟过去了,十分钟过去了,docker images时centos镜像依旧顽固地坚守在阵地。

结论:目前Kubernetes的镜像垃圾回收策略可以在docker --graph 参数默认为 /var/lib/docker 时正常工作,当 --graph 设置为其它磁盘路径时还存在bug。

问题反馈在 Github 的相关 issue 里:https://github.com/kubernetes/kubernetes/issues/17994,可以继续跟进。

Append: 根据Github上的反馈,这个bug将在后续版本中解决,目前版本需要让设置了--graph的镜像垃圾回收生效,在启动kubelet时还需要加上参数 --docker-root=

  1. 容器回收之 --maximum-dead-containers-per-container 参数

启动kubelet设置容器回收相关参数如下:

--maximum-dead-containers-per-container=1--minimum-container-ttl-duration=30s--maximum-dead-containers=100

创建一个只包含一个容器且该容器一运行就退出的pod,此时在node节点上可以看到该pod中的容器不断的创建退出创建退出:

[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
2fe96949916410.11.150.76:5000/centos:7"/bin/bash"4secondsagoExited(0)2secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_68cc6f03
555b5e7a855010.11.150.76:5000/centos:7"/bin/bash"24secondsagoExited(0)22secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_ad4a5e39
94b30a0b32c210.11.150.76:5000/centos:7"/bin/bash"34secondsagoExited(0)32secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_4027e3e1
d458e6a7d396pub.domeos.org/kubernetes/pause:latest"/pause"34secondsagoUp33secondsk8s_POD.bdb2e1f5_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_09798975

GC的容器回收时间点到达时,可以看到创建时间大于30秒的已退出容器只剩下一个(pause容器不计算),且先创建的容器被优先删除:

[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
5aae6157aeff10.11.150.76:5000/centos:7"/bin/bash"46secondsagoExited(0)45secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_f126d2a8
d458e6a7d396pub.domeos.org/kubernetes/pause:latest"/pause"2minutesagoUp2minutesk8s_POD.bdb2e1f5_test-gc-pod-exit_default_92e8bd05-e9e6-11e5-974c-782bcb2a316a_09798975

结论:Kubernetes容器垃圾回收的--maximum-dead-containers-per-container参数设置可正常工作。

  1. --maximum-dead-containers-per-container 针对容器还是容器集

启动kubelet设置容器回收相关参数如下:

--maximum-dead-containers-per-container=1--minimum-container-ttl-duration=30s--maximum-dead-containers=100

创建一个包含三个容器且这些容器一运行就退出的pod,此时在node节点上可以看到该pod中的容器不断的创建退出创建退出:

[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
dec04bd28a0310.11.150.76:5000/centos:7"/bin/bash"7secondsagoExited(0)6secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_830a9375
7c94d4a963a710.11.150.76:5000/centos:7"/bin/bash"7secondsagoExited(0)6secondsagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_975d44d3
4f3e7e8ddfd510.11.150.76:5000/centos:7"/bin/bash"8secondsagoExited(0)7secondsagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_d024eb06
cb48cf2ba13310.11.150.76:5000/centos:7"/bin/bash"12secondsagoExited(0)11secondsagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_b5ff7373
ec2941f046f010.11.150.76:5000/centos:7"/bin/bash"13secondsagoExited(0)12secondsagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_69b1a996
f831e8ed568710.11.150.76:5000/centos:7"/bin/bash"13secondsagoExited(0)12secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_fbc02e2e
ee972a4537fcpub.domeos.org/kubernetes/pause:latest"/pause"14secondsagoUp13secondsk8s_POD.bdb2e1f5_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_85b3c032

GC的容器回收时间点到达时,可以看到创建时间大于30秒的已退出容器剩下三个(pause容器不计算),且这三个容器正好是一组:

[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
e4351e6855ae10.11.150.76:5000/centos:7"/bin/bash"51secondsagoExited(0)50secondsagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_263dd820
990baa6e6a7a10.11.150.76:5000/centos:7"/bin/bash"52secondsagoExited(0)51secondsagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_b16b5eaa
c6916fb06d6510.11.150.76:5000/centos:7"/bin/bash"53secondsagoExited(0)51secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_1d8ea284
ee972a4537fcpub.domeos.org/kubernetes/pause:latest"/pause"AboutaminuteagoUpAboutaminutek8s_POD.bdb2e1f5_test-gc-pod-exit_default_d1677c09-e9e7-11e5-974c-782bcb2a316a_85b3c032

结论:--maximum-dead-containers-per-container 的计数针对一个pod内的容器集而不是容器的个数。

  1. 容器回收之 --maximum-dead-containers 参数

启动kubelet设置容器回收相关参数如下:

--maximum-dead-containers-per-container=2--minimum-container-ttl-duration=30s--maximum-dead-containers=3

创建一个包含三个容器的pod,再删除该pod,再创建该pod,再删除该pod,这样就产生了8个已退出容器(包括两个pause容器):

[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
a28625d189df10.11.150.76:5000/centos:7"/bin/bash"1secondsagoExited(0)Lessthanasecondagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_48c11200
97aca44f0deb10.11.150.76:5000/centos:7"/bin/bash"2secondsagoExited(0)1secondsagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_df34f48d
4e57b6c839ae10.11.150.76:5000/centos:7"/bin/bash"3secondsagoExited(0)2secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_afd622b2
12588fce1433pub.domeos.org/kubernetes/pause:latest"/pause"3secondsagoExited(2)Lessthanasecondagok8s_POD.bdb2e1f5_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_c9d4cbaa
621ed207d45210.11.150.76:5000/centos:7"/bin/bash"4secondsagoExited(0)3secondsagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_a91278cd
023c10fad4fd10.11.150.76:5000/centos:7"/bin/bash"5secondsagoExited(0)4secondsagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_6cc03f37
756eb7bb4b5310.11.150.76:5000/centos:7"/bin/bash"5secondsagoExited(0)4secondsagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_83312ec2
d54bdc22773epub.domeos.org/kubernetes/pause:latest"/pause"6secondsagoExited(2)3secondsagok8s_POD.bdb2e1f5_test-gc-pod-exit_default_c5cbddbb-e9ee-11e5-974c-782bcb2a316a_ccb57220

GC的容器回收时间点到达时,可以看到已退出容器只剩下了三个,pause容器也被回收了:

[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
a28625d189df10.11.150.76:5000/centos:7"/bin/bash"2minutesagoExited(0)2minutesagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_48c11200
97aca44f0deb10.11.150.76:5000/centos:7"/bin/bash"2minutesagoExited(0)2minutesagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_df34f48d
4e57b6c839ae10.11.150.76:5000/centos:7"/bin/bash"2minutesagoExited(0)2minutesagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_afd622b2

结论:Kubernetes容器垃圾回收的 --maximum-dead-containers 参数设置可正常工作;pause容器也作为可回收容器被管理着;Tips第11条第3)点。

  1. --maximum-dead-containers 对于非kubelet管理的容器是否计数

在第5个实验的基础上,手工创建一个container,等待GC的容器回收时间点到达,一分钟过去了,两分钟过去了,docker ps -a 显示的依然是4个容器:

[@tc-151-100/home/domeos]#dockerrun-it10.11.150.76:5000/openxxs/iperf:1.2/bin/sh
sh-4.2#exit
exit
[@tc-151-100/home/domeos]#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
939b932dc7db10.11.150.76:5000/openxxs/iperf:1.2"/bin/sh"2minutesagoExited(0)2minutesagobackstabbing_aryabhata
a28625d189df10.11.150.76:5000/centos:7"/bin/bash"12minutesagoExited(0)12minutesagok8s_iperf3.5c8de29f_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_48c11200
97aca44f0deb10.11.150.76:5000/centos:7"/bin/bash"12minutesagoExited(0)12minutesagok8s_iperf2.5a36e29e_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_df34f48d
4e57b6c839ae10.11.150.76:5000/centos:7"/bin/bash"12minutesagoExited(0)12minutesagok8s_iperf1.57dfe29d_test-gc-pod-exit_default_c7612b59-e9ee-11e5-974c-782bcb2a316a_afd622b2

结论:Kubernetes容器垃圾回收的策略不适用于非kubelet管理的容器。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 容器
    +关注

    关注

    0

    文章

    480

    浏览量

    21874
  • kubernetes
    +关注

    关注

    0

    文章

    219

    浏览量

    8567

原文标题:kubelet 垃圾回收机制

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Kubernetes之路 2 - 利用LXCFS提升容器资源可见性

    摘要: 这是本系列的第2篇内容,将介绍在Docker和Kubernetes环境中解决遗留应用无法识别容器资源限制的问题。本系列文章记录了企业客户在应用Kubernetes时的一些常见问题第一篇
    发表于 04-17 14:05

    阿里云容器Kubernetes监控(一) - 资源监控

    中的service或者kubernetes中的ReplicaSet、Deployment等等则没有太好的办法从采集的数据中进行反向的抽象,造成单纯的容器监控数据无法有效的进行监控数据的聚合和告警,一旦
    发表于 04-23 14:35

    阿里云容器Kubernetes监控(一) - 资源监控

    中的service或者kubernetes中的ReplicaSet、Deployment等等则没有太好的办法从采集的数据中进行反向的抽象,造成单纯的容器监控数据无法有效的进行监控数据的聚合和告警,一旦
    发表于 04-23 14:35

    阿里云容器Kubernetes监控(一) - 资源监控

    中的service或者kubernetes中的ReplicaSet、Deployment等等则没有太好的办法从采集的数据中进行反向的抽象,造成单纯的容器监控数据无法有效的进行监控数据的聚合和告警,一旦
    发表于 04-23 14:35

    电子垃圾回收隐患:非法回收1吨获利万元

    广州市政协提交的一份调研报告显示,非法回收作坊每处置1吨电子垃圾可获利3000~10000元,报告建议,应通过“谁生产,谁承担回收处理费”等方式规范管理电子垃圾
    发表于 07-07 11:37 2073次阅读

    固态硬盘垃圾回收方法

    由于NAND闪存的固有限制,写前擦除和擦除粒度较大,基于NAND Flash的固态硬盘(SSD)需要执行垃圾回收以重用失效页。然而垃圾回收带来的高开销会显著降低SSD的性能,也会直接影
    发表于 12-03 10:50 2次下载
    固态硬盘<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>方法

    Jvm垃圾回收机制及性能调优实战

    JVM中自动检测并移除不再使用的数据对象的这种机制称为:垃圾回收,简称GC。JVM通过使用垃圾收集器及使用相应的垃圾回收算法将内存中不再被使
    发表于 04-03 14:31 2次下载

    交大发布可回收垃圾分拣机器人,实现助力全国垃圾分类回收工作

    6月4日消息,交大中英国际低碳学院可回收垃圾分拣机器人,更是打破国外技术垄断,可实现每小时分拣垃圾5400次,并在大量垃圾中精准识别可回收
    的头像 发表于 06-04 14:31 2726次阅读

    智能垃圾回收机器人的应用优势是什么

    为什么需要垃圾回收机器人? 首先,垃圾分类回收是实现地球资源循环利用至关重要的一环,对于可持续发展有重大意义。垃圾分类也是对付
    发表于 07-22 09:26 1770次阅读

    智能垃圾回收机器人的优势是什么

    为什么需要垃圾回收机器人? 首先,垃圾分类回收是实现地球资源循环利用至关重要的一环,对于可持续发展有重大意义。垃圾分类也是对付
    发表于 07-28 14:42 3566次阅读

    智能垃圾回收机器人的应用优势有哪些

    为什么需要垃圾回收机器人? 首先,垃圾分类回收是实现地球资源循环利用至关重要的一环,对于可持续发展有重大意义。垃圾分类也是对付
    发表于 08-17 16:08 3945次阅读

    详解JVM的垃圾回收算法和垃圾回收

    JVM 垃圾回收机制是对堆中没有使用的对象进行回收,那么判断对象是否“存活”就至关重要。在判断对象是否“存活”的方法中,我们会介绍引用计数算法和可达性分析法。
    的头像 发表于 03-29 13:55 1246次阅读
    详解JVM的<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法和<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>器

    JVM入门之垃圾回收算法

    根据如何判定对象是垃圾垃圾回收算法分为两类:1、 「引用计数式垃圾收集」 (判定垃圾是通过引用计数器)别名:直接
    的头像 发表于 02-10 11:40 533次阅读
    JVM入门之<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法

    智能垃圾回收箱及其控制系统

    智能高效远程控制智能垃圾回收箱本文设计了基于机械传动、嵌入式系统和物联网技术的智能垃圾回收箱及控制系统,包括结构、硬件和软件设计,以及基于机智云后台服务器的操作系统,实现了用户信息识
    的头像 发表于 04-13 08:10 233次阅读
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱及其控制系统

    智能垃圾回收箱控制系统硬件设计

    智能高效远程控制智能垃圾回收箱控制系统硬件部分的选型与设计是整个产品的基础,所有功能的实现都要围绕其进行开发。本章对智能垃圾回收箱控制系统的硬件进行详细设计。智能
    的头像 发表于 04-13 08:10 228次阅读
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱控制系统硬件设计