ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

容器云原生架构落地:从PPT到kubectl可执行的硬性契约

容器云原生架构落地:从PPT到kubectl可执行的硬性契约 简介本资源是一份面向企业架构师、云平台工程师及数字化转型技术决策者的「容器云原生技术架构」深度解析PPT聚焦解决传统IT架构在敏捷交付、资源利用率与多云协同方面的核心瓶颈。内容系统梳理云原生四大支柱——容器化以“飞天”平台为实例、微服务拆分治理、DevOps安全流水线含镜像签名/扫描/审计与持续交付实践并延伸至AI异构计算、多云管理、等保合规等生产级落地场景。资源为单文件PPTX格式共1个6.96MB演示文稿结构清晰涵盖云原生能力图谱、商业价值三维模型省钱/省时/省心、典型客户案例股份制银行AI容器平台、多云战略实施路径及CNCF生态标准对齐说明。目前已有157人学习下载可直接用于技术宣导、方案汇报或团队内训助读者快速掌握云原生从理念到工程落地的关键逻辑与实操要点。1. 容器云原生技术架构不是PPT里的概念图而是你明天上线前必须对齐的部署契约你手头正压着一个“容器云原生技术架构.pptx”——它可能来自架构评审会、投标材料、或新项目启动包。但打开后发现满屏箭头堆叠、分层框图悬浮、K8s图标镶金边却找不到一句“这个Service暴露端口为什么设成30080而不是NodePort默认范围”没有说明“StatefulSet里volumeClaimTemplates的storageClassName在生产环境必须和StorageClass实际可用名严格一致否则Pod卡在Pending”更没提“CI流水线里build镜像时用--platformlinux/amd64硬编码结果在ARM集群上拉取失败报错invalid platform”。这不是PPT做错了是它本就不该承载落地细节。真正的容器云原生技术架构是一套可验证、可审计、可回滚的运行时契约它定义了应用进程在容器中如何被调度、如何访问存储、如何被网络寻址、如何与宿主机资源博弈、如何在故障时自愈。它不服务于汇报而服务于SRE值班表上的告警响应时间、运维同学深夜重启Pod时的命令成功率、以及开发提交代码后CI/CD流水线能否在5分钟内完成从镜像构建到灰度发布的全链路。本文不讲“什么是云原生”只拆解当你拿到这份PPT如何把它变成kubectl能执行、Prometheus能采集、ArgoCD能比对、审计系统能校验的最小可行架构基线——覆盖容器运行时选型、声明式编排约束、安全上下文配置、可观测性埋点、以及最常被忽略的状态持久化契约。适合正在推进容器化迁移的DevOps工程师、负责云平台建设的基础设施团队以及需要向甲方交付可验证架构方案的解决方案架构师。2. 从PPT框图到kubectl可执行容器运行时与编排层的硬约束落地PPT里常把“容器运行时”画成一个抽象模块但实际落地时它直接决定你的Pod能否启动、是否被OOM Killer干掉、甚至影响Java应用GC停顿时间。不能只写“使用Containerd”必须明确版本、配置路径、沙箱模型选择。同样“Kubernetes编排”不是画个Deployment图标就完事——你需要把PPT里“高可用”三个字翻译成具体字段replicas3、topologySpreadConstraints、podDisruptionBudget缺一不可。2.1 Containerd配置绕过Docker Desktop幻觉直击生产级运行时根目录很多团队在本地用Docker Desktop调试误以为docker run命令逻辑等同于K8s Pod启动。但生产环境几乎全部采用Containerd作为CRIContainer Runtime Interface其配置文件/etc/containerd/config.toml才是真实控制台。PPT若未指定运行时必须补全以下三项硬约束# /etc/containerd/config.toml 关键段落需root权限修改并重启containerd [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc] runtime_type io.containerd.runc.v2 [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] SystemdCgroup true # ⚠️ 必须开启否则cgroup v2下K8s无法正确限制CPU/Memory BinaryName /usr/bin/runc # 显式指定runc路径避免多版本冲突 [plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io] endpoint [https://registry.cn-hangzhou.aliyuncs.com] # 阿里云镜像加速国内必备 [plugins.io.containerd.grpc.v1.cri.registry.configs.registry.cn-hangzhou.aliyuncs.com.tls] insecure_skip_verify false # 生产环境严禁true此处仅为示例实际需配CA证书逻辑说明SystemdCgroup true是当前K8s 1.24强制要求关闭会导致Pod资源限制失效如limit.memory2Gi但实际占用超限镜像加速endpoint必须与集群所在Region匹配华东1用cn-hangzhou华北2用cn-beijing填错会导致镜像拉取超时insecure_skip_verify在生产环境必须为false否则镜像签名验证形同虚设。2.2 Deployment声明式契约把“弹性伸缩”翻译成可审计的YAML字段PPT中“自动扩缩容”常配一张HPA曲线图但真正生效的是Deployment中隐藏的调度契约。以下字段必须显式声明不可依赖默认值# production-deployment.yaml —— 每个字段都对应PPT中一个架构承诺 apiVersion: apps/v1 kind: Deployment metadata: name: payment-service spec: replicas: 3 # ✅ PPT承诺的“3副本高可用”非1 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 # 允许最多1个Pod额外启动滚动更新时 maxUnavailable: 0 # ⚠️ 关键更新期间0个Pod不可用保障SLA selector: matchLabels: app: payment-service template: metadata: labels: app: payment-service annotations: prometheus.io/scrape: true # ✅ 可观测性契约此Pod必须暴露metrics prometheus.io/port: 9090 spec: # 安全上下文PPT中“最小权限原则”的代码实现 securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: app image: registry.example.com/payment:v2.3.1sha256:abc123... # ✅ 使用digest而非tag防镜像篡改 ports: - containerPort: 8080 protocol: TCP resources: requests: cpu: 500m memory: 1Gi limits: cpu: 1000m memory: 2Gi livenessProbe: httpGet: path: /actuator/health/liveness port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 initialDelaySeconds: 10 periodSeconds: 5 # 拓扑分布PPT中“跨AZ部署”的物理实现 topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: payment-service参数说明maxUnavailable: 0是金融类业务硬性要求滚动更新时旧Pod必须存活至新Pod ReadyseccompProfile.type: RuntimeDefault启用默认安全策略拦截危险系统调用如ptraceimage使用sha256:xxx而非:latest确保每次部署镜像内容确定topologySpreadConstraints强制Pod分散到不同可用区避免单AZ故障导致服务中断。2.3 StatefulSet状态契约PPT里“有状态服务”必须绑定的三要素PPT若出现“数据库”“消息队列”“分布式缓存”等字样意味着必须用StatefulSet而非Deployment。但仅写kind: StatefulSet远远不够——它需要三重契约绑定契约要素PPT中常见描述YAML强制字段不满足后果稳定网络标识“每个实例有固定DNS名”serviceName: mysql-headlessheadless ServicePod重启后DNS解析失败客户端连接中断稳定存储绑定“数据盘不随Pod销毁”volumeClaimTemplates中storageClassName必须存在且可用PVC PendingPod卡在ContainerCreating有序启停“主从节点按序初始化”podManagementPolicy: OrderedReadyrevisionHistoryLimit: 5主从角色混乱数据同步异常# mysql-statefulset.yaml —— 缺一不可的三要素 apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: mysql-headless # ✅ 指向headless Service提供稳定DNS replicas: 3 podManagementPolicy: OrderedReady # ✅ 严格按0→1→2顺序启动0号Pod必须Ready才启1号 revisionHistoryLimit: 5 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0.33 volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumeClaimTemplates: # ✅ 存储契约核心 - metadata: name: mysql-data spec: accessModes: [ReadWriteOnce] storageClassName: alicloud-disk-ssd # ⚠️ 必须与集群中已创建的StorageClass名完全一致 resources: requests: storage: 100Gi --- # headless Service —— 网络契约基石 apiVersion: v1 kind: Service metadata: name: mysql-headless spec: clusterIP: None # ✅ headless关键不分配ClusterIP selector: app: mysql逻辑说明serviceName字段必须与下方headless Service的metadata.name严格一致否则StatefulSet无法生成mysql-0.mysql-headless.default.svc.cluster.local这类稳定DNSstorageClassName若填写alicloud-disk-ssd但集群中实际只有alicloud-disk-efficiencyPVC将永久PendingpodManagementPolicy: OrderedReady是MySQL主从场景的生命线——0号Pod通常为Master必须完全初始化成功mysqld进程监听33061号PodSlave才能开始同步。3. 安全上下文与权限隔离PPT中“零信任”在容器内的具象化实现PPT里“零信任架构”常以锁形图标呈现但在容器世界它具象为securityContext字段的每一行配置。忽略它等于把应用进程裸奔在宿主机上——Java应用可随意读取/proc、Python脚本能挂载宿主机磁盘、甚至容器内root用户拥有宿主机root权限。这不是危言耸听而是CVE-2022-29152等漏洞的根源。3.1 Pod级安全上下文阻断90%容器逃逸路径PPT若提及“安全加固”必须落实到Pod spec的securityContext。以下配置是生产环境最低基线# security-context-pod.yaml —— 每一项都是防御纵深 apiVersion: v1 kind: Pod metadata: name: secure-pod spec: securityContext: # 1. 禁止特权模式 —— 最基础防线 privileged: false # 2. 强制非root用户运行 —— 防止容器内root提权 runAsNonRoot: true runAsUser: 1001 runAsGroup: 1001 # 3. 文件系统只读 —— 阻断恶意写入 readOnlyRootFilesystem: true # 4. 禁用CAP_SYS_ADMIN等危险能力 capabilities: drop: - ALL add: - NET_BIND_SERVICE # 仅开放必要能力绑定1024以下端口 # 5. Seccomp默认策略 —— 内核级系统调用过滤 seccompProfile: type: RuntimeDefault # 6. AppArmor强制启用需提前加载profile apparmor.security.beta.kubernetes.io/profile-name: runtime/default containers: - name: nginx image: nginx:1.23.3 # 容器级安全上下文可覆盖Pod级但建议保持一致 securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true参数说明runAsUser: 1001必须与镜像内/etc/passwd中用户UID一致否则容器启动失败如Alpine镜像默认www-data UID82此处需改为82readOnlyRootFilesystem: true要求镜像所有运行时写操作如日志、临时文件必须挂载到emptyDir或PersistentVolume否则应用崩溃NET_BIND_SERVICE是Nginx等服务必需能力若去掉则无法监听80端口。3.2 PodSecurityPolicyPSP替代方案用Pod Security AdmissionPSA强制基线K8s 1.25已废弃PSPPPT若仍写“启用PSP”必须升级为PSAPod Security Admission。它通过命名空间标签强制执行安全策略无需RBAC复杂配置# 步骤1为命名空间打标替代PSP的rolebinding kubectl label namespace production \ pod-security.kubernetes.io/enforcebaseline \ pod-security.kubernetes.io/enforce-versionv1.27 \ pod-security.kubernetes.io/warnrestricted \ pod-security.kubernetes.io/auditrestricted # 步骤2验证策略生效尝试部署违规Pod cat EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: psp-violation namespace: production spec: securityContext: privileged: true # ⚠️ baseline策略禁止privileged containers: - name: nginx image: nginx EOF # 输出Error from server (Forbidden): error when creating STDIN: # pods psp-violation is forbidden: violates PodSecurity baseline:v1.27: privileged逻辑说明enforcebaseline是生产环境推荐策略禁止privileged、hostNetwork、hostPID等高危配置warnrestricted会在kubectl输出中警告更严格策略如禁止allowPrivilegeEscalationauditrestricted将违规事件记录到审计日志供SOC平台分析。PSA策略由kube-apiserver内置执行无需额外组件。3.3 镜像安全扫描PPT中“镜像可信”必须落地为CI流水线门禁PPT若写“使用可信镜像源”不能只靠人工审查。必须在CI阶段集成Trivy等工具将漏洞扫描结果作为流水线卡点# .gitlab-ci.yml 镜像安全门禁 stages: - build - scan - deploy build-image: stage: build script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG scan-image: stage: scan image: aquasec/trivy:0.45.0 script: - trivy image --severity CRITICAL,HIGH --exit-code 1 $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG # ⚠️ exit-code 1 表示发现CRITICAL/HIGH漏洞时流水线失败 allow_failure: false # 必须失败不能跳过 deploy-to-k8s: stage: deploy script: - kubectl set image deployment/payment-service app$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG参数说明--severity CRITICAL,HIGH聚焦高危漏洞避免LOW/MEDIUM干扰--exit-code 1是关键——漏洞存在即终止流水线强制开发修复Trivy扫描结果包含CVE编号、CVSS分数、修复建议如升级到openssl 3.0.12直接嵌入GitLab MR评论形成闭环。4. 可观测性与调试契约PPT中“实时监控”在容器世界的最小可行埋点PPT里监控大屏常展示QPS、延迟、错误率曲线但若容器内应用未暴露标准metrics端点Prometheus连抓取目标都发现不了。这不是运维的锅而是架构设计缺失——可观测性必须作为架构契约写入PPT并在代码和配置中落地。4.1 Prometheus指标暴露Spring Boot Actuator的生产级配置Java应用若用Spring BootPPT中“统一监控”必须对应application.yml的真实配置# application-prod.yml —— 每一行都是监控契约 management: endpoints: web: exposure: include: health,info,metrics,prometheus,threaddump,loggers # ✅ 必须包含prometheus endpoint: prometheus: scrape-interval: 15s # ⚠️ 与Prometheus抓取间隔对齐避免数据抖动 metrics: export: prometheus: enabled: true tags: application: ${spring.application.name} environment: prod health: show-details: when_authorized # ⚠️ 生产环境禁止show-detailsalways防信息泄露 server: port: 8080 shutdown: graceful逻辑说明exposure.include: prometheus是核心缺失则/actuator/prometheus端点不存在scrape-interval: 15s必须与Prometheus配置的scrape_interval一致通常15s或30s否则指标时间戳错乱show-details: when_authorized防止/actuator/health返回数据库连接字符串等敏感信息。4.2 ServiceMonitor声明让Prometheus自动发现PodPPT中“自动发现服务”需转化为ServiceMonitor资源而非手动配置static_configs# servicemonitor.yaml —— K8s原生服务发现契约 apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: payment-monitor namespace: monitoring # ✅ 必须与Prometheus Operator安装命名空间一致 spec: selector: matchLabels: app: payment-service # ✅ 匹配Deployment的label namespaceSelector: matchNames: - default # ✅ 监控目标Pod所在命名空间 endpoints: - port: web # ✅ 对应Service中port.name interval: 30s path: /actuator/prometheus scheme: http --- # 对应的Service必须存在 apiVersion: v1 kind: Service metadata: name: payment-service labels: app: payment-service # ✅ 与ServiceMonitor.selector.matchLabels一致 spec: ports: - name: web # ✅ port.name必须与ServiceMonitor.endpoints.port一致 port: 8080 targetPort: 8080 selector: app: payment-service参数说明namespaceSelector.matchNames必须精确指定目标命名空间若写any: true可能导致监控爆炸endpoints.port: web必须与Service中ports[].name完全匹配否则Prometheus找不到抓取端点path: /actuator/prometheus是Spring Boot Actuator默认路径若自定义需同步修改。4.3 日志标准化PPT中“统一日志平台”依赖的容器stdout契约PPT若承诺“日志集中采集”容器内应用必须放弃写文件全部输出到stdout/stderr// Spring Boot中禁用logback-file.xml强制输出到控制台 // src/main/resources/logback-spring.xml ?xml version1.0 encodingUTF-8? configuration appender nameCONSOLE classch.qos.logback.core.ConsoleAppender encoder !-- ⚠️ 关键JSON格式便于ELK解析 -- pattern{timestamp:%d{ISO8601},level:%level,service:%property{spring.application.name:-},traceId:%X{traceId:-},spanId:%X{spanId:-},message:%msg}%n/pattern /encoder /appender root levelINFO appender-ref refCONSOLE/ /root /configuration逻辑说明ConsoleAppender确保日志输出到stdout而非/var/log/app.log容器内文件系统不可靠JSON格式pattern是ELK/K8s日志采集器如Fluent Bit解析的基础字段如traceId支持链路追踪%X{traceId:-}中的:-表示空值时填空字符串避免JSON解析失败。5. 避坑PPT架构落地时最常翻车的5个血泪现场PPT架构图看着完美但落地时往往在某个不起眼的字段上栽跟头。以下是我在12个容器化项目中踩过的坑按发生频率排序每条都附带kubectl describe pod或journalctl中的真实报错片段。5.1 现象Pod卡在ContainerCreatingkubectl describe pod显示FailedCreatePodSandBox原因Containerd配置中SystemdCgroup false但K8s集群启用了cgroup v2。解决# 查看节点cgroup版本 cat /proc/1/cgroup | head -1 # 输出0::/为v20::/init.scope为v1 # 修改/etc/containerd/config.toml设置SystemdCgroup true sudo systemctl restart containerd # 重启kubelet sudo systemctl restart kubelet提示K8s 1.24默认要求cgroup v2若宿主机OS为CentOS 7cgroup v1需升级内核或改用Ubuntu 22.04。5.2 现象HPA显示unknownkubectl get hpa无数值原因Metrics Server未部署或Deployment未暴露/metrics端点或ServiceMonitor中port.name拼写错误。解决# 验证Metrics Server是否运行 kubectl get apiservice v1beta1.metrics.k8s.io -o wide # 验证Pod是否暴露/metrics假设Service名为payment-service curl -v http://$(kubectl get pod -l apppayment-service -o jsonpath{.items[0].status.podIP}):8080/actuator/prometheus | head -20 # 检查ServiceMonitor是否匹配 kubectl get servicemonitor -n monitoring payment-monitor -o yaml | grep -A5 endpoints5.3 现象StatefulSet Pod反复重启kubectl logs显示mysqld: Cant open the mysql.plugin table原因volumeClaimTemplates中storageClassName不存在PVC Pending导致MySQL初始化失败。解决# 查看PVC状态 kubectl get pvc -n default # NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE # mysql-data-mysql-0 Pending none 5m # 列出集群可用StorageClass kubectl get sc # 若无alicloud-disk-ssd则修改StatefulSet中storageClassName为存在的名称5.4 现象Java应用内存持续增长kubectl top pod显示RSS远超limit但JVM堆内存正常原因容器内存limit未传递给JVMJava 8u191默认启用-XX:UseContainerSupport但需显式设置-XX:MaxRAMPercentage。解决# Deployment中添加JVM参数 env: - name: JAVA_TOOL_OPTIONS value: -XX:UseContainerSupport -XX:MaxRAMPercentage75.0 -XX:PrintGCDetails resources: limits: memory: 2Gi # JVM将按2Gi * 75% 1.5Gi设置最大堆5.5 现象Ingress返回503kubectl describe ingress无事件kubectl get endpoints显示none原因Service的selector与Pod的labels不匹配或Service的ports[].targetPort与容器containerPort不一致。解决# 检查Service selector kubectl get service payment-service -o yaml | grep -A3 selector # 检查Pod labels kubectl get pod -l apppayment-service -o wide # 检查targetPort与containerPort是否一致 kubectl get service payment-service -o yaml | grep -A3 ports kubectl get deployment payment-service -o yaml | grep -A3 containerPort6. 架构验证用5条命令建立你的PPT架构可信度基线PPT交出去只是开始真正的架构可信度来自运行时验证。我坚持在每次架构评审后用这5条命令交叉验证PPT承诺是否落地——它们不依赖任何UI只读取K8s API真实状态结果可截图存档成为对甲方、对审计、对SRE团队的硬凭证。6.1 验证“高可用”检查Pod跨AZ分布与就绪状态# 命令1验证Pod是否真正在多AZ运行非同一节点 kubectl get pod -l apppayment-service -o wide --field-selector spec.nodeName | \ awk {print $NF} | sort | uniq -c | \ while read count node; do echo $node - $(kubectl get node $node -o jsonpath{.metadata.labels.topology\.kubernetes\.io/zone}) done # 命令2验证所有Pod处于Running且Ready非CrashLoopBackOff kubectl get pod -l apppayment-service -o wide | \ awk $3 ! Running || $4 ! 1/1 {print $0} | \ grep -v NAME echo ❌ 发现非Running或非Ready Pod || echo ✅ 全部Pod Running且Ready输出解读第一行命令应显示至少2个不同AZ如cn-hangzhou-a、cn-hangzhou-b第二行若无输出则表示全部Pod健康。这是PPT中“跨AZ高可用”最朴素的证明。6.2 验证“安全加固”检查Pod安全上下文合规性# 命令3扫描所有Pod确认无privileged、无root用户、无可写根文件系统 kubectl get pod -A -o json | \ jq -r .items[] | select(.spec.securityContext.privileged true) | \(.metadata.namespace)/\(.metadata.name) | \ grep -v ^$ echo ❌ 发现privileged Pod || echo ✅ 无privileged Pod kubectl get pod -A -o json | \ jq -r .items[] | select(.spec.securityContext.runAsNonRoot ! true or .spec.containers[].securityContext.runAsNonRoot ! true) | \(.metadata.namespace)/\(.metadata.name) | \ grep -v ^$ echo ❌ 发现非非root Pod || echo ✅ 全部Pod runAsNonRoot kubectl get pod -A -o json | \ jq -r .items[] | select(.spec.securityContext.readOnlyRootFilesystem ! true or .spec.containers[].securityContext.readOnlyRootFilesystem ! true) | \(.metadata.namespace)/\(.metadata.name) | \ grep -v ^$ echo ❌ 发现可写根文件系统 || echo ✅ 全部Pod只读根文件系统逻辑说明jq脚本直接解析Pod JSON比kubectl describe更可靠runAsNonRoot需同时检查Pod级和容器级因容器级可覆盖Pod级readOnlyRootFilesystem同理。这是PPT中“零信任”的代码级审计。6.3 验证“可观测性”确认Prometheus已抓取指标# 命令4检查Prometheus targets中payment-service是否UP curl -s http://prometheus.monitoring.svc.cluster.local:9090/api/v1/targets | \ jq -r .data.activeTargets[] | select(.labels.jobpayment-service) | \(.discoveredLabels.instance) \(.health) | \ grep -v ^$ echo ✅ Prometheus已发现payment-service || echo ❌ Prometheus未发现payment-service # 命令5查询最近1分钟HTTP 5xx错误率验证指标可用 curl -s http://prometheus.monitoring.svc.cluster.local:9090/api/v1/query?queryrate(http_server_requests_seconds_count{status~\5..\}[1m]) | \ jq -r .data.result[].value[1] | \ grep -v ^$ echo ✅ HTTP 5xx指标可查询 || echo ❌ HTTP 5xx指标不可用参数说明jobpayment-service来自ServiceMonitor中spec.jobLabel默认为jobrate(...[1m])计算1分钟速率避免瞬时毛刺status~5..匹配所有5xx状态码。这是PPT中“实时监控”的数据级验证。我习惯把这5条命令保存为arch-validate.sh每次架构变更后运行一次输出结果存入Confluence页面。当甲方问“你们说的高可用怎么证明”我不再翻PPT而是直接贴出终端截图——上面是真实的kubectl输出不是设计师画的箭头。这种验证方式笨拙但可靠它把架构从幻灯片拉回地面让每个承诺都经得起kubectl的质问。希望帮到你。本文还有配套的精品资源点击获取
返回列表