当前位置:首页 > 随笔 > 正文内容

Kubernetes资源指标与自定义指标API实践指南

访客 随笔 2026年6月3日 1

一、背景说明

早期Kubernetes集群依赖Heapster收集资源指标以实现监控功能,但自Kubernetes 1.8版本起,Heapster逐渐被废弃,取而代之的是基于API的资源指标监控体系。该体系包含两条主要流水线:

  • 核心指标流水线:由kubelet、metrics-server和API Service组成,提供CPU累计使用率、内存实时使用率、Pod资源占用率及容器磁盘占用率等基础指标。
  • 监控流水线:用于收集系统各类指标数据,提供给终端用户、存储系统和HPA(自动扩缩容)。该流水线包含核心指标和非核心指标,其中非核心指标无法被Kubernetes原生解析,需借助其他组件转换。

二、metrics-server部署

2.1 下载与安装

从Kubernetes官方仓库的对应版本分支(如v1.10.0)下载metrics-server所需的YAML文件:

mkdir metrics-server && cd metrics-server
for file in auth-delegator.yaml auth-reader.yaml metrics-apiservice.yaml metrics-server-deployment.yaml metrics-server-service.yaml resource-reader.yaml; do
    wget https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.0/cluster/addons/metrics-server/$file
done

检查镜像并替换为可拉取的镜像源:

