k8s cAdvisor metrics-server kube-state-metrics
在Kubernetes中,QoS(Quality of Service)是一种管理Pod资源的机制。QoS的目的是为了在资源紧张的情况下,保证某些关键任务能够优先得到资源,以保证服务的质量和可用性。
-
BestEffort:这是最低的服务质量级别,对应的Pod没有任何资源的保证。如果节点上的资源紧张,那么这种类型的Pod会被第一个驱逐。当Pod的spec中没有定义requests和limits(或者只定义了部分)时,Pod的QoS级别就是BestEffort。
-
Burstable:这是中等的服务质量级别,对应的Pod至少保证了部分资源的使用。即Pod的spec中定义了requests但是没有定义limits,或者requests和limits不相等,那么Pod的QoS级别就是Burstable。这种类型的Pod在资源紧张时会被优先保留,但是如果Guaranteed级别的Pod需要资源,那么这些Pod可能会被驱逐。
-
Guaranteed:这是最高的服务质量级别,对应的Pod保证了全部资源的使用。即Pod的spec中定义了requests且等于limits,那么Pod的QoS级别就是Guaranteed。这种类型的Pod在资源紧张时会被最后考虑驱逐,它们有最高的资源保障。
QoS的原理是通过kubelet(Kubernetes的节点代理)在资源紧张时,根据Pod的QoS级别以及其他一些指标(如Pod的优先级)来决定哪些Pod应该被驱逐。在驱逐过程中,kubelet会尝试优雅地终止Pod,如果在规定时间内Pod仍然没有停止,那么kubelet就会强制杀掉Pod,以释放资源。
在Kubernetes集群中,kubelet进程默认内置了cAdvisor,并且在端口10255(非安全)或者端口10250(安全)上暴露出/metrics/cadvisor接口,因此你无需额外部署cAdvisor。
以下是通过kubelet的cAdvisor接口获取数据的步骤:
-
确保你的kubelet配置允许暴露cAdvisor接口。你可以通过检查kubelet的启动参数来确认这一点,例如
--read-only-port=10255或者--authentication-token-webhook=true和--authorization-mode=Webhook(对于安全端口10250)。 -
访问kubelet的cAdvisor接口。例如,如果你的kubelet在节点node1上运行,你可以通过"http://node1:10255/metrics/cadvisor"来访问cAdvisor接口。
-
在浏览器中,你将看到kubelet收集的原始数据。这些数据以Prometheus格式展示,可以被Prometheus服务器抓取。
注意:确保你的服务器防火墙允许访问10255或者10250端口,否则你将无法访问kubelet的cAdvisor接口。
如果你想在整个Kubernetes集群中收集这些数据,你可以部署一个Prometheus服务器,并配置它抓取所有节点的kubelet cAdvisor接口。
kubelet进程默认内置了cAdvisor,因此一般情况下,不需要额外的步骤去检查。但如果你想要确认cAdvisor是否正在运行,可以通过以下步骤:
-
登录到Kubernetes节点。
-
运行以下命令查看kubelet进程:
ps -ef | grep kubelet你将看到kubelet进程及其启动参数。
-
查看kubelet的日志:
journalctl -u kubelet在日志中,你应该可以看到关于cAdvisor的条目。
另外,你可以通过访问kubelet暴露的cAdvisor接口来确认cAdvisor是否正在运行。在浏览器中输入"http://
cgroupDriver: 这是Kubernetes中kubelet使用的cgroup驱动。cgroup(控制组)是Linux内核的一种特性,可以限制、记录和隔离进程组使用的系统资源。systemd是一种cgroup驱动,用于管理和配置系统。
cgroupsPerQOS: 这是一个布尔值,用于确定是否在每个Quality of Service(QoS)类别中创建单独的cgroup。QoS是Kubernetes用来做资源调度的一种机制,有三个级别:BestEffort,Burstable,Guaranteed。如果设置为true,Kubernetes将会在每个QoS级别下创建单独的cgroup,以便更好地控制和隔离不同类型的工作负载。
这些是Kubernetes中kubelet的配置参数,下面是他们的含义:
cpuCFSQuota: 如果设置为true,kubelet将会限制每个POD的CPU使用量,防止一个POD占用过多的CPU资源。
cpuCFSQuotaPeriod: 设置每个POD的CPU配额周期,默认是100ms,即每100ms检查一次是否超出配额。
cpuManagerPolicy: 设置CPU管理策略,none表示不进行CPU的管理。
cpuManagerReconcilePeriod: 设置CPU管理的同步周期,如10s表示每10秒同步一次。
enableControllerAttachDetach: 如果设置为true,kubelet将启用Attach/Detach控制器,负责将存储卷attach到需要的节点上,或者从不再需要的节点上detach。
enableDebuggingHandlers: 如果设置为true,允许在kubelet上运行调试处理程序。
enforceNodeAllocatable: 为节点上的POD设置资源限制。
eventBurst和eventRecordQPS: 控制事件记录的速率。
evictionHard: 设置驱逐阈值,当达到阈值时,kubelet将开始驱逐POD以回收资源。
evictionPressureTransitionPeriod: 设置从正常到驱逐压力状态的过渡时间。
failSwapOn: 如果设置为true,当发现节点启用了swap时,kubelet将启动失败。
featureGates: 用于开启或关闭Kubernetes的特定功能。
fileCheckFrequency: 设置文件检查的频率。
hairpinMode: 设置网络的发夹模式,promiscuous-bridge表示将所有流量发送到虚拟桥接器,然后再发送到目的地。
-
evictionHard:这是一个关于节点资源驱逐的硬阈值设置。如果任何节点上的资源超过这些设置的阈值,kubelet将驱逐一些pod以回收资源。例如,imagefs.available: 15%表示当图像文件系统的可用空间低于15%时,kubelet将开始驱逐pod。 -
evictionPressureTransitionPeriod: 5m0s这是从kubelet观察到驱逐信号到节点报告它为“压力”状态所需要的最少持续时间。 -
failSwapOn: true如果设置为true,那么如果发现节点启用了swap内存,kubelet将无法启动。 -
featureGates:这是一个开启或关闭某些Kubernetes功能的开关。 -
fileCheckFrequency: 20s此设置定义了kubelet检查其管理的文件的频率。 -
healthzBindAddress: 127.0.0.1和healthzPort: 10248这些是kubelet的健康检查端点的绑定地址和端口。 -
imageGCHighThresholdPercent: 85和imageGCLowThresholdPercent: 80这些是图像垃圾收集的阈值设置。 -
kubeAPIBurst: 10和kubeAPIQPS: 5这些是kubelet向Kubernetes API服务器发出请求的速率限制。 -
kubeReserved:这是为Kubernetes系统预留的资源。 -
maxPods: 110这是每个节点上可以运行的最大pod数量。 -
nodeStatusReportFrequency: 10s和nodeStatusUpdateFrequency: 10s这些是节点状态报告和更新的频率。 -
podPidsLimit: -1这是每个pod的PID限制。-1表示没有限制。 -
port: 10250这是kubelet监听的端口。 -
registryBurst: 10和registryPullQPS: 5这些是kubelet从镜像仓库拉取镜像的速率限制。 -
rotateCertificates: true如果设置为true,kubelet将周期性地旋转其证书。 -
streamingConnectionIdleTimeout: 4h0m0s这是流式请求的空闲超时设置。 -
systemReserved:这是为节点操作系统预留的资源。
‘Step1 . kubectl top向APIServer的Metrics API发起请求:
#kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes/xxxx
#kubectl get --raw /apis/metrics.k8s.io/v1beta1/namespaces/xxxx/pods/xxxx
Step2 . Aggregation 根据API service "metrics.k8s.io"的定义转发给后端svc:metrics-server
#kubectl get apiservices v1beta1.metrics.k8s.io
Step3 . Metrics-server pod获取最近一次的指标数据返回。 注:阿里云云监控容器监控控制台展示的指标基于metrics-server配置的sinkprovider 8093端口获取数据
kubectl get svc -n kube-system heapster -oyaml 此处需要注意历史遗留的heapster svc是否也指向后端metrics-server pod
Step4. Metrics server定期向kubelet暴露的endpoint收集数据转换成k8s API格式,暴露给Metrics API.
Metrics-server本身不做数据采集,不做永久存储,相当于是将kubelet的数据做转换。
kubelet的在cadvisor采集数据的基础上做了计算汇总,提供container+pod+node级别的cgroup数据
Step5: cAdvisor定期向cgroup采集数据,container cgroup 级别。
cadvisor的endpoint是 /metrics/cadvisor,仅提供contianer+machine数据,不做计算pod/node等指标。
#curl http://127.0.0.1:10255/metrics/cadvisor
Step6: 在Node/Pod对应的Cgroup目录查看指标文件中的数据。
#cd /sys/fs/cgroup/xxxx
-
确定节点cgroup根目录 mount |grep cgroup
查看节点cgroup根目录:/sys/fs/cgroup
-
查看pod/container cgroup指标文件目录路径的三种方式 通过pod uid定位指标文件: 获取pod uid: kubectl get pod -n xxxx xxxxx -oyaml |grep Uid -i -B10 获取containerid: kubectl describe pod -n xxxx xxxxx |grep id -i 比如可以根据以上得到的uid进入pod中container对应的cgroup目录: /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod-
.slice/cri-containerd- .scope
通过container pid定位指标源文件 获取pod对应pid的cgroup文件目录