Kubernetes Pod内存监控

这篇具有很好参考价值的文章主要介绍了Kubernetes Pod内存监控。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Pod监控相关指标

对于Pod内存相关的指标,主要有两个数据源:

  1. 基于kube-state-metrics,采集到的是内存Limits和Requests的设置情况。关键的指标如下:
指标 含义
kube_pod_container_resource_limits_memory_bytes Pod内存Limits设置量
kube_pod_container_resource_requests_memory_bytes Pod内存Requests设置量
  1. 基于kubelet上的CAdvisor,采集到的是内存使用情况。关键的指标如下:

CAdvisor是Google开源用于收集容器资源和性能指标的一个工具,对于Kubernetes,其集成在kubelet里面,可以收集到每个节点上的Pod指标。

指标 含义
container_memory_usage_bytes 当前使用的内存总量。包括所有使用的内存,不管有没有被访问 (包括 cache, rss, swap等)。
container_memory_rss RSS使用量。RSS是常驻内存集(Resident Set Size)的缩写,是分配给进程使用实际物理内存,包括所有分配到的栈内存和堆内存 以及 加载到物理内存中的共享库占用的内存空间。不包含磁盘缓存
container_memory_cache 缓存使用量。
container_memory_swap 虚拟内存使用量。虚拟内存(swap)指的是用磁盘来模拟内存使用。对性能有影响,一般不用。
container_memory_working_set_bytes 当前内存工作集(working set)使用量。工作区内存使用量=活跃的匿名与和缓存,以及file-baked页。(working_set <= usage)
container_memory_failcnt 申请内存失败次数。
container_memory_failures_total 内存申请错误总次数。

基于以上的指标,就可以计算Pod的内存使用率,当然,需要Pod有设置Limits才有意义

sum(container_memory_working_set_bytes{pod!="POD", container!=""}) by (pod) / sum(kube_pod_container_resource_requests_memory_bytes{}) by (pod)

二、关于Pod OOM

先说结论,Pod OOM主要看的是working_set的使用量是否超过limits。

准备一个简单的程序,其功能是不断地申请内存

// main.go

package main

import (
	"fmt"
	"net/http"
	"time"
	"os"
	"strconv"

	"github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
	ticker, err := strconv.ParseInt(os.Getenv("Ticker"), 10, 64)
	if err != nil {
		panic(err)
	}
	memoryTicker := time.NewTicker(time.Millisecond * time.Duration(ticker))
	leak := make(map[int][]byte)
	i := 0

	go func() {
		for range memoryTicker.C {
			leak[i] = make([]byte, 1024)
			i++
		}
	}()
	
	http.Handle("/metrics", promhttp.Handler())
	fmt.Println("Strat listening on 0:8000...")
	http.ListenAndServe(":8000", nil)
	
}
# Dockerfile
FROM golang:alpine3.15
WORKDIR /app
COPY main ./
EXPOSE 8000
CMD ["./main"]

k8s查看pod内存使用情况,Kubernetes,kubernetes

WorkingSet(container_memory_working_set_bytes)和Usage(container_memory_usage_bytes)基本上是以1:1的趋势到达limits,然后Pod触发OOM

接下来在程序中添加一个goroutine,不断在文件系统上写入文件

// main.go

package main

import (
	"fmt"
	"net/http"
	"time"
	"os"
	"strconv"

	"github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
	ticker, err := strconv.ParseInt(os.Getenv("Ticker"), 10, 64)
	if err != nil {
		panic(err)
	}
	memoryTicker := time.NewTicker(time.Millisecond * time.Duration(ticker))
	leak := make(map[int][]byte)
	i := 0

	go func() {
		for range memoryTicker.C {
			leak[i] = make([]byte, 1024)
			i++
		}
	}()
	
	fileTicker := time.NewTicker(time.Millisecond * time.Duration(ticker))
	go func() {
		os.Create("/tmp/file")
		buffer := make([]byte, 1024)
		defer f.Close()

		for range fileTicker.C {
			f.Write(buffer)
			f.Sync()
		}
	}()

	http.Handle("/metrics", promhttp.Handler())
	fmt.Println("Strat listening on 0:8000...")
	http.ListenAndServe(":8000", nil)
	
}

k8s查看pod内存使用情况,Kubernetes,kubernetes

当Usage达到Limits,Pod不会OOM,随着WorkingSet继续增大,Cache逐渐减小,等WorkingSet到达Limit,Pod才OOM。

说明Usage中包含文件系统页面的缓存。当实际内存不够用的时候,这些缓存会让给程序使用。因为仅仅为了缓存就把程序给OOM掉是不合理的。文章来源地址https://www.toymoban.com/news/detail-653509.html

到了这里,关于Kubernetes Pod内存监控的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 飞天使-k8s知识点17-kubernetes实操2-pod探针的使用

    探针的使用 容器探针启动实验1-启动探针的使用-startupprobe Liveness Probes 和 Readiness Probes 演示 若存在started.html 则进行

    2024年02月20日
    浏览(56)
  • k8s 查看 pod 网段

    查看当前k8s集群中 pod 和 service 网段信息          

    2024年02月16日
    浏览(37)
  • 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对应的容器

    环境: centos 7.6 k8s 1.20 我们知道,在k8s中最小基本单位是pod,而一个pod里面可以封装一个或多个容器,而在宿主机上容器的名字并不是pod的名字,所以,下面的方式可以快速的查看一个pod里面对应宿主机哪些容器:

    2024年02月07日
    浏览(49)
  • Kubernetes(k8s):精通 Pod 操作的关键命令

    💖The Begin💖点点关注,收藏不迷路💖 Kubernetes 是一个强大的容器编排平台,其中的核心概念之一就是 Pod。Pod 是 Kubernetes 中最小的可部署单元,它由一个或多个容器组成,共享网络和存储资源。 在本篇博客中,我们将深入探讨 Kubernetes 集群中与 Pod 相关的一些重要命令,帮

    2024年04月14日
    浏览(185)
  • K8S第四讲 Kubernetes删除pod阻塞问题

    在Kubernetes中,当您尝试删除一个Pod时,可能会遇到Pod一直阻塞的情况。这通常是由于Pod正在运行或被其他资源(例如ReplicaSet或Deployment)控制而导致的。以下是一些可能的解决方案: 1: 确认Pod是否正在运行:在执行删除Pod命令之前,请先检查Pod的状态,确保它没有在运行中

    2024年02月05日
    浏览(67)
  • 【k8s pod container内存指标说明】

    我司平台研发的devops平台底层采用k8s实现,k8s自带cadvisor进行集群指标收集,根据官网,我们选用了 container_memory_working_set_bytes (容器的工作集使用量)作为内存使用量的观察项,但随着后续使用过程中发现该指标上升到一定大小后就会维持不变,并不像应用实际内存使用量

    2024年02月15日
    浏览(43)
  • 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(Kubernetes)学习(三):pod概念及相关操作

    摘取官网: https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/#working-with-pods 1.1 简介 Pod 是可以在 Kubernetes 中 创建和管理的、最小的可部署的计算单元 。 Pod (就像在鲸鱼荚或者豌豆荚中) 是一组(一个或多个)容器 ; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 P

    2024年02月13日
    浏览(94)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包