grep image: ./*
# 若镜像不可用,手动拉取并修改配置文件
docker pull registry.cn-hangzhou.aliyuncs.com/k8s-kernelsky/metrics-server-amd64:v0.2.1
docker pull registry.cn-hangzhou.aliyuncs.com/criss/addon-resizer:1.8.1
# 修改metrics-server-deployment.yaml中的镜像地址

应用所有YAML文件并检查Pod状态:

kubectl apply -f .
kubectl get pod -n kube-system

2.2 验证功能

# 检查API版本
kubectl api-versions | grep metrics
# 启动代理并测试API
kubectl proxy --port=8080 &
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/pods
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/nodes
# 使用kubectl top命令查看资源
kubectl top node
kubectl top pods

2.3 注意事项

在高版本Kubernetes(v1.11及以上)中部署metrics-server时需注意:

  • 数据获取端口变更:从默认的10255(HTTP)改为10250(HTTPS),需修改启动参数:
--source=kubernetes.summary_api:https://kubernetes.default?kubeletHttps=true&kubeletPort=10250&insecure=true
  • RBAC权限补充:在resource-reader.yaml的ClusterRole中增加nodes/stats资源:
rules:
- apiGroups: [""]
  resources: ["pods", "nodes", "nodes/stats", "namespaces"]
  • 针对Kubernetes v1.12.3版本,需调整metrics-server的启动命令:
command:
  - /metrics-server
  - --metric-resolution=30s
  - --kubelet-port=10250
  - --kubelet-insecure-tls
  - --kubelet-preferred-address-types=InternalIP

三、Prometheus部署

3.1 获取YAML文件

cd /mnt
git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes/cluster/addons/prometheus
git checkout v1.11.0
cp -r prometheus /root/manifests/
cd /root/manifests/prometheus

3.2 修改配置

将默认的命名空间从kube-system改为自定义空间k8s-monitor:

sed -i 's/namespace: kube-system/namespace: k8s-monitor/g' ./*

创建所需PV,注意storageClassName需与StatefulSet定义一致:

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
  name: alertmanager
spec:
  capacity:
    storage: 5Gi
  accessModes: ["ReadWriteOnce", "ReadWriteMany"]
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/v1
    server: 172.16.150.158
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: standard
spec:
  capacity:
    storage: 25Gi
  accessModes: ["ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: standard
  nfs:
    path: /data/volumes/v2
    server: 172.16.150.158
EOF
kubectl create namespace k8s-monitor

将组件文件分类整理:

mkdir node-exporter kube-state-metrics alertmanager prometheus
mv node-exporter-* node-exporter
mv alertmanager-* alertmanager
mv kube-state-metrics-* kube-state-metrics
mv prometheus-* prometheus

3.3 安装node-exporter

kubectl apply -f node-exporter/
kubectl get pod -n k8s-monitor

3.4 安装Prometheus

kubectl apply -f pv.yaml
kubectl get pv
# 修改prometheus-service.yaml,将类型改为NodePort以外部访问
type: NodePort
ports:
  - name: http
    port: 9090
    nodePort: 30090
kubectl apply -f prometheus/
kubectl get pod -n k8s-monitor
kubectl get svc -n k8s-monitor

访问Prometheus UI:http://节点IP:30090

3.5 部署metrics适配器

# 检查镜像
grep image: ./*
# 拉取替代镜像并修改配置
docker pull registry.cn-hangzhou.aliyuncs.com/ccgg/addon-resizer:1.7
kubectl apply -f kube-state-metrics-deployment.yaml
kubectl get pod -n k8s-monitor

3.6 部署k8s-prometheus-adapter

生成HTTPS证书并创建Secret:

cd /etc/kubernetes/pki
(umask 077; openssl genrsa -out serving.key 2048)
openssl req -new -key serving.key -out serving.csr -subj "/CN=serving"
openssl x509 -req -in serving.csr -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -out serving.crt -days 3650
kubectl create secret generic cm-adapter-serving-certs \
  --from-file=serving.crt=./serving.crt \
  --from-file=serving.key=./serving.key \
  -n k8s-monitor

克隆适配器项目并部署:

git clone https://github.com/DirectXMan12/k8s-prometheus-adapter.git
cd k8s-prometheus-adapter/deploy/manifests
# 修改命名空间(排除rolebinding文件)
sed -i 's/namespace: custom-metrics/namespace: k8s-monitor/g' ./*
kubectl apply -f ./
kubectl get pod -n k8s-monitor
kubectl get svc -n k8s-monitor
kubectl api-versions | grep custom

四、Grafana可视化集成

4.1 部署Grafana

wget https://raw.githubusercontent.com/kubernetes-retired/heapster/master/deploy/kube-config/influxdb/grafana.yaml
# 修改grafana.yaml:注释influxdb环境变量,修改namespace和端口类型为NodePort
kubectl apply -f grafana.yaml
kubectl get svc -n k8s-monitor
kubectl get pod -n k8s-monitor

4.2 配置数据源

登录Grafana后,配置Prometheus数据源:

  • URL:http://prometheus.k8s-monitor.svc:9090
  • Access:Browser

4.3 导入Dashboard模板

从Grafana官网下载Kubernetes相关模板(如"Kubernetes Cluster (Prometheus)"),通过JSON文件导入。

五、HPA自动扩缩容实现

5.1 基于v1版本的HPA

创建测试Deployment:

kubectl autoscale deployment myapp-deploy --min=1 --max=8 --cpu-percent=60
# 压力测试
ab -c 1000 -n 5000000 http://172.16.150.213:32222/index.html
kubectl describe hpa myapp-deploy
kubectl get hpa

5.2 基于v2beta1版本的HPA

cat << EOF | kubectl apply -f -
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa-v2
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp-deploy
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 55
  - type: Resource
    resource:
      name: memory
      targetAverageValue: 100Mi
EOF
kubectl delete hpa myapp-deploy
kubectl apply -f hpa-demo.yaml
kubectl get hpa
kubectl describe hpa myapp-hpa-v2

5.3 自定义指标HPA

使用带自定义指标的镜像:

cat << EOF | kubectl apply -f -
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa-v2
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp-deploy
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metricName: http_requests
      targetAverageValue: 800m
EOF
kubectl apply -f hpa-custom.yaml
kubectl describe hpa myapp-hpa-v2

相关文章

可以按小时收费的VPS

很多 VPS 提供商都支持 按小时计费(hourly billing),想短期试用 / 临时搭建节点、测试网络、短期项目等场景非常合适。下面是当前最主流且靠谱的按小时 VPS 选项,分别按不同需求场景整理: 1. Vultr(全球节点,包括日本) 按小时计费 可选机房:东京 / 大阪 / 洛杉矶 / 法兰克福 / 伦敦 … 支持 PayPal(部分情况),但更常用信用卡/PayPal+卡价格参考$...

在 iPhone 上下载国外App

地区/国家限制App Store 会根据 Apple ID 的国家或地区限制应用下载。如果你的 Apple ID 绑定的是中国大陆,就可能无法下载 OpenAI 官方的 ChatGPT 应用,因为它在大陆 App Store 不上架。解决办法:换成美国、加拿大、香港等地区的 Apple ID。或者在现有 Apple ID 上更改地区。注册一个国外 Apple ID(推荐)比如注册 美国区 Appl...

Node.js 中的异步编程:回调与 Promise

Node.js 是一个基于 JavaScript 构建的单线程、非阻塞运行环境,它通过异步编程机制来高效处理多个操作。在执行如文件读取、API 请求或数据库查询等任务时,Node.js 不会等待这些操作完成,而是使用回调函数和 Promise 来避免阻塞主线程。 回调方式实现异步 那么当异步操作完成后,Node.js 如何知道接下来要做什么呢?这就要用到 回调函数(callback)。 回调本质上...

Selenium自动化测试入门指南

Selenium自动化测试入门指南

什么是自动化测试? 自动化测试是指利用软件工具自动执行测试用例,模拟用户操作,如打开网页、点击链接、输入文本等,并验证结果是否符合预期。 其主要优点包括: 大幅减少人工成本 测试速度快 可以在非工作时间运行 支持持续集成和交付 然而,它也存在一些局限性,例如开发成本较高、不适合快速变化的项目、依赖稳定的UI界面等。 自动化测试的应用条件 适合引入自动化测试的情况包括: 手动测试耗时且需要大量...

MariaDB Galera集群故障快速恢复指南

OpenStack控制节点采用三节点MariaDB Galera集群架构。当数据库集群因故障重启时,有时会出现Galera集群无法正常启动的问题。虽然有多种方法可以恢复数据库服务,但如何实现快速启动同时确保数据完整性呢? 通过分析日志发现,MariaDB Galera集群节点宕机时会在日志中输出以下信息: [Note] WSREP: 新集群视图:全局状态: 874d8e7e-5980-11e8-8...

Android 中 EventBus 的通信机制与实现原理深度解析

EventBus 核心设计思想 EventBus 是一个基于观察者模式的事件总线框架,广泛应用于 Android 平台以实现组件解耦。它通过中心化的消息分发机制,使不同层级、不同线程的对象能够以"发布-订阅"方式通信,避免了传统接口回调或广播带来的强依赖问题。 核心角色说明 事件(Event):任意 Java 对象,作为数据载体,如网络状态变更通知、用户登录信息等。 发布者(Publi...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。