聚集网(jujiwang.com) - 收录免费分类目录信息软文发布网址提交
免费加入

Kubernetes 集群的可观察性:监控、日志记录和故障排除的最佳实践 (kubernetes)

文章编号:11344时间:2024-09-30人气:


Kubernetes

Kubernetes 是一个容器编排平台,用于管理容器化应用程序。随着 Kubernetes 集群变得越来越复杂和分布式,监控、日志记录和故障排除变得至关重要以确保正常运行和高可用性。

监控

监控是收集和分析有关 Kubernetes 集群性能和行为的数据的过程。它可以帮助你检测问题、识别趋势并优化资源利用率。

最佳实践

  • 使用 Kubernetes 内置的监控工具(例如 Metrics Server 和 Node Exporter)
  • 使用外部监控解决方案(例如 Prometheus 和 Grafana)
  • kubernetes
  • 监控以下指标:
    • CPU 和内存使用率
    • 网络流量
    • Pod 和容器状态
    • 事件和错误
  • 设置警报和通知以在出现问题时提醒你

日志记录

日志记录是记录 Kubernetes 集群中发生事件的过程。它可以帮助你调试问题、跟踪应用程序行为并进行审计。

最佳实践

  • 使用 Kubernetes 内置的日志记录工具(例如 journalctl 和 kubectl logs)
  • 使用外部日志记录解决方案(例如 Fluentd 和 Elasticsearch)
  • 收集以下日志:
    • 应用程序日志
    • Kubernetes 日志
    • 容器和 Pod 日志
    • 事件和错误日志
  • 使用日志聚合和分析工具来查找趋势和模式

故障排除

故障排除是识别和解决 Kubernetes 集群中问题的过程。它需要系统的方法和对集群的深入了解。

最佳实践

  • 使用 kubectl 工具获取有关集群和 Pod 的信息
  • 检查容器和 Pod 状态(例如使用 kubectl get pods)
  • 查看日志以查找错误和警告消息
  • 利用 Kubernetes 事件(使用 kubectl get events)来识别问题
  • 使用诊断工具(例如 kubectl describe 和 kubectl top)来获取有关集群的详细信息
  • 利用 Kubernetes 社区资源(例如 Stack Overflow 和 Kubernetes 文档)来寻求帮助

结论

实施 Kubernetes 集群的可观察性最佳实践对于确保正常运行和高可用性至关重要。通过监控、日志记录和故障排除,你可以快速检测和解决问题,从而提高集群的性能和可靠性。


技术分享|AWS EKS 与 APISIX 实现微服务架构的实践指南

本文深入探讨了如何利用AWS Elastic Kubernetes Service(EKS)与APISIX实现高效稳定的微服务架构实践。 微服务架构凭借其灵活性和可扩展性,为企业IT架构提供了更高效的服务管理和部署方式。 Amazon Elastic Kubernetes Service(EKS)作为亚马逊云科技提供的托管Kubernetes服务,简化了集群管理和维护流程,使用户无需处理控制层面或节点的安装、操作和维护。 借助EKS的特性,结合APISIX的高性能API网关功能,构建出一个高效、稳定且易于管理的微服务架构。 APISIX作为一个云原生、动态、实时、高性能的API网关,提供了丰富的功能,如流量管理、监控、安全等,有助于微服务架构的实现。 通过定义路由规则,APISIX能够将客户端请求精准转发至相应服务。 同时,其丰富的插件支持,如身份验证、限速、灰度发布等,进一步强化了APISIX在微服务架构中的作用。 全面了解APISIX的特性,包括API Gateway、APISIX Dashboard和插件等核心功能。 API Gateway负责实时管理所有流量,提供路由、负载均衡、认证授权、限流熔断、数据转换、日志记录监控、缓存等服务。 APISIX Dashboard提供可视化配置界面,简化管理流程,而插件系统则允许用户扩展和定制功能,以满足特定需求。 ETCD作为配置存储和分布式协调系统,确保了APISIX的高可用性和一致性。 在实践中,部署前需选择合适EC2实例部署ETCD集群,避免直接部署于EKS上以确保数据持久性与稳定性。 使用Helm工具简化APISIX在EKS上的部署,并配置其连接ETCD集群。 同时,APISIX Dashboard的部署与使用也需遵循相应步骤,通过配置文件指定ETCD地址,实现可视化管理。 在微服务的路由与管理中,通过Ingress暴露服务,用户可通过APISIX Gateway和Dashboard的Web界面进行路由添加、插件配置等操作。 观测性方面,APISIX提供丰富的插件,如prometheus、kafka-logger等,配合第三方工具实现对服务和路由性能的监控、日志记录等。 安全考虑是实践中的重要环节,涉及TLS设置、秘钥管理等,遵循最佳实践如自动缩放、资源配额和健康检查,确保系统稳定运行和数据安全。 总结,AWS EKS与APISIX结合为微服务架构提供了强大、灵活且易于管理的解决方案。 通过本文提供的实践指南,开发者和运维人员能够实施这一组合方案,实现系统稳定运行、数据安全以及高可用性的保障,为企业技术创新提供坚实基础。

「微服务架构」Medium的微服务架构实践

微服务¹架构的目标是帮助工程团队更快,更安全,更高质量地交付产品。 解耦服务允许团队快速迭代,对系统的其余部分影响最小。

在Medium,我们的技术堆栈始于2012年的单片应用程序。 我们已经构建了几个卫星服务,但我们还没有制定一个系统地采用微服务架构的策略。 随着系统变得越来越复杂并且团队不断发展,我们在2018年初转向了微服务架构。 在这篇文章中,我们希望分享我们有效地做到这一点并避免微服务综合症的经验。

首先,让我们花一点时间来思考微服务架构是什么,不是什么。 “微服务”是那些过载和混乱的软件工程趋势之一。 这就是我们在Medium认为它是什么:

该定义包括三个微服务设计原则:

Three Principles of Modeling Microservices

当我们对微服务进行建模时,我们应该遵守所有三个设计原则。 这是实现微服务架构全部潜力的唯一途径。 错过任何一个都会成为反模式。

没有一个目的,每个微服务最终会做太多事情,成长为多个“单片”服务。 我们不会从微服务架构中获得全部好处,我们也会支付运营成本。

