通过MetricsAPI监控pod资源使用情况(k8s资源监控,java)

1. 目的:简单监控pod

在这里插入图片描述
我想使用java监控k8s pod的资源的简单使用情况,但是k8s内部并没有采集资源的实现。

但是k8s提供了一套k8s的对接标准,只要适配这套标准,就可以通过kubelet采集资源数据,并且通过k8s api服务器输出。这些对于故障排查以及自动伸缩至关重要

2. 部署指南

metrics-server是Kubernetes的一个集群范围内的聚合器,用于收集所有节点和Pods的资源使用信息,如CPU和内存。metrics指标统计器(github)

  1. 如果证书没问题,部署最新的metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.1/components.yaml
  1. 如果你的集群使用自签名的证书,你可能需要添加参数来忽略 TLS 验证错误

把commponents.yaml wget下来后, 在 components.yaml 文件中,找到 metrics-server 的 Deployment 部分,并添加以下参数到 args:

- --kubelet-insecure-tls
  1. 查看是否部署成功
kubectl get deployment metrics-server -n kube-system

在这里插入图片描述

# 查看所有命名空间的pod资源
kubectl top pods -A

在这里插入图片描述
top 命令就可以使用了。

3. java Api调用

在官方提供的客户端 java库里是没有直接调用metrics的方法的。我们只能使用restful api进行访问,

  1. 添加maven依赖(获取tls上下文,如果只是过去资源可以不添加)
<dependency>
            <groupId>io.kubernetes</groupId>
            <artifactId>client-java</artifactId>
            <version>18.0.0</version>
        </dependency>
  1. 测试restful api(测试,可不做)
    我这里是手动把证书导入到了postman(k8s的权限认证非常关键,没有权限是无法访问api的)
    在这里插入图片描述
  2. java访问 restapi
    我这里吧k8s 客户端和 rest http前后文都注入spring了,这样调用起来比较方便

注入k8s客户端

在这里插入代码片@Configuration
public class KubernetesClientConfig {
         @Bean
    public AppsV1Api appsV1Api(ApiClient apiClient) {
        return  new AppsV1Api(apiClient);
    }

}

在这里插入图片描述
注入8sRestTemplate

@Configuration
public class RestTemplateConfig {
    private final ApiClient apiClient;

    public RestTemplateConfig(ApiClient apiClient) {
        this.apiClient = apiClient;
    }
    @Bean
    public RestTemplate extendK8sRestTemplate() {
       return  new RestTemplate(new OkHttp3ClientHttpRequestFactory(apiClient.getHttpClient()));

    }

}

在这里插入图片描述
4. 定时任务读取该数据,存储到redis,保留60分钟,可以根据自动目的设置。

里面代码看起来比较杂乱,整体思路是使用上面注入的extendK8sRestTemplate访问api,然后存入redis,只保留30分钟

@Service
public class LogResourceTaskService implements TaskService {
    @Resource
    private final RedisService redisService;
    @Resource
    private final RestTemplate extendK8sRestTemplate;
    @Resource

    private final KubernetesServiceImpl kubernetesServiceImpl;
    @Resource

    private final ApiClient apiClient;
    public LogResourceTaskService(RedisService redisService,RestTemplate extendK8sRestTemplate, KubernetesServiceImpl kubernetesServiceImpl,ApiClient apiClient) {
        this.redisService = redisService;
        this.extendK8sRestTemplate = extendK8sRestTemplate;
        this.apiClient = apiClient;
        this.kubernetesServiceImpl = kubernetesServiceImpl;

    }

