什么是Kubernetes?
Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。Kubernetes由Google于2014年开源 ,它是基于Google自身在生产中运行容器的经验而构建的。它现在由Cloud Native Computing Foundation(CNCF)管理,Kubernetes是大型企业中最流行的容器管理工具,在最近的CNCF调查中有83%的受访者使用过。Kubernetes这个词 源于希腊语,意为“舵手”或“飞行员”。
Kubernetes如何成为标准
要了解Kubernetes的价值,我们首先必须回顾一下多年来企业如何部署应用程序。在传统部署中,应用程序在物理服务器上运行,这种方法容易导致资源分配问题。例如,如果在单个服务器上运行多个应用程序,则一个应用程序可能会消耗大部分资源,从而影响其他应用程序的性能。一种解决方案是在单独的物理服务器上运行每个应用程序,但是这种方式带来的成本过高,并且会导致资源利用不足。下一步是虚拟化,它通过在物理服务器的CPU之上运行多个虚拟机(VM)(每个虚拟机运行自己的组件,包括操作系统(OS)和应用程序)来解决物理服务器的局限性。VM提供了很多好处,包括改善服务器资源的利用率,降低硬件成本,简化应用程序升级以及其他增强可扩展性。虚拟机有其缺点。例如,每个有自己的OS映像的VM都意味着额外的内存和存储要求。这增加了软件开发生命周期的复杂性,并限制了应用程序在公有云和私有云以及数据中心之间的可移植性。
容器的好处
容器与虚拟机相似,因为它有自己的软件,库,内存,配置文件等。但容器有许多优点,最显着的是有共享操作系统的能力(每个VM拥有自己独立的OS映像),从而使它们相对轻量,快速且高效。容器的好处包括:
- 效率提高:借助容器,可以更快地部署,修补或扩展应用程序。
- 更好的可移植性:将容器中运行的应用程序轻松部署到多个操作系统和硬件平台很容易。
- 一致的操作:基于容器的应用程序无论部署在何处都可以相同地方式运行。
- 更清晰的可观察性:除了提供操作系统级别的指标之外,它们还显示应用程序的运行状况。
- 受益于应用程序开发:容器支持敏捷和DevOps开发(以加快开发,测试和生产周期)。
Kubernetes对容器的作用
由于容器比传统的虚拟化更加高效,快速和轻便,因此有大型应用程序部署的企业可以将多个容器部署为一个或多个容器集群也就不足为奇了。但是,由于大型的分布式容器化应用程序通常难以协调,因此该环境面临着一系列挑战。Kubernetes是一个开源容器编排工具,可跨主机群集自动执行应用程序容器的部署,扩展和操作。最流行的容器调度工具Kubernetes与领先的容器化平台Docker一起使用是最多的场景。但是Kubernetes还支持其他符合容器镜像格式和运行时标准的容器系统,该标准由开放容器倡议(OCI)设定,该组织是由Linux Foundation监督的开源技术社区。Kubernetes的替代产品包括Docker Swarm和Apache Mesos。
Kubernetes如何工作
Kubernetes提供了一个框架来运行弹性的分布式系统。部署后,您将获得一个Kubernetes集群—一组运行Kubernees管理的容器化应用程序的机器或节点。集群至少具有一个:
- 承载Pod的辅助节点。(每个pod是一组一个或多个容器。)
- 主节点,用于管理集群中的工作节点和Pod。
要使Kubernetes集群正常工作,您需要多个主组件,节点组件和附加组件。我们将在下面有关Kubernetes监控的部分中讨论这些组件。
Kubernetes的好处
尽管Kubernetes拥有很多优点,但它的四个主要优点包括速度,扩展,基础设施抽象和效率。《Kubernetes: Up and Running》(https://www.oreilly.com/library/view/kubernetes-up-and/9781491935668/)这本书由 Joe Beda,Brendan Burns和Kelsey Hightower撰写。
- 速度: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 server(kube-apiserver)
验证和配置API对象(例如Pod,服务,复制控制器等)的数据。
Scheduler(kube-scheduler)
管理工作负载利用率以及将pod分配到可用节点。
kube-controller-manager
一个守护程序,负责收集信息并将其发送到API服务器。
cloud-controller-manager
运行与云供应商进行交互的控制器。Kubernotes节点组件包括:
- 容器运行时(例如,Docker)
- kubelet:主要节点代理,通过API服务器监控pod规范;它还在Kubernetes集群中注册了一个节点并报告事件,pod状态和资源利用率。
- Kubernetes代理(kube-proxy):在每个节点上运行的代理服务,有助于使服务对外部主机可用。
Kubernetes附加组件
您有很多Kubernetes附加组件可供选择,但是这里有一些受欢迎的选择。您可以在此处找到更全面的加载项列表。
- Kubernetes仪表板:Kubernetes集群的基于Web的UI,可用于监控工作负载(deployments, pods, replica sets 等等)的运行状况,并查看所有节点上汇总的CPU和内存使用情况指标。它具有配置,发现,负载平衡,存储,监控以及创建和管理工作负载的功能。
- 群集DNS:为Kubernetes服务提供DNS记录的DNS服务器。
- ACI:通过Cisco Application Centric Infrastructure(ACI)(https://github.com/noironetworks/aci-containers)提供集成的容器网络和网络安全性。
- 集群级日志记录:使用搜索/浏览UI将容器日志保存到中央日志存储中。
Kubernetes监控挑战
将传统的单片应用程序迁移到Kubernetes既耗时又容易出错。但是,企业愿意冒险以在云中实现更大的敏捷性,创新,成本优势,可扩展性和业务增长。但是将单片应用程序迁移到微服务的公司缺乏对Kubernetes环境的可见性。这使得无法实时查看每个微服务的交互。
Kubernetes很复杂
集成工程师Dave Snyder指出,Kubernetes难以监控的另一个原因是,Kubernetes集群要复杂得多,它有多个服务器以及私有和公有云服务。问题开始时,将有许多日志以及其他数据和组件需要排查。整体环境可能需要好几个日志搜索,但是Kubernetes环境可能包含一个或多个有关正在排查的问题需要多个微服务的日志。
使用APM进行Kubernetes监控
使用应用程序性能监控解决方案进行的Kubernetes监控使组织可以查看应用程序和业务性能,包括对容器化应用程序,Kubernetes集群,Docker容器和基础架构指标的更深入了解。这种可见性使企业可以增强容器级别的指标,并获得有关CPU,数据包,内存和网络利用率的可见性。然后,用户可以将这些指标和关联的运行状况规则以及它们在APM监控的容器应用程序上的资源使用统计信息作为基准。通过将APM指标与基础容器和服务器指标进行比较,公司可以快速了解其容器化应用程序的性能,并了解基础架构中的潜在障碍。例如,特定指标可以帮助识别占用带宽的应用程序和容器级网络错误。
Kubernetes环境中的全栈可见性
可见性使组织可以监控在Kubernetes Pod中运行的容器化应用程序,并确定妨碍应用程序性能的容器问题。全面的Kubernetes监控解决方案可提供对组织应用程序的每个组件(基础架构,Kubernetes平台,容器以及每个微服务和最终用户设备)的端到端可见性。
什么是Kubernetes监控最佳实践?
Kubernetes提供了操作流程和复杂性,其中许多涉及应用程序性能监控。随着您将Kubernetes的使用扩展到生产环境中,这些挑战变得更加重要。通过创建诸如Pod和Service之类的抽象级别,Kubernetes使您不必担心应用程序在何处运行或它们是否具有足够的资源来高效运行。但是要确保最佳性能,您仍然必须监控应用程序,运行它们的容器,甚至Kubernetes本身。以下是一些重要的Kubernetes监控最佳实践:
使用Kubernetes DaemonSets
在运行Kubernetes时,您可能希望在所有节点上运行单个pod,例如,在运行诸如AppDynamics代理或开源数据收集器Fluentd之类的监控进程时,以收集日志。DaemonSet是一个Kubernetes工作负载对象,可确保特定的Pod在集群中的每个节点或节点的某些子集上运行。通过使用DaemonSet,您要告诉Kubernetes确保每个节点上都有一个pod实例。
Tags和Labels Matter很重要
使用Kubernetes管理容器编排,标签对于监控变得至关重要,因为标签是您与容器和容器进行交互的唯一方法。为了使度量标准尽可能有用,必须使用逻辑且一致的方案定义标签。
知道要监控的指标
根据Kubernetes.io,应该密切跟踪Kubernetes指标的几种关键类型:
- 运行Pod及其部署
- 资源指标,包括CPU,内存使用情况和磁盘I/O
- 容器原生指标
- 应用指标
使用服务发现
由于Kubernetes根据调度策略动态调度应用程序,因此您可能不知道应用程序在何处运行,但是无论如何您都必须对其进行监控。您将希望使用具有服务发现功能的监控系统,该系统会自动使指标收集适应移动的容器。这种方法使您可以连续监控应用程序而不会中断。
Kubernetes监控工具
Kubernetes有很多好处,但也增加了复杂性。例如,其要在多个数据中心甚至不同的云供应商之间分布容器化应用程序的能力,就需要一种全面的监控解决方案来跨多个不同来源收集和汇总指标。持续监控系统和应用程序的运行状况至关重要,许多免费的商业解决方案可提供对Kubernetes集群及其托管的应用程序的实时监控。这是用于Kubernetes监控的几个开源工具:
Prometheus
这个针对Kubernetes和Docker的流行的监控和警报工具提供了详细,可行的指标和分析。Prometheus由SoundCloud开发并捐赠给CNCF社区,专门设计用于监控在容器中运行的应用程序和微服务。但是,Prometheus并不是仪表板,通常与Grafana结合使用(见下文)以可视化数据。
Grafana
Grafana是用于分析和度量可视化的开源平台,包括四个仪表板:集群,节点,Pod/容器和部署。Kubernetes管理员通常会安装Grafana并利用Prometheus数据源来创建信息丰富的仪表板。
Jaeger
Jaeger是一个跟踪系统,用于对复杂的分布式系统中的事务进行故障排除和监控。它解决了分布式上下文传播,分布式事务监控,等待时间优化等中出现的软件问题。
Dashboard
Kubernetes仪表板是Kubernetes集群的Web UI插件,可让您监控工作负载的运行状况。
Kubewatch
该附加组件监控Kubernetes pod中发生的更改,并将通知发送到Slack Channel。Kubewatch用Golang编写,它使用Kubernetes客户端库与Kubernetes API服务器进行交互,并使用Slack客户端库与Slack进行交互。
Weave Scope
Weave Scope是Kubernetes和Docker的可视化和监控工具,它提供了应用程序和整个基础架构的自顶向下视图。由Weaveworks开发,Weave Scope生成Kubernetes集群中的进程,容器和主机的映射。它的图形用户界面还允许您在容器上管理和运行诊断命令。
EFK Stack
EFK Stack实际上是三个可以很好地协同工作的工具的混合物:Elasticsearch,Fluentd和Kibana。Fluentd是一个数据收集器,它从Kubernetes集群节点上运行的Pod中删除日志。它将这些日志路由到Elasticsearch搜索引擎,Elasticsearch搜索引擎提取数据并将其存储在中央存储库中。Kibana是Elasticsearch的数据可视化插件,是EFK Stack的UI,允许用户可视化收集的日志和指标并创建自定义仪表板。
InfluxDB
InfluxData的InfluxDB是时间序列数据的高性能存储。它专为监控记录的大量存储而构建,可通过集群提供水平可伸缩性和高可用性。InfluxDB是长期存储Kubernetes监控数据以用于历史记录或建模的很好的解决方案。