掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
作者:?jiǎn)炭?2023-05-11 07:08:07
云計(jì)算
云原生 這篇文章只討論 Kubernetes 本身的監(jiān)控,而且只討論如何在夜鶯體系中來(lái)監(jiān)控它們。

Kubernetes 是一個(gè)簡(jiǎn)單且復(fù)雜的系統(tǒng),簡(jiǎn)單之處在于其整體架構(gòu)比較簡(jiǎn)單清晰,是一個(gè)標(biāo)準(zhǔn)的 Master-Slave 模式,如下:
但是,它又是一個(gè)復(fù)雜的系統(tǒng),不論是 Master 還是 Slave,都有多個(gè)組件組合而成,如上圖所示:
kubelet:維護(hù)容器生命周期、CSI 管理以及 CNI 管理。
kube-proxy:負(fù)責(zé)服務(wù)發(fā)現(xiàn)和負(fù)載均衡。
container runtime(docker、containerd 等):鏡像管理、容器運(yùn)行、CRI 管理等。
數(shù)據(jù)庫(kù)組件。
Etcd:保存集群狀態(tài),與 apiserver 保持通信。
對(duì)于如此復(fù)雜的簡(jiǎn)單系統(tǒng),要時(shí)刻掌握里內(nèi)部的運(yùn)行狀態(tài),是一件挺難的事情,因?yàn)樗母采w面非常的廣,主要涉及:
要監(jiān)控的非常多,SLI 也非常多。不過(guò),這篇文章只討論 Kubernetes 本身的監(jiān)控,而且只討論如何在夜鶯體系中來(lái)監(jiān)控它們。
對(duì)于 Kubernetes 本身,主要是監(jiān)控其系統(tǒng)組件,如下:
!! Ps:這里不在介紹夜鶯監(jiān)控是怎么安裝的,如果不清楚的可以看《【夜鶯監(jiān)控】初識(shí)夜鶯》這篇文章,本次實(shí)驗(yàn)也是使用是這篇文章中的安裝方式。
ApiServer 是 Kubernetes 架構(gòu)中的核心,是所有 API 是入口,它串聯(lián)所有的系統(tǒng)組件。
為了方便監(jiān)控管理 ApiServer,設(shè)計(jì)者們?yōu)樗┞读艘幌盗械闹笜?biāo)數(shù)據(jù)。當(dāng)你部署完集群,默認(rèn)會(huì)在default名稱空間下創(chuàng)建一個(gè)名叫kubernetes的 service,它就是 ApiServer 的地址。
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 309d 你可以通過(guò)curl -s -k -H "Authorization: Bearer $token" https://10.96.0.1:6443/metrics命令查看指標(biāo)。其中$token是通過(guò)在集群中創(chuàng)建 ServerAccount 以及授予相應(yīng)的權(quán)限得到。
所以,要監(jiān)控 ApiServer,采集到對(duì)應(yīng)的指標(biāo),就需要先授權(quán)。為此,我們先準(zhǔn)備認(rèn)證信息。
kubectl create ns flashcat創(chuàng)建0-apiserver-auth.yaml文件,內(nèi)容如下:
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: categraf
rules:
- apiGroups: [""]
resources:
- nodes
- nodes/metrics
- nodes/stats
- nodes/proxy
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups:
- extensions
- networking.k8s.io
resources:
- ingresses
verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics", "/metrics/cadvisor"]
verbs: ["get"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: categraf
namespace: flashcat
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: categraf
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: categraf
subjects:
- kind: ServiceAccount
name: categraf
namespace: flashcat上面的內(nèi)容主要是為categraf授予查詢相關(guān)資源的權(quán)限,這樣就可以獲取到這些組件的指標(biāo)數(shù)據(jù)了。
指標(biāo)采集的方式有很多種,建議通過(guò)自動(dòng)發(fā)現(xiàn)的方式進(jìn)行采集,這樣是不論是伸縮、修改組件都無(wú)需再次來(lái)調(diào)整監(jiān)控方式了。
夜鶯支持Prometheus Agent的方式獲取指標(biāo),而且 Prometheus 在服務(wù)發(fā)現(xiàn)方面做的非常好,所以這里將使用Prometheus Agent方式來(lái)采集 ApiServer 的指標(biāo)。
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-agent-conf
labels:
name: prometheus-agent-conf
namespace: flashcat
data:
prometheus.yml: |-
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'apiserver'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
insecure_skip_verify: true
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
remote_write:
- url: 'http://192.168.205.143:17000/prometheus/v1/write'上面的內(nèi)容主要是通過(guò)endpoints的方式主動(dòng)發(fā)現(xiàn)在default名稱空間下名字為kubernetes且端口為https的服務(wù),然后將獲取到的監(jiān)控指標(biāo)傳輸給夜鶯服務(wù)端http://192.168.205.143:17000/prometheus/v1/write(這個(gè)地址根據(jù)實(shí)際情況做調(diào)整)。
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-agent
namespace: flashcat
labels:
app: prometheus-agent
spec:
replicas: 1
selector:
matchLabels:
app: prometheus-agent
template:
metadata:
labels:
app: prometheus-agent
spec:
serviceAccountName: categraf
containers:
- name: prometheus
image: prom/prometheus
args:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--web.enable-lifecycle"
- "--enable-feature=agent"
ports:
- containerPort: 9090
resources:
requests:
cpu: 500m
memory: 500M
limits:
cpu: 1
memory: 1Gi
volumeMounts:
- name: prometheus-config-volume
mountPath: /etc/prometheus/
- name: prometheus-storage-volume
mountPath: /prometheus/
volumes:
- name: prometheus-config-volume
configMap:
defaultMode: 420
name: prometheus-agent-conf
- name: prometheus-storage-volume
emptyDir: {}其中--enable-feature=agent表示啟動(dòng)的是 agent 模式。
然后將上面的所有 YAML 文件部署到 Kubernetes 中,然后查看 Prometheus Agent 是否正常。
# kubectl get po -n flashcat
NAME READY STATUS RESTARTS AGE
prometheus-agent-78c8ccc4f5-g25st 1/1 Running 0 92s然后可以到夜鶯UI查看對(duì)應(yīng)的指標(biāo)。
獲取到了指標(biāo)數(shù)據(jù),后面就是合理利用指標(biāo)做其他動(dòng)作,比如構(gòu)建面板、告警處理等。
比如夜鶯Categraf提供了 ApiServer 的儀表盤(pán)(https://github.com/flashcatcloud/categraf/blob/main/k8s/apiserver-dash.json),導(dǎo)入后如下:
但是,不論是做面板也好,還是做告警也罷,首先都要對(duì) ApiServer 的指標(biāo)有一個(gè)清晰的認(rèn)識(shí)。
下面做了一些簡(jiǎn)單的整理。
以下指標(biāo)來(lái)自阿里云 ACK 官方文檔,我覺(jué)得整理的比較全,比較細(xì),就貼了一部分。想要了解更多的可以到官方網(wǎng)站去查看。
|
指標(biāo) |
類(lèi)型 |
解釋 |
|
apiserver_request_duration_seconds_bucket |
Histogram |
該指標(biāo)用于統(tǒng)計(jì) APIServer 客戶端對(duì) APIServer 的訪問(wèn)時(shí)延。對(duì) APIServer 不同請(qǐng)求的時(shí)延分布。請(qǐng)求的維度包括 Verb、Group、Version、Resource、Subresource、Scope、Component 和 Client。 |
|
Histogram Bucket 的閾值為:**{0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40, 50, 60}**,單位:秒。 |
||
|
apiserver_request_total |
Counter |
對(duì) APIServer 不同請(qǐng)求的計(jì)數(shù)。請(qǐng)求的維度包括 Verb、Group、Version、Resource、Scope、Component、HTTP contentType、HTTP code 和 Client。 |
|
apiserver_request_no_resourceversion_list_total |
Counter |
對(duì) APIServer 的請(qǐng)求參數(shù)中未配置 ResourceVersion 的 LIST 請(qǐng)求的計(jì)數(shù)。請(qǐng)求的維度包括 Group、Version、Resource、Scope 和 Client。用來(lái)評(píng)估 quorum read 類(lèi)型 LIST 請(qǐng)求的情況,用于發(fā)現(xiàn)是否存在過(guò)多 quorum read 類(lèi)型 LIST 以及相應(yīng)的客戶端,以便優(yōu)化客戶端請(qǐng)求行為。 |
|
apiserver_current_inflight_requests |
Gauge |
APIServer 當(dāng)前處理的請(qǐng)求數(shù)。包括 ReadOnly 和 Mutating 兩種。 |
|
apiserver_dropped_requests_total |
Counter |
限流丟棄掉的請(qǐng)求數(shù)。HTTP 返回值是**429 'Try again later'**。 |
|
apiserver_admission_controller_admission_duration_seconds_bucket |
Gauge |
準(zhǔn)入控制器(Admission Controller)的處理延時(shí)。標(biāo)簽包括準(zhǔn)入控制器名字、操作(CREATE、UPDATE、CONNECT 等)、API 資源、操作類(lèi)型(validate 或 admit)和請(qǐng)求是否被拒絕(true 或 false)。 |
|
Bucket 的閾值為:**{0.005, 0.025, 0.1, 0.5, 2.5}**,單位:秒。 |
||
|
apiserver_admission_webhook_admission_duration_seconds_bucket |
Gauge |
準(zhǔn)入 Webhook(Admission Webhook)的處理延時(shí)。標(biāo)簽包括準(zhǔn)入控制器名字、操作(CREATE、UPDATE、CONNECT 等)、API 資源、操作類(lèi)型(validate 或 admit)和請(qǐng)求是否被拒絕(true 或 false)。 |
|
Bucket 的閾值為:**{0.005, 0.025, 0.1, 0.5, 2.5}**,單位:秒。 |
||
|
apiserver_admission_webhook_admission_duration_seconds_count |
Counter |
準(zhǔn)入 Webhook(Admission Webhook)的處理請(qǐng)求統(tǒng)計(jì)。標(biāo)簽包括準(zhǔn)入控制器名字、操作(CREATE、UPDATE、CONNECT 等)、API 資源、操作類(lèi)型(validate 或 admit)和請(qǐng)求是否被拒絕(true 或 false)。 |
|
cpu_utilization_core |
Gauge |
CPU 使用量,單位:核(Core)。 |
|
cpu_utilization_ratio |
Gauge |
CPU 使用率=CPU 使用量/內(nèi)存資源上限,百分比形式。 |
|
memory_utilization_byte |
Gauge |
內(nèi)存使用量,單位:字節(jié)(Byte)。 |
|
memory_utilization_ratio |
Gauge |
內(nèi)存使用率=內(nèi)存使用量/內(nèi)存資源上限,百分比形式。 |
|
up |
Gauge |
服務(wù)可用性。 |
|
名稱 |
PromQL |
說(shuō)明 |
|
API QPS |
sum(irate(apiserver_request_total[$interval])) |
APIServer 總 QPS。 |
|
讀請(qǐng)求成功率 |
sum(irate(apiserver_request_total{code=~"20.*",verb=~"GET|LIST"}[interval])) |
APIServer 讀請(qǐng)求成功率。 |
|
寫(xiě)請(qǐng)求成功率 |
sum(irate(apiserver_request_total{code=~"20.*",verb!~"GET|LIST|WATCH|CONNECT"}[interval])) |
APIServer 寫(xiě)請(qǐng)求成功率。 |
|
在處理讀請(qǐng)求數(shù)量 |
sum(apiserver_current_inflight_requests{requestKind="readOnly"}) |
APIServer 當(dāng)前在處理讀請(qǐng)求數(shù)量。 |
|
在處理寫(xiě)請(qǐng)求數(shù)量 |
sum(apiserver_current_inflight_requests{requestKind="mutating"}) |
APIServer 當(dāng)前在處理寫(xiě)請(qǐng)求數(shù)量。 |
|
請(qǐng)求限流速率 |
sum(irate(apiserver_dropped_requests_total[$interval])) |
Dropped Request Rate。 |
|
名稱 |
PromQL |
說(shuō)明 |
|
內(nèi)存使用量 |
memory_utilization_byte{cnotallow="kube-apiserver"} |
APIServer 內(nèi)存使用量,單位:字節(jié)。 |
|
CPU 使用量 |
cpu_utilization_core{cnotallow="kube-apiserver"}*1000 |
CPU 使用量,單位:豪核。 |
|
內(nèi)存使用率 |
memory_utilization_ratio{cnotallow="kube-apiserver"} |
APIServer 內(nèi)存使用率,百分比。 |
|
CPU 使用率 |
cpu_utilization_ratio{cnotallow="kube-apiserver"} |
APIServer CPU 使用率,百分比。 |
|
資源對(duì)象數(shù)量 |
|
名稱 |
PromQL |
說(shuō)明 |
|
按 Verb 維度分析 QPS |
sum(irate(apiserver_request_total{verb=~"verb"}[interval]))by(verb) |
按 Verb 維度,統(tǒng)計(jì)單位時(shí)間(1s)內(nèi)的請(qǐng)求 QPS。 |
|
按 Verb+Resource 維度分析 QPS |
sum(irate(apiserver_request_total{verb=~"resource"}[$interval]))by(verb,resource) |
按 Verb+Resource 維度,統(tǒng)計(jì)單位時(shí)間(1s)內(nèi)的請(qǐng)求 QPS。 |
|
按 Verb 維度分析請(qǐng)求時(shí)延 |
histogram_quantile(interval])) by (le,verb)) |
按 Verb 維度,分析請(qǐng)求時(shí)延。 |
|
按 Verb+Resource 維度分析請(qǐng)求時(shí)延 |
histogram_quantile(interval])) by (le,verb,resource)) |
按 Verb+Resource 維度,分析請(qǐng)求時(shí)延。 |
|
非 2xx 返回值的讀請(qǐng)求 QPS |
sum(irate(apiserver_request_total{verb=~"GET|LIST",resource=~"resource",code!~"2.*"}[interval])) by (verb,resource,code) |
統(tǒng)計(jì)非 2xx 返回值的讀請(qǐng)求 QPS。 |
|
非 2xx 返回值的寫(xiě)請(qǐng)求 QPS |
sum(irate(apiserver_request_total{verb!~"GET|LIST|WATCH",verb=~"resource",code!~"2.*"}[$interval])) by (verb,resource,code) |
統(tǒng)計(jì)非 2xx 返回值的寫(xiě)請(qǐng)求 QPS。 |
ControllerManager 也是 Kubernetes 的重要組件,它負(fù)責(zé)整個(gè)集群的資源控制管理,它有許多的控制器,比如 NodeController、JobController 等。
ControllerManager 的監(jiān)控思路和 ApiServer 一樣,都使用 Prometheus Agent 進(jìn)行采集。
ControllerManager 是通過(guò)10257的/metrics接口進(jìn)行指標(biāo)采集,要訪問(wèn)這個(gè)接口同樣需要相應(yīng)的權(quán)限,不過(guò)我們?cè)诓杉?ApiServer 的時(shí)候創(chuàng)建過(guò)相應(yīng)的權(quán)限,這里就不用創(chuàng)建了。
(1)添加 Prometheus 配置 在原有的 Prometheus 采集配置中新增一個(gè) job 用于采集 ControllerManager,如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-agent-conf
labels:
name: prometheus-agent-conf
namespace: flashcat
data:
prometheus.yml: |-
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'apiserver'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
insecure_skip_verify: true
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
- job_name: 'controller-manager'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
insecure_skip_verify: true
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: kube-system;kube-controller-manager;https-metrics
remote_write:
- url: 'http://192.168.205.143:17000/prometheus/v1/write'由于我的集群里沒(méi)有相應(yīng)的 endpoints,所以需要?jiǎng)?chuàng)建一個(gè),如下:
apiVersion: v1
kind: Service
metadata:
annotations:
labels:
k8s-app: kube-controller-manager
name: kube-controller-manager
namespace: kube-system
spec:
clusterIP: None
ports:
- name: https-metrics
port: 10257
protocol: TCP
targetPort: 10257
selector:
component: kube-controller-manager
sessionAffinity: None
type: ClusterIP將 YAML 的資源更新到 Kubernetes 中,然后使用curl -X POST "http://
但是現(xiàn)在我們還無(wú)法獲取到 ControllerManager 的指標(biāo)數(shù)據(jù),需要把 ControllerManager 的bind-address改成0.0.0.0。
然后就可以在夜鶯 UI 中查看指標(biāo)了。
然后可以導(dǎo)入https://github.com/flashcatcloud/categraf/blob/main/k8s/cm-dash.json的是數(shù)據(jù)大盤(pán)。
|
指標(biāo) |
類(lèi)型 |
說(shuō)明 |
|
workqueue_adds_total |
Counter |
Workqueue 處理的 Adds 事件的數(shù)量。 |
|
workqueue_depth |
Gauge |
Workqueue 當(dāng)前隊(duì)列深度。 |
|
workqueue_queue_duration_seconds_bucket |
Histogram |
任務(wù)在 Workqueue 中存在的時(shí)長(zhǎng)。 |
|
memory_utilization_byte |
Gauge |
內(nèi)存使用量,單位:字節(jié)(Byte)。 |
|
memory_utilization_ratio |
Gauge |
內(nèi)存使用率=內(nèi)存使用量/內(nèi)存資源上限,百分比形式。 |
|
cpu_utilization_core |
Gauge |
CPU 使用量,單位:核(Core)。 |
|
cpu_utilization_ratio |
Gauge |
CPU 使用率=CPU 使用量/內(nèi)存資源上限,百分比形式。 |
|
rest_client_requests_total |
Counter |
從狀態(tài)值(Status Code)、方法(Method)和主機(jī)(Host)維度分析 HTTP 請(qǐng)求數(shù)。 |
|
rest_client_request_duration_seconds_bucket |
Histogram |
從方法(Verb)和 URL 維度分析 HTTP 請(qǐng)求時(shí)延。 |
|
名稱 |
PromQL |
說(shuō)明 |
|
Workqueue 入隊(duì)速率 |
sum(rate(workqueue_adds_total{job="ack-kube-controller-manager"}[$interval])) by (name) |
無(wú) |
|
Workqueue 深度 |
sum(rate(workqueue_depth{job="ack-kube-controller-manager"}[$interval])) by (name) |
無(wú) |
|
Workqueue 處理時(shí)延 |
histogram_quantile($quantile, sum(rate(workqueue_queue_duration_seconds_bucket{job="ack-kube-controller-manager"}[5m])) by (name, le)) |
無(wú) |
|
名稱 |
PromQL |
說(shuō)明 |
|
內(nèi)存使用量 |
memory_utilization_byte{cnotallow="kube-controller-manager"} |
內(nèi)存使用量,單位:字節(jié)。 |
|
CPU 使用量 |
cpu_utilization_core{cnotallow="kube-controller-manager"}*1000 |
CPU 使用量,單位:毫核。 |
|
內(nèi)存使用率 |
memory_utilization_ratio{cnotallow="kube-controller-manager"} |
內(nèi)存使用率,百分比。 |
|
CPU 使用率 |
cpu_utilization_ratio{cnotallow="kube-controller-manager"} |
CPU 使用率,百分比。 |
|
名稱 |
PromQL |
說(shuō)明 |
|
Kube API 請(qǐng)求 QPS |
Scheduler 監(jiān)聽(tīng)在10259端口,依然通過(guò) Prometheus Agent 的方式采集指標(biāo)。
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-agent-conf
labels:
name: prometheus-agent-conf
namespace: flashcat
data:
prometheus.yml: |-
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'apiserver'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
insecure_skip_verify: true
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
- job_name: 'controller-manager'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
insecure_skip_verify: true
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: kube-system;kube-controller-manager;https-metrics
- job_name: 'scheduler'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
insecure_skip_verify: true
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: kube-system;kube-scheduler;https
remote_write:
- url: 'http://192.168.205.143:17000/prometheus/v1/write'然后配置 Scheduler 的 Service。
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: kube-scheduler
name: kube-scheduler
namespace: kube-system
spec:
clusterIP: None
ports:
- name: https
port: 10259
protocol: TCP
targetPort: 10259
selector:
component: kube-scheduler
sessionAffinity: None
type: ClusterIP將 YAML 的資源更新到 Kubernetes 中,然后使用curl -X POST "http://
但是現(xiàn)在我們還無(wú)法獲取到 Scheduler 的指標(biāo)數(shù)據(jù),需要把 Scheduler 的bind-address改成0.0.0.0。
修改完成過(guò)后就可以正常在夜鶯UI中查看指標(biāo)了。
導(dǎo)入監(jiān)控大盤(pán)(https://github.com/flashcatcloud/categraf/blob/main/k8s/scheduler-dash.json)。
|
指標(biāo)清單 |
類(lèi)型 |
說(shuō)明 |
|
scheduler_scheduler_cache_size |
Gauge |
調(diào)度器緩存中 Node、Pod 和 AssumedPod 的數(shù)量。 |
|
scheduler_pending_pods |
Gauge |
Pending Pod 的數(shù)量。隊(duì)列種類(lèi)如下: |
|
指標(biāo)清單 |
PromQL |
說(shuō)明 |
|
Scheduler 集群統(tǒng)計(jì)數(shù)據(jù) |
|
指標(biāo)清單 |
PromQL |
說(shuō)明 |
|
內(nèi)存使用量 |
memory_utilization_byte{cnotallow="kube-scheduler"} |
內(nèi)存使用量,單位:字節(jié)。 |
|
CPU 使用量 |
cpu_utilization_core{cnotallow="kube-scheduler"}*1000 |
CPU 使用量,單位:毫核。 |
|
內(nèi)存使用率 |
memory_utilization_ratio{cnotallow="kube-scheduler"} |
內(nèi)存使用率,百分比。 |
|
CPU 使用率 |
cpu_utilization_ratio{cnotallow="kube-scheduler"} |
CPU 使用率,百分比。 |
|
指標(biāo)清單 |
PromQL |
說(shuō)明 |
|
Kube API 請(qǐng)求 QPS |
Etcd 是 Kubernetes 的存儲(chǔ)中心,所有資源信息都是存在在其中,它通過(guò)2381端口對(duì)外提供監(jiān)控指標(biāo)。
由于我這里的 Etcd 是通過(guò)靜態(tài) Pod 的方式部署到 Kubernetes 集群中的,所以依然使用 Prometheus Agent 來(lái)采集指標(biāo)。
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-agent-conf
labels:
name: prometheus-agent-conf
namespace: flashcat
data:
prometheus.yml: |-
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'apiserver'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
insecure_skip_verify: true
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
- job_name: 'controller-manager'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
insecure_skip_verify: true
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: kube-system;kube-controller-manager;https-metrics
- job_name: 'scheduler'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
insecure_skip_verify: true
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: kube-system;kube-scheduler;https
- job_name: 'etcd'
kubernetes_sd_configs:
- role: endpoints
scheme: http
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: kube-system;etcd;http
remote_write:
- url: 'http://192.168.205.143:17000/prometheus/v1/write'然后增加 Etcd 的 Service 配置。
apiVersion: v1
kind: Service
metadata:
namespace: kube-system
name: etcd
labels:
k8s-app: etcd
spec:
selector:
component: etcd
type: ClusterIP
clusterIP: None
ports:
- name: http
port: 2381
targetPort: 2381
protocol: TCP部署 YAML 文件,并重啟 Prometheus。如果獲取不到指標(biāo),需要修改 Etcd 的listen-metrics-urls配置為0.0.0.0。
導(dǎo)入監(jiān)控大盤(pán)(https://github.com/flashcatcloud/categraf/blob/main/k8s/etcd-dash.json)。
|
指標(biāo) |
類(lèi)型 |
說(shuō)明 |
|
cpu_utilization_core |
Gauge |
CPU 使用量,單位:核(Core)。 |
|
cpu_utilization_ratio |
Gauge |
CPU 使用率=CPU 使用量/內(nèi)存資源上限,百分比形式。 |
|
etcd_server_has_leader |
Gauge |
etcd member 是否有 Leader。 |
|
名稱 |
PromQL |
說(shuō)明 |
|
etcd 存活狀態(tài) |
kubelet 工作節(jié)點(diǎn)的主要組件,它監(jiān)聽(tīng)兩個(gè)端口:10248和10250。10248是監(jiān)控檢測(cè)端口,10250是系統(tǒng)默認(rèn)端口,通過(guò)它的/metrics接口暴露指標(biāo)。
這里依然通過(guò) Prometheus Agent 的方式采集 kubelet 的指標(biāo)。
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-agent-conf
labels:
name: prometheus-agent-conf
namespace: flashcat
data:
prometheus.yml: |-
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'apiserver'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
insecure_skip_verify: true
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
- job_name: 'controller-manager'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
insecure_skip_verify: true
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __m
新聞標(biāo)題:【夜鶯監(jiān)控】管理Kubernetes組件指標(biāo)
文章鏈接:http://uogjgqi.cn/article/dpsopgi.html

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流