    @Override
    public void work(String guid) {
        String mapKey0 = "metrics_cpu:"+PodDataSynConfig.CURRENT_POD;
        String mapKey1 = "metrics_memory:"+PodDataSynConfig.CURRENT_POD;

        String url = String.format("%s/apis/metrics.k8s.io/v1beta1/namespaces/%s/pods/%s", apiClient.getBasePath(),kubernetesServiceImpl.getNamespace(), PodDataSynConfig.CURRENT_POD);
        ResponseEntity<PodMetrics> response =  extendK8sRestTemplate.getForEntity(url, PodMetrics.class);

        if (response.getBody() != null && response.hasBody()){
            if(response.getBody().getContainers() != null && response.getBody().getContainers().get(0) != null){
                String cpu = response.getBody().getContainers().get(0).getUsage().getCpu();
                String memory = response.getBody().getContainers().get(0).getUsage().getMemory();
                long timestamp = Instant.now().getEpochSecond();

                redisService.getRedisTemplate().opsForZSet().add(mapKey0, timestamp+":"+cpu,timestamp);
                redisService.getRedisTemplate().opsForZSet().add(mapKey1, timestamp+":"+memory,timestamp);
            }
        }
        removeOldData(mapKey0,mapKey1);
        
    }
    public void removeOldData(String key0, String key1) {
        long cutoffTimestamp = Instant.now().getEpochSecond() - 3600; // 60分钟前
        redisService.getRedisTemplate().opsForZSet().removeRangeByScore(key0, -Double.MAX_VALUE, cutoffTimestamp);
        redisService.getRedisTemplate().opsForZSet().removeRangeByScore(key1, -Double.MAX_VALUE, cutoffTimestamp);

    }

}

4. 完工:

这样简单读取pod资源的任务就完成了,主要步骤就是 metrics server服务器的部署,然后使用restful api读取信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/394813.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

甲醇汽车产量不断增加 行业发展面临一定困难和挑战

甲醇汽车产量不断增加 行业发展面临一定困难和挑战 甲醇汽车是指以甲醇作为主要或者唯一燃料的汽车。与传统汽车相比&#xff0c;甲醇汽车具有节能减排、使用成本低、有害气体排放量少等优点&#xff0c;能够有效缓解能源紧缺及环境污染问题。 从上游市场来看&#xff0c;甲醇…

软考30-上午题-数据结构-小结

一、杂题汇总 真题1&#xff1a; 有向图——AOV 带权有向图——AOE 真题2&#xff1a; 二叉排序树&#xff1a;左子树< 根节点 < 右子树。 二叉排序树中序遍历&#xff0c;节点关键字有序&#xff08;递增&#xff09;&#xff1b; 关键字初始序列有序&#xff0c;二叉树…

