
Kubernetes
文章平均质量分 82
Kubernetes 在 SAP 产品开发中的应用
汪子熙
18年深耕企业管理软件领域,精通 ABAP, Java, Javascript, Typescript, 精通 UI5, Fiori, Fiori Element, Angular, Kubernetes, SAP HANA, SAP BTP. 具有通过阅读 Github 上各种优秀的开源框架和工具源代码的习惯,对于我来说阅读源代码,就像阅读中国白话文一样轻松自然。
展开
-
如何在 Kubernetes 集群的 Pod 中通过 Service Account 安全访问 API 服务
Service Account 是 Kubernetes 中的资源对象,用于标识和授权运行在 Pod 内的进程。在 Kubernetes 集群中,每个 Pod 如果需要与 API 服务器交互,通常会通过 Service Account 来认证和授权。它可以看作是 Pod 在 Kubernetes 集群中的“身份证”,保证它们在与 API 服务器通信时拥有合法的身份和适当的权限。原创 2024-12-03 19:07:16 · 579 阅读 · 0 评论 -
如何使用 Kubernetes 的 RBAC 机制限制用户访问权限
Kubernetes 中的 RBAC(Role-Based Access Control,基于角色的访问控制)是一种用于管理和限制用户访问权限的强大机制。RBAC 的设计使得集群管理员可以基于用户角色配置不同的权限,确保集群资源的安全性和分布式团队协作的高效性。原创 2024-12-03 19:06:14 · 1005 阅读 · 0 评论 -
在 Kubernetes 中手动指定 Pod 运行的节点详解
对于更复杂的调度需求,可以使用自定义调度器。自定义调度器可以根据特定的算法或策略,决定 Pod 的调度位置。手动指定 Pod 的运行节点在 Kubernetes 中是实现精细化资源管理和满足特殊需求的重要手段。通过节点选择器、节点亲和性、直接指定nodeName、污点和容忍度以及自定义调度器等方法,可以灵活地控制 Pod 的调度策略。原创 2024-11-25 11:56:50 · 1013 阅读 · 0 评论 -
解析 Minikube 架构与 Kubernetes 的设计差异
Minikube 是一个单节点的 Kubernetes 集群,使用虚拟化技术在本地机器上运行。虚拟机 (VM) 或容器:Minikube 的核心依赖于一个虚拟化层,这个层可以是一个虚拟机(例如基于 VirtualBox 或者 Hyperkit),也可以是一个 Docker 容器。它实际上把整个 Kubernetes 控制平面以及节点都运行在一个单独的虚拟化实例中。Kubernetes 集群。原创 2024-11-23 14:29:47 · 739 阅读 · 0 评论 -
Kubernetes 中 CrashLoopBackOff 的根本原因及解决路径
Kubernetes 提供了丰富的安全策略来控制 Pod 的行为,例如 PodSecurityPolicy 或 NetworkPolicy 等。这些策略配置不当也可能引发 CrashLoopBackOff。例如,PodSecurityPolicy 可以限制容器运行时的权限,如果一个应用程序需要特权模式,而 PodSecurityPolicy 禁止特权访问,容器就无法正常启动。假如一个应用程序需要访问主机网络,但被禁止使用主机网络的策略所约束,容器在启动时就会由于缺乏必要的权限而崩溃。原创 2024-11-23 14:14:51 · 1111 阅读 · 0 评论 -
Kubernetes 集群如何实现入站网络请求的负载均衡
Service:Service 是 Kubernetes 提供的一个抽象,用于将一个或多个 Pod 组合在一起,使它们能够对外提供统一的网络入口。kube-proxy:Kube-proxy 是 Kubernetes 中的网络代理,它负责管理节点上的网络规则,使得网络请求可以被正确地路由到 Pod。Ingress 和 Ingress Controller:Ingress 提供 HTTP 和 HTTPS 的负载均衡,通常用于为 Kubernetes 集群内的服务提供单一入口。原创 2024-11-19 18:36:10 · 885 阅读 · 0 评论 -
Kubernetes 集群中使用 Thanos 实现集群监控的详细指南
通过将 Thanos 集成到 Kubernetes 集群中,可以解决单独使用 Prometheus 时遇到的多项瓶颈问题,特别是数据的长期存储、高可用性、以及统一视图查询。Thanos 的组件化设计使得其与现有 Prometheus 集成时极为灵活,用户可以根据实际需求逐步增加组件来应对监控需求的变化。无论是为了提升数据的持久化能力,还是为了实现集群监控的全局视图,Thanos 都提供了一套有效且可扩展的解决方案。原创 2024-11-17 16:14:58 · 1035 阅读 · 0 评论 -
Kubernetes 网络策略详解与 Pod 间访问限制
有了隔离策略后,你可以开始逐步地开放那些必须的流量。metadata:spec:- Ingressingress:- from:这一策略允许标签为的 Pods 访问的 Pods。这种方式可以确保只有订单服务有权访问支付服务,而不是整个生产环境中的所有 Pods。网络策略是 Kubernetes 提供的重要安全机制之一,能够有效地限制 Pod 之间的访问,降低安全风险。原创 2024-11-12 23:19:36 · 798 阅读 · 0 评论 -
什么是 Kubernetes pod eviction
Pod Eviction 是 Kubernetes 中非常重要的机制,用于应对节点资源紧张、节点不可用等问题。它确保集群的稳定性和可靠性,使得重要的工作负载能够优先获得资源,保证服务的持续可用。在 Pod Eviction 的具体操作过程中,Kubelet 会监控节点的资源使用情况,并根据 Pod 的 QoS 类别、优先级等策略来选择合适的 Pod 进行驱逐。而 Kubernetes 调度器则会将被驱逐的 Pod 重新调度到其他合适的节点,完成整个资源的动态调整过程。原创 2024-11-06 11:53:11 · 880 阅读 · 0 评论 -
Kubernetes Pod 内的容器之间有哪些通信方式?
在讨论容器通信之前,有必要理解 Pod 的定义。Pod 是 Kubernetes 的核心概念,是一个逻辑主机环境,包含一个或多个相互关联的容器,这些容器共享同一网络命名空间和存储卷。在实践中,Pod 内的容器协同完成特定的任务,例如,一个容器运行 Web 服务,而另一个容器负责日志收集。这种协作需要高效的通信方式。Pod 内的容器之间存在多种通信方式,包括共享网络命名空间、共享存储卷和进程间通信(IPC)机制。共享网络命名空间适用于实时状态查询和服务发现,而共享存储卷更适合大规模数据传输和持久化存储。原创 2024-10-29 14:22:43 · 696 阅读 · 0 评论 -
如何使用 Istio 来为一个本身不支持安全性的应用程序添加保护?
除了加密通信,Istio 还允许你定义服务之间的访问控制策略,以便限制哪些服务可以访问其他服务。通过 Istio 的资源,我们可以非常细粒度地控制服务之间的访问权限。假设你希望只允许访问metadata:spec:selector:rules:- from:- source:在这个配置中,我们定义了授权策略,它只允许使用服务账号的请求访问。通过这种方式,我们可以确保只有合法的服务才能访问订单管理服务,从而进一步提高安全性。原创 2024-10-28 11:45:42 · 277 阅读 · 0 评论 -
如何使用 Istio 来为一个本身不支持安全性的应用程序添加保护?
除了加密通信,Istio 还允许你定义服务之间的访问控制策略,以便限制哪些服务可以访问其他服务。通过 Istio 的资源,我们可以非常细粒度地控制服务之间的访问权限。假设你希望只允许访问metadata:spec:selector:rules:- from:- source:在这个配置中,我们定义了授权策略,它只允许使用服务账号的请求访问。通过这种方式,我们可以确保只有合法的服务才能访问订单管理服务,从而进一步提高安全性。原创 2024-10-28 09:09:16 · 847 阅读 · 0 评论 -
利用Docker volume修改Nginx Docker镜像里index.html
通过这个小例子我们可以进一步加深对Docker volume概念的理解和使用方法。我们都知道运行基于Docker的Nginx镜像后,访问localhost能看到Nginx默认的首页,这个首页的位置是Nginx镜像内的/usr/share/nginx/html目录下面。假设我们有个需求,修改Nginx默认的首页成下面的内容:<html><head><title...原创 2018-11-26 23:42:20 · 732 阅读 · 1 评论 -
Dockerfile里的VOLUMES关键字
我有一个如下的Dockerfile:定义了一个名为log的VOLUME, 这样该SpringBoot应用运行在Docker容器时,我可以用如下命令,进入Docker容器内部,到log文件夹下查看该SpringBoot应用运行时产生的日志:docker exec -it <容器id> /bin/shSpringBoot应用的Application.properties文件:D...原创 2020-02-11 10:15:47 · 673 阅读 · 1 评论 -
为什么 ConfigMap 作为环境变量时需要重启 Pod 才能更新
ConfigMap 作为环境变量与作为文件卷时的不同表现,源自底层系统机制的不同。环境变量是静态的,一旦进程启动就不会改变,而文件卷则是动态的,Kubernetes 可以通过更新挂载的文件内容实现配置的实时更新。这让开发者在设计系统时有了更多的选择,可以根据应用程序的需求选择合适的配置加载方式。对于需要动态调整的配置,推荐使用文件卷方式来加载 ConfigMap;而对于在启动时固定不变的配置,使用环境变量则更加简洁明了。原创 2024-10-24 10:48:06 · 1188 阅读 · 0 评论 -
Docker镜像的目录存储讲解
我们成功安装完docker后,执行命令行sudo docker run hello-world, 如果是第一次执行,则会从远程拉取hello-world的镜像到本地,然后运行,显示hello world。以ubuntu系统为例,本地镜像存储于目录/var/lib/docker文件夹下:相关目录介绍如下。/var/lib/docker/image/overlay2:存储镜像管理数据的目录,...原创 2018-09-29 17:08:22 · 11859 阅读 · 1 评论 -
Kubernetes 里 spec 概念的含义介绍
在 Kubernetes 中,每一个资源对象的声明都是通过 YAML 或 JSON 文件来定义的,这些配置文件中最核心的部分之一就是spec。spec是(规范)的缩写,它主要用于描述你希望资源具有什么样的特性以及如何运行。这部分定义了 Kubernetes 对象的期望状态,也就是我们希望集群中各个组件最终达到的目标状态。Kubernetes 中很多不同类型的对象(如 Pod、Deployment、Service 等)都有它们各自的spec。原创 2024-10-22 11:11:23 · 453 阅读 · 0 评论 -
Kubenetes里pod和service绑定的实现方式
我之前的文章 如何在Kubernetes里创建一个Nginx service介绍了如何创建一个Kubernetes pod和service,使用的方法是命令kubectl run。本文介绍另一种方式,通过这种方式来学习Kubernetes里pod和对应的service是如何绑定的。首先使用下面的命令行创建一个名称为jerry-nginx-1982的deployment:kubect...原创 2018-10-01 22:25:35 · 5025 阅读 · 0 评论 -
在 Istio、Linkerd 和 Cilium 之间,哪种服务网格在性能上表现最佳
在讨论服务网格之前,先理解一下为什么我们需要它。现代微服务架构意味着将应用拆分为多个小型、独立的服务,这些服务可以独立开发、部署和扩展。然而,服务之间的通信和管理成了巨大的挑战,例如如何保证安全的通信、负载均衡、监控与可观测性等。服务网格(Service Mesh)作为基础设施层的一部分,专注于处理服务之间的网络通信,解决了这些问题。而 Istio、Linkerd 和 Cilium 则是当今流行的三种服务网格,它们各有优劣。我们从架构、性能、应用案例等方面来分析它们在性能上的表现。原创 2024-10-18 19:13:55 · 987 阅读 · 0 评论 -
Kubernetes 的多集群管理引擎有哪些?
要了解 Kubernetes 的多集群管理引擎,我们可以从多集群管理的基本需求出发,逐步深入地探讨不同的技术实现以及它们的优缺点。多集群管理在 Kubernetes 生态系统中正逐渐成为一种趋势,特别是在需要对多个 Kubernetes 集群进行统一管理、监控和操作时。原创 2024-10-18 18:52:19 · 850 阅读 · 0 评论 -
在 Kubernetes 集群中,Velero 备份方案有哪些优势?
Velero 备份方案在 Kubernetes 集群中的优势主要体现在其云原生设计、支持完整的集群资源备份、灵活的备份策略、跨集群迁移、灾难恢复、增量备份、持久卷快照、自动化集成、安全性以及社区支持等方面。它不仅为 Kubernetes 提供了强大的备份与恢复功能,还极大地提升了集群管理的灵活性与安全性。通过这些优势,Velero 不仅适用于小型的 Kubernetes 部署环境,更能够在企业级的生产环境中,为用户提供可靠的数据保护和恢复方案,确保业务的连续性和数据的完整性。原创 2024-10-18 18:49:24 · 853 阅读 · 0 评论 -
如何通过一系列优化措施使 etcd 支持包含数万个节点的 Kubernetes 集群 ?
为了让etcd支持一个包含数万个节点的 Kubernetes 集群,需要从多个角度进行优化,包括存储和网络性能的提升、分片策略、多集群的部署、参数调整、数据压缩与存储优化、集群监控与故障恢复等。每一个优化措施都有其特定的场景适用性,需要结合实际情况进行权衡。超大规模集群的etcd优化不仅仅依赖单一手段,而是需要通过多方面协同优化,以保证系统的高性能和高可用。特别是对于那些依赖 Kubernetes 管理大量微服务的企业来说,etcd的优化对其业务的稳定性和可扩展性至关重要。原创 2024-10-18 18:44:31 · 856 阅读 · 0 评论 -
如何使用 Kubernetes 部署现代数据平台(数据湖仓结构)
通过 Kubernetes 来部署一个现代的数据平台,可以实现从数据摄取、存储、处理到可视化的全流程自动化管理,并利用 Kubernetes 的弹性伸缩、高可用和 Operator 等特性来保证系统的稳定性和扩展性。每个组件,例如 Kafka、MinIO、Spark 等,都可以利用 Kubernetes 的资源管理功能来最大化其性能,同时保证数据的高可用性和安全性。原创 2024-10-16 08:59:52 · 885 阅读 · 0 评论 -
公网流量是如何通过 Kubernetes 服务到达 Pod 的?
假设我们的电商应用使用了 AWS 的负载均衡器和 Nginx Ingress 控制器。当用户访问时,流量首先到达 AWS ELB,ELB 将请求路由到 Kubernetes 集群中的某个节点上。节点上的kube-proxy根据服务规则将请求转发给 Nginx Ingress 控制器的 Pod。Ingress 控制器会解析请求路径,并将请求进一步路由到负责处理产品信息的服务。负载均衡器负责将公网流量引入集群。kube-proxy负责将节点上的流量正确地导向目标 Pod。原创 2024-10-15 22:52:42 · 998 阅读 · 0 评论 -
浅谈运行在 Kubernetes 上数据库的性能问题
在 Kubernetes 环境中运行数据库时,存储性能,尤其是 IOPS,决定了数据库的工作效率。高 IOPS 能够帮助数据库快速处理大量的随机读写和小型事务操作,确保应用的稳定性和响应速度。而低 IOPS 的存储可能导致数据库性能下降,最终影响到整个应用的用户体验。通过选择合适的存储类型、优化存储配置,并为高 IO 需求的数据库工作负载分配足够的资源,能够显著提升数据库在 Kubernetes 上的运行效率。无论是在云环境还是本地集群中,IOPS 都是数据库工作负载成功的关键。原创 2024-10-15 22:51:32 · 937 阅读 · 0 评论 -
Kubernetes 集群管理中,自动扩缩工具 Karpenter 和 Cluster Autoscaler 的异同
在 Kubernetes 集群中,自动扩缩容的目的是根据工作负载的变化,自动地调整集群节点的数量,以确保资源能够及时供给,同时也能尽量降低成本。Cluster Autoscaler 作为 Kubernetes 的官方扩缩容工具已经被广泛使用,而 AWS 在此基础上开发了 Karpenter 这一新的扩缩工具,进一步提升了自动扩缩的效率和灵活性。为了理解这两者的差异,我们先来看看它们的核心思想。是 Kubernetes 官方提供的一种节点自动扩缩工具。它的主要职责是基于现有的调度请求来增加或减少节点。原创 2024-10-12 13:49:19 · 1000 阅读 · 0 评论 -
Kubernetes 中的网络概念有哪些关键点?
Kubernetes 中的网络概念相对复杂,但理解这些概念对于成功地部署和管理 Kubernetes 集群至关重要。从 Pod 之间的通信,到 Service 的抽象,再到 Ingress、CNI 插件和网络策略,每个组件都有其特定的用途和作用。通过真实世界的案例,我们可以看到 Kubernetes 如何简化网络管理,使得开发人员能够专注于应用逻辑,而不是底层的网络配置。原创 2024-10-12 13:47:50 · 636 阅读 · 0 评论 -
Kubernetes 集群的目录结构有哪些关键部分?
Kubernetes 集群的目录结构包含了许多重要的部分,每一个目录都在集群的管理和运行中扮演着不同的角色。了解这些目录不仅帮助你更好地理解 Kubernetes 的内部运作机制,也为你在管理和排查集群故障时提供了有效的手段。通过对等目录的深入理解,我们能够更快地找到问题的根源,进而采取相应的修复措施。这些目录中存储的信息,如配置文件、状态文件、日志和证书等,都是 Kubernetes 集群正常运行的重要保障。原创 2024-10-12 13:44:21 · 629 阅读 · 0 评论 -
Kubernetes 集群的目录结构有哪些关键部分?
Kubernetes 集群的目录结构包含了许多重要的部分,每一个目录都在集群的管理和运行中扮演着不同的角色。了解这些目录不仅帮助你更好地理解 Kubernetes 的内部运作机制,也为你在管理和排查集群故障时提供了有效的手段。通过对等目录的深入理解,我们能够更快地找到问题的根源,进而采取相应的修复措施。这些目录中存储的信息,如配置文件、状态文件、日志和证书等,都是 Kubernetes 集群正常运行的重要保障。原创 2024-10-11 12:00:12 · 1002 阅读 · 0 评论 -
如何使用 ArgoCD 安全地管理多个 Kubernetes 集群?
使用 ArgoCD 来管理多个 Kubernetes 集群是一种在持续交付和大规模集群管理场景中非常高效的方法。然而,确保这些集群之间的管理过程是安全的,是我们作为 Kubernetes 管理员必须仔细考虑的问题。在这里,我们将逐步讨论如何使用 ArgoCD 安全地管理多个 Kubernetes 集群,并通过实际案例来帮助大家理解其中的关键细节和实现方式。原创 2024-10-11 11:58:19 · 944 阅读 · 0 评论 -
如何在 Kubernetes 上部署 Spark
在 Kubernetes 中部署 Spark,可以充分利用 Kubernetes 的容器编排和自动扩展能力,让 Spark 集群能够根据工作负载动态调整。这个过程虽然涉及多个复杂的步骤,但 Kubernetes 的工具链(如 Helm、kubectl 等)以及 Spark 提供的 Kubernetes 集成特性,使得整体部署流程相对顺畅。通过真实案例的讲解,我们看到 Kubernetes 和 Spark 的结合为大型电商公司提供了强大的数据处理能力。原创 2024-10-07 22:52:43 · 1493 阅读 · 0 评论 -
Kubernetes proxy 命令与集群资源交互中起的作用
是 Kubernetes 中一个非常有用的工具,它简化了开发者与集群资源的交互,特别是在调试和开发过程中表现尤为出色。通过代理 API 服务器,开发者可以方便地访问集群内部的服务,无需复杂的认证和网络配置,这使得开发人员能够专注于调试和优化应用。在本地开发和测试 Kubernetes 应用时,提供了一种简单有效的方式来快速访问集群资源。它不仅能够帮助开发者验证应用的状态,还可以在开发者不熟悉 Kubernetes 复杂的安全和网络配置时,降低访问 API 的难度。结合真实的案例,我们可以看到。原创 2024-10-07 12:23:14 · 956 阅读 · 0 评论 -
Docker 实战教程之从入门到提高(一)
笔者将自己在云原生开发中的 Kubernetes 工作经验写成了一个系列实战教程:适合 Kubernetes 初学者的一些实战练习 (一)适合 Kubernetes 初学者的一些实战练习 (二)适合 Kubernetes 初学者的一些实战练习 (三)适合 Kubernetes 初学者的一些实战练习 (四)适合 Kubernetes 初学者的一些实战练习 (五)适合 Kubernetes 初学者的一些实战练习 (六)从本文开始,笔者将开启一个新的系列写作,主题是 Ku原创 2022-04-12 11:39:41 · 832 阅读 · 0 评论 -
Docker 实战教程之从入门到提高(三)
本系列的前两篇文章,我们已经学习了 Docker 的安装步骤,通过实际的例子,学习了Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的工作原理:Docker 实战教程之从入门到提高 (一)Docker 实战教程之从入门到提高 (二)本文继续通过实战来学习如何编辑 Docker 镜像以及如何使用 Dockerfile 自制镜像。练习1:Docker 镜像提交命令 commit 的工作原理和使用方法在本地创建一个容器后,可以依据这个容器创建本地镜像,原创 2022-04-13 20:36:50 · 888 阅读 · 0 评论 -
Docker 实战教程之从入门到提高 (四)
本系列的前三篇文章,我们学习了如何在 Ubuntu 操作系统安装 Docker,并且通过实战练习,了解了 Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的工作原理。通过动手对 Nginx Docker 镜像进行修改,达到自定义其首页显示的目的。Docker 实战教程之从入门到提高 (一)Docker 实战教程之从入门到提高 (二)Docker 实战教程之从入门到提高 (三)其中系列的第三篇文章,包含了使用 Dockerfile 基于已有的 Nginx原创 2022-04-14 10:29:23 · 2617 阅读 · 0 评论 -
Docker 实战教程之从入门到提高 (五)
本文首先介绍了如何将包含了某个 Web 应用的 Nginx 镜像通过 dockerfile 制作成一个新的镜像并发布到 Docker Hub 上,然后通过展示将一个 SpringBoot 应用制作成 Docker 镜像的步骤,介绍了 DockerFile 里 VOLUME, ADD, ENV 和 ENTRYPOINT 等命令的用法。原创 2022-04-15 17:31:37 · 854 阅读 · 0 评论 -
如何在 Kubernetes 集群中安装和配置 OpenEBS 持久化块存储?
在 Kubernetes 集群中安装和配置 OpenEBS 是一个非常灵活的持久化存储解决方案,适用于各类应用场景。通过引入不同的存储引擎(如 Jiva、cStor 和 LocalPV),你可以根据业务需求选择合适的存储类型,并结合 Kubernetes 的资源管理机制,实现高可用、动态扩展的存储系统。这个过程展示了如何安装 OpenEBS、配置存储类,并将持久化存储应用于 Kubernetes 集群中的应用工作负载。原创 2024-10-02 11:02:30 · 1219 阅读 · 0 评论 -
Kubernetes 节点何时处于就绪状态?
在 Kubernetes 中,节点(Node)是一个工作负载的基本单元,容器被部署和运行在这些节点上。每个 Kubernetes 节点在加入集群后都需要经过一定的健康检查和状态评估,才能被集群标记为“就绪”状态。这一过程的关键是节点的kubelet组件,它负责管理节点与集群的交互,确保节点能与 Kubernetes 控制平面正常通信,并且所有必需的服务和资源都处于正常状态。要了解节点何时处于就绪状态,需要理解 Kubernetes 中的几个关键概念和节点状态的管理机制。原创 2024-09-30 12:15:41 · 622 阅读 · 0 评论 -
如何利用 Argo Events 来触发 Kubernetes 集群中的工作流程?
Argo Events 是一种事件驱动的工作流自动化工具。它允许 Kubernetes 集群根据外部或内部事件触发工作流程。这些事件可以是来自外部系统的 HTTP 请求、GitHub Webhook、Kafka 消息、S3 对象创建,或者 Kubernetes 内部资源的变化。通过 Argo Events,我们可以定义触发器(Trigger),并将它们与事件源(Event Source)关联,从而在事件发生时执行相应的操作,比如启动一个工作流。原创 2024-09-29 15:31:18 · 1183 阅读 · 0 评论 -
如何在 Kubernetes 上部署和配置开源数据集成平台 Airbyte?
尽管 Helm Chart 默认提供了一些基础配置,但在生产环境中,调整这些配置是非常重要的。可以创建一个文件来自定义这些配置。size: 10Giresources:requests:limits:webapp:service:通过这个配置文件,PostgreSQL 的持久化存储已经启用,并且我们定义了更高的 CPU 和内存资源限制来确保 Airbyte 在高负载下能够稳定运行。对于生产环境,持久化存储是至关重要的,它能够确保即使容器重启,数据库的数据也不会丢失。原创 2024-09-29 14:11:13 · 1713 阅读 · 0 评论