云容器引擎,你了解多少?【与云原生的故事】
本文主要内容:
- 概述
- 云容器引擎架构
- 云容器引擎功能介绍
- 云容器引擎优势
- 应用场景
- 最佳实践
- 操作指导
- 未来展望
1、概述
1.1、什么是云容器引擎
云容器引擎(Cloud Container Engine)可提供高可靠高性能的企业级容器应用管理服务,支持Kubernetes社区原生应用和工具,简化云上自动化容器运行环境搭建,面向云原生2.0打造CCE Turbo容器集群,计算、网络、调度全面加速,全面加速企业应用创新。
1.2、为什么选择云容器引擎
云容器引擎深度整合华为云高性能的计算(ECS/BMS)、网络(VPC/EIP/ELB)、存储(EVS/OBS/SFS)等服务,并支持GPU、NPU、ARM、FPGA等异构计算架构,支持多可用区(Available Zone,简称AZ)、多区域(Region)容灾等技术构建高可用Kubernetes集群。
华为云是全球首批Kubernetes认证服务提供商(Kubernetes Certified Service Provider,KCSP),是国内最早投入Kubernetes社区的厂商,是容器开源社区主要贡献者和容器生态领导者。华为云也是CNCF云原生计算基金会的创始成员及白金会员,云容器引擎是全球首批通过CNCF基金会Kubernetes一致性认证的容器服务。
2、云容器引擎架构
云容器引擎架构可支持多集群部署,同时可实现容器编排、应用管理、服务治理等功能。
3、云容器引擎功能介绍
云容器引擎提供高度可扩展的、高性能的企业级Kubernetes集群,包括集群管理、节点管理、节点池管理、工作负载、亲和/反亲和性调度、容器网络、容器存储、插件管理、模板市场、弹性伸缩、权限管理、系统管家等功能,为您提供一站式容器平台服务。
3.1、集群管理
云容器引擎CCE是一种托管的Kubernetes服务,可进一步简化基于容器的应用程序部署和管理,您可以在CCE中方便的创建Kubernetes集群、部署您的容器化应用,以及方便的管理和维护。
- 一站式部署和运维:使用云容器引擎,您可以一键创建Kubernetes容器集群,无需自行搭建Docker和Kubernetes集群。您可以通过云容器引擎自动化部署和一站式运维容器应用,使得应用的整个生命周期都在云容器引擎内高效完成。
- 支持多类型容器集群:通过云容器引擎您可以直接使用华为云高性能的弹性云服务器、裸金属服务器、GPU加速云服务器等多种异构基础设施,您可以根据业务需要在云容器引擎中快速创建集群,并通过云容器引擎对创建的集群进行统一管理。
3.2、节点管理
节点是容器集群组成的基本元素。节点取决于业务,既可以是虚拟机,也可以是物理机。每个节点都包含运行Pod所需要的基本组件,包括 Kubelet、Kube-proxy 、Container Runtime等。在云容器引擎CCE中,主要采用高性能的弹性云服务器ECS或裸金属服务器BMS作为节点来构建高可用的Kubernetes集群。
节点管理功能介绍 |
|
功能模块 |
功能概述 |
添加节点 |
支持两种添加节点的方式:购买节点和纳管节点,纳管节点是指将“已购买的弹性云服务器(ECS)加入到CCE集群中”。 支持虚拟机、裸金属服务器、GPU、NPU等异构节点的购买添加。 |
节点监控 |
CCE通过云监控服务(Cloud Eye)为您提供节点的监控,每个节点对应一台弹性云服务器。 |
重置节点 |
在CCE集群中重置节点会将该节点以及节点内运行的业务都销毁,重置前请确认您的正常业务运行不受影响,请谨慎操作。该功能支持v1.13及以上版本的集群。 |
删除节点 |
在CCE集群中删除节点会将该节点以及节点内运行的业务都销毁,删除前请确认您的正常业务运行不受影响,请谨慎操作。 |
3.3、节点池管理
支持创建新的自定义节点池,借助节点池基本功能方便快捷地创建、管理和销毁节点,而不会影响整个集群。新节点池中所有节点的参数和类型都彼此相同,您无法在节点池中配置单个节点,任何配置更改都会影响节点池中的所有节点。
3.4、工作负载
工作负载是在Kubernetes上运行的应用程序。无论您的工作负载是单个组件还是协同工作的多个组件,您都可以在Kubernetes上的一组Pod中运行它。在Kubernetes中,工作负载是对一组Pod的抽象模型,用于描述业务的运行载体,包括Deployment、Statefulset、Daemonset、Job、CronJob等多种类型。
CCE提供基于Kubernetes原生类型的容器部署和管理能力,支持容器工作负载部署、配置、监控、扩容、升级、卸载、服务发现及负载均衡等生命周期管理。
3.5、持久化存储卷
云容器引擎除支持本地磁盘存储外,还支持将工作负载数据存储在华为云的云存储上,当前支持的云存储包括:云硬盘存储卷(EVS)、文件存储卷(SFS)、对象存储卷(OBS)和极速文件存储卷(SFS Turbo)。
存储管理功能介绍 |
|
功能模块 |
功能概述 |
本地磁盘存储 |
通过本地磁盘存储将容器所在宿主机的文件目录挂载到容器的指定路径中(对应Kubernetes的HostPath),也可以不填写源路径(对应Kubernetes的EmptyDir),不填写时将分配主机的临时目录挂载到容器的挂载点,指定源路径的本地硬盘数据卷适用于将数据持久化存储到容器所在宿主机,EmptyDir(不填写源路径)适用于容器的临时存储。 |
云硬盘存储卷 |
支持将云硬盘(EVS)挂载到容器中。通过云硬盘,可以将存储系统的远端文件目录挂载到容器中,数据卷中的数据将被永久保存,即使删除了容器,数据卷中的数据依然保存在存储系统中。 |
文件存储卷 |
支持创建SFS存储卷并挂载到容器的某一路径下,也可以使用底层SFS服务创建的文件存储卷,SFS存储卷适用于多读多写的持久化存储,适用于多种工作负载场景,包括媒体处理、内容管理、大数据分析和分析工作负载程序等场景。 |
对象存储卷 |
支持创建OBS对象存储卷并挂载到容器的某一路径下,对象存储适用于云工作负载、数据分析、内容分析和热点对象等场景。 |
极速文件存储卷 |
CCE支持创建SFS Turbo极速文件存储卷并挂载到容器的某一路径下,极速文件存储具有按需申请,快速供给,弹性扩展,方便灵活等特点,适用于DevOps、容器微服务、企业办公等应用场景。 |
快照与备份 |
通过EVS服务为您提供快照功能,云硬盘快照简称快照,指云硬盘数据在某个时刻的完整拷贝或镜像,是一种重要的数据容灾手段,当数据丢失时,可通过快照将数据完整的恢复到快照时间点。 |
3.6、插件扩展
CCE提供了多种类型的系统插件,用于管理集群的扩展功能,以支持选择性扩展满足特性需求的功能。
- 提供OpenAPI和社区原生API。
- 提供Kubectl插件和社区原生Kubectl工具。
3.7、生态工具
云容器引擎深度集成应用服务网格和Kubernetes Helm标准模板。
Kubernetes生态 |
|
功能模块 |
功能概述 |
应用服务网格 |
提供非侵入式的微服务治理解决方案,支持完整的生命周期管理和流量治理能力,兼容Kubernetes和Istio生态。您无需修改任何服务代码,也无需手动安装代理,只需开启应用服务网格功能,即可实现丰富的服务治理能力。 |
模板市场 |
模板市场是CCE基于Kubernetes Helm标准的模板提供统一的资源管理与调度,高效地实现了模板的快速部署与后期管理,大幅简化了Kubernetes资源的安装管理过程。CCE提供的模板市场功能包括:示例模板和我的模板。 · 示例模板:使用社区Helm开源镜像,提供基础的容器集群体验与模板体验功能,当前支持redis、etcd、mysql-ndb、mongodb、istio、zookeeper、elasticsearch、kibana等示例模板。 · 我的模板:通过自定义Helm模板来简化工作负载部署的服务。 |
4、云容器引擎优势
云容器引擎是基于业界主流的Docker和Kubernetes开源技术构建的容器服务,提供众多契合企业大规模容器集群场景的功能,在系统可靠性、高性能、开源社区兼容性等多个方面具有独特的优势,满足企业在构建容器云方面的各种需求。
4.1、 简单易用
- 通过WEB界面一键创建Kubernetes集群,支持管理虚拟机节点或裸金属节点,支持虚拟机与物理机混用场景。
- 一站式自动化部署和运维容器应用,整个生命周期都在容器服务内一站式完成。
- 通过Web界面轻松实现集群节点和工作负载的扩容和缩容,自由组合策略以应对多变的突发浪涌。
- 通过Web界面一键完成Kubernetes集群的升级。
- 深度集成应用服务网格和Helm标准模板,真正实现开箱即用。
4.2、高性能
- 基于华为在计算、网络、存储、异构等方面多年的行业技术积累,提供业界领先的高性能云容器引擎,支撑您业务的高并发、大规模场景。
- 采用高性能裸金属NUMA架构和高速IB网卡,AI计算性能提升3-5倍以上。
4.3、安全可靠
- 高可靠:集群控制面支持3 Master HA高可用,3个Master节点可以处于不同可用区,保障您的业务高可用。集群内节点和工作负载支持跨可用区(AZ)部署,帮助您轻松构建多活业务架构,保证业务系统在主机故障、机房中断、自然灾害等情况下可持续运行,获得生产环境的高稳定性,实现业务系统零中断。
- 高安全:私有集群,完全由用户掌控,并深度整合华为云帐号和Kubernetes RBAC能力,支持用户在界面为子用户设置不同的RBAC权限。
4.4、开放兼容
- 云容器引擎在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
- 云容器引擎基于业界主流的Kubernetes实现,完全兼容Kubernetes/Docker社区原生版本,与社区最新版本保持紧密同步,完全兼容Kubernetes API和Kubectl。
5、应用场景
5.1、 基础设施与容器应用管理
CCE集群支持管理X86资源池和ARM资源池,能方便的创建Kubernetes集群、部署您的容器化应用,以及方便的管理和维护。
价值
通过容器化改造,使应用部署资源成本降低,提升应用的部署效率和升级效率,可以实现升级时业务不中断以及统一的自动化运维。
优势
- 多种类型的容器部署
支持部署无状态工作负载、有状态工作负载、守护进程集、普通任务、定时任务等。
- 应用升级
支持替换升级、滚动升级(按比例、实例个数进行滚动升级);支持升级回滚。
- 弹性伸缩
支持节点和工作负载的弹性伸缩。
5.2、秒级弹性伸缩
应用场景
- 电商客户遇到促销、限时秒杀等活动期间,访问量激增,需及时、自动扩展云计算资源。
- 视频直播客户业务负载变化难以预测,需要根据CPU/内存使用率进行实时扩缩容。
- 游戏客户每天中午12点及晚上18:00-23:00间需求增长,需要定时扩容。
价值
云容器引擎可根据用户的业务需求预设策略自动调整计算资源,使云服务器或容器数量自动随业务负载增长而增加,随业务负载降低而减少,保证业务平稳健康运行,节省成本。
优势
- 自由灵活
支持多种策略配置,业务流量达到扩容指标,秒级触发容器扩容操作。
- 高可用
自动检测伸缩组中实例运行状况,启用新实例替换不健康实例,保证业务健康可用。
- 低成本
只按照实际用量收取云服务器费用。
建议搭配使用
HPA(Horizontal Pod Autoscaling)+ CA(Cluster AutoScaling)
图1 弹性伸缩场景
5.3、微服务流量治理
应用场景
伴随着互联网技术的不断发展,各大企业的系统越来越复杂,传统的系统架构越来越不能满足业务的需求,取而代之的是微服务架构。微服务是将复杂的应用切分为若干服务,每个服务均可以独立开发、部署和伸缩;微服务和容器组合使用,可进一步简化微服务的交付,提升应用的可靠性和可伸缩性。
随着微服务的大量应用,其构成的分布式应用架构在运维、调试、和安全管理等维度变得更加复杂,在管理微服务时,往往需要在业务代码中添加微服务治理相关的代码,导致开发人员不能专注于业务开发,还需要考虑微服务治理的解决方案,并且将解决方案融合到其业务系统中。
价值
云容器引擎深度集成应用服务网格,提供开箱即用的应用服务网格流量治理能力,用户无需修改代码,即可实现灰度发布、流量治理和流量监控能力。
优势
- 开箱即用
与云容器引擎无缝对接,一键开启后即可提供非侵入的智能流量治理解决方案。
- 策略化智能路由
无需修改代码,即可实现HTTP、TCP等服务连接策略和安全策略。
- 流量治理可视化
基于无侵入的监控数据采集,深度整合华为云APM能力,提供实时流量拓扑、调用链等服务性能监控和运行诊断,构建全景的服务运行视图,可实时、一站式观测服务流量健康和性能状态。
建议搭配使用
弹性负载均衡ELB + 应用性能管理APM + 应用运维管理AOM
微服务治理场景
5.4、混合云架构
应用场景
- 多云部署、容灾备份
为保证业务高可用,需要将业务同时部署在多个云的容器服务上,在某个云出现事故时,通过统一流量分发的机制,自动的将业务流量切换到其他云上。
- 流量分发、弹性伸缩
大型企业客户需要将业务同时部署在不同地域的云机房中,并能自动弹性扩容和缩容,以节约成本。
- 业务上云、数据库托管
对于金融、安全等行业用户,业务数据的敏感性要求将数据业务保留在本地的IDC中而将一般业务部署在云上,并需要进行统一管理。
- 开发与部署分离
出于IP安全的考虑,用户希望将生产环境部署在公有云上,而将开发环境部署在本地的IDC。
价值
云容器引擎利用容器环境无关的特性,将私有云和公有云容器服务实现网络互通和统一管理,应用和数据可在云上云下无缝迁移,并可统一运维多个云端资源,从而实现资源的灵活使用以及业务容灾等目的。
优势
- 云上容灾
通过云容器引擎,可以将业务系统同时部署在多个云的容器服务上,统一流量分发,单云故障后能够自动将业务流量切换到其他云上,并能快速自动解决现网事故。
- 流量自动分发
通过云容器引擎的统一流量分发机制,实现应用访问流量的地域亲和,降低业务访问时延,并需要能够将线下IDC中的业务在云上扩展,可根据业务流量峰值情况,自动弹性扩容和缩容。
- 计算与数据分离,能力共享
通过华为云容器引擎,用户可以实现敏感业务数据与一般业务数据的分离,可以实现开发环境和生产环境分离,可以实现特殊计算能力与一般业务的分离,并能够实现弹性扩展和集群的统一管理,达到云上云下资源和能力的共享。
- 降低成本
业务高峰时,利用公有云资源池快速扩容,用户不再需要根据流量峰值始终保持和维护大量资源,节约成本。
建议搭配使用
弹性云服务器ECS + 云专线DC + 虚拟专用网络VPN + 容器镜像服务SWR
混合云场景
6、最佳实践
6.1、容灾-在CCE中实现高可用部署
基本原则
在CCE中,容器部署要实现高可用,可参考如下几点:
- 集群选择3个控制节点的高可用模式。
- 创建节点选择在不同的可用区,在多个可用区(AZ)多个节点的情况下,根据自身业务需求合理的配置自定义调度策略,可达到资源分配的最大化。
- 创建多个节点池,不同节点池部署在不同可用区,通过节点池扩展节点。
- 工作负载创建时设置实例数需大于2个。
- 设置工作负载亲和性规则,尽量让Pod分布在不同可用区、不同节点上。
操作步骤
为了便于描述,假设集群中有4个节点,其可用区分布如下所示。
NAME STATUS ROLES AGE VERSION ZONE HOSTNAME
192.168.5.112 Ready <none> 42m v1.21.7-r0-CCE21.11.1.B007 cn-south-2b 192.168.5.112
192.168.5.179 Ready <none> 42m v1.21.7-r0-CCE21.11.1.B007 cn-south-2b 192.168.5.179
192.168.5.252 Ready <none> 37m v1.21.7-r0-CCE21.11.1.B007 cn-south-1f 192.168.5.252
192.168.5.8 Ready <none> 33h v1.21.7-r0-CCE21.11.1.B007 cn-south-1e 192.168.5.8
- 第一条在可用区下工作负载反亲和,参数设置如下。
- 权重weight:权重值越高会被优先调度,本示例设置为50。
- 拓扑域topologyKey:包含默认和自定义标签,用于指定调度时的作用域。本示例设置为failure-domain.beta.kubernetes.io/zone,此为节点上标识节点在哪个可用区的标签。
- 标签选择labelSelector:选择Pod的标签,与工作负载本身反亲和。
- 第二条在节点名称作用域下工作负载反亲和,参数设置如下。
- 权重weight:设置为50。
- 拓扑域topologyKey:设置为io/hostname。
-
kind: Deployment apiVersion: apps/v1 metadata: name: nginx namespace: default memory: 512Mi affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 50 podAffinityTerm: labelSelector: # 选择Pod的标签,与工作负载本身反亲和。 topologyKey: failure-domain.beta.kubernetes.io/zone # 在同一个可用区下起作用 topologyKey: kubernetes.io/hostname # 在节点上起作用 imagePullSecrets: - name: default-secret 创建工作负载,然后查看Pod所在的节点。 $ kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE nginx-6fffd8d664-dpwbk 1/1 Running 0 17s 10.0.0.132 192.168.5.112 nginx-6fffd8d664-qhclc 1/1 Running 0 17s 10.0.1.133 192.168.5.252 将Pod数量增加到3,可以看到Pod被调度到了另外一个节点,且这个当前这3个节点是在3个不同可用区。
应用现状
基于CPU/内存使用率有一个问题,就是资源使用率数据反映是滞后的,不能及时反映应用实际需求,根据资源使用率进行扩缩容对一些需要快速弹性扩缩容的业务(比如抢购、社交媒体)来说就来不及了,会导致业务问题。
解决方案
本文介绍一种基于ELB监控指标的弹性伸缩方法,相比CPU/内存使用率进行弹性伸缩,基于ELB的QPS数据弹性伸缩更有针对性,更加及时。
本方案的关键点是获取ELB的指标数据并上报到Prometheus,再将Prometheus中的数据转换成HPA能够识别的metric数据,然后HPA根据metric数据进行弹性伸缩。
基于ELB监控指标的弹性伸缩具体实施方案如下所示:
- 开发一个Prometheus exporter,获取ELB的指标,并转化成Prometheus需要的格式,上报到Prometheus。
- 将Prometheus的数据转换成kubernetes metric api提供给HPA controller使用。
- 设置HPA规则,使用ELB的监控数据作为弹性伸缩指标。
图1 ELB流量与监控数据示意图
说明:
本文介绍的方法不限于ELB指标,其他指标可按照类似方法操作。
部署exporter
Prometheus可以动态监测,一般来说给Pod打上Prometheus知名的annotations,Prometheus会自动采集该Pod的监控信息。
有如下prometheus知名的annotations。
- io/scrape: true的话该pod会作为监控目标
- io/path: 采集的url,默认为/metrics
- io/port: 采集endpoint的端口号
- io/scheme: 默认http,如果为了安全设置了https,此处需要改为https
通常打上prometheus.io/scrape这个annotations就可以了,这样Prometheus就会从“/metrics”采集Pod的的监控信息。
创建HPA弹性伸缩规则
exporter上报到Prometheus的数据,经过Prometheus adapter监控数据转换成kubernetes metric api后,就可以创建HPA规则实现弹性伸缩。
创HPA规则示例如下,使用ELB的入流量来作为扩容的标准,当m7_in_Bps(网络流入速率)的值超过10k时,会触发名为nginx的Deployment弹性伸缩。
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: nginx
namespace: default
spec:
metrics:
- type: Object
object:
describedObject:
kind: Service
name: nginx
target:
type: Value
value: 10k
metric:
name: m7_in_Bps
创建完后,可以对负载进行压测(也就是通过ELB访问Pod),然后HPA controller会根据设置的值计算是否需要扩容。
7、操作指导
完整的云容器引擎使用流程包含以下步骤:
1、注册华为云帐号,授予IAM用户相应的权限。
华为云注册帐号无需授权即可拥有所有权限,由华为云帐号创建的IAM子用户需要授予相应的权限才能使用CCE,具体请参见权限管理。
2、创建集群。
- 通过镜像或编排模板创建工作负载(应用)。
- 查看部署后工作负载的状态和日志信息,对工作负载进行相应的升级、伸缩和监控。
8、未来展望
作为云原生发展的基石,云容器引擎技术的新趋势和新挑战备受关注。
趋势一:围绕云原生应用的高度自动化
得益于 Kubernetes 面向终态的理念,云原生架构天然具备高度自动化的能力。在应用云原生化的过程中会充分享用到自动化带来的优势,副本数维持、版本一致性、错误重试、异步事件驱动等能力,相比过去面向过程的运维模式而言是一次新理念、新技术带来的进步。在这片蓬勃发展的土壤之上,如何围绕云原生、为应用打造更加自动化的基础设施是未来探索的重点方向之一:
- 应用部署运维更加自动化:云原生业务类型及其多样化,不管是传统 IT、互联网,还是 Web 服务、搜索、游戏、AI、边缘等细分领域,每一种都会有自身特殊应用场景,而抽象、提炼出其中核心通用的部署运维诉求并转化为更加自动化的能力则是深耕云原生的必经之路。
- 风险防控能力更加自动化:面向终态的自动化是一把 “双刃剑”,它既为应用带来了声明式的部署能力,同时也潜在地会将一些误操作行为被终态化放大,例如在发生操作故障时副本数维持、版本一致性、级联删除等机制反而很可能导致爆炸半径扩大。因此,通过防护、拦截、限流、熔断等防控自动化能力来抑制其他功能性自动化能力的缺陷和副作用,是伴随着云原生规模急剧扩大的必要防护措施。
- Operator 运行时更加自动化:Kubernetes 能成为容器集群调度管理引擎的事实标准,其强大而又灵活的扩展能力功不可没。Operator 既是一种特殊的应用,也是不少有状态应用的自动化管理者。而过去社区整体 Operator 趋势还停留在数量野蛮增长、周边运行时机制却无太大进步,未来Operator 的运行时将会在水平扩展、灰度升级、租户隔离、安全防护、可观测性等方面获得充分的自动化增强。
趋势二:以“应用”为中心构建高可扩展的上层平台
随着容器技术的进一步成熟,越来越多的企业开始关注容器技术如何更好的为业务带来价值。我们可以看到以 Kubernetes 为交付界面的云原生生态日益庞大,越来越多的团队会基于 Kubernetes 构建上层抽象,增加更多的扩展能力,以“应用”为中心构建高可扩展的云原生平台。
- 基于 Kubernetes 与标准应用模型构建的易用、可扩展的上层平台将取代传统 PaaS 成为主流。当前云原生生态的软件虽然日益丰富,但是学习和使用门槛依旧非常高,易用性将成为“以应用为中心”的首要突破点。除此之外,在易用的同时保证可扩展性,保证以 Kubernetes 为接入点的开源软件无需或只要较小改造便可接入使用,也是这样类型应用管理平台的重要特征。
- “关注点分离”的标准化应用构建方式进一步深入人心。围绕 Kubernetes 构建应用交付平台已经逐渐成为共识,任何一个 PaaS 平台都不想把 Kubernetes 屏蔽掉。但是这并不意味着直接把 Kubernetes 所有的信息暴露给用户,PaaS 平台的构建者们极度渴望给用户最佳的体验。解决这个问题的突破点就是大家使用一个标准化的、关注点分离的应用构建模型,平台的构建者们关注 Kubernetes 接口(CRD 和 Operator),而平台的用户,也就是应用开发者们关注的则是一个标准化的抽象应用模型。
- 应用中间件能力进一步下沉,应用逻辑与中间件逻辑逐步解耦。随着云原生以及整个生态的发展,中间件领域也在逐步发展变化,从原先的中心化 ESB 到如今通过 Sidecar 模式提供能力的 Service Mesh 。应用中间件不再是通过一个胖客户端提供能力,而是成为一个能力的标准接入层,能力的提供则由应用管理平台通过 Sidecar 的方式在应用运行时注入。相信 Sidecar 这种模式将在除流量治理、路由策略、访问控制之外的更多中间件场景中得到应用,“以应用为中心”,让业务更专注,更聚焦。
【与云原生的故事】有奖征文火热进行 快来参加:https://bbs.huaweicloud.com/blogs/345260
- 点赞
- 收藏
- 关注作者
评论(0)