前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ops实践 | K8S云原生环境下集群资源监控指标拉取与可视化展示实践(补充)

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

作者头像
全栈工程师修炼指南
发布2023-12-01 14:00:15
3640
发布2023-12-01 14:00:15
举报

前言简述:

描述: 在《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服务的监控,希望大家能持续关注作者,也不枉作者花费时间整理此文。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈工程师修炼指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.kubelet、kube-proxy 组件监控实践
  • K8S云原生集群资源监控实践
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档