前言

监控k8s集群,目前主流就是使用prometheus以及其周围的生态,本文开始介绍怎么一步步完成k8s监控的建设

环境准备

组件 版本
操作系统 Ubuntu 22.04.4 LTS
minikube v1.30.1
docker 24.0.7
prometheus v2.54.1
kube-state-metrics v2.13.0
node-exporter v1.8.2

下载编排文件

本文所有的编排文件,都在这里

 cd /tmp && git clone git@github.com:wilsonchai8/installations.git && cd installations/prometheus

使用minikube搭建k8s测试环境

1)下载 minikube

2)启动,minikube start

 minikube start
 docker ps | grep minikube
db877d660750 kicbase/stable:v0.0.39 "/usr/local/bin/entr…" 37 seconds ago Up 33 seconds 127.0.0.1:32782->22/tcp, 127.0.0.1:32781->2376/tcp, 127.0.0.1:32780->5000/tcp, 127.0.0.1:32779->8443/tcp, 127.0.0.1:32778->32443/tcp minikube

3)检查k8s是否正常工作

 kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 4m41s v1.26.3

这里需要注意一下,由于现在镜像地址全部被墙了,大家可以尝试这个方法解决

安装prometheus

1)创建命名空间

 kubectl create ns prometheus
namespace/prometheus created

2)启动

 cd /tmp/installations/prometheus
kubectl apply -f prometheus.yaml

检查是否启动

 kubectl -n prometheus get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
prometheus-deploy-8495dfd557-xcwnp 1/1 Running 0 2m52s 10.244.0.3 minikube <none> <none>

这里需要注意的是configmap的配置,由于是一步一步的演示,所以configmap的文件内容是一步一步的充实进去的,后面会慢慢修改

apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-cm
labels:
name: prometheus-cm
namespace: prometheus
data:
prometheus.yml: |-
global:
scrape_interval: 5s
evaluation_interval: 5s alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093'] rule_files:
- /etc/prometheus/*.rules scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']

3)访问页面服务

查看service配置,nodeport的端口是32648

 kubectl -n prometheus get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-service NodePort 10.99.231.160 <none> 9090:32648/TCP 12m
kubectl get node -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready control-plane 4d5h v1.26.3 192.168.49.2 <none> Ubuntu 20.04.5 LTS 6.8.0-45-generic docker://23.0.2

访问 192.168.49.2:32648

至此,prometheus已经安装完成了,监控的框架算是搭建起来了,但是没有监控指标,这并不是一个完整的监控系统,我们需要prometheus监控k8s的基础指标

安装k8s exporter

简单来说,exporter就是提供监控数据的组件,prometheus定期到exporter采集数据。而即将介绍的 kube-state-metrics ,就是专门用来提供k8s相关数据的exporter

而安装exporter也是非常简单的,exporter也是一个组件服务,只需要把它编排进k8s即可

 cd /tmp/installations/prometheus
kubectl apply -f kube-state-metrics.yaml

查看exporter是否启动

 kubectl -n kube-system get pod | grep kube-state-metrics
kube-state-metrics-6cd66dbcd8-4mqh4 1/1 Running 0 63s

exporter安装完成,需要告诉prometheus去采集新的exporter,修改prometheus configmap

apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-cm
labels:
name: prometheus-cm
namespace: prometheus
data:
prometheus.yml: |-
global:
scrape_interval: 5s
evaluation_interval: 5s alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093'] rule_files:
- /etc/prometheus/*.rules scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090'] # 从这里是新加的
- job_name: "prometheus-kube-state-metrics"
static_configs:
- targets: ["kube-state-metrics.kube-system:8080"]

修改了configmap之后,需要重启prometheus

 kubectl -n prometheus rollout restart deploy prometheus-deploy

重新打开页面之后查看,有新的监控指标被采集上来了

安装node exporter

需要注意的是,kube-state-metrics 并没有关注node相关的监控数据,这时候又有一个exporter需要上场了,那就是node-exporter

 cd /tmp/installations/prometheus
kubectl apply -f node-exporter.yaml

查看exporter是否启动成功

 kubectl -n prometheus get pod | grep node-exporter
node-exporter-q8rmq 1/1 Running 0 75s

node-exporter的工作方式与kube-state-metrics不一样,kube-state-metrics是借助k8s的服务发现能力,可以知道k8s集群内部到底有多少pod、deploy、service等资源的状态

node-exporter也是部署在k8s内部,通过daemonset的方式,在每一个节点启动一个采集服务,然后暴露api等待prometheus来采集数据,但是node-exporter自身并没有服务发现能力,所以在节点扩容或者缩容的时候,prometheus并不知道当前有多少节点需要采集。虽然prometheus不知道,但是k8s确知道当前集群有多少节点,所以这里node-exporter也需要借用k8s得服务发现的能力来自动发现当前的节点数

修改prometheus configmap

apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-cm
labels:
name: prometheus-cm
namespace: prometheus
data:
prometheus.yml: |-
global:
scrape_interval: 5s
evaluation_interval: 5s alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093'] rule_files:
- /etc/prometheus/*.rules scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090'] - job_name: "prometheus-kube-state-metrics"
static_configs:
- targets: ["kube-state-metrics.kube-system:8080"] # 从这里是新加的
- job_name: 'kubernetes-nodes'
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
action: replace
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)

修改了configmap之后,需要重启prometheus

 kubectl -n prometheus rollout restart deploy prometheus-deploy

这里已经可以看到node相关的指标了

切到Status --> Targets,可以看到通过k8s服务发现的节点

为了验证服务发现,我们新加一个节点

 minikube node add

检查新加节点

 kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 5d3h v1.26.3
minikube-m02 Ready <none> 70s v1.26.3

再去页面检查,已经自动发现了第二个节点

至此,一个可以监控k8s各种资源的监控系统已经初步达成

注意事项

由于本文是演示一步一步安装prometheus以及相关组件,所以配置文件也是一步一步累加出来的,最终呈现在仓库的配置文件是最终版,可以直接将编排文件fully apply,从而跳过这些调试步骤

联系我

  • 联系我,做深入的交流


至此,本文结束

在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

循规蹈矩--从零开始建设k8s监控(一)的更多相关文章

  1. [转帖]从零开始入门 K8s:应用编排与管理:Job & DaemonSet

    从零开始入门 K8s:应用编排与管理:Job & DaemonSet https://www.infoq.cn/article/KceOuuS7somCYbfuykRG 陈显鹭 阅读数:193 ...

  2. k8s监控api调用

    k8s监控api调用 curl -s --cacert /etc/kubernetes/ssl/ca.pem -basic -u fengjian:fengjian --insecure -X GET ...

  3. 从零开始搭建前端监控系统(三)——实现控制iframe前进后退

    前言 本系列文章旨在讲解如何从零开始搭建前端监控系统. 项目已经开源 项目地址: https://github.com/bombayjs/bombayjs (web sdk) https://gith ...

  4. [转帖]从零开始入门 K8s | 手把手带你理解 etcd

    从零开始入门 K8s | 手把手带你理解 etcd https://zhuanlan.zhihu.com/p/96721097 导读:etcd 是用于共享配置和服务发现的分布式.一致性的 KV 存储系 ...

  5. 从零开始入门 K8s | Kubernetes 存储架构及插件使用

    本文整理自<CNCF x Alibaba 云原生技术公开课>第 21 讲. 导读:容器存储是 Kubernetes 系统中提供数据持久化的基础组件,是实现有状态服务的重要保证.Kubern ...

  6. Kubernetes_从零开始搭建k8s集群(亲测可用)

    一.前言 本文讲述从零开始搭建k8s集群,均使用国内镜像,版本均统一,使用两个虚拟机,一个主节点,一个从节点,保证k8s一次搭建成功. 注意:Kubernetes,简称K8s,是用8代替名字中间的8个 ...

  7. 从零开始入门 K8s | 可观测性:监控与日志

    作者 | 莫源  阿里巴巴技术专家 一.背景 监控和日志是大型分布式系统的重要基础设施,监控可以帮助开发者查看系统的运行状态,而日志可以协助问题的排查和诊断. 在 Kubernetes 中,监控和日志 ...

  8. prometheus和metrucs-server (k8s监控)

    资源指标:metrucs-server 自定义指标:prometheus, k8s-prometheus-adapter(转换prometheus数据的格式) 新一代架构: 核心指标流水线:由kube ...

  9. 从零开始入门 K8s | 应用编排与管理:Job & DaemonSet

    一.Job 需求来源 Job 背景问题 首先我们来看一下 Job 的需求来源.我们知道 K8s 里面,最小的调度单元是 Pod,我们可以直接通过 Pod 来运行任务进程.这样做将会产生以下几种问题: ...

  10. 从零开始入门 K8s | Kubernetes 网络概念及策略控制

    作者 | 阿里巴巴高级技术专家  叶磊 一.Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法.大家知道 Kubernetes 对于网络具体实现方案,没有什 ...

随机推荐

  1. 基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!

    前言 今天大姚给大家分享一款基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用:ZR.Admin.NET. 开源免费(基于MIT License开源协议).代码量少.学习简单. ...

  2. jacoco代码覆盖率工具配置

    参考文章: https://blog.csdn.net/skh2015java/article/details/121775806 解决引入jacoco依赖并配置后,执行maven clean tes ...

  3. python+ffmpeg视频转码转格式

    本文转发来自:https://blog.csdn.net/KH_FC/article/details/115771126 废话 python目前自己也是在学习当中,对python也不是特别精通,写视频 ...

  4. Linux+Nginx+Php+MariaDB+Redis部署

    目录 工作机制 系统环境描述 部署Nginx 安装 启动 测试并访问 部署PHP 安装 启动 配置Nginx 测试 部署MariaDB 安装 启动 配置php支持 测试 部署Redis 安装 启动 配 ...

  5. spring下 -spring整体架构,JdbcTemplate笔记

    2,搭建Java Maven项目 我的idea是2024.1.1版本,创建普通Maven项目如下图: 用的jdk8,项目名可以自己改,Archetype选图中的第一个就行,之后点 create. 创建 ...

  6. SQL Server创建用户只能访问指定数据库和视图

    我们在给数据库用户赋予权限时,有时候不想让该用户看到太多过程表和过程视图,这时就需要限定用户的访问权限 第一步:创建用户 创建数据库连接后,进入安全性--登录名,单击右键,新建登录名,并设置默认数据库 ...

  7. AI游戏外挂:强化学习算法用于棋牌类游戏的最优出牌策略 —— 如何在“斗地主”中使用AI技术获得最高胜率

    相关: https://zh.wikipedia.org/wiki/十三張 去年原打算接的一个小项目,不过后来没有搞下去,这里只记录一下. 这个项目的主要需要完成的一个功能就是图像识别,识别屏幕上的牌 ...

  8. 4.6 Linux解压.gz格式的文件(gunzip命令)

    gunzip 是一个使用广泛的解压缩命令,它用于解压被 gzip 压缩过的文件(扩展名为 .gz). 对于解压被 gzip 压缩过的文件,还可以使用 gzip 自己,即 gzip -d 压缩包. gu ...

  9. ARC143D Bridges

    ARC143D Bridges 巧妙的图论题. 思路 分析题目,发现很像拆点. 由于拆点要设置出入点,这里我们也把 \(a_i\) 设成入点,把 \(a_i+n\) 设成出点,再次分析问题. 考虑我们 ...

  10. vue2-vuex

    专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应 用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信 应用场景: 多个组 ...