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

这篇具有很好参考价值的文章主要介绍了通过MetricsAPI监控pod资源使用情况(k8s资源监控,java)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 目的:简单监控pod

通过MetricsAPI监控pod资源使用情况(k8s资源监控,java),分布式,# kubernetes,java,kubernetes,java,容器
我想使用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

通过MetricsAPI监控pod资源使用情况(k8s资源监控,java),分布式,# kubernetes,java,kubernetes,java,容器

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

通过MetricsAPI监控pod资源使用情况(k8s资源监控,java),分布式,# kubernetes,java,kubernetes,java,容器
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的)
    通过MetricsAPI监控pod资源使用情况(k8s资源监控,java),分布式,# kubernetes,java,kubernetes,java,容器
  2. java访问 restapi
    我这里吧k8s 客户端和 rest http前后文都注入spring了,这样调用起来比较方便

注入k8s客户端

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

}

通过MetricsAPI监控pod资源使用情况(k8s资源监控,java),分布式,# kubernetes,java,kubernetes,java,容器
注入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()));

    }

}

通过MetricsAPI监控pod资源使用情况(k8s资源监控,java),分布式,# kubernetes,java,kubernetes,java,容器
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读取信息。文章来源地址https://www.toymoban.com/news/detail-827117.html

到了这里,关于通过MetricsAPI监控pod资源使用情况(k8s资源监控,java)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8s(一)Pod资源——Pod介绍、创建Pod、Pod简单资源配额

    目录 Pod概述 pod网络 pod存储 pod和容器对比 创建pod的方式 pod运行方式分类 Pod的创建 Pod的创建过程 通过kubectl run来创建pod 通过yaml文件创建,yaml文件简单写法 Pod简单操作 Pod的标签labels Pod的资源配额resource 测试 Kubernetes Pod | Kubernetes Pod是Kubernetes中的最小调度单元,k8s都是以p

    2024年01月18日
    浏览(60)
  • k8s资源对象(1) namespace&&pod

    Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的

    2024年01月18日
    浏览(51)
  • k8s pod一直处于pending状态一般有哪些情况,怎么排查?

    一个pod一开始创建的时候,它本身就是会处于pending状态,这时可能是正在拉取镜像,正在创建容器的过程。 如果等了一会发现pod一直处于pending状态, 那么我们可以使用kubectl describe命令查看一下pod的Events详细信息。一般可能会有这么几种情况导致pod一直处于pending状态: 1、

    2024年01月17日
    浏览(56)
  • k8s pod “cpu和内存“ 资源限制

    转载用于收藏学习:原文 为了保证充分利用集群资源,且确保重要容器在运行周期内能够分配到足够的资源稳定运行,因此平台需要具备 Pod的资源限制的能力。 对于一个pod来说,资源最基础的2个的指标就是:CPU和内存。 Kubernetes提供了个采用requests和limits 两种类型参数对资

    2024年02月13日
    浏览(68)
  • Kubernetes(k8s)核心资源解析:Pod详解

    💖The Begin💖点点关注,收藏不迷路💖 Pod是Kubernetes中最小的调度单元,它可以包含一个或多个容器。Pod中的所有容器共享网络和存储卷,它们一起运行在同一个节点上。Pod提供了一种抽象层,使得容器可以作为一个逻辑单元来管理。 Pod中的容器共享IP地址、端口空间和存储

    2024年04月11日
    浏览(76)
  • kubernetes(k8s) pod(资源限制、基础概念)

    目录  一、资源限制 1、概念 1.2、Pod和容器的资源请求和限制 1.3、CPU资源单位 1.4、内存资源单位 1.5、CPU和内存的Requests和Limits的特点 1.6、案例 二、pod 的两种使用方式 三、pod 资源共享 四、底层容器Pause 1、pause 共享资源 1.1、网络 1.2、存储 1.3、小结 2、Pause主要功能 3、Pod

    2024年02月05日
    浏览(76)
  • k8s集群pod和node状态监控

    curl -L -O https://raw.githubusercontent.com/gjeanmart/kauri-content/master/spring-boot-simple/k8s/kube-state-metrics.yml 修改namespace为dev(default也行,但是后面的metricbeat安装也需要修改namespace为default)。 kubectl create -f kube-state-metrics.yml curl -L -O https://raw.githubusercontent.com/elastic/beats/7.6/deploy/kubernetes/metr

    2024年04月09日
    浏览(45)
  • K8S学习指南(10)-k8s中为pod分配CPU和内存资源

    Kubernetes(简称K8s)是一种开源的容器编排平台,广泛用于构建、部署和管理容器化应用。在Kubernetes中,Pod是最小的可部署单元,而资源分配是确保Pod正常运行的关键因素之一。本文将深入探讨如何在Kubernetes中为Pod分配CPU和内存资源,并提供详细的示例。 在容器化环境中,多

    2024年02月04日
    浏览(56)
  • K8s(四)Pod资源——pod生命周期、重启策略、容器钩子与容器探测

    目录 Pod生命周期 Pod重启策略 初始化容器 容器钩子 容器探测 启动探测 存活探测 就绪探测 参考资料 Pod 的生命周期 | Kubernetes Init 容器 | Kubernetes Pod的生命周期可以分为以下几个阶段: Pending(等待):在这个阶段,Pod被创建,并且正在等待被调度到一个节点上运行。此时,

    2024年01月20日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包