如果没有松散耦合,对一个服务的更改会影响其他服务,因此我们无法快速安全地发布更改,这是微服务架构的核心优势。 更重要的是,紧密耦合引起的问题可能是灾难性的,例如数据不一致甚至数据丢失。

如果没有高凝聚力,我们将最终得到一个分布式单片系统 - 一组混乱的服务,必须同时进行更改和部署才能构建单一功能。 由于多个服务协调的复杂性和成本(有时跨多个团队),分布式单片系统通常比集中式单片系统差得多。

与此同时,了解 微服务不是什么 很重要:

在Medium,我们总是在做出重大产品或工程决策时会问“为什么现在?”这个问题。 “为什么?”是一个显而易见的问题,但它假设我们拥有无限的人,时间和资源,这是一个危险的假设。 当你想到“为什么现在?”时,你突然有了更多的限制 - 对当前工作的影响,机会成本,分心的开销等等。 这个问题有助于我们更好地优先考虑。

我们现在需要采用微服务的原因是我们的单片应用程序已经成为多个方面的瓶颈。

首先,最紧迫和最重要的瓶颈是其性能。

某些计算量很大且I / O很重的任务不适合.我们一直在逐步改进整体应用程序,但事实证明它是无效的。 它的低劣性能使我们无法提供更好的产品而不会使已经非常慢的应用程序变慢。

其次,整体应用程序的一个重要且有点紧迫的瓶颈是它会减慢产品开发速度。

由于所有工程师都在单个应用程序中构建功能,因此它们通常紧密耦合。 我们无法灵活地改变系统的一部分,因为它也可能影响其他部分。 我们也害怕做出重大改变,因为影响太大,有时难以预测。 整个应用程序作为一个整体进行部署,因此如果由于一次错误提交导致部署停滞,那么所有其他更改(即使它们完全正常工作)也无法完成。 相比之下,微服务架构允许团队更快地发货,学习和迭代。 他们可以专注于他们正在构建的功能,这些功能与复杂系统的其余部分分离。 更改可以更快地进入生产。 他们可以灵活地安全地尝试重大变革。

在我们新的微服务架构中,更改会在一小时内完成生产,工程师不必担心它会如何影响系统的其他部分。 该团队还 探索 了在开发中安全使用生产数据的方法²多年来一直是白日梦。 随着我们的工程团队的发展,所有这些都非常重要。

第三,单一应用程序使得难以为特定任务扩展系统或隔离不同类型任务的资源问题。

使用单一的单一应用程序,我们必须扩展和缩小整个系统,以满足更多资源需求的任务,即使这意味着系统过度配置用于其他更简单的任务。 为了缓解这些问题,我们对不同类型的请求进行分片,以分离进程。 它们在一定程度上起作用,但不会扩展,因为这些微单一版本的单片服务是紧密耦合的。

最后但同样重要的是,一个重要且即将成为紧迫的瓶颈是它阻止我们尝试新技术。 微服务架构的一个主要优点是每个服务都可以使用不同的技术堆栈构建,并与不同的技术集成。 这使我们能够选择最适合工作的工具,更重要的是,我们可以快速安全地完成工作。

采用微服务架构并非易事。 它可能会出错,实际上会损害工程生产力。 在本节中,我们将分享七个在采用早期阶段帮助我们的策略:

有人可能会认为采用新的服务器架构意味着产品开发的长时间停顿以及对所有内容的大量重写。 这是错误的做法。 我们永远不应该为了建立新的服务而建立新的服务。 每次我们建立新服务或采用新技术时,都必须具有明确的产品价值和/或工程价值。

产品价值应以我们可以为用户提供的利益为代表。 与在单片应用程序中构建值相比,需要一项新服务来提供值或使其更快地交付值。 工程价值应该使工程团队更好,更快。

如果构建新服务没有产品价值或工程价值,我们将其留在单一的应用程序中。 如果十年内Medium仍然有一个支持某些表面的单片应用程序,那就完全没了问题。 从单一应用程序开始实际上有助于我们战略性地对微服务进行建模。

建立具有明确价值的新服务

有人可能会认为采用新的服务器架构意味着产品开发的长时间停顿以及对所有内容的大量重写。 这是错误的做法。 我们永远不应该为了建立新的服务而建立新的服务。 每次我们建立新服务或采用新技术时,都必须具有明确的产品价值和/或工程价值。

产品价值应以我们可以为用户提供的利益为代表。 与在单片应用程序中构建值相比,需要一项新服务来提供值或使其更快地交付值。 工程价值应该使工程团队更好,更快。

如果构建新服务没有产品价值或工程价值,我们将其留在单一的应用程序中。 如果十年内Medium仍然有一个支持某些表面的单片应用程序,那就完全没了问题。 从单一应用程序开始实际上有助于我们战略性地对微服务进行建模。

单片持久存储被认为是有害的

建模微服务的很大一部分是对其持久数据存储(例如,数据库)进行建模。 跨服务共享持久数据存储通常似乎是将微服务集成在一起的最简单方法,然而,它实际上是有害的,我们应该不惜一切代价避免它。 这就是原因。

首先,持久数据存储是关于实现细节的。 跨服务共享数据存储会将一个服务的实现细节暴露给整个系统。 如果该服务更改了数据的格式,或者添加了缓存层,或者切换到不同类型的数据库,则还必须相应地更改许多其他服务。 这违反了松散耦合的原则。

其次,持久数据存储不是服务行为,即如何修改,解释和使用数据 。 如果我们跨服务共享数据存储,则意味着其他服务也必须复制服务行为。 这违反了高内聚的原则- 给定域中的行为泄露给多个服务。 如果我们修改一个行为,我们将不得不一起修改所有这些服务。

在微服务架构中,只有一个服务应该负责特定类型的数据。 所有其他服务应该通过负责服务的API请求数据,或者保留数据的 只读非规范(可能具体化)副本 。

这可能听起来很抽象,所以这是一个具体的例子。 假设我们正在构建一个新的推荐服务,它需要来自规范帖子表的一些数据,目前在AWS DynamoDB中。 我们可以通过两种方式之一为新推荐服务提供发布数据。

在单片存储模型中,推荐服务可以直接访问单片应用程序所执行的相同持久存储。这是一个坏主意,因为:

