「译文」深入了解 Kubernetes 指标 - 第三部分 - 容器资源指标

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 「译文」深入了解 Kubernetes 指标 - 第三部分 - 容器资源指标

👉️原文 URL: https://blog.freshtracks.io/a-deep-dive-into-kubernetes-metrics-part-3-container-resource-metrics-361c5ee46e66

✍️作者: Bob Cotton

📝Description:

This is part 3 of a multi-part series about all the metrics you can gather from you Kubernetes cluster. In part 2, I explained, and then demonstrated the USE method to select and examine the most…

这是关于你可以从 Kubernetes 集群中收集的所有指标的多部分系列的第三部分。

第二部分 中,我解释并演示了选择和检查节点 (Node) 上最重要资源的 USE 方法;内存、CPU、磁盘和网络。这一次,我将关注容器层面的指标。这些是 cAdvisor 所报告的指标。

cAdvisor 的 Container 指标

来自谷歌的 cAdvisor 项目最初是一个独立的项目,用于收集 节点上运行的容器的资源和性能指标。在 Kubernetes 中,cAdvisor 被嵌入到 kubelet 中。这是控制集群中每个节点上所有容器的过程。这很方便,因为你不需要在每个节点上运行另一个进程来收集容器指标。

kublet 在一个 /metrics 端点上以 Prometheus 阐述格式公开了它的所有运行时指标和所有 cAdvisor 指标。

cAdvisor 所提供的 “container” 指标最终是由底层的 Linux cgroup 实现报告的指标。就像节点指标一样,它们数量众多,内容详细。然而,我们关注的是容器对底层节点所提供资源的使用情况。具体来说,我们对 CPU、内存、网络和磁盘感兴趣。在处理资源的时候,同样,在选择这些指标的报告时,最好使用 USE 方法。

📝 译者注:

USE 方法更多地关注于监视性能,并被用作确定性能问题和其他系统瓶颈的根本原因的起点。理想情况下,在监视应用程序时,USE 方法和 RED 方法应该同时使用。

USE 方法关键指标为:

  • Utilization(使用率)
  • Saturation(饱和度)
  • Errors(错误)

RED 方法关键指标为:

  • Rate(比率)
  • Errors(错误)
  • Duration(持续时间)

USE 方法和容器度量

作为快速提醒,USE 方法是指 Utilization(使用率)、Saturation(饱和度)和 Errors(错误)。请参考本系列的 第二部分,以深入了解这一方法。

因为这些指标的来源从节点(node_exporter)变成了容器(cAdvisor),所以指标的名称也会改变。此外,每个指标都会对你集群中的所有容器进行报告。使用 Prometheus 中的 sum 方法将是必要的,以获得你的应用程序的整体视图。

在我开始谈论单个资源指标之前,我们需要谈谈 Kubernetes 中的一个功能,这将使计算饱和度 (Saturation) 更容易。这个功能就是资源 "requests" 和 “limits”。

Kubernetes Requests 和 Limits

Kubernetes 系统的核心是一个调度器,将容器放在节点上。就像用不同大小的物品包装一堆不同大小的盒子一样,调度器需要知道节点的容量和被放置在这些节点上的容器的大小。如果不知道容器的 “大小 (size)”,你就很容易在集群中过度配置(over-provision) 节点,导致由于过度拥挤而出现性能问题。

请求 (Requests) 和限制 (limits) 作为 deployment 的一部分被应用到容器规范中。从 Kubernetes 1.10 开始,有两种资源类型可以设置请求和限制:CPU 和内存。CPU 被指定为 CPU 或核心的分数(低至 1/1000),内存被指定为字节(bytes)。

一个 request 是对你的容器将需要的该资源的最低数量的投标。请求并没有说你将使用多少资源,只是说你将需要多少。你在告诉调度器你的容器需要多少资源来完成它的工作。Request 用于 Kubernetes 调度器的调度。对于 CPU request,它们也被用来配置容器如何被 Linux 内核调度。关于这一点,在另一篇文章中会有更多介绍。

Limit是你的容器将使用的该资源的最大数量。Limit 必须大于或等于 Request 值。如果你只设置 Limit,那么 request 将与 limit 相同。

Limit 允许容器有一些余地,以超过资源请求。由于 Kubernetes 调度器不考虑 limits,因此 limits 给了你一个在节点上过度配置容器的旋钮。也就是说,如果你的容器超过了你的 limit,行动取决于资源资源类型;如果你超过了 CPU 的 limit,你将被遏制(throttled),如果你超过了内存的限制,你将被杀死(killed)。

