【Kubernetes】资源指标管道——部署Metrics Server

  • Post author:
  • Post category:其他

1. Metrics API

Metrics API 包括 Custom Metrics API(自定义指标 API)和 Resource Metrics API(资源指标 API)。我们一般说的 Metrics API 泛指 Resource Metrics API,也就是通过 kubectl top 命令访问的API,是侠义上的。

1.1 什么是Metrics API

Metrics API,即Kubernetes Resource Metrics API。它是Kubernetes API组中的一员,在集群中提供了一组基本的指标( 允许管理员访问集群中节点和 Pod 的 CPU 和内存使用情况。),以支持自动伸缩和类似的用例。

1.2 Metrics API 的作用

  • 它的主要作用是将资源使用指标提供给 K8s 自动扩缩器组件。
  • Metrics API 提供有关节点和 Pod 的资源使用情况的信息, 包括 CPU 和内存的指标。
  • Metrics API可以监听K8s集群中每个节点和Pod的CPU和内存使用量。
  • 如果将 Metrics API 部署到集群中, 那么 Kubernetes API 的客户端就可以查询这些信息,并且可以使用 Kubernetes 的访问控制机制来管理权限。

1.3 Metrics API 的使用

  • HorizontalPodAutoscaler (HPA) 和 VerticalPodAutoscaler (VPA) 使用 metrics API 中的数据调整工作负载副本和资源,以满足客户需求。
  • Kubernetes管理员也可以通过 kubectl top 命令来查看资源指标。

1.4 资源指标管道架构

在这里插入图片描述

图中从右到左的架构组件包括以下内容:

  • cAdvisor: 用于收集、聚合和公开 Kubelet 中包含的容器指标的守护程序。
  • kubelet: 用于管理容器资源的节点代理。 可以使用 /metrics/resource 和 /stats kubelet API 端点访问资源指标。
  • Summary API: kubelet 提供的 API,用于发现和检索可通过 /stats 端点获得的每个节点的汇总统计信息。
  • metrics-server: 集群插件组件,用于收集和聚合从每个 kubelet 中提取的资源指标。 API 服务器提供 Metrics API 以供 HPA、VPA 和 kubectl top 命令使用。Metrics Server 是 Metrics API 的参考实现。
  • Metrics API: Kubernetes API 支持访问用于工作负载自动扩缩的 CPU 和内存。使用Metrics API的前提是部署提供 Metrics API 的 API 扩展服务器。

2. Metrics Server

2.1 什么是 Metrics Server

Kubernetes Metrics Server (Kubernetes指标服务器),它是一个可扩展的、高效的容器资源度量源

Metrics Server is a scalable, efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines.

2.2 Metrics Server 的作用

Metrics Server 用于监控每个 Node 和 Pod 的负载(用于Kubernetes内置自动扩缩管道)。Metrics Server从Kubelets 收集资源指标,并通过 Metrics API 在Kubernetes apiserver中公开,供 Horizontal Pod Autoscaler 和 Vertical Pod Autoscaler 使用。Metrics API 也可以通过 kubectl top 访问,使其更容易调试自动扩缩管道。

2.3 Metrics Server 特点

  • 在大多数集群上只需要部署一个实例。
  • 快速自动扩缩,每15秒收集一次指标。
  • 资源效率高,集群中的每个节点使用1mili 核心 CPU 和 2MB 的内存。
  • 可扩展支持高达5000个节点的集群。

2.4 Metrics Server 使用场景

  • 水平自动扩缩。基于CPU/内存的水平自动扩缩
  • 垂直扩索。自动调整/建议容器所需的资源

以下使用场景是 Metrics Server 不支持的:

  • 非 Kubernetes 集群
  • 需要资源使用指标的准确来源
  • 基于 CPU/内存以外的其他资源的水平自动缩放。

对于不受支持的用例,建议使用Prometheus 等完整的监控解决方案。

3. Metrics Server 和 Metric API 的关系

Metrics Server 实现了 Metrics API。管理员必须部署提供 Metrics API 服务的 metrics-server 或其他适配器才能访问它。

因为 Metrics API 不在默认的Kubernetes API组中,它需要通过如 Metrics Server 添加至K8s集群的API组中,才能使用户通过客户端访问它。

  • Metrics API 在 k8s.io/metrics 代码库中定义。管理员必须启用 API 聚合层并为 metrics.k8s.io API 注册一个 APIService,才能让 Metrics API 出现在K8s API组中。
  • 配置聚合层可以允许 Kubernetes apiserver 使用其它 API 扩展,这些 API 不是核心 Kubernetes API 的一部分。

