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

8 篇文章 0 订阅
3 篇文章 0 订阅

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读取信息。

  • 22
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Prometheus可以通过Kubernetes API监控Kubernetes集群中的Pod状态。通过使用Prometheus的Kubernetes SD(Service Discovery)机制,可以自动发现Kubernetes集群中的Pod,并将其添加到监控目标中。然后,可以使用Prometheus的查询语言PromQL来查询和分析Pod的状态信息,例如CPU使用率、内存使用率、网络流量等。此外,Prometheus还可以与Grafana等可视化工具结合使用,以便更直观地展示Pod状态信息。 ### 回答2: Prometheus 是一款开源的监控系统,它可以用于监控 Kubernetes 中的 Pod 状态。在 Kubernetes 中,Pod 是最基本的调度单元,一个 Pod 可以包含一个或多个容器,因此,监控 Pod 状态可以提高我们对整个集群的管理效率和质量。 在 Kubernetes 中,Prometheus 主要通过以下三种方式来监控 Pod 状态: 1. 使用 KubernetesMetrics API Kubernetes 提供 Metrics API 来获取 Pod 的状态信息,包括 CPU 使用率、内存使用率、网络速率等。Prometheus 可以通过配置 scrape_config 来获取 Metrics API 中的数据,进而监控 Pod 状态。在 Prometheus 的配置文件中,我们可以添加以下配置来获取 Metrics API 中的数据: ```yaml - job_name: 'kubernetes-pods' scrape_interval: 30s kubernetes_sd_configs: - role: pod metrics_path: "/apis/metrics.k8s.io/v1beta1/pods" ``` 2. 使用 cAdvisor cAdvisor 是一个开源的容器监控工具,它可以收集容器内部运行的各种性能指标。由于 Kubernetes 使用 cAdvisor 收集容器的性能数据,因此,Prometheus 可以通过 cAdvisor 来监控 Pod 的状态。我们可以在 Prometheus 的配置文件中添加以下内容来获取 cAdvisor 中的数据: ```yaml - job_name: 'kubernetes-cadvisor' scrape_interval: 30s kubernetes_sd_configs: - role: node metrics_path: "/metrics/cadvisor" ``` 3. 使用 kube-state-metrics kube-state-metrics 是一个开源工具,可以将 Kubernetes 中的对象状态信息转换成 Prometheus 可以获取的格式。包括 Pod 的状态信息、容器状态信息、镜像版本信息等。因此,Prometheus 可以通过配置 scrape_config 来获取 kube-state-metrics 中的数据。我们可以在 Prometheus 的配置文件中添加以下内容来获取 kube-state-metrics 中的数据: ```yaml - job_name: 'kubernetes-apiservers' scrape_interval: 30s kubernetes_sd_configs: - role: endpoints api_server: 'https://kubernetes.default.svc:443' bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt metrics_path: "/metrics" ``` 总结来说,通过以上三种方式,Prometheus 可以监控 Kubernetes 中的 Pod 状态信息。每种方式都有其优缺点,我们需要根据实际情况进行选择和配置。最终,我们可以通过 Prometheus 的监控来有效管理和优化我们的 Kubernetes 集群。 ### 回答3: Prometheus是一种广泛使用的开源监控解决方案,它能够收集和分析各种类型的指标,并提供仪表板和警报功能,帮助管理员实时跟踪整个应用程序栈的健康状况。在Kubernetes中,使用Prometheus监控Pod状态非常重要,因为PodKubernetes的基本单元,也是应用程序的唯一部署单元。如果Pod无法正常运行,那么应用程序也会无法正常运行。 在Kubernetes中,Pod的状态非常重要,因为它反映了Pod当前的健康状况。通过Prometheus监控Pod状态,可以获得有关Pod状态的详细信息,例如: 1. Pod的运行状态 (Running / Pending / Failed) 2. Pod的重启次数 3. Pod资源使用情况 (CPU、内存、存储) 4. Pod的实时日志 为了监控Pod状态,我们需要安装和配置Prometheus和其他必要的组件。首先,需要配置Kubernetes API Server作为Prometheus的数据源。接着,需要部署Prometheus Server和相应的Exporters,例如kube-state-metrics,这个可以提供有关Pod运行状态的详细信息。最后,需要配置Prometheus警报规则,以在发生问题时通知管理员。 总之,通过使用Prometheus监控Kubernetes Pod状态,我们能够获得实时的指标和警报,帮助我们快速发现和解决Pod的健康问题,以保持应用程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只会写bug的靓仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值