缓存可能很棘手。 如果推荐服务与单一应用程序共享相同的缓存,我们也必须在推荐服务中复制缓存实现细节;如果推荐服务使用自己的缓存,当单片应用更新帖子数据时,我们将不知道何时使其缓存无效。

如果单片应用程序决定更改为使用RDS而不是DynamoDB来存储帖子数据,我们将不得不重新实现推荐服务中的逻辑以及访问帖子数据的所有其他服务。

单片应用程序具有解释帖子数据的复杂逻辑 ,例如,如何确定帖子是否应该对给定用户不可见。 我们必须在推荐服务中重新实现这些逻辑。 一旦整体应用程序更改或添加新逻辑,我们也需要在任何地方进行相同的更改。

即使推荐服务是自己的数据访问模式的错误选项,推荐服务仍然停留在DynamoDB上。

在解耦存储模型中,推荐服务不能直接访问发布数据,也不能直接访问任何其他新服务。 发布数据的实​​现细节仅保留在一个服务中。 有不同的方法来实现这一目标。

Option A理想情况下,应该有一个拥有帖子数据的Post服务,其他服务只能通过Post服务的API访问邮政数据。 但是,为所有核心数据模型构建新服务可能是一项昂贵的前期投资。

当人员配置有限时,还有一些更实用的方法。 根据数据访问模式,它们实际上可能是更好的方式。

在 选项B 中,单一应用程序可让推荐服务知道何时更新相关的帖子数据。 通常,这不必立即发生,因此我们可以将其卸载到排队系统。

在 选项C 中,ETL管道生成推荐服务的发布数据的只读副本,以及可能对推荐有用的其他数据。 在这两个选项中,推荐服务完全拥有其数据,因此它可以灵活地缓存数据或使用最适合的数据库技术。

解耦“建立服务”和“运行服务”

如果构建微服务很难,那么运行服务往往更难。 当运行服务与构建每个服务相结合时,它会减慢工程团队的速度,团队必须不断重新发明这样做。 我们希望让每项服务都专注于自己的工作而不用担心如何运行服务的复杂问题,包括网络,通信协议,部署,可观察性等。 服务管理应该与每个服务的实现完全分离。

由于最近在 容器化,容器编排,服务网格,应用程序性能监 控等方面的技术进步,“运行服务”的解耦变得比以往更容易实现。

网络。 网络(例如,服务发现,路由,负载平衡,流量路由等)是运行服务的关键部分。 传统方法是为每种平台/语言提供库。 它工作但不理想,因为应用程序仍然需要非常繁琐的工作来集成和维护库。 通常,应用程序仍然需要单独实现某些逻辑。 现代解决方案是在Service Mesh中运行服务。 在Medium,我们使用 Istio和Envoy作为边车代理 。 构建服务的应用工程师根本不需要担心网络问题。

通信协议 。 无论您选择哪种技术堆栈或语言来构建微服务,从一个高效,类型化,跨平台且需要最少开发开销的成熟RPC解决方案开始是非常重要的。 支持向后兼容性的RPC解决方案也使部署服务更加安全,即使它们之间存在依赖关系。 在Medium,我们选择了gRPC。

一种常见的替代方案是基于HTTP的REST + JSON,它长期以来一直是服务器通信的福音解决方案。 但是,尽管该堆栈非常适合浏览器与服务器通信,但它对于服务器到服务器的 通信效率很低 ,尤其是当我们需要发送大量请求时。 如果没有自动生成的 存根和样板代码 ,我们将不得不手动实现服务器/客户端代码。 可靠的RPC实现不仅仅包装网络客户端。 另外,REST是“自以为是”,但总是让每个人都对每个细节都达成一致很困难,例如,这个调用真的是REST,还是只是一个RPC?这是一种资源还是一种操作?等等

部署。 拥有一致的方法来构建,测试,打包,部署和管理服务非常重要。 所有Medium的微服务都在容器中运行。 目前,我们的编排系统是AWS ECS和Kubernetes的混合体,但仅限于Kubernetes。

我们构建了自己的系统来 构建,测试,打包和部署 服务,称为BBFD。 它在一致地跨服务工作和为个人服务提供采用不同技术堆栈的灵活性之间取得平衡。 它的工作方式是让每个服务提供基本信息,例如,要监听的端口,构建/测试/启动服务的命令等,BBFD将负责其余的工作。

彻底和一致的可观察性

可观察性包括允许我们了解系统如何工作的过程,约定和工具,以及在不工作时对问题进行分类。 可观察性包括日志记录,性能跟踪,指标,仪表板,警报,并且对于微服务架构的成功至关重要。

当我们从单个服务迁移到具有许多服务的分布式系统时,可能会发生两件事:

我们失去了可观察性,因为它变得更难或更容易被忽视。

不同的团队重新发明了轮子,我们最终得到了零碎的可观察性,这实际上是低可观察性 ,因为很难使用碎片数据连接点或分类任何问题。

从一开始就具有良好且一致的可观察性非常重要,因此我们的DevOps团队提出了一致的可观察性策略,并构建了支持实现这一目标的工具。 每项服务都会自动获取详细的DataDog仪表板,警报和日志搜索,这些服务在所有服务中也是一致的。 我们还大量使用LightStep来了解系统的性能。

并非每一项新服务都需要从零开始构建

在微服务架构中,每个服务都做一件事并且做得非常好。 请注意,它与如何构建服务无关。 如果您从单一服务迁移,请记住,如果您可以从单片应用程序中剥离微服务并不总是必须从头开始构建。

在这里,我们采取务实的态度。 我们是否应该从头开始构建服务取决于两个因素:(1)适合该任务的程度如何;(2)在不同的技术堆栈中重新实现的成本是多少。

如果是一个很好的技术选项并且现有的实现很好,我们将代码从单片应用程序中删除,并用它创建一个微服务。 即使采用相同的实现,我们仍将获得微服务架构的所有好处。

我们的单片单片应用程序的架构使我们可以相对轻松地使用现有实现构建单独的服务。 我们将在本文稍后讨论如何正确构建单片。

尊重失败,因为他们会发生

