devops icon indicating copy to clipboard operation
devops copied to clipboard

k8s cAdvisor metrics-server kube-state-metrics

Open heidsoft opened this issue 2 years ago • 0 comments

在Kubernetes中,QoS(Quality of Service)是一种管理Pod资源的机制。QoS的目的是为了在资源紧张的情况下,保证某些关键任务能够优先得到资源,以保证服务的质量和可用性。

  1. BestEffort:这是最低的服务质量级别,对应的Pod没有任何资源的保证。如果节点上的资源紧张,那么这种类型的Pod会被第一个驱逐。当Pod的spec中没有定义requests和limits(或者只定义了部分)时,Pod的QoS级别就是BestEffort。

  2. Burstable:这是中等的服务质量级别,对应的Pod至少保证了部分资源的使用。即Pod的spec中定义了requests但是没有定义limits,或者requests和limits不相等,那么Pod的QoS级别就是Burstable。这种类型的Pod在资源紧张时会被优先保留,但是如果Guaranteed级别的Pod需要资源,那么这些Pod可能会被驱逐。

  3. 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接口获取数据的步骤:

  1. 确保你的kubelet配置允许暴露cAdvisor接口。你可以通过检查kubelet的启动参数来确认这一点,例如--read-only-port=10255或者--authentication-token-webhook=true--authorization-mode=Webhook(对于安全端口10250)。

  2. 访问kubelet的cAdvisor接口。例如,如果你的kubelet在节点node1上运行,你可以通过"http://node1:10255/metrics/cadvisor"来访问cAdvisor接口。

  3. 在浏览器中,你将看到kubelet收集的原始数据。这些数据以Prometheus格式展示,可以被Prometheus服务器抓取。

注意:确保你的服务器防火墙允许访问10255或者10250端口,否则你将无法访问kubelet的cAdvisor接口。

如果你想在整个Kubernetes集群中收集这些数据,你可以部署一个Prometheus服务器,并配置它抓取所有节点的kubelet cAdvisor接口。

kubelet进程默认内置了cAdvisor,因此一般情况下,不需要额外的步骤去检查。但如果你想要确认cAdvisor是否正在运行,可以通过以下步骤:

  1. 登录到Kubernetes节点。

  2. 运行以下命令查看kubelet进程:

    ps -ef | grep kubelet
    

    你将看到kubelet进程及其启动参数。

  3. 查看kubelet的日志:

    journalctl -u kubelet
    

    在日志中,你应该可以看到关于cAdvisor的条目。

另外,你可以通过访问kubelet暴露的cAdvisor接口来确认cAdvisor是否正在运行。在浏览器中输入"http://:10255/metrics/cadvisor",如果cAdvisor正在运行,你将看到输出的metrics数据。其中""需要替换为你的Kubernetes节点的IP地址。

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设置资源限制。

eventBursteventRecordQPS: 控制事件记录的速率。

evictionHard: 设置驱逐阈值,当达到阈值时,kubelet将开始驱逐POD以回收资源。

evictionPressureTransitionPeriod: 设置从正常到驱逐压力状态的过渡时间。

failSwapOn: 如果设置为true,当发现节点启用了swap时,kubelet将启动失败。

featureGates: 用于开启或关闭Kubernetes的特定功能。

fileCheckFrequency: 设置文件检查的频率。

hairpinMode: 设置网络的发夹模式,promiscuous-bridge表示将所有流量发送到虚拟桥接器,然后再发送到目的地。

  1. evictionHard: 这是一个关于节点资源驱逐的硬阈值设置。如果任何节点上的资源超过这些设置的阈值,kubelet将驱逐一些pod以回收资源。例如,imagefs.available: 15%表示当图像文件系统的可用空间低于15%时,kubelet将开始驱逐pod。

  2. evictionPressureTransitionPeriod: 5m0s 这是从kubelet观察到驱逐信号到节点报告它为“压力”状态所需要的最少持续时间。

  3. failSwapOn: true 如果设置为true,那么如果发现节点启用了swap内存,kubelet将无法启动。

  4. featureGates: 这是一个开启或关闭某些Kubernetes功能的开关。

  5. fileCheckFrequency: 20s 此设置定义了kubelet检查其管理的文件的频率。

  6. healthzBindAddress: 127.0.0.1healthzPort: 10248 这些是kubelet的健康检查端点的绑定地址和端口。

  7. imageGCHighThresholdPercent: 85imageGCLowThresholdPercent: 80 这些是图像垃圾收集的阈值设置。

  8. kubeAPIBurst: 10kubeAPIQPS: 5 这些是kubelet向Kubernetes API服务器发出请求的速率限制。

  9. kubeReserved: 这是为Kubernetes系统预留的资源。

  10. maxPods: 110 这是每个节点上可以运行的最大pod数量。

  11. nodeStatusReportFrequency: 10snodeStatusUpdateFrequency: 10s 这些是节点状态报告和更新的频率。

  12. podPidsLimit: -1 这是每个pod的PID限制。-1表示没有限制。

  13. port: 10250 这是kubelet监听的端口。

  14. registryBurst: 10registryPullQPS: 5 这些是kubelet从镜像仓库拉取镜像的速率限制。

  15. rotateCertificates: true 如果设置为true,kubelet将周期性地旋转其证书。

  16. streamingConnectionIdleTimeout: 4h0m0s 这是流式请求的空闲超时设置。

  17. systemReserved: 这是为节点操作系统预留的资源。

image ‘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

  1. 确定节点cgroup根目录 mount |grep cgroup

    查看节点cgroup根目录:/sys/fs/cgroup

  2. 查看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文件目录

heidsoft avatar Oct 16 '23 05:10 heidsoft