Ops实践 | K8S云原生环境下集群资源监控指标拉取与可视化展示实践(补充)

2023-12-01 14:00:15 浏览数 (1)

前言简述:

描述: 在《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参数进行配置 kubeletkube-proxy 组件监控指标的抓取,修改过后更新configmap以及热重载Prometheus,前面的文章中已经提及过此处我就不再累述了。

代码语言:javascript复制
$ 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镜像也都是可以的。

代码语言:javascript复制
$ 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后部署即可。

代码语言:javascript复制
$ 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 拉取注释。

代码语言:javascript复制
$ 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配置。

代码语言:javascript复制
# 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服务的监控,希望大家能持续关注作者,也不枉作者花费时间整理此文。

0 人点赞