前言简述:
描述: 在《Ops实践 | 从零开始,在云原生环境下快速实现K8S集群可视化监控》文章中,针对 Kubernetes 集群资源监控部分,作者写得有些含糊不清,所以此文我将对K8S集群组件(kubelet、kube-proxy)以及使用kube-state-metric暴露资源(deployment、statefulset、service、pod)的监控指标整理介绍。
回顾一下,针对集群节点监控指标暴露通常使用的是node_exporter
工具,而针对集群容器资源监控指标是采用CAdvisor
(目前已被Kubernetes集成),而如果想监控K8S集群控制器资源则需要使用kube-state-metric
工具,实现架构图如下所示:
本文将实现的效果如下图所示:
图1.使用 kube-state-metric 暴露指标使用 Prometheus 拉取。
图2.使用 Grafana平台展示K8S集群相关资源指标。
温馨提示:希望各位看友持续支持作者《[#云原生落地实践指南]》专栏,作者将继续更新此专栏文章,请已付费的看友务必添加作者,拉你一起进入交流答疑群(添加时请备注文章付费)。
1.kubelet、kube-proxy 组件监控实践
kubernetes 集群中 10250 与 10249 端口对应了什么组件服务?
描述: 在 Kubernetes 集群中 10250 与 10249 端口都暴露了 Metrics 指标,其中10250端口对应的是kubelet服务,而10249端口对应的是kube-proxy服务, 这些端口在Kubernetes集群中起到了关键的作用,确保了集群的正常运行和服务的可用性。
- kubelet 是Kubernetes集群中每个节点上的主要组件之一,它负责管理节点上的容器和Pod,它通过监听10250端口来与Kubernetes API服务器进行通信,接收来自API服务器的指令,并执行相应的操作,如创建、删除和监控Pod, 所以其监控指标
带有容器和Pod等资源信息
。 - kube-proxy 是Kubernetes集群中负责服务发现和负载均衡的组件之一, 它通过监听10249端口来与Kubernetes API服务器进行通信,接收来自API服务器的服务和端口信息,并在节点上配置相应的网络规则,实现服务的访问和负载均衡功能, 所以其监控指标
带有Services和Pod容器网络等资源信息
。
下面,我们使用 Kuberneter API 分别访问 kubelet、kube-proxy 端口上的 metric。
代码语言:javascript复制# 1.验证 sa 用户 与 rbac 权限
kubectl get sa,clusterrole,clusterrolebindings -n monitoring prometheus
# NAME SECRETS AGE
# serviceaccount/prometheus 0 10h
# NAME CREATED AT
# clusterrole.rbac.authorization.k8s.io/prometheus 2023-11-22T15:05:58Z
# NAME ROLE AGE
# clusterrolebinding.rbac.authorization.k8s.io/prometheus ClusterRole/prometheus 10h
# 2.集群信息
$ kubectl cluster-info
# Kubernetes control plane is running at https://apiserver.cluster.weiyigeek:6443
# CoreDNS is running at https://apiserver.cluster.weiyigeek:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
# 3.获取 Token
$ kubectl get secret -n monitor $(kubectl get sa prometheus -n monitor -o yaml | tail -n 1 | cut -d " " -f 3) -o yaml | grep "token:" | head -n 1 | awk '{print $2}'| base64 -d > cluster.weiyigeek_prometheus_token
# 验证 Token
token=$(cat cluster.weiyigeek_prometheus_token)
# 基于 kubelet metrics
curl -k -H "Authorization: Bearer ${token}" https://apiserver.cluster.weiyigeek:6443/api/v1/nodes/weiyigeek-103:10250/proxy/metrics | head -n 10
# 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
# # HELP apiserver_client_certificate_expiration_seconds [ALPHA] Distribution of the remaining lifetime on the certificate used to authenticate a request.
# # TYPE apiserver_client_certificate_expiration_seconds histogram
# apiserver_client_certificate_expiration_seconds_bucket{le="0"} 0
# apiserver_client_certificate_expiration_seconds_bucket{le="1800"} 0
# 基于 kube-proxy metrics
curl -s -k -H "Authorization: Bearer ${token}" https://apiserver.cluster.weiyigeek:6443/api/v1/nodes/weiyigeek-103:10249/proxy/metrics | head -n 10
# # HELP aggregator_discovery_aggregation_count_total [ALPHA] Counter of number of times discovery was aggregated
# # TYPE aggregator_discovery_aggregation_count_total counter
# aggregator_discovery_aggregation_count_total 0
# # 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
此处我以外部K8S集群配置为例,演示使用kubernetes_sd_config
参数进行配置 kubelet
与 kube-proxy
组件监控指标的抓取,修改过后更新configmap以及热重载Prometheus,前面的文章中已经提及过此处我就不再累述了。
$ vim /storage/app/monitoring/prometheus/deploy/prometheus-configmap.yaml
# prometheus 配置文件
.......
scrape_configs:
# kubelet / kube-proxy 组件服务监控指标拉取
- job_name: 'K8S-weiyigeek-kubelet'
# 创建的 SA Prometheus 用户的认证 Token
bearer_token_file: /prometheus/exporter/token/cluster.weiyigeek_prometheus_token
# 设置协议为 https 否则将会访问 http 报 server returned HTTP status 400 Bad Request 错误哟。
scheme: https
tls_config:
# 跳过集群 https 验证
insecure_skip_verify: true
# 配置使用 nodes 级别动态发现
kubernetes_sd_configs:
- role: node
api_server: 'https://apiserver.cluster.weiyigeek:6443'
bearer_token_file: /prometheus/exporter/token/cluster.weiyigeek_prometheus_token
tls_config:
insecure_skip_verify: true
relabel_configs:
# 将标签 ip 值修改为 __address__ 标签中的IP地址部分
- source_labels: [__address__]
regex: (.*):(.*)
action: replace
target_label: ip
replacement: ${1}
# 使用 replacement 值替换 __address__ 默认值
- target_label: __address__
replacement: apiserver.cluster.weiyigeek:6443
# 使用 replacement 值替换 __metrics_path__ 默认值, 下面端口为10250时则是使用 kubelet 组件监控指标采集,若更改为 10249 则进行 kube-proxy 组件监控指标采集。
- source_labels: [__meta_kubernetes_node_name]
regex: (. )
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}:10250/proxy/metrics
# 保留 __meta_kubernetes_node_label 中的标签
- action: labelmap
regex: __meta_kubernetes_node_label_(. )
抓取效果如下所示
温馨提示: kubernetes_sd_config
允许从Kubernetes的RESTneneneba API检索抓取目标,并始终与集群状态保持同步, 支持 node、pod、service、endpoints、endpointslice、ingress
等服务级别的自动发现,
官网文档地址:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config
K8S云原生集群资源监控实践
描述: 此小节将进行安装使用kube-state-metric
代理来生成和公开Kubernetes云原生集群资源指标,并使用Prometheus拉取对应指标,最后使用Grafana来可视化展示指标实践。
简单介绍: kube-state-metrics
(KSM) 是一项简单的服务,用于侦听 Kubernetes API 服务器并生成有关对象状态的指标,它并不关注各个 Kubernetes 组件的运行状况,而是关注内部各种对象的运行状况,例如 Pod、DaemonSet、Deployment、Job、CronJob
等各种资源对象的状态也需要监控,这也反映了使用这些资源部署的应用的状态。
比如:
- 我调度了多少个副本?现在可用的有几个?
- 多少个 Pod 是
running/stopped/terminated
状态? - Pod 重启了多少次?
- 我有多少 job 在运行中等等
项目地址: https://github.com/kubernetes/kube-state-metrics
温馨提示: kube-state-metric
版本需要与对应的Kubernetes集群版本一一对应,下面展示出当前最新【2023年11月29日】的对应关系,由于K8S更新较快,若版本不再此图中建议你参考官方文档,此处作者测试的集群为V1.28则选用当前main(2.10.1/2023-10-09)
即可。
操作步骤
Step 1.官网下载解压资源清单。
代码语言:javascript复制$ wget -L https://github.com/kubernetes/kube-state-metrics/archive/refs/tags/v2.10.1.zip -O kube-state-metrics-v2.10.1.zip
$ unzip kube-state-metrics-v2.10.1.zip
代码语言:javascript复制
Step 2.使用标准 standard 的示例资源清单安装到集群之中, 查看部署所需的 image 镜像,由于国内无法访问registry.k8s.io
所以,此处作者采用此篇文章《如何使用Github Action优雅的同步国外镜像到DockerHub或私有仓库》的方式将镜像拷贝到docker.io中,或者采用bitnami/kube-state-metrics
镜像也都是可以的。
$ cd kube-state-metrics-2.10.1/examples/standard
$ ls
# cluster-role-binding.yaml cluster-role.yaml deployment.yaml service-account.yaml service.yaml
$ grep "image" *
deployment.yaml: - image: registry.k8s.io/kube-state-metrics
代码语言:javascript复制/kube-state-metrics:v2.10.1
Step 3.替换镜像为weiyigeek/kube-state-metrics:v2.10.1
后部署即可。
$ vim deployment.yaml
# containers:
# - image: weiyigeek/kube-state-metrics:v2.10.1
$ kubectl apply -f ./
# clusterrolebinding.rbac.authorization.k8s.io/kube-state-metrics created
# clusterrole.rbac.authorization.k8s.io/kube-state-metrics created
# deployment.apps/kube-state-metrics created
# serviceaccount/kube-state-metrics created
# service/kube-state-metrics created
代码语言:javascript复制
Step 4.查看验证 kube-state-metrics 部署结果, 为 service/kube-state-metrics
添加 Prometheus 拉取注释。
$ kubectl get deployment,service,pod -n kube-system -l app.kubernetes.io/name=kube-state-metrics
# NAME READY UP-TO-DATE AVAILABLE AGE
# deployment.apps/kube-state-metrics 1/1 1 1 105s
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# service/kube-state-metrics ClusterIP None <none> 8080/TCP,8081/TCP 105s
# NAME READY STATUS RESTARTS AGE
# pod/kube-state-metrics-84b7bcc66-mfvmt 1/1 Running 0 105s
# 重点步骤
$ kubectl patch services kube-state-metrics -n kube-system --patch '{"metadata": {"annotations": {"prometheus.io/scrape": "true","prometheus.io/scheme": "http","prometheus.io/port": "8080"}}}'
代码语言:javascript复制
Step 5.此处使用endpoints服务发现方式进行Prometheus拉取本地(内部
)集群资源metrics配置。
# prometheus 配置文件
$ vim /storage/app/monitoring/prometheus/deploy/prometheus-configmap.yaml
- job_name: 'K8S-SEC-Metrics'
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
kubernetes_sd_configs:
- role: endpoints
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
# 指定名称空间
namespaces:
names:
- "ingress-nginx"
- "kube-system"
api_server: 'https://sec-lb.k8s.weiyigeek.top:16443'
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
relabel_configs:
# 只保留 service 有 prometheus.io/scrape 注释的
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
# 请求协议自定义替换
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
# 请求地址自定义替换
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:] )(?::d )?;(d )
replacement: $1:$2
# 请求路径自定义替换
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (. )
# 保留服务标签
- action: labelmap
regex: __meta_kubernetes_service_label_(. )
# 名称空间以及服务名称
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: kubernetes_name
Step 6.更新配置,重载 prometheus 服务,并验证【kube-state-metrics
】拉取目标对象情况。
Step 7.在Grafana中导入id为13332
或者15398
的K8S集群资源监控可视化模板,具体操作请查看前面文章,此处不再累述,后续作者会将基于此模板整理修改符合自己企业所需。
更多 Grafana 可视化模板可访问如下地址: https://grafana.com/grafana/dashboards/
温馨提示:下一篇文章,作者将更新企业内部的DNS服务器CoreDNS服务的监控,以及Kubernetes集群中的ingress-nginx服务的监控,希望大家能持续关注作者,也不枉作者花费时间整理此文。