在分布式环境中,更多的东西可能会失败,而且它们会失败。 如果处理不当,任务关键型服务的失败可能是灾难性的。 我们应该始终考虑如何测试故障并优雅地处理故障。

从第一天起避免使用微服务综合症

微服务不是灵丹妙药 - 它解决了一些问题,但创造了一些其他问题,我们将其称为“微服务综合症”。 如果我们从第一天开始就不去考虑它们,那么事情会变得很快,如果我们以后再照顾它们会花费更多。 以下是一些常见症状。

随着最近的技术创新,采用微服务架构要容易得多。这是否意味着我们都应该停止构建单一服务?

虽然新技术支持得更好,但微服务架构仍然存在高度复杂性和复杂性。 对于小型团队来说,单一的应用程序通常仍然是更好的选择。 但是,请花些时间来构建单片应用程序,以便以后在系统和团队成长时更容易迁移到微服务架构。

在Medium,我们在早期的单片应用程序中做出了一些很好的架构决策。

我们的单片应用程序由组件高度模块化,即使它已经发展成为一个非常复杂的应用程序,包括Web服务器,后端服务和离线事件处理器。 脱机事件处理器单独运行,但使用完全相同的代码。 这使得将一大块业务逻辑剥离到单独的服务相对容易,只要新服务提供与原始实现相同(高级)的接口即可。

我们的整体应用程序在较低级别封装了数据存储详细信息。 每种数据类型(例如,数据库表)具有两层实现:数据层和服务层。

这有助于我们采用微服务架构,因为一种类型数据的实现细节完全隐藏在代码库的其余部分。 创建新服务来处理某些类型的数据相对容易且安全。

单片应用程序还可以帮助我们对微服务进行建模,并使我们能够灵活地专注于系统中最重要的部分,而不是从头开始为所有微服务建模。

单片应用程序为我们服务了好几年,但它开始减慢我们从运送伟大的项目和快速迭代。 我们开始系统地和战略性地采用微服务架构。 我们仍处于这一旅程的早期阶段,但我们已经看到了它的优势和潜力 - 它大大提高了开发效率,使我们能够大胆地思考并实现大量的产品改进,并解锁了工程团队以安全地测试新技术。

加入Medium的工程团队是一个激动人心的时刻。 如果这听起来很有趣,请查看我们的工作页面 - 在Medium工作。 如果您对微服务架构特别感兴趣,您可能需要先了解这两个开头:高级全栈工程师和高级平台工程师。

原文 :讨论: 请加入知识星球【首席架构师圈】

如何发现Kubernetes中服务和工作负载的异常

大家好,我是来自阿里云的李煌东,今天由我为大家分享Kubernetes监控公开课的第二节内容:如何发现Kubernetes中服务和工作负载的异常。

本次分享由三个部分组成:

一、Kubernetes异常定位存在痛点;

二、针对这些痛点,Kubernetes监控如何更快、更准、更全的发现异常;

三、网络性能监控、中间件监控等典型案例解析。

Kubernetes异常定位存在痛点

当下的互联网架构中,越来越多的公司采用微服务+Kubernetes这样的架构,这样的架构有如下特点:

首先应用层基于微服务,微服务由解耦开的几个服务相互调用构成,服务一般职责分明、边界明确,造成的结果是一个简单的产品也有几十、甚至上百个微服务,相互之间的依赖、调用是非常复杂的,这给定位问题带来比较大的成本。 同时,每个服务的owner可能来自不同团队,不同的开发,可能使用不同的语言,对我们监控的影响是对每一种语言都需要进行监控工具的接入,投资回报率低。 还有一个特点是多协议,几乎每种中间件(Redis、MySQL、Kafka)都有他们独特的协议,怎么要做到快速对这些协议进行观测,是不小的挑战。

虽然Kubernetes和容器对上层应用屏蔽了底层的复杂度,但是带来的两个结果是:基础设施层越来越高;另一个是上层应用和基础设施之间信息变得越来越复杂了。 举个例子,用户反馈网站访问很慢,管理员查看访问日志、服务状态、资源水位发现都没问题,这时候不知道问题出现在哪里,虽然怀疑基础设施有问题,但无法定界的情况下只能一个一个排查效率低,问题的根源就是上层应用和基础设施之间缺少上下问题关联,无法做到端到端串联。

最后一个痛点是数据散、工具多、信息没打通。 举个例子,假设我们收到一个告警,用grafana去查看指标,指标只能描述的比较粗略,我们得去看下日志,这时候我们要去SLS日志服务看下有没有对应的日志,日志也没问题,这时候我们需要登录到机器上去看,然而登录到容器里面可能又因为重启导致日志没有了。 查了一波之后,可能我们会觉得可能问题不是出现在这个应用,于是我们又去看链路追踪是不是下游有问题。 总而言之,工具用了一大堆,浏览器开了十几个窗口,效率低、体验差。

这三个痛点分别归纳为成本、效率、体验三个方面。 针对这些痛点,接下来我们一起看下Kubernetes监控的数据体系,看下怎么来更好的解决成本、效率、体验三大问题。

Kubernetes监控如何发现异常

下图金子塔自顶向下表示信息的密度或者详细程度,越往下面信息越详细。 我们从底部开始讲,Trace是我们通过eBPF技术以无入侵、多协议、多语言的方式采集应用层协议数据,如HTTP、MySQL、Redis,协议数据会进一步解析成容易理解的请求详情、响应详情、各个阶段的耗时信息。

再上一层是指标,指标主要由黄金指标、网络、Kubernetes体系中的指标。 其中黄金指标和网络指标是基于eBPF采集的,所以同样他们是没有入侵的,支持各种协议的,有了黄金指标,我们就能知道服务整体上是否有异常、是否有慢、是否影响用户;网络指标主要是对socket的支持,如丢包率、重传率、RTT等,主要用来监控网络是否正常的指标。 Kubernetes体系中的指标是指原来Kubernetes监控体系中的cAdvisor/MetricServer/NodeExporter/NPD这些指标。

再上一层是事件,事件直接明确地告诉我们发生了什么,可能我们遇到最多的是Pod重启、拉镜像失败等。 我们对Kubernetes事件进行了持久化存储,并保存一段时间,这样方便定位问题。 然后,我们的巡检和健康检查也是支持以事件的形式报出来。