MyBatis--08--分页插件PageHelper

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.分页插件PageHelper1.1 mysql中 limit 关键字含义1.2 PageHelper 官网https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md](ht…

GptSoVits音频教程

这个号称5秒克隆&#xff0c;或者用1分钟音频训练10分钟就能达到原声效果。 5秒的号称&#xff0c;只要是&#xff0c;什么几秒的&#xff0c;大家可以完全不要想了&#xff0c;什么知更鸟&#xff0c;什么火山&#xff0c;包括本次的GptSoVits的效果肯定是不行的&#xff0c;…

盲盒小程序开发:创新科技与消费者心理的完美结合

随着科技的飞速发展&#xff0c;小程序已经深入到我们生活的方方面面。而在众多小程序中&#xff0c;盲盒小程序以其独特的魅力&#xff0c;吸引了大量消费者的关注。本文将探讨盲盒小程序的发展背景、市场需求、开发流程以及未来趋势&#xff0c;以期为相关行业的从业者提供一…

IDEA导入外部项目的系列问题:java代码文件不识别以及the output path is not specified for module

IDEA导入外部项目的系列问题&#xff1a;java代码文件不识别以及the output path is not specified for module 引言导入后java代码不识别the output path is not specified for module 引言 分享一点Java使用的经验。 java小白引入外部项目&#xff08;zip类型的项目&#xf…

电商数据分析数据统计数据监控必备-电商API电商数据接口

API&#xff0c;全称Application Programming Interface&#xff0c;是一种用于不同应用程序间通信的接口&#xff0c;它允许不同的应用程序之间交换数据和功能。API可以理解为应用程序提供给其他应用程序或开发者的接口&#xff0c;通过这个接口&#xff0c;其他应用程序或开发…

代理IP是什么?如何选择?使用指纹浏览器为什么需要代理?

随着跨境电商行业竞争的加剧&#xff0c;多账号运营成为了一种普遍的策略&#xff0c;旨在最大化市场覆盖面和用户参与度。但是&#xff0c;这种策略带来了一个不容忽视的问题&#xff1a;如何保护您的在线隐私和安全性&#xff1f;这就是代理IP发挥作用的地方。代理IP是一种技…

2023年【四川省安全员B证】最新解析及四川省安全员B证新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年四川省安全员B证最新解析为正在备考四川省安全员B证操作证的学员准备的理论考试专题&#xff0c;每个月更新的四川省安全员B证新版试题祝您顺利通过四川省安全员B证考试。 1、【多选题】《建筑施工安全检查标准…

第九篇:node静态文件服务(中间件)

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! &#x1f4d8; 引言&#xff1a; 当今互联网时代&am…

【ARM架构】ARMv8-A 系统中的安全架构概述

一个安全或可信的操作系统保护着系统中敏感的信息&#xff0c;例如&#xff0c;可以保护用户存储的密码&#xff0c;信用卡等认证信息免受攻击。 安全由以下原则定义&#xff1a; 保密性&#xff1a;保护设备上的敏感信息&#xff0c;防止未经授权的访问。有以下几种方法可以做…

2023年10月计算机系统结构真题

一、填空题 1.直接执行微指令的是 A.硬件 B.汇编程序 C.编译程序 D.微指令程序 2. 支持动态地址定位的寻址方式是 A.基址寻址 B.间接寻址 C.变址寻址 D.直接寻址 3.当浮点数尾数基值rm16,除尾符外的位数机器位数为8位时&#xff0c;可表示的规格化最大尾数值为 A.1/256 B.…

全国工商企业名录

全国2023年12月份企业名录2.5亿条

查询获取SMBIOS的方法

一、用于在本地查询 SMBIOS 的示例 PowerShell 脚本 Microsoft网站参考 以下 ChassisTypes 列表是从最新的 DMTF SMBIOS 规范复制的。 # Set-ExecutionPolicy or Script Signing documentation needs to be reviewed # Current script is designed to run on individual mach…

SpringMVC回顾总结笔记

MVC是一种思想而SpringMVC是具体的实现&#xff08;Ioc和DI的关系&#xff09; 在创建项目的时候勾选的SpringWeb框架就是SpringMVC框架 与浏览器建立连接 默认返回的是一个 view 视图。需要添加ResponseBody说明返回的是json数据。RestController是ControllerResponseBody…

Spring6学习技术|简要介绍+安装环境+入门案例+log4j2日志

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; 碎碎念一下吧&#xff0c;javaWeb跟完了全程。还是感觉啥也不知道&#xff0c;啥也没学会。2025年春天能找到实习吗&#xff1f;真的好担心。 环境安装 纠…

Recorder 实现语音录制并上传到后端(兼容PC和移动端)

Recorder 首页&#xff1a;https://github.com/xiangyuecn/Recorder 一、安装 npm install recorder-core二、代码部分 1. HTML页面 <template><div><el-inputv-model"ttsText"type"textarea"placeholder"请输入内容"><…

Java三大框架简介与比较

一、引言 在Java开发领域&#xff0c;三大框架——Spring、Hibernate和MyBatis&#xff0c;各自扮演着重要的角色。它们为开发者提供了不同的解决方案&#xff0c;使得开发者能够更高效地构建企业级应用。本文将分别介绍这三大框架的特点、优势以及适用场景&#xff0c;并对它…

对尾递归的理解(有哪些应用场景)

文章目录 一、递归二、尾递归三、应用场景参考文献 一、递归 递归&#xff08;英语&#xff1a;Recursion&#xff09; 在数学与计算机科学中&#xff0c;是指在函数的定义中使用函数自身的方法 在函数内部&#xff0c;可以调用其他函数。如果一个函数在内部调用自身本身&am…

初次安装Android Studio卡在gradle的解决方法

原因 国外的下载的地址无法访问才导致无法下载 解决方案 找到新建项目的保存位置找到gradle文件夹 进入文件夹 用文本打开 如图 大概一样&#xff0c;将国外地址改为国内地址 选中的这一条 国内的地址有 腾讯云提供了 Gradle 的国内镜像&#xff0c;您可以通过访问腾讯云…