diff --git a/content/zh/docs/concepts/configuration/manage-resources-containers.md b/content/zh/docs/concepts/configuration/manage-resources-containers.md index 00c5eba261..c3d69cef95 100644 --- a/content/zh/docs/concepts/configuration/manage-resources-containers.md +++ b/content/zh/docs/concepts/configuration/manage-resources-containers.md @@ -411,9 +411,9 @@ see the [Troubleshooting](#troubleshooting) section. The kubelet reports the resource usage of a Pod as part of the Pod [`status`](/docs/concepts/overview/working-with-objects/kubernetes-objects/#object-spec-and-status). -If optional [tools for monitoring](/docs/tasks/debug-application-cluster/resource-usage-monitoring/) +If optional [tools for monitoring](/docs/tasks/debug/debug-cluster/resource-usage-monitoring/) are available in your cluster, then Pod resource usage can be retrieved either -from the [Metrics API](/docs/tasks/debug-application-cluster/resource-metrics-pipeline/#the-metrics-api) +from the [Metrics API](/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/#metrics-api) directly or from your monitoring tools. --> ## 监控计算和内存资源用量 @@ -422,8 +422,8 @@ kubelet 会将 Pod 的资源使用情况作为 Pod [`status`](/zh/docs/concepts/overview/working-with-objects/kubernetes-objects/#object-spec-and-status) 的一部分来报告的。 -如果为集群配置了可选的[监控工具](/zh/docs/tasks/debug-application-cluster/resource-usage-monitoring/), -则可以直接从[指标 API](/zh/docs/tasks/debug-application-cluster/resource-metrics-pipeline/#the-metrics-api) +如果为集群配置了可选的[监控工具](/zh/docs/tasks/debug/debug-cluster/resource-usage-monitoring/), +则可以直接从[指标 API](/zh/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/#metrics-api) 或者监控工具获得 Pod 的资源使用情况。 + + + + + +对于 Kubernetes,_Metrics API_ 提供了一组基本的指标,以支持自动伸缩和类似的用例。 +该 API 提供有关节点和 Pod 的资源使用情况的信息, +包括 CPU 和内存的指标。如果将 Metrics API 部署到集群中, +那么 Kubernetes API 的客户端就可以查询这些信息,并且可以使用 Kubernetes 的访问控制机制来管理权限。 + +[HorizontalPodAutoscaler](/zh/docs/tasks/run-application/horizontal-pod-autoscale/) (HPA) 和 +[VerticalPodAutoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#readme) (VPA) +使用 metrics API 中的数据调整工作负载副本和资源,以满足客户需求。 + +你也可以通过 [`kubectl top`](/zh/docs/reference/generated/kubectl/kubectl-commands#top) 命令来查看资源指标。 + +{{< note >}} + +Metrics API 及其启用的指标管道仅提供最少的 CPU 和内存指标,以启用使用 HPA 和/或 VPA 的自动扩展。 +如果你想提供更完整的指标集,你可以通过部署使用 _Custom Metrics API_ 的第二个 +[指标管道](/zh/docs/tasks/debug-application-cluster/resource-usage-monitoring/#full-metrics-pipeline) 来作为简单的 Metrics API 的补充。 +{{< /note >}} + + +图 1 说明了资源指标管道的架构。 + +{{< mermaid >}} +flowchart RL +subgraph cluster[Cluster] +direction RL +S[

] +A[Metrics-
Server] +subgraph B[Nodes] +direction TB +D[cAdvisor] --> C[kubelet] +E[Container
runtime] --> D +E1[Container
runtime] --> D +P[pod data] -.- C +end +L[API
server] +W[HPA] +C ---->|Summary
API| A -->|metrics
API| L --> W +end +L ---> K[kubectl
top] +classDef box fill:#fff,stroke:#000,stroke-width:1px,color:#000; +class W,B,P,K,cluster,D,E,E1 box +classDef spacewhite fill:#ffffff,stroke:#fff,stroke-width:0px,color:#000 +class S spacewhite +classDef k8s fill:#326ce5,stroke:#fff,stroke-width:1px,color:#fff; +class A,L,C k8s +{{< /mermaid >}} + + +图 1. 资源指标管道 + +图中从右到左的架构组件包括以下内容: + +* [cAdvisor](https://github.com/google/cadvisor): 用于收集、聚合和公开 Kubelet 中包含的容器指标的守护程序。 +* [kubelet](/zh/docs/concepts/overview/components/#kubelet): 用于管理容器资源的节点代理。 + 可以使用 `/metrics/resource` 和 `/stats` kubelet API 端点访问资源指标。 +* [Summary API](#summary-api-source): kubelet 提供的 API,用于发现和检索可通过 `/stats` 端点获得的每个节点的汇总统计信息。 +* [metrics-server](#metrics-server): 集群插件组件,用于收集和聚合从每个 kubelet 中提取的资源指标。 + API 服务器提供 Metrics API 以供 HPA、VPA 和 `kubectl top` 命令使用。 Metrics Server 是 Metrics API 的参考实现。 +* [Metrics API](#metrics-api): Kubernetes API 支持访问用于工作负载自动缩放的 CPU 和内存。 + 要在你的集群中进行这项工作,你需要一个提供 Metrics API 的 API 扩展服务器。 + + + {{< note >}} + cAdvisor 支持从 cgroups 读取指标,它适用于 Linux 上的典型容器运行时。 + 如果你使用基于其他资源隔离机制的容器运行时,例如虚拟化,那么该容器运行时必须支持 + [CRI 容器指标](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/cri-container-stats.md) + 以便 kubelet 可以使用指标。 + {{< /note >}} + + + + +## Metrics API {#the-metrics-api} + +{{< feature-state for_k8s_version="1.8" state="beta" >}} + +metrics-server 实现了 Metrics API。此 API 允许你访问集群中节点和 Pod 的 CPU 和内存使用情况。 +它的主要作用是将资源使用指标提供给 K8s 自动缩放器组件。 + +下面是一个 `minikube` 节点的 Metrics API 请求示例,通过 `jq` 管道处理以便于阅读: + +```shell +kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/minikube" | jq '.' +``` + + +这是使用 `curl` 来执行的相同 API 调用: + +```shell +curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/nodes/minikube +``` + + +响应示例: + +```json +{ + "kind": "NodeMetrics", + "apiVersion": "metrics.k8s.io/v1beta1", + "metadata": { + "name": "minikube", + "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/minikube", + "creationTimestamp": "2022-01-27T18:48:43Z" + }, + "timestamp": "2022-01-27T18:48:33Z", + "window": "30s", + "usage": { + "cpu": "487558164n", + "memory": "732212Ki" + } +} +``` + + + +下面是一个 `kube-system` 命名空间中的 `kube-scheduler-minikube` Pod 的 Metrics API 请求示例, +通过 `jq` 管道处理以便于阅读: + +```shell +kubectl get --raw "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube" | jq '.' +``` + + +这是使用 `curl` 来完成的相同 API 调用: + +```shell +curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube +``` + + +响应示例: + +```json +{ + "kind": "PodMetrics", + "apiVersion": "metrics.k8s.io/v1beta1", + "metadata": { + "name": "kube-scheduler-minikube", + "namespace": "kube-system", + "selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube", + "creationTimestamp": "2022-01-27T19:25:00Z" + }, + "timestamp": "2022-01-27T19:24:31Z", + "window": "30s", + "containers": [ + { + "name": "kube-scheduler", + "usage": { + "cpu": "9559630n", + "memory": "22244Ki" + } + } + ] +} +``` + + + +Metrics API 在 [k8s.io/metrics](https://github.com/kubernetes/metrics) 代码库中定义。 +你必须启用 [API 聚合层](/zh/docs/tasks/extend-kubernetes/configure-aggregation-layer/)并为 +`metrics.k8s.io` API 注册一个 [APIService](/zh/docs/reference/kubernetes-api/cluster-resources/api-service-v1/)。 + +要了解有关 Metrics API 的更多信息, +请参阅资源 [Resource Metrics API Design](https://github.com/kubernetes/design-proposals-archive/blob/main/instrumentation/resource-metrics-api.md)、 +[metrics-server 代码库](https://github.com/kubernetes-sigs/metrics-server) 和 +[Resource Metrics API](https://github.com/kubernetes/metrics#resource-metrics-api)。 + + +{{< note >}} +你必须部署提供 Metrics API 服务的 metrics-server 或其他适配器才能访问它。 +{{< /note >}} + + +## 度量资源用量 {#measuring-resource-usage} + +### CPU + +CPU 报告为以 cpu 为单位测量的平均核心使用率。在 Kubernetes 中, +一个 cpu 相当于云提供商的 1 个 vCPU/Core,以及裸机 Intel 处理器上的 1 个超线程。 + +该值是通过对内核提供的累积 CPU 计数器(在 Linux 和 Windows 内核中)取一个速率得出的。 +用于计算 CPU 的时间窗口显示在 Metrics API 的窗口字段下。 + +要了解更多关于 Kubernetes 如何分配和测量 CPU 资源的信息,请参阅 +[CPU 的含义](/zh/docs/concepts/configuration/manage-resources-containers/#meaning-of-cpu)。 + + +### 内存 {#memory} + +内存报告为在收集度量标准的那一刻的工作集大小,以字节为单位。 + +在理想情况下,“工作集”是在内存压力下无法释放的正在使用的内存量。 +然而,工作集的计算因主机操作系统而异,并且通常大量使用启发式算法来产生估计。 + +Kubernetes 模型中,容器工作集是由容器运行时计算的与相关容器关联的匿名内存。 +工作集指标通常还包括一些缓存(文件支持)内存,因为主机操作系统不能总是回收页面。 + +要了解有关 Kubernetes 如何分配和测量内存资源的更多信息, +请参阅[内存的含义](/zh/docs/concepts/configuration/manage-resources-containers/#meaning-of-memory)。 + + +## Metrics 服务器 {#metrics-server} + +metrics-server 从 kubelet 中获取资源指标,并通过 Metrics API 在 Kubernetes API 服务器中公开它们,以供 HPA 和 VPA 使用。 +你还可以使用 `kubectl top` 命令查看这些指标。 + +metrics-server 使用 Kubernetes API 来跟踪集群中的节点和 Pod。metrics-server 服务器通过 HTTP 查询每个节点以获取指标。 +metrics-server 还构建了 Pod 元数据的内部视图,并维护 Pod 健康状况的缓存。 +缓存的 Pod 健康信息可通过 metrics-server 提供的扩展 API 获得。 + +例如,对于 HPA 查询,metrics-server 需要确定哪些 Pod 满足 Deployment 中的标签选择器。 + + +metrics-server 调用 [kubelet](/zh/docs/reference/command-line-tools-reference/kubelet/) API +从每个节点收集指标。根据它使用的度量服务器版本: + +* 版本 v0.6.0+ 中,使用指标资源端点 `/metrics/resource` +* 旧版本中使用 Summary API 端点 `/stats/summary` + + + +了解更多 metrics-server,参阅 [metrics-server 代码库](https://github.com/kubernetes-sigs/metrics-server)。 + +你还可以查看以下内容: + +* [metrics-server 设计](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/metrics-server.md) +* [metrics-server FAQ](https://github.com/kubernetes-sigs/metrics-server/blob/master/FAQ.md) +* [metrics-server known issues](https://github.com/kubernetes-sigs/metrics-server/blob/master/KNOWN_ISSUES.md) +* [metrics-server releases](https://github.com/kubernetes-sigs/metrics-server/releases) +* [Horizontal Pod Autoscaling](/zh/docs/tasks/run-application/horizontal-pod-autoscale/) + + + +### Summary API 来源 + +[Kubelet](/zh/docs/reference/command-line-tools-reference/kubelet/) 在节点、卷、Pod 和容器级别收集统计信息, +并在[Summary API](https://github.com/kubernetes/kubernetes/blob/7d309e0104fedb57280b261e5677d919cb2a0e2d/staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1/types.go) +中提供它们的统计信息供消费者阅读。 + + + +下面是一个 `minikube` 节点的 Summary API 请求示例: + +```shell +kubectl get --raw "/api/v1/nodes/minikube/proxy/stats/summary" +``` + + +这是使用 `curl` 来执行的相同 API 调用: + +```shell +curl http://localhost:8080/api/v1/nodes/minikube/proxy/stats/summary +``` + +{{< note >}} + +从 metrics-server 0.6.x 开始,Summary API `/stats/summary` 端点被 `/metrics/resource` 端点替换。 +{{< /note >}} diff --git a/content/zh/docs/tasks/debug/debug-cluster/resource-usage-monitoring.md b/content/zh/docs/tasks/debug/debug-cluster/resource-usage-monitoring.md new file mode 100644 index 0000000000..86345a09a8 --- /dev/null +++ b/content/zh/docs/tasks/debug/debug-cluster/resource-usage-monitoring.md @@ -0,0 +1,113 @@ +--- +content_type: concept +title: 资源监控工具 +--- + + + + + +要扩展应用程序并提供可靠的服务,你需要了解应用程序在部署时的行为。 +你可以通过检测容器检查 Kubernetes 集群中的应用程序性能, +[Pods](/zh/docs/concepts/workloads/pods), +[服务](/zh/docs/concepts/services-networking/service/) +和整个集群的特征。 +Kubernetes 在每个级别上提供有关应用程序资源使用情况的详细信息。 +此信息使你可以评估应用程序的性能,以及在何处可以消除瓶颈以提高整体性能。 + + + + +在 Kubernetes 中,应用程序监控不依赖单个监控解决方案。 +在新集群上,你可以使用[资源度量](#resource-metrics-pipeline)或 +[完整度量](#full-metrics-pipeline)管道来收集监视统计信息。 + + +## 资源度量管道 {#resource-metrics-pipeline} + +资源指标管道提供了一组与集群组件,例如 +[Horizontal Pod Autoscaler](/zh/docs/tasks/run-application/horizontal-pod-autoscale/) +控制器以及 `kubectl top` 实用程序相关的有限度量。 +这些指标是由轻量级的、短期、内存存储的 +[metrics-server](https://github.com/kubernetes-sigs/metrics-server) 收集的, +通过 `metrics.k8s.io` 公开。 + + +度量服务器发现集群中的所有节点,并且查询每个节点的 +[kubelet](/zh/docs/reference/command-line-tools-reference/kubelet/) +以获取 CPU 和内存使用情况。 +Kubelet 充当 Kubernetes 主节点与节点之间的桥梁,管理机器上运行的 Pod 和容器。 +kubelet 将每个 Pod 转换为其组成的容器,并在容器运行时通过容器运行时接口 +获取各个容器使用情况统计信息。 +kubelet 从集成的 cAdvisor 获取此信息,以进行旧式 Docker 集成。 +然后,它通过 metrics-server Resource Metrics API 公开聚合的 pod 资源使用情况统计信息。 +该 API 在 kubelet 的经过身份验证和只读的端口上的 `/metrics/resource/v1beta1` 中提供。 + + +## 完整度量管道 {#full-metrics-pipeline} + +一个完整度量管道可以让你访问更丰富的度量。 +Kubernetes 还可以根据集群的当前状态,使用 Pod 水平自动扩缩器等机制, +通过自动调用扩展或调整集群来响应这些度量。 +监控管道从 kubelet 获取度量值,然后通过适配器将它们公开给 Kubernetes, +方法是实现 `custom.metrics.k8s.io` 或 `external.metrics.k8s.io` API。 + + +[Prometheus](https://prometheus.io) 是一个 CNCF 项目,可以原生监控 Kubernetes、 +节点和 Prometheus 本身。 +完整度量管道项目不属于 CNCF 的一部分,不在 Kubernetes 文档的范围之内。 +