最顶层是告警,告警是监控系统的最后一环,当我们发现某些特定异常可能对业务有损后,我们就需要对指标、事件进行告警配置。 告警目前支持PromQL,智能告警支持对历史数据进行智能算法检测,从而发现潜在的异常事件。 告警的配置支持动态阈值,通过调节灵敏度的方式来配置告警,从而避免写死阈值。 有了Trace、指标、事件、告警之后,我们用拓扑图将这些数据和Kubernetes实体都关联起来,每个节点对应Kubernetes实体中的服务和工作负载,服务之间调用用线表示。 有了拓扑图,我们就像拿到一张地图,能快速识别拓扑图中的异常,并对异常进行进一步的分析,对上下游、依赖、影响面进行分析,从而对系统有了更全面的掌控。

最佳实践&场景分析

接下来我们讲下发现Kubernetes中服务和工作负载的异常的最佳实践。

首先还是先有指标,指标能反应服务的监控状态,我们应尽可能地收集各种指标,并且越全越好,不限于黄金指标、USE指标、Kubernetes原生指标等;然后,指标是宏观数据,需要做根因分析我们得有Trace数据,多语言、多协议的情况下要考虑采集这些Trace的成本,同样尽可能地支持多一点协议、多一点语言;最后,用一张拓扑将指标、Trace、事件汇总起来、串联起来,形成一张拓扑图,用来做架构感知分析、上下游分析。

通过这三种方法的分析,服务和工作负载的异常通常暴露无遗了,但我们不应该就此停止前进的脚步,加入这个异常下次再来,那么我们这些工作得重来一遍,最好的办法是针对这类异常配置对应的告警,自动化地管理起来。

我们用几个具体的场景来详细介绍:

(一)网络性能监控

网络性能监控以重传为例,重传的意思是说发送方认为发生了丢包现象,就重发这些数据包。以图中的传输过程为例:

发送方发送编号为1的包,接收方接受了,返回ACK2

发送方发送编号为2的包,接收方返回ACK2

发送方发送编号为3、4、5的包,接收方都返回ACK2

直到发送方收到3次同样的ACK,就会触发重传机制,重传会导致延迟升高

代码和日志是观察不出来的,这种情形下最终很难找到根因。 为了能快速定位这个问题,我们需要一组网络性能指标来提供定位依据,包含以下指标,P50、P95、P99指标来表示延时,然后我们需要流量、重传、RTT、丢包这些指标来表征网络情况。

以某个服务RT高为例:首先我们看到拓扑的边是红的,红的判断逻辑是根据延时、错误来判断的,当发现这个红边的时候,点击上面的边,就可以看对应的黄金指标了。

点击底部最左边这个按钮,可以查看当前服务的网络数据列表,我们可以按平均响应时间、重传、RTT排下序,可以看到第一个服务调用延时比较高,快到一秒的返回时间,同时也看到重传比较高,相比于其他服务高很多。 这里其实是通过工具去注入了重传高这么一个故障,看起来更明显一些。 这样分析下来我们就知道可能是网络的问题,就可以进一步排查了。 有经验的开发一般会拿着网络指标、服务名、ip、域名这些信息去找网络的同事排查,而不是只是告诉对方说我服务很慢,这样对方知道的信息太少,就不会积极去排查,因为别人也不知道从哪里开始,当我们提供了相关数据,对方就有了参考,会顺藤摸瓜进一步推进。

(二)DNS解析异常

第二个场景是DNS解析异常。 DNS通常是协议通信的第一步,比如HTTP请求,第一步就是先拿到IP,也就是我们平常说的服务发现过程,第一步出现问题,整个调用就直接失败了,这就是所谓关键路径不能掉链子。 在Kubernetes集群中所有的DNS都走CoreDNS的解析,所以CoreDNS上容易出现瓶颈,一旦出现问题,影响面也是非常大的,可能整个集群都不可用了。 举个两个月前发生的鲜活的例子,著名的CDN公司Akamai就发生了一个DNS故障,导致众多网站像Airbnb网站无法访问,事故持续了长达一个小时。

在Kubernetes集群中DNS解析比较核心的几个场景有三个:

调用外部API网关

调用云服务,云服务一般是公网的

调用外部中间件

这里对CoreDNS常见的问题进行了归纳,大家可以参考下,排查下自己的集群上有没有类似问题:

配置问题(ndots问题),ndots是个数字,表示域名中点的个数要是小于ndots,那么搜索就优先走search列表中的域去查找,这样的话会产生多次查询,对性能的影响还是挺大的。

由于Kubernetes所有的域名解析都走CoreDNS,非常容易成为性能瓶颈,有人统计过大概qps在5000~8000的时候就要关注性能问题了。 尤其是依赖外部Redis、MySQL这种访问量比较大的。

低版本的CoreDNS有稳定性问题,这个也是需要关注的点。

有些语言,想PHP对连接池支持的不是很好,导致每次都要去解析DNS,创建连接,这个现象也是比较常见的。

接下来,我们看下KubernetesCoreDNS中可能会发生问题的地方,首先应用和CoreDNS之间的网络可能有问题;第二是CoreDNS本身问题,比如CoreDNS返回SERVFAIL、REFUSE这些错误码,甚至因为Corefile配置错了,导致返回值是错的;第三点是跟外部DNS通信的时候,发生网络中断、性能问题;最后一个是外部DNS不可用。

针对这些问题点总结出以下步骤来盘查:

第一、从客户端侧,先看下请求内容和返回码,如果是返回是错误码说明是服务端有问题。 如果是慢解析,可以看下时间瀑布流看下时间耗费在哪个阶段。

第二、看网络是否正常,看流量、重传、丢包、RTT这几个指标就够了。

第三、查看服务端,看下流量、错误、延时、饱和度这几个指标,再看下CPU、内存、磁盘等这几个资源指标,也能定位出是否有问题。

第四、看下外部DNS,同理我们可以通过请求Trace、返回码、网路流量、重传等指标来定位。

接下来我们看下拓扑。 首先看到红色的线表示有异常的DNS解析调用,点击这个我们能看到调用的黄金指标;点击查看列表,弹出详情页面,可查看请求的详情,是请求这个域名,请求过程中经历发送、等待、下载三个过程,看起来指标正常,接下来我们点击看响应,发现响应是域名不存在。 那么这时候我们可以进一步看下外部DNS是否有问题,步骤也是一样的,后面我会在demo中展示,所以这里就不展开先了。