带着资源 request 和 limit 运行是一个 "安全最佳实践"。

运行无资源约束的容器的选项使你的系统处于 DoS 或 " 嘈杂的邻居(noisy neighbor)" 场景的风险中。为了防止和减少这些风险,你应该定义资源配额(resource quotas)。

一旦你在 namespace 上设置 quotas,你将被迫对该 namespace 的每个容器应用设置 request 和 limit。

Container CPU Utilization, Saturation, 和 Errors

对于 CPU 的利用率,Kubernetes 只为每个容器提供了三个指标:

  1. container_cpu_user_seconds_total — “user” time 的总数(即: 不在内核中的花费时间)
  2. container_cpu_system_seconds_total — “system” time 的总数 (i.e. 在内核中的花费时间)
  3. container_cpu_usage_seconds_total — 上述各项的综合. 在 Kubernetes 1.9 之前,所有节点的每个 CPU 都会报告这个情况。这在 1.1.0 中有所改变。

所有这些指标都是计数器,需要有一个 rate 应用于它们。这个查询将给我们提供每个容器正在使用的核心数量。对于整个系统中的所有该名称的容器:

sum(rate(container_cpu_usage_seconds_total[5m]))by (container_name)
LISP

当使用 CPU limits 运行时,计算饱和度会变得更容易,因为你已经定义了 CPU 使用的上限是什么。当一个容器超过其 CPU 限制时,Linux 运行时将 " 遏制(throttle)" 该容器,并在 container_cpu_cfs_throttled_seconds_total 系列中记录它被节制的时间量。这将作为一个计数器再次跟踪每个容器,因此采取rate:

sum(rate(container_cpu_cfs_throttled_seconds_total[5m])) by (container_name)
LISP

这是一个重要的指标,在运行时要注意 CPU 的 limit(应该总是这样的!)。

与 node_exporter 非常相似,cAdvisor 不会暴露 CPU 错误。

内存 Utilization, Saturation, 和 Errors

在 cAdvisor 中跟踪的内存指标是由 node_exporter 暴露的 43 个内存指标的一个子集。下面是容器的内存指标:

container_memory_cache -- Number of bytes of page cache memory.
container_memory_rss -- Size of RSS in bytes.
container_memory_swap -- Container swap usage in bytes.
container_memory_usage_bytes -- Current memory usage in bytes,       
                                including all memory regardless of
                                when it was accessed.
container_memory_max_usage_bytes -- Maximum memory usage recorded 
                                    in bytes.
container_memory_working_set_bytes -- Current working set in bytes.
container_memory_failcnt -- Number of memory usage hits limits.
container_memory_failures_total -- Cumulative count of memory 
                                   allocation failures.
ADA

你可能认为用 container_memory_usage_bytes 来跟踪内存利用率是很容易的,然而,这个指标也包括在内存压力下可能被驱逐的缓存(cache)(想想文件系统缓存)项目。更好的指标是container_memory_working_set_bytes,因为这就是 OOM killer 所关注的。

为了计算容器的内存利用率,我们使用:

sum(container_memory_working_set_bytes{name!~"POD"})  by (name)
PGSQL

在上面的查询中,我们需要排除名称包含 “POD” 的容器。这是该容器的父组,并将跟踪 pod 中所有容器的统计信息。

容器的内存饱和度在运行内存限制时变得更容易(感觉到这里有一个主题?)我们将把饱和度定义为限制中的可用内存量:

sum(container_memory_working_set_bytes) by (container_name) / sum(label_join(kube_pod_container_resource_limits_memory_bytes,
    "container_name", "", "container")) by (container_name)
LISP

这里我们要连接两个系列,一个来自 cAdvisor,一个来自 kube-state-metrics。不幸的是,容器名称的标签没有对齐,但 PromQL 在这里用 label_join 来帮助。

内存错误不会被 kubelet 暴露出来。

Disk Utilization, Saturation, 和 Errors

cAdvisor 有 container_fs_io_time_seconds_totalcontainer_fs_io_time_weighted_seconds_total的系列,在处理磁盘 I/O 时,我们首先通过查看读和写来跟踪所有的磁盘利用率。这些应该在节点层面上跟踪类似的指标,但在我的安装中,这些指标总是为零。

