CPU使用率
指标名称:container_cpu_usage_seconds_total
容器CPU使用率计算公式详解
注:container_cpu_usage_seconds_total得到的并不是容器的CPU使用率,待我们一层层分析。
第一步:
http://10.4.**.***:31263/api/v1/query?query=container_cpu_usage_seconds_total{image!="",container_name!="POD",namespace="default"}
注:命名空间default下有两个Pod,分别为Pod1和Pod2。
上面的表达式查询出两组数据,分别为pod_name="Pod1"和pod_name=“Pod2”。每组数据都包含一个值,没有时间戳,默认为当前时间。
第二步:
http://10.4.**.***:31263/api/v1/query_range?query=container_cpu_usage_seconds_total{image!="",container_name!="POD",namespace="default"}[30s]
注1:将调用的接口从query变为query_range。
注2:Prometheus配置文件中将采集周期定义为15s,这里的[30s]表示过去30s的所有值。此时Pod1和Pod2分别对应两组数据。每组数据中包含一个时间戳和一个该时间戳下的value值。
第三步:
http://10.4.**.***:31263/api/v1/query_range?query=rate(container_cpu_usage_seconds_total{image!="",container_name!="POD",namespace="default"}[1m])
注:对每组过去1分钟的数据做计算,此时Pod1和Pod2分别对应一组数据,rate将每组数据中多个时间戳对应的数据聚合起来。
第四步:
http://10.4.**.***:31263/api/v1/query_range?query=sum(rate(container_cpu_usage_seconds_total{image!="",container_name!="POD",namespace="default"}[1m]))
注:对两个Pod的数据进行聚合,此时一共只有一组数据。
第五步:
http://10.4.**.***:31263/api/v1/query_range?query=sum(rate(container_cpu_usage_seconds_total{image!="",container_name!="POD",namespace="default"}[1m]))&start=1547532685.948&end=1547532715.948&step=1m
注1:注明起始时间和结束时间。通常结束时间就是当前的时间。时间的格式为unix timestamp。精确到毫秒级,前面的十位表示年月日,时分秒,后面的三位表示毫秒。这是Prometheus输出的时间戳。在正经的时间格式转换时需要将中间的小数点去掉,形成一个诸如1547532685948的13位的long值,这个是标准的unix时间戳,表示从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。
注2:step表示设置的步长,如果start和end的间隔为1分钟,step为30秒,那么就形成三个时间戳,分别是start,start过去30s以及end。
总之是由start开始,一个step,一个step的数下去。最后的end不一定能包含进去。比如start和end间间隔59秒,step为30秒,那么就只有两个时间戳。
注3:[30s]的理解和step不同,虽然Prometheus设置的采集周期为15s,但是[30s]得到的数据不一定是严格以15s为间隔的。
注4:unix时间戳与普通时间戳的相互转换
http://tool.chinaz.com/Tools/unixtime.aspx
注5:在一个标签内包含逻辑或:
pod_name=~"weave-scope-agent-t7sf7|weave-scope-agent-grglf"
注6:在标签内包含正则,表示pod_name匹配以weave-scope-agent-开头的指标:
pod_name=~"weave-scope-agent-.*"
注7:如下指标查询出的指标的个数为:Pod的总数-不健康的Pod(包括waiting状态的Pod和Running状态等于0的Pod,二者不重合+一个Pod中存在多个container的特殊情况(因为这个指标是以容器作为基本单位的)。
如我们有32个Pod,4个不健康的Pod,一个Pod中有两个container,则表达式查询出的指标数为32-4+1=29。
rate(container_cpu_usage_seconds_total{container_name!="POD",id!="/",image!="",namespace!=""}[1m])
参考:https://prometheus.io/docs/prometheus/latest/querying/basics/
Pod健康情况
1、查出Pod所属的资源对象
kube_pod_owner
如
kube_pod_owner{instance="10.233.114.124:8080",job="kubernetes-endpoints",k8s_app="kube-state-metrics",kubernetes_name="kube-state-metrics",kubernetes_namespace="kube-system",namespace="kube-system",owner_is_controller="true",owner_kind="DaemonSet",owner_name="calico-node",pod="calico-node-74tgq"}
注1:如pod="kube-apiserver-node-kle6kz7u"、pod="kube-controller-manager-node-kle6kz7u"
等情况,owner_is_controller="<none>"
注2:Pod所属的控制器分为Daemonset、ReplicaSet、StatefulSet。Deployment为ReplicaSet的上层,因此owner_kind会挂在ReplicaSet上,而不会挂在Deployment上。
2、等待状态的Pod
kube_pod_container_status_waiting>0
解释原因:如ImagePullBackOff,此时的状态已经为Running了
kube_pod_container_status_waiting_reason>0
3、重启次数
kube_pod_container_status_restarts_total
4、获得非运行状态的Pod
新版本:
#非运行状态的Pod
kube_pod_status_phase{phase="Running"}==0
注:kube_pod_status_phase的五种状态:failed pending unkonwn running successed
Pending:挂起,这时pod已经被k8s集群接受,但有一个或多个容器镜像尚未创建,等待时间包括调度pod的时间和通过网络下载容器镜像的时间。
Running:此时pod已经被绑定到某一个节点上,pod中所有的容器都被创建并且至少有一个容器正在运行或者处于启动或重启状态。
Succeed:此时pod中的所有容器都被成功终止并且不会重启。
Failed:pod中的所有容器都已经被终止,并且至少有一个容器因为失败而终止(容器以非0状态退出)。
StatefulSet
1、value值为有状态副本集的个数
kube_statefulset_metadata_generation
2、