(三)全链路压测

第三个典型场景是全链路压测,对于大促这种场景峰值是平常的数倍,怎么保障大促的稳定,需要通过一系列的压测来验证系统能力、系统稳定性评估、做容量规划、识别系统瓶颈。 一般会有这么几个步骤:先预热下,这时候验证下链路是否正常的,逐步加流量直到峰值,然后开始摸高,也就是看下能支持的最大TPS是多少,接着再加流量,这时候主要就是看服务是否能正常限流了,因为已经找过最大TPS了,再加大力量就是破坏性流量了。 那么在这个过程中,我们需要关注哪些点呢?

首先针对我们多语言、多协议的微服务架构,比如这里的java、Golang、Python应用,这里有RPC、MySQL、Redis、Kafka应用层协议,我们得有各种语言、各种协议的黄金指标,用来验证系统能力;针对系统的瓶颈、容量规划这块,我们需要use指标,去看各种流量级别情况下资源的饱和度,来确定是不是要扩容,每增加一次流量,对应看下use指标,对应调整容量,逐步优化;对于复杂架构,需要有一张全局的大图来帮助梳理上下游依赖、全链路架构,确定爆炸报警,比如这里的CheckoutService就是个关键的服务,这个点如果出现问题,影响面会很大。

第一、各种语言、协议通信的黄金指标,通过查看列表进一步看调用的详情

第二、点击节点详情下钻查看cpu、memory等use资源指标

第三、整个拓扑图是能反映整个架构的形态的,有了全局的架构视角,就能识别哪个服务容易成为瓶颈、爆炸半径有多大,是否需要做高可用保障。

(四)访问外部MySQL

第四个场景是访问外部MySQL,先看下访问外部MySQL有哪些常见的问题:

首先是慢查询,慢查询提现为延时指标高,这时候去看trace里面详情请求是啥,查询的是哪张表,哪些字段,进而看下是不是查询量太大了、表太大了、还是说没有建索引等。

查询语句过大,我们知道查询语句太大会导致传输耗时高,网络稍一抖动就造成失败重试,还会引发带宽占用的问题。 一般都是一些批量的更新、插入导致的,出现这种问题延时指标会飙高,这时候我们可以选择RT较高的一些Trace来看,看下语句怎么写的、看下查询语句的长度是不是太大了。

错误码返回,比如表不存在这种,那么解析出其中的错误码就很有帮助了,再进一步看里面的详情,去看语句,就比较容易定位出根因了。

网络问题,这个点也讲过比较多了,一般配合着延时指标加上RTT、重传、丢包来确定网络是否有问题。

接下来看下拓扑图,中间框住的应用依赖了外部的MySQL服务,点击拓扑线可以进一步看黄金指标,点击查看列表可以进一步看请求的详情、响应等。 同时我们也可以看下网络性能指标,这个table是将当前拓扑中的网络数据根据来源和目标进行归类,可以分别查看请求数、错误数、平均响应时间、socket重传、socketrtt,点击上面箭头可以对应地排序。

(五)多租户架构

第五个典型案例是多租户架构。 多租户指的是不同的租户、工作负载、不同团队,公用一个集群,通常一个租户对应一个命名空间,同时保证资源的逻辑隔离或者物理隔离,互不影响、互不干扰。 常见的场景有:企业内部用户,一个团队对应一个租户,同一个命名空间内网络不受限制,用网络策略去控制不同命名空间之间的网络流量。 第二种是SaaS提供商多租户架构,每个用户对应一个命名空间,同时租户和平台分别处于不同的命名空间。 虽然Kubernetes的命名空间特性给多租户架构带来了便利,但也给可观测带来两个挑战:第一命名空间非常多,查找信息变得很繁琐,增加了管理成本、理解成本。 第二是租户之间有流量隔离的要求,在命名空间比较多的情况下往往无法做到准确、全面的发现异常流量。 第三是对多协议、多语言的Trace支持。 曾经遇到过一个客户,一个集群里面有400多个命名空间,管理起来非常痛苦,而且应用是多协议、多语言的,要支持Trace,得一个个改造。

这是我们产品的集群首页,Kubernetes的实体以命名空间的方式划分,支持查询来定位到我想看的集群。 气泡图上展示对应命名空间上的实体数,以及有异常的实体数,比如框子里3个命名空间里存在有异常的pod,点进去可以进一步看异常。 首页下面是按黄金指标排序的性能概览,也就是场景的Top功能,这样能快速查看哪几个命名空间是有异常的。

在拓扑图中,如果命名空间比较多,可以通过过滤功能查看想看的命名空间,或者通过搜索方式快速定位到想看的命名空间。 由于节点是以命名空间分组的,能通过命名空间之间的线来查看命名空间的流量,这样就能方便地查看有来自哪些命名空间的流量、是否有异常流量等等。

我们将上述场景介绍总结如下:

网络监控:如何能分析网络导致的服务的错慢、中断,如何分析网络问题带来的影响

服务监控:如何通过黄金指标确定服务是否健康?如何通过支持多协议的Trace查看详情?

中间件、基础设施监控:如何用黄金指标、trace分析中间件、基础设施的异常,如何快速定界是网络问题,还是自身问题,还是下游服务问题

架构感知:如何通过拓扑感知整个架构,梳理上下游、内部外部依赖,进而能掌控全局?如何通过拓扑保障架构有足够的观测性、稳定性保障,如何通过拓扑分析、发现系统中的瓶颈、爆炸半径。

从这几个场景中又进一步列举常见的case:网络、服务的可用性检测,健康检查;中间件架构升级可观测性保障;新业务上线验证;服务性能优化;中间件性能监控;方案选型;全链路压测等。

产品价值

经过以上内容介绍,我们将Kubernetes的产品价值总结如下:

通过多协议、多语言、无入侵的方式采集服务的指标和Trace数据,最大限度地减少接入的成本,同时提供覆盖度全面的指标和Trace;

有了这些指标和Trace之后我们就能,对服务和工作负载进行科学的分析、下钻;