最基本的磁盘 I/O 利用率是指读 / 写的字节数:

sum(rate(container_fs_writes_bytes_total[5m])) by (container_name,device)
sum(rate(container_fs_reads_bytes_total[5m])) by (container_name,device)
LISP

将这些加起来,得到每个容器的总体磁盘 I/O 利用率。

kubelet 并没有提供足够的细节来对容器磁盘饱和度或错误进行有意义的查询。

网络 Utilization, Saturation, 和 Errors

在容器级别的网络利用率,你可以选择以字节或数据包的形式来测量发送和接收。这个查询有点不同,因为所有的网络核算都发生在 Pod 层面,而不是在容器层面

这个查询将按 pod 名称显示每个 pod 的网络利用率:

sum(rate(container_network_receive_bytes_total[5m])) by (name)
sum(rate(container_network_transmit_bytes_total[5m])) by (name)
LISP

同样,如果不知道最大的网络带宽是多少,网络的饱和度是无法定义的。cAdvisor 提供了 container_network_receive_packets_dropped_totalcontainer_network_transmit_packets_dropped_total

cAdvisor 还显示了 container_network_receive_errors_totalcontainer_network_transmit_errors_total系列的错误数量。

结束语

通过使用 cAdvisor,kubelet 为你的 Kubernetes 集群中的所有容器提供了大量的资源信息。通过利用率、饱和度和错误来查看这些资源,可以为调查资源限制和容量规划提供起点。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
9天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践
|
2天前
|
Kubernetes Cloud Native 持续交付
云原生之旅:Docker容器化与Kubernetes集群管理
【9月更文挑战第33天】在数字化转型的浪潮中,云原生技术如同一艘航船,带领企业乘风破浪。本篇文章将作为你的航海指南,从Docker容器化的基础讲起,直至Kubernetes集群的高级管理,我们将一起探索云原生的奥秘。你将学习到如何封装应用、实现环境隔离,以及如何在Kubernetes集群中部署、监控和扩展你的服务。让我们启航,驶向灵活、可伸缩的云原生未来。
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
9天前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
5天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
阿里云ACK容器服务生产级可观测体系建设实践
|
16天前
|
存储 Kubernetes 负载均衡
深入浅出 Kubernetes:掌握容器编排的艺术
在云计算迅速发展的今天,Kubernetes 作为容器编排和管理的事实标准,提供了运行分布式系统的强大框架,支持无缝部署、扩展和管理容器化应用。本文深入探讨 Kubernetes 的核心概念与组件,介绍其自动化部署、负载均衡、存储编排等特性,并演示如何使用 Minikube、kubeadm 及 Kubernetes 服务提供商部署集群,通过 `kubectl` 和 Helm 管理资源,帮助开发者掌握这一关键技术。
|
22天前
|
存储 Kubernetes 持续交付
深入浅出 Kubernetes:掌握容器编排的艺术
Kubernetes作为容器编排领域的领头羊,提供了运行分布式系统的强大框架,支持自动化部署、扩展和管理容器化应用。本文深入浅出地介绍了Kubernetes的核心概念与关键组件,包括服务发现、存储编排及自动部署等特性。通过Minikube、kubeadm及云服务商等多种方式部署集群,并使用`kubectl`、YAML配置文件和Helm进行资源管理。掌握Kubernetes将成为软件开发者的宝贵技能。
|
6天前
|
Kubernetes Cloud Native Docker
云原生之旅:深入理解容器化与Kubernetes
【9月更文挑战第29天】在云计算的海洋中,云原生技术如同一艘航船带领着企业乘风破浪。本文将作为你的航海图,带你探索云原生的核心——容器化和Kubernetes。我们将从容器的基本概念出发,逐步深入到如何在Kubernetes集群中部署应用,最后探讨这些技术如何助力现代软件开发。文章旨在为读者提供清晰的云原生入门知识,并展示实际操作的步骤,让你能够自信地启航。
|
8天前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
23 0
|
2天前
|
Kubernetes Cloud Native Ubuntu
云原生之旅:Kubernetes集群搭建与应用部署
【8月更文挑战第65天】本文将带你进入云原生的世界,通过一步步指导如何在本地环境中搭建Kubernetes集群,并部署一个简单的应用。我们将使用Minikube和Docker作为工具,探索云原生技术的魅力所在。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和实践技巧。
下一篇
无影云桌面