做者:Carlos Arilla翻译:Bach(才云)数据库
若是想要监控 Kubernetes,包括基础架构平台和正在运行的工做负载,传统的监控工具和流程可能还不够用。就目前而言,监控 Kubernetes 并非件容易的事。api
K8sMeetup安全
为何监控 Kubernetes 很难?服务器
Kubernetes 已经席卷了整个容器生态系统,它充当着容器分布式部署的大脑,旨在使用跨主机集群分布的容器来管理面向服务的应用程序。Kubernetes 提供了用于应用程序部署、调度、更新、服务发现和扩展的机制,可是监控 Kubernetes 呢?网络
虽然 Kubernetes 能够极大地简化将应用程序在容器以及跨云的部署过程,但它会为平常任务、应用程序性能管理、服务可见性以及典型的“监控->警报->故障排除”工做流程增长了复杂性。架构
旧版监控工具从静态目标中收集指标,用于监控服务器和服务,这些工具过去工做良好,但如今没法正常工做。下面就是这些工具如今没法监控 Kubernetes 的缘由:分布式
Kubernetes 增长了基础架构的复杂性微服务
为了简化应用程序部署,基础架构增长了新的复杂性层:动态配置的 IaaS、自动配置的配置管理工具以及编排平台(如 Kubernetes),它们都位于裸机或虚拟基础架构与支持应用程序的服务之间,所以在控制平面上监控 Kubernetes 安全也是工做的一部分。工具
微服务架构
除了增长基础架构的复杂性以外,微服务还被设计了新的应用程序,其中相互通讯的组件数量也会按数量级增长。每一个服务分布在多个实例中,而且容器能够根据须要在基础结构中移动。这就是监控 Kubernetes 编排状态对于了解 Kubernetes 执行工做相当重要的缘由。咱们要验证服务的全部实例都已启动并运行。
原生云爆炸的规模要求
咱们须要监控系统,这样能为高水平的服务目标发出警报,另外咱们也要保留粒度以根据须要检查各个组件。当采用云原生架构时,它们带来了变化也带走了愈来愈多的小组件。这就影响了 Kubernetes 监控方法和工具。
随着指标数量的激增,传统的监控系统已没法跟上。虽然过去咱们能知道每一个服务组件有多少个实例以及它们位于何处,但如今状况已再也不如此。如今指标一般具备必定的基数,Kubernetes 会有一些多维级别,例如集群、节点、命名空间、Service 等。许多标签的表明属性来自于微服务的逻辑、应用程序版本、API 端点、特定资源或操做等。
另外,容器不会永远运行下去。据一份容器使用状况报告显示,22% 的容器寿命不超过 10 秒,54% 的容器寿命不到 5 分钟。这会形成很大的变更,容器 ID、Pod 名称之类的标签始终在变化,这也是咱们在处理新标签时却再也看不到它们的缘由。
如今,咱们若是将度量标准的名称、标签与实际值、时间戳一块儿使用,在短期内,就将拥有成千上万个数据点,即便是在小型 Kubernetes 集群中,也将生成数十万个时间序列,若是是中型基础架构,可能就是数百万个。这就是为何 Kubernetes 监控工具须要准备好扩展成千上万个指标。
容器可见性不足
容器的生命周期是短暂的,它一旦死亡,内部的全部东西都将消失,咱们没法使用 SSH 或查看日志。容器很是适合操做,咱们能够打包、隔离应用程序,在任何地方以一致的方式部署它们,可是同时,它们一样会成为难以排除故障的黑盒。监控工具能够经过系统调用跟踪从而提供详尽的可见性,这样咱们能够查看容器内发生的每一个进程、文件或网络链接,从而更快地对问题进行故障排除。
考虑到这些因素,咱们能够更好地理解为何监控 Kubernetes 与监控服务器、VM 甚至是云实例有很大不一样。
K8sMeetup
Kubernetes 监控的用例
Kubernetes 集群具备多个组件和层,在每一个组件和层中,咱们须要监控不一样的故障点。如下是 Kubernetes 监控的一些典型用例:
监控 Kubernetes 集群和节点
经过监控集群,您能够全面了解整个平台的运行情况和容量。具体的用例以下:
监控 Kubernetes deployment 和 Pod
查看诸如命名空间、deployment、副本集或 DaemonSet 之类的 Kubernetes constructs,咱们能够了解应用程序是否已正确部署。例如:
监控 Kubernetes 应用
归根结底,应用的监控才是最重要的。下面是应用监控的一部分:
K8sMeetup
Kubernetes 监控工具
与大多数平台同样,Kubernetes 具备一组基本工具,能够监控平台,包括基于物理基础架构之上的 Kubernetes 构造。因为 Kubernetes 具备可扩展性,它会添加其余组件以得到 Kubernetes 可见性。让咱们来看一下 Kubernetes 监控设置的部分:
cAdvisor 和 heapster
cAdvisor 是一个开源容器资源使用收集器。它专为容器而构建,支持本地 Docker 容器。cAdisor 会自动发现给定节点中的全部容器,并收集CPU、内存、文件系统和网络使用状况统计信息,不过它仅会收集基本资源利用率。仅当容器具备 X%CPU 利用率时,cAdvisor 才能告诉咱们应用程序的实际性能。cAdvisor 自己并不提供任何长期存储或分析功能。
在 Kubernetes 上,节点的 kubelet 能够安装 cAdvisor 来监控 Pod 容器资源。
为了进一步处理这些数据,咱们须要一些东西来整合整个集群中的数据。最受欢迎的选择是 Heapster。就像任何应用程序同样,Heapster 在集群中做为 Pod 运行。Heapster Pod 从 kubelet 获取有用数据,而 kubelet 自己的数据则是从 cAdvisor 获得,而后 Heapster 按窗格将信息分组,其中也包括相关标签。
在 Kubernetes 中使用 Heapster 和 cAdvisor 进行监控。资料来源:blog.kubernetes.io
Heapster 是一个收集者,而不是采集者,它只是让咱们收集整个集群中的 cAdvisor 数据。咱们须要将这些数据推送到可配置的后端进行存储和可视化。咱们能够添加可视化层(例如 Grafana)查看数据。
虽然 cAdvisor 仍然是经过 kubelet 的默认 Pod 监控组件,但 Heapster 已被弃用,如今 Kubernetes 经过 metric-server 使用指标。
Kubernetes metric server
从 Kubernetes v1.8 开始,来自 Kubernetes 和 cAdvisor 的资源使用状况指标能够经过 Kubernetes metric server API 得到,这与公开 Kubernetes API 的方式相同。
不过此服务也不容许咱们随时间存储值,而且缺少可视化或分析功能。Kubernetes metric server 可用于 Kubernetes 的高级编排,例如 Horizontal Pod Autoscaler 自动伸缩。
Kubernetes 仪表板(Dashboard)
Kubernetes 仪表板提供了一种简单的方式,让咱们经过 Kubernetes 命名空间和工做量查看环境。它提供了一种一致的方式来可视化基本数据,包括基本的 CPU、内存数据。另外,咱们还能够从仪表板进行管理并采起措施,不过这就涉及到了多租户集群上的安全问题,须要设置适当的 RBAC 特权。
Kubernetes kube-state-metrics
还有一个组件是 kube-state-metrics,这是一项附加服务,它与 Kubernetes metrics-server 一块儿运行,可轮询 Kubernetes API 并将 Kubernetes 构造的特征转换为指标。kube-state-metrics 能够解决如下问题:
咱们如今对在 Kubernetes 环境中构建合理的监控有了必定了解,虽然仍然没有详细的应用程序监控(例如:个人数据库服务的响应时间是多少?),但至少能够看到基础主机、Kubernetes 节点以及 Kubernetes 状态的一些监控。
Kubernetes liveness 和 readiness 探针
Kubernetes 探针发挥了按期监控 Pod 的运行情况和可用性的重要做用。它可让咱们经过针对端点的请求和运行命令来任意定义“活动性”。如下是基于运行 cat 命令的 liveness 探针的简单示例:
apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-exec spec: containers: - name: liveness args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 image: gcr.io/google_containers/busybox livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5 #source https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
用于 Kubernetes 监控的 Prometheus
Prometheus 是一个是开源的时间序列数据库,它和 Kubernetes 同样是 CNCF 项目。Prometheus 监控是围绕 Prometheus 服务器的整个监控堆栈,该服务器会收集并存储度量,另外还有用于仪表板的 Grafana。
Prometheus 入门很是容易,只要简单设置 Prometheus、Grafana 和不多的元素便可。Prometheus 是监控 Kubernetes 的一种不错方法,咱们能够对本身的 Kubernetes 实施 DIY Prometheus 监控。
尽管一开始使用 Prometheus 监控 Kubernetes 真的很简单,可是之后 DevOps 团队会很快意识到 Prometheus 也有一些使用障碍,例如规模、RBAC 以及一些团队合规性问题。
K8sMeetup
总结
Kubernetes 监控的事实标准是由许多开源工具构建的,例如 cAdvisor、Kubernetes metric server、kube-state-metrics 和 Prometheus。总而言之,咱们要考虑以适合的方式来监控咱们的 Kubernetes。