将这些指标、Trace关联起来串成一张拓扑图,能在一张大图上进行架构感知、上下游分析、上下文关联等,充分得理解架构,评估潜在的性能瓶颈等,方便做进一步的架构优化;

提供配置简单的告警配置方法,将经验知识沉淀到告警中,做到主动发现。

K8s技术全景:架构、应用与优化

Kubernetes(K8s)作为关键的容器编排技术,涵盖了架构、应用部署与优化的全面探讨。 从其开源历程到现在的广泛应用,K8s凭借其设计哲学和社区支持,已经成为云原生应用和微服务架构的基石。 本文将深入解析K8s的核心概念,包括其架构设计、容器编排机制、网络与存储管理,以及安全、高可用性和监控系统,以展现其强大而灵活的管理能力。 K8s的核心是容器编排,它通过Pod管理应用程序的生命周期,控制器如Deployment、StatefulSet和Job确保服务的稳定和可用。 网络模型采用扁平化设计,允许Pod间直接通信,同时支持复杂的网络策略。 在存储方面,K8s提供了Volume和PV/PVC/StorageClass机制,以适应不同的存储需求。 为了保障安全,K8s实施了认证、授权和审计机制,确保集群和数据的合规性。 高可用性和灾难恢复是K8s的重要特性,通过集群配置的高可用性和备份策略,确保在面临各种问题时仍能保持服务运行。 监控和日志管理则是确保集群健康和性能的关键,通过集成的工具和策略,管理员能实时监控资源和诊断问题。 总而言之,Kubernetes凭借其全面而深入的架构设计和管理功能,为现代应用提供了强大且可扩展的容器化解决方案。 无论是在单个节点还是大规模集群中,K8s都扮演着不可或缺的角色,是企业级应用部署和运维的首选平台。

OpenKruise x iLogtail:管理可观测数据采集Sidecar容器最佳实践

在Kubernetes集群中,Sidecar容器被广泛用于采集业务容器的可观测性数据。 然而,这种部署模式在管理和维护上存在高成本和复杂性问题。 本文分析了Sidecar采集容器管理的难点,并通过OpenKruise提供的能力逐一解决,以iLogtail为例,给出最佳实践。 Sidecar部署方式在可观测系统中有着重要应用。 Kubernetes官方文档中介绍的三种数据采集形式各有优劣。 Sidecar方式通过在每个Pod内部署采集agent,虽然资源占用较高,但提供了稳定性、灵活性和多租户隔离等优势。 建议在Job类任务采集或作为PaaS平台服务多个业务方的集群中使用此方式。 然而,使用K8s Sidecar模式存在挑战,包括修改业务部署声明、确保采集agent的生命周期与业务容器同步等。 本文以iLogtail为例,提供了一种通用的Sidecar采集部署配置。 iLogtail是阿里云开源的高性能轻量级可观测性数据采集Agent,支持多种数据类型的采集。 配置中包括volumeMounts部分用于声明共享存储,以及args部分控制Sidecar和业务容器间进程的启动及退出顺序。 此配置展示了Sidecar模式的弊端,如资源占用、管理复杂性等。 OpenKruise管理Sidecar容器的利器包括SidecarSet、Container Launch Priority和Job Sidecar Terminator。 其中,SidecarSet负责注入和升级Sidecar容器,Container Launch Priority控制容器启动顺序,而Job Sidecar Terminator在业务容器完成后通知Sidecar容器退出。 在iLogtail的Sidecar部署实践中,通过使用OpenKruise的上述能力简化了管理流程。 社区中已有iLogtail部署案例。 使用OpenKruise管理iLogtail Sidecar容器,能够降低管理难度,解耦Sidecar和业务容器配置,确保容器间的启动顺序,并支持不重建Pod更新Sidecar容器。 通过配置和实践,Sidecar容器的管理得到了简化,确保了iLogtail采集数据的完整性和可靠性。 此外,独立升级Sidecar容器也得以实现,进一步提高了灵活性和安全性。 使用OpenKruise管理iLogtail日志采集,能够大幅降低管理难度,提高系统的稳定性和可靠性。 然而,关于Sidecar容器资源分配、日志路径规划和业务Pod中Sidecar配置的差异化等问题仍需进一步探索。 开发者社区的协作和贡献对于推动Kubernetes生态的发展至关重要。



相关标签: Kubernetes集群的可观察性监控kubernetes日志记录和故障排除的最佳实践

上一篇:Kubernetes集群自动化部署流水线编排和持续

下一篇:Kubernetes集群无服务器化充分利用无服务器

内容声明:

1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/00ee18392ebebd913e19.html,复制请保留版权链接!


温馨小提示:在您的网站做上本站友情链接,访问一次即可自动收录并自动排在本站第一位!
随机文章
深入了解 Squirrelsql 的高级功能,成为数据库处理大师 (深入了解是什么)

深入了解 Squirrelsql 的高级功能,成为数据库处理大师 (深入了解是什么)

Squirrelsql是一款功能强大的数据库管理工具,可用于管理多种类型的数据库,包括MySQL、PostgreSQL、Oracle和SQLServer,除了基本功能外,Squirrelsql还提供了许多高级功能,可帮助您提高工作效率并简化数据库管理任务,高级SQL编辑Squirrelsql的高级SQL编辑器提供了多种功能,可以帮助您...。

本站公告 2024-09-25 05:26:00

单击 确定。(单击确定终止)

单击 确定。(单击确定终止)

单击确定将终止操作,请慎重考虑是否单击确定,单击确定后,操作将无法撤销,如果您不确定是否单击确定,请咨询专业人士,单击确定前需要考虑的事项操作是否必要操作的潜在后果其他可用的选项如果单击确定,您是否有准备承受后果单击确定后会发生什么单击确定后,操作将立即开始,操作完成后,您将收到一条确认消息,如何撤消单击确定一旦单击确定,操作将无法撤...。

技术教程 2024-09-24 20:29:34

Message Digest 安全性:理解哈希碰撞和伪造风险 (message)

Message Digest 安全性:理解哈希碰撞和伪造风险 (message)