Resource Metrics API 由 metrics-serverprometheus-adapter 实现。

image-20221003234435267

4. 安装 Metrics Server

4.1 环境预设

正常运行的,完整的kubernetes集群,包括已经安装好calico网络和coredns。

具体详见:https://github.com/kubernetes-sigs/metrics-server#requirements

4.2 部署 Metrics Server

部署metrics server有两种方法:

  • 使用官方Helm图表(Chart)安装。
  • 使用YAML清单安装。

Chart包和YAML清单下载地址是:https://github.com/kubernetes-sigs/metrics-server/releases

(1)使用 Helm

1)下载 chart

wget https://github.com/kubernetes-sigs/metrics-server/releases/download/metrics-server-helm-chart-3.8.2/metrics-server-3.8.2.tgz

2)解压、备份和修改 chart

# 解压 chart
tar zxvf metrics-server-3.8.2.tgz
# 进入 metrics-server 目录
cd metrics-server
# 查看并复制 ci/ci-values.yaml中的参数
cat ci/ci-values.yaml

image-20221003024449358

# 备份 values.yaml
cp values.yaml values.yaml.bak
# 修改 values.yaml
vim values.yaml

修改内容如下所示

# 通过 diff 命令对比修改前后的文件内容。
# diff values.yaml values.yaml.bak
6c6
<   repository: bitnami/metrics-server
---
>   repository: k8s.gcr.io/metrics-server/metrics-server
8c8
<   tag: "0.6.1"
---
>   tag: ""
77d76
<   - --kubelet-insecure-tls

修改说明:

  • 官方chart包中的镜像默认是k8s.gcr.io/metrics-server/metrics-server,国内无法访问谷歌镜像库,因此需要先到docker hub中找到对应版本的容器镜像,再与之替换即可。
  • chart包中默认镜像标签是 v0.6.1,而我们替换的镜像标签是 0.6.1 。
  • 访问kubernetes API服务器默认需要kubelet证书,通过向Metrics Server传递 --kubelet-insecure-tls 来禁用证书验证。

3)部署 metrics-server

返回到 metrics-server 文件夹的上级目录

root@k8s-01:~/metrics-server/metrics-server# cd ../
root@k8s-01:~/metrics-server# helm install metrics-server metrics-server
NAME: metrics-server
LAST DEPLOYED: Sun Oct  2 18:48:30 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
***********************************************************************
* Metrics Server                                                      *
***********************************************************************
  Chart version: 3.8.2
  App version:   0.6.1
  Image tag:     bitnami/metrics-server:0.6.1
***********************************************************************

4)tips 说明

helm默认安装在default命名空间内。

(2)YAML 清单

1)下载、备份和修改 YAML 清单

# 下载 YAML 清单
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 备份 YAML 清单
cp components.yaml components.yaml.bak
# 比较修改后的 YAML 清单
# diff components.yaml components.yaml.bak
135d134
<         - --kubelet-insecure-tls
141c140
<         image: bitnami/metrics-server:0.6.1
---
>         image: k8s.gcr.io/metrics-server/metrics-server:v0.6.1

修改解释见使用Helm安装的步骤。

2)部署 metrics-server

kubectl apply -f components.yaml

等待30s 后,metrics-server 部署成功。

3)tips 说明

  • 使用 YAML 清单部署的 metrics-server 默认命名空间是 kube-system。

4.3 查看 metrics-server 以及 节点和 Pod 指标值

kubectl get pod -n kube-system
kubectl top node
kubectl top pod

image-20221003234329520

输出参数:

  • CPU(cores)下的291m中的 m 表示一个微核心,1核 = 1000核心
  • 使用lscpu命令查看虚拟机的cpu核心数,发现有两个核心,2核大概为2000m

image-20210507211644969

假如使用kubectl top nodes出现下面的现象,可能是因为kubernetes集群网络cacoli的配置的网段和构建集群的网段不一致。

[root@vm31 ~]# kubectl top nodes  --use-protocol-buffers
NAME   CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
vm31   232m         11%    1395Mi          36%       
vm32   <unknown>          <unknown>      <unknown>            <unknown>        
vm33   <unknown>          <unknown>      <unknown>            <unknown>    

5. 参考资料


版权声明:本文为NOWSHUT原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。