Skip to main content

moregeek program

kubernetes监控手册07-监控controller-manager-多极客编程

写在前面

controller-manager 是 Kubernetes 控制面的组件,通常不太可能出问题,一般监控一下通用的进程指标就问题不大了,不过 controller-manager 确实也暴露了很多 ​​/metrics​​ 白盒指标,我们也一并梳理一下相关内容。

黑盒测试

类似上一篇《​​Kubernetes监控手册06-监控APIServer​​》描述的方法,我们先从黑盒角度测试一下,看看 controller-manager 的 ​​/metrics​​ 接口是否直接可用。

[root@tt-fc-dev01.nj manifests]# ss -tlnp|grep controller
LISTEN 0 128 *:10257 *:* users:(("kube-controller",pid=2782446,fd=7))

[root@tt-fc-dev01.nj manifests]# curl -s http://localhost:10257/metrics
Client sent an HTTP request to an HTTPS server.

[root@tt-fc-dev01.nj manifests]# curl -k -s https://localhost:10257/metrics
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "forbidden: User \"system:anonymous\" cannot get path \"/metrics\"",
"reason": "Forbidden",
"details": {},
"code": 403
}

看起来也是需要认证的,我们直接复用上一篇创建的 Token,看看能否拿到数据:

[root@tt-fc-dev01.nj yamls]# token=`kubectl get secret categraf-token-6whbs -n flashcat -o jsonpath={.data.token} | base64 -d`
[root@tt-fc-dev01.nj yamls]# curl -s -k -H "Authorization: Bearer $token" https://localhost:10257/metrics > cm.metrics
[root@tt-fc-dev01.nj yamls]# head -n 6 cm.metrics
# HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend.
# TYPE apiserver_audit_event_total counter
apiserver_audit_event_total 0
# HELP apiserver_audit_requests_rejected_total [ALPHA] Counter of apiserver requests rejected due to an error in audit logging backend.
# TYPE apiserver_audit_requests_rejected_total counter
apiserver_audit_requests_rejected_total 0
[root@tt-fc-dev01.nj yamls]# cat cm.metrics | wc -l
10070

妥了,可以复用之前的 Token。

配置采集

我们还是使用 Prometheus agent mode 来拉取数据,原汁原味的,只要把 controller-manager 部分也加上就行了。改造之后的 prometheus-agent-configmap.yaml 内容如下:

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

remote_write:
- url: 'http://10.206.0.16:19000/prometheus/v1/write'

这里我新增了一个scrape job name:controller-manager,Kubernetes 服务发现仍然使用 endpoints,匹配规则有三点(通过 relabel_configs 的 keep 实现):

  • ​__meta_kubernetes_namespace​​ endpoint 的 namespace 要求是 kube-system
  • ​__meta_kubernetes_service_name​​ service name 要求是 kube-controller-manager
  • ​__meta_kubernetes_endpoint_port_name​​ endpoint 的 port_name 要求是叫 https

如果你没有采集成功,就要去看看有没有这个 endpoint:

[work@tt-fc-dev01.nj yamls]$ kubectl get endpoints -n kube-system
NAME ENDPOINTS AGE
etcd 10.206.0.16:2381 126d
etcd-service 10.206.0.16:2379 75d
etcd-service2 10.206.10.16:2379 75d
kube-controller-manager 10.206.0.16:10257 74d
kube-dns 172.16.0.85:53,172.16.1.4:53,172.16.0.85:53 + 3 more... 324d
kube-scheduler 10.206.0.16:10259 131d
kube-state-metrics 172.16.3.198:8081,172.16.3.198:8080 75d
kubelet 10.206.0.11:10250,10.206.0.16:10250,10.206.0.17:10250 + 15 more... 315d

