【云原生】k8s集群资源监控平台搭建—20230227

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 【云原生】k8s集群资源监控平台搭建—20230227

1. 监控指标


  1. 集群监控
    ①节点资源利用率
    ②节点数
    ③运行pods
  2. pod监控
    ①容器指标
    ②应用程序


2. 监控平台


1. Prometheus

开源的;集成了很多功能,比如监控、报警、数据库等;以HTTP协议周期性的抓取被监控组件的状态以及相应的数据;不需要复杂的集成过程,只需要使用HTTP接口接入就可以了。


2. Grafana

开源的数据分析和可视化的工具;支持多种数据源。

7099b2c7d89845ea88dcad4669222aff.png

通过Prometheus抓取数据,进行存储,通过Grafana读取展示可视化。


3. 搭建监控平台

(1)部署Prometheus

使用二进制包或者通过yaml文件部署,这里采用yaml文件部署。

将Windows系统中的yaml文件传入Linux系统,逐个运行。

e72493f64ea54eba91a7785a009d383d.png

0399b50e2214493d8585e9e130b89400.png

  1. 部署守护进程
    node-exporter.yaml文件内容如下
kubectl create -f node-exporter.yaml


---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: kube-system
  labels:
    k8s-app: node-exporter
spec:
  selector:
    matchLabels:
      k8s-app: node-exporter
  template:
    metadata:
      labels:
        k8s-app: node-exporter
    spec:
      containers:
      - image: prom/node-exporter
        name: node-exporter
        ports:
        - containerPort: 9100
          protocol: TCP
          name: http
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: node-exporter
  name: node-exporter
  namespace: kube-system
spec:
  ports:
  - name: http
    port: 9100
    nodePort: 31672
    protocol: TCP
  type: NodePort
  selector:
    k8s-app: node-exporter
  1. 部署其他yaml文件
    rbac-setup.yaml文件内容
kubectl create -f rbac-setup.yaml


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - nodes/proxy
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: kube-system

configmap.yaml文件内容

kubectl create -f configmap.yaml


apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-system
data:
  prometheus.yml: |
    global:
      scrape_interval:     15s
      evaluation_interval: 15s
    scrape_configs:
    - job_name: 'kubernetes-apiservers'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_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: 'kubernetes-nodes'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics
    - job_name: 'kubernetes-cadvisor'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
    - job_name: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - 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: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - 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
    - job_name: 'kubernetes-services'
      kubernetes_sd_configs:
      - role: service
      metrics_path: /probe
      params:
        module: [http_2xx]
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe]
        action: keep
        regex: true
      - source_labels: [__address__]
        target_label: __param_target
      - target_label: __address__
        replacement: blackbox-exporter.example.com:9115
      - source_labels: [__param_target]
        target_label: instance
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        target_label: kubernetes_name
    - job_name: 'kubernetes-ingresses'
      kubernetes_sd_configs:
      - role: ingress
      relabel_configs:
      - source_labels: [__meta_kubernetes_ingress_annotation_prometheus_io_probe]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]
        regex: (.+);(.+);(.+)
        replacement: ${1}://${2}${3}
        target_label: __param_target
      - target_label: __address__
        replacement: blackbox-exporter.example.com:9115
      - source_labels: [__param_target]
        target_label: instance
      - action: labelmap
        regex: __meta_kubernetes_ingress_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_ingress_name]
        target_label: kubernetes_name
    - job_name: 'kubernetes-pods'
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        target_label: __address__
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: kubernetes_pod_name

prometheus.deploy.yml文件内容

kubectl create -f prometheus.deploy.yml


---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    name: prometheus-deployment
  name: prometheus
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - image: prom/prometheus:v2.0.0
        name: prometheus
        command:
        - "/bin/prometheus"
        args:
        - "--config.file=/etc/prometheus/prometheus.yml"
        - "--storage.tsdb.path=/prometheus"
        - "--storage.tsdb.retention=24h"
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: "/prometheus"
          name: data
        - mountPath: "/etc/prometheus"
          name: config-volume
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 500m
            memory: 2500Mi
      serviceAccountName: prometheus    
      volumes:
      - name: data
        emptyDir: {}
      - name: config-volume
        configMap:
          name: prometheus-config   

