Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

30|系统监控:如何使用Metrics Server和Prometheus?

你好,我是 Chrono。
在前面的两节课里,我们学习了对 Pod 和对集群的一些管理方法,其中的要点就是设置资源配额,让 Kubernetes 用户能公平合理地利用系统资源。
虽然有了这些方法,但距离我们把 Pod 和集群管好用好还缺少一个很重要的方面——集群的可观测性。也就是说,我们希望给集群也安装上“检查探针”,观察到集群的资源利用率和其他指标,让集群的整体运行状况对我们“透明可见”,这样才能更准确更方便地做好集群的运维工作。
但是观测集群是不能用“探针”这种简单的方式的,所以今天我就带你一起来看看 Kubernetes 为集群提供的两种系统级别的监控项目:Metrics Server 和 Prometheus,以及基于它们的水平自动伸缩对象 HorizontalPodAutoscaler。

Metrics Server

如果你对 Linux 系统有所了解的话,也许知道有一个命令 top 能够实时显示当前系统的 CPU 和内存利用率,它是性能分析和调优的基本工具,非常有用。Kubernetes 也提供了类似的命令,就是 kubectl top,不过默认情况下这个命令不会生效,必须要安装一个插件 Metrics Server 才可以。
Metrics Server 是一个专门用来收集 Kubernetes 核心资源指标(metrics)的工具,它定时从所有节点的 kubelet 里采集信息,但是对集群的整体性能影响极小,每个节点只大约会占用 1m 的 CPU 和 2MB 的内存,所以性价比非常高。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何使用Metrics Server和Prometheus进行系统监控。首先,介绍了Metrics Server的安装和使用方法,以及如何使用命令`kubectl top`来查看集群当前的资源状态。其次,详细介绍了基于Metrics Server的水平自动伸缩对象HorizontalPodAutoscaler的使用方法,并通过示例展示了自动化扩容和缩容过程。接着,对Prometheus进行了简略介绍,包括其架构和部署过程。文章还提到了Prometheus的核心组件和在Kubernetes中的部署方式。最后,总结了Metrics Server和Prometheus的重要性,以及HorizontalPodAutoscaler的应用。整体来说,本文通过实际操作和示例,详细介绍了如何使用Metrics Server和HorizontalPodAutoscaler进行系统监控和自动化伸缩,为读者提供了实用的技术指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 入门实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(33)

  • 最新
  • 精选
  • 马以
    操作中遇到的问题以及解决办法 1: metris-server如果出现执行命令 kubectl top 不生效可以加如下配置 apiVersion: apps/v1 kind: Deployment metadata: ... template: .... spec: nodeName: k8s-master #你自己的节点名称 2: prometheus 镜像问题 这里我偷懒,不用骑驴找驴了,直接用老师的 这里我建议您push到docker hub (因为集群有多个节点,push到docker hub上,这样pod调度到任意一个节点都可以方便下载) docker pull chronolaw/kube-state-metrics:v2.5.0 docker tag chronolaw/kube-state-metrics:v2.5.0 k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0 docker rmi chronolaw/kube-state-metrics:v2.5.0 docker push k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0 prometheus-adapter 老师的版本运行不起来,我在docker hub上 找了一个可以用的 docker pull pengyc2019/prometheus-adapter:v0.9.1 docker tag pengyc2019/prometheus-adapter:v0.9.1 k8s.gcr.io/prometheus-adapter/prometheus-adapter:v0.9.1 docker rmi pengyc2019/prometheus-adapter:v0.9.1 docker push k8s.gcr.io/prometheus-adapter/prometheus-adapter:v0.9.1 然后执行: kubectl create -f manifests/setup kubectl create -f manifests 到此,运行成功

    作者回复: 感谢分享。 不知道为什么prometheus-adapter:v0.9.1有问题,可能我上传的是arm64版本的,有空再检查一下。 下载看了看,sha256是一样的,不知道哪里有问题。

    2022-09-06归属地:北京
    9
    12
  • 邵涵
    在使用hpa做自动扩容/缩容时,遇到了只扩容不缩容的问题,具体情况如下: 1. 按文中的步骤,使用ab加压,可以看到pod增加到了10个 [shaohan@k8s4 ~]$ kubectl get hpa ngx-hpa -w NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ngx-hpa Deployment/ngx-hpa-dep 150%/5% 2 10 2 90s ngx-hpa Deployment/ngx-hpa-dep 129%/5% 2 10 4 105s ngx-hpa Deployment/ngx-hpa-dep 93%/5% 2 10 8 2m ngx-hpa Deployment/ngx-hpa-dep 57%/5% 2 10 10 2m15s 2. 在ab停止运行之后过了几分钟,kubectl get hpa ngx-hpa -w的输出中才出现了一行新数据,如下 ngx-hpa Deployment/ngx-hpa-dep 0%/5% 2 10 10 7m31s 仍然是10个pod,并没有自动缩容 3. 查看pod [shaohan@k8s4 ~]$ kubectl get pod NAME READY STATUS RESTARTS AGE ngx-hpa-dep-86f66c75f5-d82rh 0/1 Pending 0 63s ngx-hpa-dep-86f66c75f5-dtc88 0/1 Pending 0 63s (其他ngx-hpa-dep-xxx省略,因为评论字数限制……) test 1/1 Running 1 (6s ago) 2m5s 可以看到,有两个pod是pending状态的,kubectl describe这两个pending pod中的一个,可以看到 Warning FailedScheduling 18s (x2 over 85s) default-scheduler 0/2 nodes are available: 1 Insufficient cpu, 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate. 是因为worker节点资源不足,master节点没有开放给pod调度,造成扩容时有两个pod虽然创建了,但一直在等待资源而没有进入running状态 4. 手动删除了用于执行ab的apache pod,释放资源,然后立刻查看pod,就只有两个了 kubectl get hpa ngx-hpa -w的输出中也出现了一行新数据 ngx-hpa Deployment/ngx-hpa-dep 0%/5% 2 10 2 7m46s 自动缩容成功执行了 所以,看起来,hpa是“严格按顺序执行的”,它按照规则设定的条件,要扩容到10个pod,在10个pod全都running之前,即使已经符合缩容的条件了,它也不执行缩容,而是要等到之前扩容的操作彻底完成,也就是10个pod全都running了,才会执行缩容

    作者回复: great!

    2022-11-01归属地:上海
    7
  • peter
    请教老师几个问题: Q1:Grafana 不是Prometheus的组件吧 架构图中标红色的是属于Prometheus,在UI方面,架构图中的”prometheus web ui”应该是Prometheus的组件吧。Grafana好像是一个公共组件,不是Prometheus独有的。 Q2: Prometheus部署后有四个POD的状态不是RUNNING blackbox-exporter-746c64fd88-ts299:状态是ImagePullBackOff prometheus-adapter-8547d6666f-6npn6:状态是CrashLoopBackOff, 错误信息: sc = Get "https://registry-1.docker.io/v2/jimmidyson/configmap-reload/manifests/sha256:91467ba755a0c41199a63fe80a2c321c06edc4d3affb4f0ab6b3d20a49ed88d1": net/http: TLS handshake timeout 好像和TLS有关,需要和Metrics Server一样加“kubelet-insecure-tls”吗?在哪个YAML文件中修改? Q3:Prometheus部署的逆向操作是什么? 用这两个命令来部署: kubectl create -f manifests/setup kubectl create -f manifests 部署后,如果想重新部署,需要清理环境,那么,怎么清理掉以前部署的东西? 和kubectl create -f manifests/setup相反的操作是“kubectl delete -f manifests/setup”吗?

    作者回复: 1. 是的。Grafana是独立的项目,图省事就和Prometheus在一起说了,可能造成了误解,抱歉。 2.镜像拉取失败和tls没关系,可以自己用docker pull命令再尝试一下。 3.create 换成delete,先是manifests,然后是setup,你的理解正确。

    2022-08-31归属地:北京
    7
  • ningfei
    prometheus-adapter里使用这个willdockerhub/prometheus-adapter:v0.9.1镜像,可以启动成功

    作者回复: good

    2022-09-02归属地:上海
    3
  • XXG
    metrics-server-85bc76798b-hr56n 0/1 ImagePullBackOff 原因: <1> 注意metrics-server版本,我拉下来的yml文件版本变成了v0.6.2,所以要根据最新的components.yaml文件中的metrics-server版本对应改一下老师的脚本; <2> 注意要在Worker节点执行脚本,我就在master节点上执行了好几遍。。。

    作者回复: good,多实践,集群管理和本机管理的差距较大,很多时候会弄混。

    2022-11-30归属地:上海
    2
  • dao
    简单的回答一下思考题, 1,会根据设置进行扩容(scale out),但是如果不满足 HPA 的指标条件,接着会立即进行缩容(scale in),下面是我的操作观察到的日志 --- Normal SuccessfulCreate 3s replicaset-controller Created pod: ngx-hpa-dep-86f66c75f5-z2gjk Normal SuccessfulCreate 3s replicaset-controller Created pod: ngx-hpa-dep-86f66c75f5-p46lr Normal SuccessfulDelete 3s replicaset-controller Deleted pod: ngx-hpa-dep-86f66c75f5-z2gjk Normal SuccessfulDelete 3s replicaset-controller Deleted pod: ngx-hpa-dep-86f66c75f5-p46lr --- 2,我现有的经验很有限,主要集中在单机/集群机器指标的监控,以及对于应用及产品的监控(通过监控日志实现的),同时结合一些告警系统(alert),以便快速发现故障及解决。 关注的指标有 CPU、内存、网卡、磁盘读写,应用的性能监控和错误率(可用性)监控。性能监控指标主要是响应时间(RT)、各种吞吐量(比如QPS)等。错误率指标主要是指应用错误及异常、HTTP错误响应代码等。

    作者回复: awesome!

    2022-10-02归属地:北京
    2
  • 放不下荣华富贵
    自动扩容的话,通常生产环境常用的指标是什么呢? 文中采用cpu占用率,比如md5sum是非常偏向于cpu运算的工作,但扩容可能并不能达到预期的效果(工作占满了一个核但是再多一个核却不能分摊这个工作)。 所以看起来系统负载而非占用率应该是更好的扩容指标,不知道我这么理解是否正确?

    作者回复: 还可以基于其他的一些自定义指标,Kubernetes在这里提供了一个很好的可扩展的框架。

    2022-09-01归属地:上海
    2
  • 运维赵宏业
    老师您好,请教下,多k8s集群的场景下,每个集群内都要部署一套kube-prometheus吗?感谢

    作者回复: 这个不是太确定,可能要对运维比较熟悉的同学来解答了,我理解应该是这样。

    2023-02-16归属地:北京
    1
  • Lorry
    老师,有没有办法能够让k8s访问宿主机网络?物理机安装prometus+grafana比较麻烦,如果能够直接通过docker/k8s装好就方便很多;但是现在生产/测试环境都是物理机环境,所以想要反向通过k8s的应用监控宿主机所在网络的服务。 应该怎么配置呢?

    作者回复: 可以的,有个hostNetwork属性,查一下资料,我们的课程里也用过一次。

    2023-02-05归属地:四川
    1
  • 邵涵
    安装metrics server之后,kubectl top执行失败,如下 [shaohan@k8s4 ~]$ kubectl top node Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io) 执行kubectl get apiservice v1beta1.metrics.k8s.io -o yaml看到 status: conditions: - lastTransitionTime: "2022-10-29T09:57:08Z" message: 'failing or missing response from https://10.98.115.140:443/apis/metrics.k8s.io/v1beta1: Get "https://10.98.115.140:443/apis/metrics.k8s.io/v1beta1": dial tcp 10.98.115.140:443: i/o timeout' reason: FailedDiscoveryCheck status: "False" type: Available 在components.yaml中给deployment对象添加hostNetwork: true(在spec->template->spec下)就可以解决这个问题

    作者回复: 感觉这个不是太好的办法,尽量不要用hostNetwork: true。

    2022-11-01归属地:上海
    3
    1
收起评论
显示
设置
留言
33
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部