[work@tt-fc-dev01.nj yamls]$ kubectl get endpoints -n kube-system kube-controller-manager -o yaml
apiVersion: v1
kind: Endpoints
metadata:
annotations:
endpoints.kubernetes.io/last-change-trigger-time: "2022-09-15T09:43:21Z"
creationTimestamp: "2022-09-15T09:43:21Z"
labels:
k8s-app: kube-controller-manager
name: kube-controller-manager
namespace: kube-system
resourceVersion: "112212043"
uid: 52cfb383-6d2b-452e-9a1f-95c7a898a1b4
subsets:
- addresses:
- ip: 10.206.0.16
nodeName: 10.206.0.16
targetRef:
kind: Pod
name: kube-controller-manager-10.206.0.16
namespace: kube-system
resourceVersion: "112211925"
uid: d9515495-057c-4ea6-ad1f-28341498710f
ports:
- name: https
port: 10257
protocol: TCP

​__meta_kubernetes_endpoint_port_name​​ 就是上面的倒数第三行。这些信息我的环境里都是有的,如果你的环境没有对应的 endpoint,可以手工创建一个 service,孔飞老师之前给大家准备过一个 ​​https://github.com/flashcatcloud/categraf/blob/main/k8s/controller-service.yaml​​,把这个 controller-service.yaml apply 一下就行了。另外,如果是用 kubeadm 安装的 controller-manager,还要记得修改 ​​/etc/kubernetes/manifests/kube-controller-manager.yaml​​,调整 controller-manager 的启动参数:​​--bind-address=0.0.0.0​​。

监控大盘

controller-manager 的大盘已经准备好了,地址在 ​​https://github.com/flashcatcloud/categraf/blob/main/k8s/cm-dash.json​​,可以直接导入夜莺使用。如果觉得大盘有需要改进的地方,欢迎PR。

监控指标

controller-manager 的关键指标分别是啥意思,孔飞老师之前整理过,我给搬过来了:

# HELP rest_client_request_duration_seconds [ALPHA] Request latency in seconds. Broken down by verb and URL.
# TYPE rest_client_request_duration_seconds histogram
请求apiserver的耗时分布,按照url+verb统计

# HELP cronjob_controller_cronjob_job_creation_skew_duration_seconds [ALPHA] Time between when a cronjob is scheduled to be run, and when the corresponding job is created
# TYPE cronjob_controller_cronjob_job_creation_skew_duration_seconds histogram
cronjob 创建到运行的时间分布

# HELP leader_election_master_status [ALPHA] Gauge of if the reporting system is master of the relevant lease, 0 indicates backup, 1 indicates master. 'name' is the string used to identify the lease. Please make sure to group by name.
# TYPE leader_election_master_status gauge
控制器的选举状态,0表示backup, 1表示master

# HELP node_collector_zone_health [ALPHA] Gauge measuring percentage of healthy nodes per zone.
# TYPE node_collector_zone_health gauge
每个zone的健康node占比

# HELP node_collector_zone_size [ALPHA] Gauge measuring number of registered Nodes per zones.
# TYPE node_collector_zone_size gauge
每个zone的node数

# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total counter
cpu使用量(也可以理解为cpu使用率)

# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
控制器打开的fd数

# HELP pv_collector_bound_pv_count [ALPHA] Gauge measuring number of persistent volume currently bound
# TYPE pv_collector_bound_pv_count gauge
当前绑定的pv数量

# HELP pv_collector_unbound_pvc_count [ALPHA] Gauge measuring number of persistent volume claim currently unbound
# TYPE pv_collector_unbound_pvc_count gauge
当前没有绑定的pvc数量


# HELP pv_collector_bound_pvc_count [ALPHA] Gauge measuring number of persistent volume claim currently bound
# TYPE pv_collector_bound_pvc_count gauge
当前绑定的pvc数量

# HELP pv_collector_total_pv_count [ALPHA] Gauge measuring total number of persistent volumes
# TYPE pv_collector_total_pv_count gauge
pv总数量