prometheus.svc.yml文件内容

kubectl create -f prometheus.svc.yml


---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus
  namespace: kube-system
spec:
  type: NodePort
  ports:
  - port: 9090
    targetPort: 9090
    nodePort: 30003
  selector:
    app: prometheus


⑤查看pod

kubectl get pods -n kube-system


(2)部署Grafana

adba099ac91b4dc4be96f552ef9a4b71.png

grafana-deploy.yaml文件内容

kubectl create -f grafana-deploy.yaml


apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana-core
  namespace: kube-system
  labels:
    app: grafana
    component: core
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
      component: core
  template:
    metadata:
      labels:
        app: grafana
        component: core
    spec:
      containers:
      - image: grafana/grafana:7.4.3
        name: grafana-core
        imagePullPolicy: IfNotPresent
        # env:
        resources:
          # keep request = limit to keep this container in guaranteed class
          limits:
            cpu: 100m
            memory: 100Mi
          requests:
            cpu: 100m
            memory: 100Mi
        env:
          # The following env variables set up basic auth twith the default admin user and admin password.
          - name: GF_AUTH_BASIC_ENABLED
            value: "true"
          - name: GF_AUTH_ANONYMOUS_ENABLED
            value: "false"
          # - name: GF_AUTH_ANONYMOUS_ORG_ROLE
          #   value: Admin
          # does not really work, because of template variables in exported dashboards:
          # - name: GF_DASHBOARDS_JSON_ENABLED
          #   value: "true"
        readinessProbe:
          httpGet:
            path: /login
            port: 3000
          # initialDelaySeconds: 30
          # timeoutSeconds: 1
        volumeMounts:
        - name: grafana-persistent-storage
          mountPath: /var/lib/grafana
      volumes:
      - name: grafana-persistent-storage
        emptyDir: {}

grafana-svc.yaml文件内容

kubectl create -f grafana-svc.yaml


apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: kube-system
  labels:
    app: grafana
    component: core
spec:
  type: NodePort
  ports:
    - port: 3000
  selector:
    app: grafana
    component: core

grafana-ing.yaml文件内容

kubectl create -f grafana-ing.yaml


apiVersion: extensions/v1beta1
kind: Ingress
metadata:
   name: grafana
   namespace: kube-system
spec:
   rules:
   - host: k8s.grafana
     http:
       paths:
       - path: /
         backend:
          serviceName: grafana
          servicePort: 3000

(3)打开Grafana,配置数据源,导入显示模板

①测试

kubectl get svc -n kube-system -o wide


查看端口号,用节点IP+端口号,访问Grafana

默认用户名密码都是:admin

f73d868a9b5c4510a22769b7d75cdde1.png

d068e9ee87fc49bd829ff523abbd7868.png

②配置数据源,使用Prometheos

6f82db3890ac48ac96abbfc0c8d80b26.png

28c0dc3fffd747569ebb5131ea5714a9.png

Url那里填写prometheus对应的CLUSTER-IP

615dc147d34d4b1cbc2fbdf0af84f306.png

3b3e794af47a421aa3b9d42ddabfa100.png

③设置显示数据模板

cae7e60b54b84a4dab56d5866f7f146d.png

1c726ac480ed471e94d57d4a23c57f71.png

选择自己的数据源后import

4142af2e15be4f58ba35329741289da8.png

导入后即可看到检控看板。

