当前位置: 首页 > 科技观察

Kubernetes监控最佳实践

时间:2023-03-12 01:40:59 科技观察

什么是Kubernetes?Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,促进声明式配置和自动化。Kubernetes拥有庞大且快速发展的生态系统。Kubernetes的服务、支持和工具随处可见。Kubernetes于2014年由谷歌开源,它是基于谷歌自己在生产环境中运行容器的经验构建的。它现在由云原生计算基金会(CNCF)管理,而Kubernetes是大型企业中最受欢迎的容器管理工具,在最近的CNCF调查中有83%的受访者使用它。Kubernetes一词源自希腊语,意思是“舵手”或“领航员”。Kubernetes如何成为标准要了解Kubernetes的价值,我们首先要回顾一下这些年企业是如何部署应用的。在传统部署中,应用程序运行在物理服务器上,这种方式很容易导致资源分配问题。例如,如果多个应用程序运行在一台服务器上,一个应用程序可能会占用大部分资源,影响其他应用程序的性能。一种解决方案是在单独的物理服务器上运行每个应用程序,但这样做成本过高并且会导致资源利用不足。下一步是虚拟化,它通过运行多个虚拟机(VM)来解决物理服务器的局限性,每个虚拟机在物理服务器的CPU之上运行自己的组件,包括操作系统(OS)和应用程序。VM提供了许多好处,包括提高服务器资源的利用率、降低硬件成本、简化应用程序升级以及其他增强的可扩展性。虚拟机有其缺点。例如,每个VM都有自己的操作系统映像意味着额外的内存和存储需求。这增加了软件开发生命周期的复杂性,并限制了公共云和私有云以及数据中心之间的应用程序可移植性。容器的好处容器类似于虚拟机,因为它有自己的软件、库、内存、配置文件等。但是容器有很多优点,最显着的是共享操作系统的能力(每个VM都有自己独立的OS映像),使它们相对轻量、快速和高效。容器的好处包括:提高效率:使用容器,可以更快地部署、修补或扩展应用程序。更好的可移植性:可以轻松地将运行在容器中的应用程序部署到多个操作系统和硬件平台。一致的操作:无论部署在何处,基于容器的应用程序都以相同的方式运行。更清晰的可观察性:除了提供操作系统级别的指标外,它们还显示应用程序的健康状况。从应用程序开发中获益:容器支持敏捷开发和DevOps开发(以加快开发、测试和生产周期)。Kubernetes对容器的作用由于容器比传统虚拟化更高效、更快速、更轻便,因此拥有大型应用程序部署的企业可以将多个容器部署为一个或多个容器集群也就不足为奇了。然而,这种环境带来了一系列挑战,因为大型分布式容器化应用程序通常难以协调。Kubernetes是一种开源容器编排工具,可跨主机集群自动部署、扩展和运行应用程序容器。Kubernetes是最流行的容器调度工具,最常与领先的容器化平台Docker一起使用。但Kubernetes还支持其他容器系统,这些容器系统符合开放容器倡议(OCI)制定的容器映像格式和运行时标准,OCI是一个由Linux基金会监督的开源技术社区。Kubernetes的替代品包括DockerSwarm和ApacheMesos。Kubernetes的工作原理Kubernetes提供了一个用于运行弹性分布式系统的框架。部署后,您将获得一个Kubernetes集群——一组运行由Kubernetes管理的容器化应用程序的机器或节点。一个集群至少有一个:托管pod的辅助节点。(每个Pod是一组一个或多个容器。)主节点,管理集群中的工作节点和Pod。为了使Kubernetes集群正常工作,您需要几个主组件、节点组件和附加组件。我们将在下面有关Kubernetes监控的部分中讨论这些组件。Kubernetes的好处尽管Kubernetes有很多优势,但它的四大主要优势包括速度、可扩展性、基础架构抽象和效率。(https://www.oreilly.com/library/view/kubernetes-up-and/9781491935668/)这本书由JoeBeda、BrendanBurns和KelseyHightower合着。速度:Kubernetes提供了您需要的工具,可以每小时或每天快速发布功能,同时保持服务的高可用性。扩展:Kubernetes的配置管理工具可以更轻松地扩展构成分布式应用程序的容器以及支持这些容器的集群。基础架构抽象:跨多个公共云或在混合云环境中运行分布式应用程序具有挑战性。Kubernetes有许多插件可以简化这些任务。效率:通过在集群中自动分发应用程序并确保更高的利用率,Kubernetes有助于提高效率和成本管理。Kubernetes监控涉及什么?什么是Kubernetes监控?它涉及什么?让我们从Kubernetes中需要监控的内容以及原因开始。Kubernetes可以极大地简化容器内和跨云的应用程序部署,但它也带来了一系列复杂性。正如Google在他们的《站点可靠性工程指南》(https://landing.google.com/sre/sre-book/chapters/practical-alerting/)中指出的那样,监控大型复杂系统面临两个主要挑战:监控以及为操作员维持“合理低的维护工作量”的需要。这些要求需要一个监控系统,不仅要对高级服务目标发出警报,还要检查各个组件。为了扩展您的应用程序并提供可靠的服务,您需要深入了解您的应用程序在部署时的行为方式。要监控Kubernetes集群中的应用程序性能,检查容器、容器和服务的性能以及整个集群的特征至关重要。通过提供有关应用程序资源使用情况的信息,Kubernetes允许您评估应用程序性能以检测和消除瓶颈。Kubernetes组件:要监控的内容Kubernetes集群架构由一个主节点和各个Kubernetes节点组成。主要组件包括:etcd存储配置信息,可供集群中的每个节点使用。API服务器(kube-apiserver)验证和配置API对象(例如Pod、服务、复制控制器等)的数据。调度程序(kube-scheduler)管理工作负载利用率并将pod分配给可用节点。kube-controller-manager一个守护进程,负责收集信息并将其发送到API服务器。cloud-controller-manager运行与云提供商交互的控制器。Kubernetes节点组件包括:容器运行时(例如Docker)kubelet:通过API服务器监控pod规范的主要节点代理;它还在Kubernetes集群中注册一个节点并报告事件、pod状态和资源利用率。Kubernetes代理(kube-proxy):在每个节点上运行的代理服务,有助于使服务对外部主机可用。Kubernetes附加组件您有很多Kubernetes附加组件可供选择,但这里有一些流行的选择。您可以在此处找到更全面的附加组件列表。Kubernetes仪表板:Kubernetes集群的基于Web的UI,可用于监控工作负载(部署、Pod、副本集等)的健康状况,并查看所有节点的聚合CPU和内存使用指标。它具有配置、发现、负载平衡、存储、监控以及工作负载的创建和管理等功能。ClusterDNS:为Kubernetes服务提供DNS记录的DNS服务器。ACI:通过思科以应用为中心的基础设施(ACI)(https://github.com/noironetworks/aci-containers)提供集成的容器网络和网络安全。集群级日志记录:使用搜索/浏览UI将容器日志保存到中央日志存储。Kubernetes监控挑战将传统的单体应用程序迁移到Kubernetes既耗时又容易出错。然而,企业愿意承担风险以在云中实现更大的敏捷性、创新、成本优势、可扩展性和业务增长。但是将单体应用程序迁移到微服务的公司缺乏对Kubernetes环境的可见性。这使得无法实时看到每个微服务的交互。Kubernetes很复杂集成工程师DaveSnyder指出,Kubernetes难以监控的另一个原因是Kubernetes集群要复杂得多,有多个服务器以及私有和公共云服务。当问题开始时,会有很多日志和其他数据和组件需要排查。整体环境可能需要多次查找日志,但Kubernetes环境可能包含一个或多个与跨多个微服务正在排查的问题相关的日志。KubernetesMonitoringwithAPMKubernetesMonitoringwithanapplicationperformancemonitoringsolution使组织能够了解应用程序和业务性能,包括更深入地了解容器化应用程序、Kubernetes集群、Docker容器和基础架构指标。这种可见性使企业能够增强容器级别的指标,并获得对CPU、数据包、内存和网络利用率的可见性。然后,用户可以对这些指标和相关的健康规则以及他们在APM监控的容器应用程序上的资源使用统计数据进行基准测试。通过将APM指标与底层容器和服务器指标进行比较,公司可以快速了解其容器化应用程序的性能,并了解基础架构中的潜在障碍。例如,特定指标可以帮助识别占用带宽的应用程序和容器级网络错误。Kubernetes环境中的全栈可见性可见性允许组织监控在KubernetesPod中运行的容器化应用程序,并识别阻碍应用程序性能的容器问题。全面的Kubernetes监控解决方案可提供对组织应用程序每个组件的端到端可见性——基础设施、Kubernetes平台、容器以及每个微服务和最终用户设备。什么是Kubernetes监控最佳实践?Kubernetes提供操作流程和复杂性,其中许多涉及应用程序性能监控。随着您将Kubernetes的使用扩展到生产环境中,这些挑战变得更加重要。通过创建抽象级别(例如Pod和服务),Kubernetes让您不必担心应用程序在哪里运行或者它们是否有足够的资源来高效运行。但为了确保最佳性能,您仍然必须监控应用程序、运行它们的容器,甚至Kubernetes本身。以下是一些重要的Kubernetes监控最佳实践:使用KubernetesDaemonSets在运行Kubernetes时,您可能希望在所有节点上运行单个pod,例如,在运行AppDynamics代理或开源数据收集器Fluentd等监控进程时,以收集日志。DaemonSet是一个Kubernetes工作负载对象,可确保特定Pod在集群中的每个节点或某些节点子集上运行。通过使用DaemonSet,您告诉Kubernetes确保每个节点上都有一个pod实例。标签和标签很重要随着Kubernetes管理容器编排,标签对于监控变得至关重要,因为标签是您与容器和容器交互的唯一方式。为了使指标尽可能有用,必须使用逻辑一致的方案来定义标签。知道要监控哪些指标根据Kubernetes.io,您应该密切跟踪几种关键类型的Kubernetes指标:运行Pod及其部署的资源指标,包括CPU、内存使用率和磁盘I/O容器原生指标应用程序metricsusingservicediscovery感谢Kubernetes应用程序是根据调度策略动态调度的,所以你可能不知道应用程序在哪里运行,但无论如何你都必须对其进行监控。您需要使用具有服务发现功能的监控系统,自动调整指标收集以适应移动的容器。这种方法允许您不间断地持续监控您的应用程序。Kubernetes监控工具Kubernetes有很多好处,但也增加了复杂性。例如,其跨多个数据中心甚至跨不同云提供商分发容器化应用程序的能力需要一个全面的监控解决方案来收集和汇总许多不同来源的指标。持续监控系统和应用程序的健康状况至关重要,许多免费的商业解决方案提供对Kubernetes集群及其托管的应用程序的实时监控。这里有几个用于Kubernetes监控的开源工具:Prometheus这个流行的Kubernetes和Docker监控和警报工具提供了详细的、可操作的指标和分析。Prometheus由SoundCloud开发并捐赠给CNCF社区,专门用于监控容器中运行的应用程序和微服务。但是,Prometheus不是仪表板,通常与Grafana(见下文)结合使用以可视化数据。GrafanaGrafana是一个用于分析和指标可视化的开源平台,包括四个仪表板:Cluster、Node、Pod/Container和Deployment。Kubernetes管理员通常会安装Grafana并利用Prometheus数据源来创建信息丰富的仪表板。JaegerJaeger是一个跟踪系统,用于对复杂分布式系统中的事务进行故障排除和监控。它解决了分布式上下文传播、分布式事务监控、延迟优化等方面出现的软件问题。DashboardKubernetesDashboard是一个用于Kubernetes集群的WebUI插件,可让您监控工作负载的健康状况。Kubewatch该插件监控Kubernetespod中发生的变化,并向Slack频道发送通知。Kubewatch是用Golang编写的,它使用Kubernetes客户端库与KubernetesAPI服务器交互,并使用Slack客户端库与Slack交互。WeaveScopeWeaveScope是Kubernetes和Docker的可视化和监控工具,提供应用程序和整个基础设施的自上而下视图。WeaveScope由Weaveworks开发,可生成Kubernetes集群中进程、容器和主机的映射。它的GUI还允许您在容器上管理和运行诊断命令。EFKStackEFKStack实际上是三种可以很好协同工作的工具的混合体:Elasticsearch、Fluentd和Kibana。Fluentd是一个数据收集器,它从运行在Kubernetes集群节点上的pod中删除日志。它将这些日志路由到Elasticsearch搜索引擎,后者提取数据并将其存储在中央存储库中。Kibana是Elasticsearch的数据可视化插件,是EFKStack的UI,允许用户可视化收集的日志和指标并创建自定义仪表板。InfluxDBInfluxData的InfluxDB是一种用于时间序列数据的高性能存储。它专为监控记录的海量存储而构建,通过集群提供水平可扩展性和高可用性。InfluxDB是一个很好的长期存储Kubernetes监控数据的解决方案,用于历史记录或建模。