# HELP workqueue_adds_total [ALPHA] Total number of adds handled by workqueue
# TYPE workqueue_adds_total counter
各个controller已接受的任务总数
与apiserver的workqueue_adds_total指标类似

# HELP workqueue_depth [ALPHA] Current depth of workqueue
# TYPE workqueue_depth gauge
各个controller队列深度,表示一个controller中的任务的数量
与apiserver的workqueue_depth类似,这个是指各个controller中队列的深度,数值越小越好

# HELP workqueue_queue_duration_seconds [ALPHA] How long in seconds an item stays in workqueue before being requested.
# TYPE workqueue_queue_duration_seconds histogram
任务在队列中的等待耗时,按照控制器分别统计

# HELP workqueue_work_duration_seconds [ALPHA] How long in seconds processing an item from workqueue takes.
# TYPE workqueue_work_duration_seconds histogram
任务出队到被处理完成的时间,按照控制分别统计

# HELP workqueue_retries_total [ALPHA] Total number of retries handled by workqueue
# TYPE workqueue_retries_total counter
任务进入队列重试的次数

# HELP workqueue_longest_running_processor_seconds [ALPHA] How many seconds has the longest running processor for workqueue been running.
# TYPE workqueue_longest_running_processor_seconds gauge
正在处理的任务中,最长耗时任务的处理时间

# HELP endpoint_slice_controller_syncs [ALPHA] Number of EndpointSlice syncs
# TYPE endpoint_slice_controller_syncs counter
endpoint_slice 同步的数量(1.20以上)

# HELP get_token_fail_count [ALPHA] Counter of failed Token() requests to the alternate token source
# TYPE get_token_fail_count counter
获取token失败的次数

# HELP go_memstats_gc_cpu_fraction The fraction of this program's available CPU time used by the GC since the program started.
# TYPE go_memstats_gc_cpu_fraction gauge
controller gc的cpu使用率

相关文章

关于作者

本文作者秦晓辉,​​Flashcat​​合伙人,文章内容是Flashcat技术团队共同沉淀的结晶,作者做了编辑整理,我们会持续输出监控、稳定性保障相关的技术文章,文章可转载,转载请注明出处,尊重技术人员的成果。

如果对 Nightingale、Categraf、Prometheus 等技术感兴趣,欢迎加入我们的微信群组,联系我(picobyte)拉入部落,和社区同仁一起探讨监控技术。

©著作权归作者所有:来自51CTO博客作者龙渊秦五的原创作品,请联系作者获取转载授权,否则将追究法律责任

liveqing视频平台linux系统安装使用说明-多极客编程

1、服务架构下载地址:​​https://www.liveqing.com/docs/download/LiveGBS.html#​​版本下载 服务说明LiveGBS服务,包含 信令服务(LiveCMS) 和 流媒体服务(LiveSMS) 两部分,需同时安装运行下载安装包​​下载 LiveGBS 安装包​​,先上传部署包到服务器, 再解压Linux平台使用的安装包: LiveCMS-linux-*