d32f173b4a2a40feab44559c859ceff4.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
Prometheus Kubernetes 监控
高性能、高可用、免运维-云原生Prometheus方案与实践
SLS(阿里云日志服务)一直致力于发展成一个DevOps的数据中台,为用户提供丰富的机器数据接入、存储、分析、可视化等能力。本文主要介绍SLS如何支持Prometheus的方案,为大家提供云原生的高性能、高可用、免运维的Prometheus引擎。
8148 2
高性能、高可用、免运维-云原生Prometheus方案与实践
|
运维 Kubernetes 监控
以一致的体验交付和管理云原生多集群应用
本文为 KubeCon China 2021 演讲内容作者:孙健波(天元),冯泳(鹿惊)背景随着云原生生态的繁荣,Kubernetes 逐渐成为了基础设施的标准集成界面,越来越多的基础设施能力变成了开箱即用的声明式 API,CRD Operator的普及也让运维能力也逐渐趋向于声明式和自动化。如图 1 所示,从底层基础设施到上层应用开发,如今的 CNCF 生态中有上千个项目。图 1. CNCF l
|
存储 弹性计算 Prometheus
阿里云注册集群+Prometheus 解决多云容器集群运维痛点
面对跨区跨云厂商容器集群混用场景,我们该如何借助Prometheus+Grafana实现容器集群监控?立刻查看本文吧!
阿里云注册集群+Prometheus 解决多云容器集群运维痛点
|
运维 监控 Cloud Native
《云原生可观测性监控运维实践》电子版地址
【6】云原生可观测性监控运维实践-马小鹏(2)(1)
136 0
《云原生可观测性监控运维实践》电子版地址
|
3月前
|
运维 Kubernetes Cloud Native
云原生时代下的应用部署与管理
【10月更文挑战第38天】在数字化浪潮中,云原生技术正引领着软件开发和运维的革命。本文将探讨云原生的核心概念、优势以及如何通过代码示例实现应用的快速部署和管理,旨在为读者提供一套清晰的云原生应用部署和管理的实践指南。
|
Kubernetes 监控 安全
【直播预告】云上云下 Kubernetes 多集群统一资源管理和安全治理
如今,越来越多的企业已经采用 Kubernetes 容器集群,随着创新业务的不断增加,用户会选择将一部分业务上云运行在阿里云 ACK 集群,一部分业务继续运行在 IDC 自建 Kubernetes 集群,本次直播将介绍如何解决云上云下多集群不一致的资源管理方式、不一致的安全策略和访问控制以及日志监控告警等问题。
【直播预告】云上云下 Kubernetes 多集群统一资源管理和安全治理
|
运维 Kubernetes 监控
金融级云原生:多活容器集群高可用建设实践
本文整理自蚂蚁集团金融云产品技术部SOFAStack产品专家俞仁杰在2020 GIDC全球互联网数据大会的分享。详细讲解了云原生架构下的多活高可用平台和产品建设相关经验和观点。
1170 1
金融级云原生:多活容器集群高可用建设实践
|
调度
《全新的混合云管理模式-统一的观测、治理、弹性、调度》电子版地址
全新的混合云管理模式-统一的观测、治理、弹性、调度
81 0
《全新的混合云管理模式-统一的观测、治理、弹性、调度》电子版地址
|
1月前
|
运维 Cloud Native 开发工具
智能运维:云原生大规模集群GitOps实践
智能运维:云原生大规模集群GitOps实践,由阿里云运维专家钟炯恩分享。内容涵盖云原生运维挑战、管理实践、GitOps实践及智能运维体系。通过OAM模型和GitOps优化方案,解决大规模集群的发布效率与稳定性问题,推动智能运维工程演进。适用于云原生环境下的高效运维管理。
|
9月前
|
Kubernetes Cloud Native 持续交付
探索云原生架构的未来:如何优化资源管理和服务部署
【5月更文挑战第6天】 随着云计算的快速发展,云原生技术已成为企业数字化转型的关键驱动力。此篇文章深入探讨了云原生架构的核心组件及其在资源管理和服务部署方面的优化策略。通过分析容器化、微服务及自动化管理的实践案例,本文旨在为读者提供一套系统的方法论,以利用云原生技术实现更高效、灵活且可靠的IT基础设施。
152 2

热门文章

最新文章