消息摘要,也称为哈希函数,是密码学中重要的工具,用于生成消息的固定大小的数字摘要,这些摘要用于验证消息的完整性,确保它们在传输过程中未被修改,哈希函数的特性理想的哈希函数应具有以下特性,抗碰撞性,对于任何给定的消息,找到另一个具有相同哈希值的消息几乎是不可能的,第二原像抗性,给定一个哈希值,找到具有该哈希值的消息几乎是不可能的,抗预像...。

技术教程 2024-09-24 16:46:13

妻子出走后:一个被遗弃丈夫的自述 (妻子出走后的法律责任)

妻子出走后:一个被遗弃丈夫的自述 (妻子出走后的法律责任)

作者,一位被遗弃的丈夫前言,婚姻是一场神圣的契约,承诺着爱、忠诚和责任,当这份契约破裂时,带来的往往是无情的痛苦和伤害,我是一个被遗弃的丈夫,经历了妻子出走后的煎熬和绝望,我写下自述,希望它能帮助其他处于类似情况的人了解他们的权利和责任,并为他们提供一些安慰和支持,妻子的出走,我的妻子在没有留下任何解释或预兆的情况下出走了,她带走了我...。

本站公告 2024-09-23 19:24:14

为 HTML 表格创建像素完美的边框:最佳实践 (为html表格某一格填充颜色)

为 HTML 表格创建像素完美的边框:最佳实践 (为html表格某一格填充颜色)

为HTML表格单元格填充颜色有时,您可能需要为HTML表格的特定单元格填充颜色,这是通过使用CSSbackground,color属性来实现的,例如,以下CSS代码为具有filled类的所有单元格填充红色,.filled,background,color,ff0000,您可以通过将filled类添加到单元格的td元素来为特定单元格填...。

本站公告 2024-09-16 06:51:35

海量网站程序下载,助您轻松搭建您的网站 (海量网站程序下载)

海量网站程序下载,助您轻松搭建您的网站 (海量网站程序下载)

欢迎来到我们的网站程序下载中心!在这里,您可以找到海量免费和付费的网站程序,助您轻松搭建您的网站,网站程序分类内容管理系统,CMS,电子商务平台博客软件论坛软件图片库软件维基软件内容管理系统,CMS,WordPress,免费,Joomla,免费,Drupal,免费,Shopify,付费,Squarespace,付费,电子商务平台Wo...。

本站公告 2024-09-10 17:14:01

VB 数据库连接:揭示数据库世界 (vb6.0连接数据库)

VB 数据库连接:揭示数据库世界 (vb6.0连接数据库)

引言在软件开发的世界中,连接到数据库是至关重要的,对于使用VB6.0开发应用程序的人来说,了解如何连接和操作数据库是成功项目的关键,连接到数据库在VB6.0中连接到数据库的过程涉及以下步骤,创建ADO连接对象指定连接字符串打开连接创建ADO连接对象在VB6.0中,可以使用ADO,ActiveXDataObjects,库来连接到数据库,...。

最新资讯 2024-09-10 10:24:27

计算机编程基础知识:为初学者奠定坚实的基础 (计算机编程基础知识)

计算机编程基础知识:为初学者奠定坚实的基础 (计算机编程基础知识)

简介计算机编程是向计算机提供指令并对其行为进行控制的过程,它是一种用计算机可理解的语言对计算机进行通信的方法,计算机编程对于解决问题、创建软件应用程序以及自动化任务至关重要,计算机编程基础知识1.变量和数据类型变量是计算机中用于存储数据的内存位置,每个变量都有一个名称和一个数据类型,指定了变量可以存储的数据类型,如数字、字符串或布尔值...。

技术教程 2024-09-09 14:22:18

见证中国的编程天才:编程中国上冉冉升起的明星 (见证中国的编剧是谁)

见证中国的编程天才:编程中国上冉冉升起的明星 (见证中国的编剧是谁)

中国的科技产业正在蓬勃发展,而编程是中国经济中一个日益重要的部分,编程中国是该国最大的编程社区之一,拥有超过1000万会员,在该平台的众多技术爱好者中,涌现了许多编程天才,他们正在用他们的技能塑造中国的未来,编程中国的杰出贡献者张雨锡,知名算法竞赛选手,在各大国际比赛中屡获殊荣,他也是一名出色的导师,帮助了许多学生提高编程水平,李锐,...。

最新资讯 2024-09-09 10:06:57

VCL 控件库:了解 Delphi 和 C++Builder 中的各种控件及其功能 (vc 控件)

VCL 控件库:了解 Delphi 和 C++Builder 中的各种控件及其功能 (vc 控件)

引言VCL,视觉组件库,控件库是EmbarcaderoDelphi和C,Builder集成开发环境,IDE,提供的一套功能强大的用户界面,UI,控件,这些控件提供了创建各种应用程序所需的丰富组建,包括桌面、移动和Web应用程序,VCL控件概述VCL控件库包含一系列控件,可以分为以下几类,基本控件,这些控件是最基本的构建块,用于创建用...。

技术教程 2024-09-07 18:16:07

踏进网络开发大门:网站编程入门指南 (网络开发技巧)

踏进网络开发大门:网站编程入门指南 (网络开发技巧)

引言随着互联网的飞速发展,网络开发变得比以往任何时候都更加重要,网站是企业、组织和个人的在线形象,也是与客户互动、提供信息和销售产品或服务的重要平台,如果你对构建自己的网站感兴趣,那么学习网络开发技能是必不可少的,本指南将带你踏进网络开发的大门,提供网站编程入门的全面指南,我们将涵盖从基础概念到实用实践的一切内容,让你能够从头开始构建...。

本站公告 2024-09-07 14:15:09

不完全 Gamma 函数在概率和统计建模中的作用:理论和实际应用 (不完全gamma函数表)

不完全 Gamma 函数在概率和统计建模中的作用:理论和实际应用 (不完全gamma函数表)

简介不完全Gamma函数,IGF,在概率和统计建模中是一个强大的工具,它是Gamma函数的一个特殊情况,其定义为,$$P,z,a,b,=\frac,1,\Gamma,a,\int,0^zt^,a,1,e^,t,b,$$其中,a和b是形参,IGF的理论性质IGF具有许多有用的理论性质,包括,当z=0时,IGF为0当z为正无穷大...。

技术教程 2024-09-07 13:43:14