zabbix通过proxy的被动模式代理来跨网段监控linux主机-多极客编程

  上篇文章使用zabbix proxy实现主动代理跨网段分布式监控(https://blog.51cto.com/u_15105742/5956857),我们已经配置完架构图中的主动模式的监控部分,在这篇文章中我们就继续配置被动模式的监控实践。 1、实验架构图 2、zabbix proxy的被动代理模式安装及配置 这里的被动代理服务的主机我就是要编译安装zabbix proxy了。 root@

修改kube-proxy的网络模式为ipvs-多极客编程

变更内容:修改kube-proxy的网络模式ifconfig为ipvs1、加载内核模块cat ipvs.modules#!/bin/bashipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf

python之模块和包-多极客编程

一、模块Python 模块(Module),是⼀个 Python ⽂件,以 .py 结尾,包含了 Python 对象定义和Python语句。模块能定义函数,类和变量,模块⾥也能包含可执⾏的代码。1、导入模块1、导入模块的方式import 模块名from 模块名 import 功能名from 模块名 import *import 模块名 as 别名from 模块名 import 功能名 as 别名2

python之异常-多极客编程

一、了解异常当检测到⼀个错误时,解释器就⽆法继续执⾏了,反⽽出现了⼀些错误的提示,这就是所谓的"异常"。例如:以 r ⽅式打开⼀个不存在的⽂件。open('test.txt', 'r')二、异常的写法1、语法try: 可能发⽣错误的代码except: 如果出现异常执⾏的代码2、快速体验需求:尝试以 r 模式打开⽂件,如果⽂件不存在,则以 w ⽅式打开。try: f = open('test.txt

35-企业级监控系统 zabbix(包安装)-多极客编程

Zabbix 是一个高度成熟完善的网络监控解决方案,包含了多种功能。Zabbix 安装要求经测试,Zabbix 组件 可以运行在下列平台:安装 Zabbix ServerZabbix Server 提供了三种安装方法 1. 二进制包安装: 官方提供了二进制包安装的方法,可以支持CentOS和Debian/Ubuntu的安装 #Zabbix6.0 https://www.zabbix.c

liveqing视频平台linux系统安装使用说明-多极客编程

1、服务架构下载地址:​​https://www.liveqing.com/docs/download/LiveGBS.html#​​版本下载 服务说明LiveGBS服务,包含 信令服务(LiveCMS) 和 流媒体服务(LiveSMS) 两部分,需同时安装运行下载安装包​​下载 LiveGBS 安装包​​,先上传部署包到服务器, 再解压Linux平台使用的安装包: LiveCMS-linux-*

zabbix通过proxy的被动模式代理来跨网段监控linux主机-多极客编程

  上篇文章使用zabbix proxy实现主动代理跨网段分布式监控(https://blog.51cto.com/u_15105742/5956857),我们已经配置完架构图中的主动模式的监控部分,在这篇文章中我们就继续配置被动模式的监控实践。 1、实验架构图 2、zabbix proxy的被动代理模式安装及配置 这里的被动代理服务的主机我就是要编译安装zabbix proxy了。 root@

修改kube-proxy的网络模式为ipvs-多极客编程

变更内容:修改kube-proxy的网络模式ifconfig为ipvs1、加载内核模块cat ipvs.modules#!/bin/bashipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf

python之模块和包-多极客编程

一、模块Python 模块(Module),是⼀个 Python ⽂件,以 .py 结尾,包含了 Python 对象定义和Python语句。模块能定义函数,类和变量,模块⾥也能包含可执⾏的代码。1、导入模块1、导入模块的方式import 模块名from 模块名 import 功能名from 模块名 import *import 模块名 as 别名from 模块名 import 功能名 as 别名2

python之异常-多极客编程

一、了解异常当检测到⼀个错误时,解释器就⽆法继续执⾏了,反⽽出现了⼀些错误的提示,这就是所谓的"异常"。例如:以 r ⽅式打开⼀个不存在的⽂件。open('test.txt', 'r')二、异常的写法1、语法try: 可能发⽣错误的代码except: 如果出现异常执⾏的代码2、快速体验需求:尝试以 r 模式打开⽂件,如果⽂件不存在,则以 w ⽅式打开。try: f = open('test.txt

nfv到底是什么?-多极客编程

NFV是一种网络架构,它是基于虚拟化技术将网络功能节点虚拟化为可链接在一起提供通信服务的功能模块。NFV致力于改变网络运营者构建网络的方式,通过虚拟化技术让各种网络组成单元实现独立应用,可以灵活部署在基于标准的服务器、存储、交换机构建的统一平台上,实现在数据中心、网络节点和用户端等各个位置的部署与配置。NFV可以将网络功能软件化,以便在业界标准的服务器上运行,软件化的功能模块可迁移或部署在网络中的