文档首页/ 云容器实例 CCI/ 最佳实践/ 负载管理/ 使用Prometheus监控CCI实例
更新时间:2024-10-29 GMT+08:00
分享

使用Prometheus监控CCI实例

为实现CCI用户对部署的应用负载进行基础资源监控和自定义监控,我们提供了Prometheus对接CCI实例监控的能力,您可以手动部署Prometheus插件,直接使用Prometheus作为监控平台,对命名空间中部署的应用负载进行实时监控。

Prometheus概念及详细配置请参阅Prometheus 官方文档

本章节将介绍如何在CCI命名空间中,部署Prometheus,实现对Pod实例的监控。

首先需要完成两步配置,一是访问CCI并使用“用户名/密码”或“AK/SK”的方式配置IAM认证信息,二是使用ConfigMap管理Prometheus配置。两个ConfigMap资源创建成功之后。接下来使用Deployment部署Prometheus,通过Volume挂载的方式,将Prometheus的配置文件挂载到容器中。

使用ConfigMap配置Prometheus访问CCI

首先使用cci-iam-authenticator作为k8s client端的认证插件,通过用户名/密码的方式配置IAM认证信息。您可参照安装并设置kubectl进行配置。配置完成后,执行“kubectl config view”命令,获取$HOME/.kube/config路径下的kubeconfig文件。

图1 kubeconfig文件

以下示例是为Prometheus访问CCI所做的配置。使用此配置文件构造Prometheus连接API Server的信息。您只需将获取到的kubeconfig配置文件内容写入ConfigMap。

kind: ConfigMap
apiVersion: v1 
metadata:   
  name: kubeconfig 
data: 
  kubeconfig: |-   
    apiVersion: v1    # cci-iam-authenticator生成的kubeconfig配置文件
    ...

使用ConfigMap管理Prometheus配置

为了能够方便地管理配置文件,我们这里将 prometheus.yml 文件用 ConfigMap 的形式进行管理。通过ConfigMap可以方便地做到配置解耦,使得不同环境有不同的配置。相比环境变量,Pod中引用的ConfigMap可以做到实时更新,当您更新ConfigMap的数据后,Pod中引用的ConfigMap会同步刷新。

创建prometheus-config.yml文件,并写入以下内容:

kind: ConfigMap
apiVersion: v1
metadata:
  name: prometheus-config
  labels:
    name: prometheus-config
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s   
      evaluation_interval: 15s  
    scrape_configs: 
      - job_name: kuberenete-pods   # 对pod中应用的监控,自定义监控
        kubernetes_sd_configs:  
        - role: pod
          kubeconfig_file: /etc/kube/kubeconfig    # 指定deployment挂载kubeconfig的路径
          namespaces:
            names:
            - test     # 要监控的命名空间列表
          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  
       - job_name: cci-monitor    # 监控pod指标
        kubernetes_sd_configs:  
        - role: pod
          kubeconfig_file: /etc/kube/kubeconfig    #指定deployment挂载kubeconfig的路径
          namespaces:
            names:
            - test    # 要监控的命名空间列表
          relabel_configs:
          - source_labels: [__meta_kubernetes_pod_annotation_monitoring_cci_io_enable_pod_metrics]
          - action: drop
            regex: false
          - action: replace
            regex: ([^:]+)(?::\d+)?
            replacement: $1:19100
            source_labels: [__meta_kubernetes_pod_ip]
            target_label: __address__
          - action: replace
            regex: ([^:]+)(?::\d+)?;(\d+)
            replacement: $1:$2
            source_labels: [__meta_kubernetes_pod_ip, __meta_kubernetes_pod_annotation_monitoring_cci_io_metrics_port]
            target_label: __address__

global模块:控制Prometheus Server的全局配置。

  • scrape_interval:表示拉取targets的默认时间间隔。
  • evaluation_interval:表示执行rules的时间间隔。

scrape_configs模块:用于控制prometheus监控哪些资源。

利用Pod服务自动发现机制,在Prometheus主配置文件(prometheus.yml)中,配置监控任务(job),对工作负载进行自定义监控和基础指标监控。

  • 自定义监控:对接开源Prometheus监控指标,为pod中的应用提供prometheus的监控功能,利用Pod服务自动发现机制,在Prometheus主配置文件(prometheus.yml)中,配置port和path指定要采集的端口和路径。
    • prometheus.io/scrape为true,则会将pod作为监控目标。
    • prometheus.io/path,默认为/metrics
    • prometheus.io/port , 端口
  • 基础指标监控是CCI为了让Prometheus能获取Kubernetes集群的pod基础监控数据,利用Pod服务自动发现机制,在Prometheus主配置文件(prometheus.yml)中,配置一个单独的监控任务(job),在kubernetes_sd_configs项下,指定模式为Pod,列出需要被监控的命名空间列表。

使用Deployment部署Prometheus

创建prometheus的工作负载,将配置项挂载到工作负载中。使用Deployment部署Prometheus所用的镜像,相比于官方镜像额外打包了cci-iam-authenticator二进制。

示例中创建一个名为prometheus-config的Volume,Volume引用名为“prometheus-config”、“kubeconfig”、“prometheus-storage”的ConfigMap,再将Volume挂载到容器的“/tmp”路径下。

kind: Deployment
apiVersion: apps/v1 
metadata:   
  name: prometheus   
  labels:     
    app.kubernetes.io/component: prometheus     
    app.kubernetes.io/instance: k8s     
    app.kubernetes.io/name: prometheus     
    app.kubernetes.io/part-of: kube-prometheus 
spec:   
  replicas: 1
  selector:
     matchLabels:
       app.kubernetes.io/component: prometheus      # 架构中的组件
       app.kubernetes.io/instance: k8s              # 标识应用程序实例的唯一名称
       app.kubernetes.io/name: prometheus           # 应用程序的名称
       app.kubernetes.io/part-of: kube-prometheus   # 这是一个更高级别应用程序的名称
  template:
    metadata:
      labels:
        app.kubernetes.io/component: prometheus
        app.kubernetes.io/instance: k8s
        app.kubernetes.io/name: prometheus
        app.kubernetes.io/part-of: kube-prometheus
    spec:
      volumes:      # 在Volume中引用ConfigMap
        - name: prometheus-config
          configMap:
            name: prometheus-config
            defaultMode: 420        # ConfigMap卷中的所有文件默认设置为420
        - name: kubeconfig
          configMap:
            name: kubeconfig
            defaultMode: 420
        - name: prometheus-storage
          emptyDir:
            medium: LocalAuto
            sizeLimit: 10Gi
      containers:
        - name: prometheus
          image: 'swr.cn-north-7.myhuaweicloud.com/cci_k8s_gcr_io/...'
          args:         # 传给可执行文件的参数(启动参数)
            - '--storage.tsdb.retention.time=12h'              # 监控数据保留的时间
            - '--config.file=/etc/prometheus/prometheus.yml'   # 配置文件
            - '--storage.tsdb.path=/prometheus/'               # Prometheus写入数据库的地方
          ports:
            - containerPort: 9090
              protocol: TCP 
          resources:
            limits:
              cpu: 500m
              memory: 1Gi
            requests:
              cpu: 500m
              memory: 1Gi
          volumeMounts:
            - name: prometheus-config
              mountPath: /etc/prometheus/
            - name: kubeconfig
              mountPath: /etc/kube/
            - name: prometheus-storage
              mountPath: /prometheus/
          terminationMessagePath: /dev/termination-log       # 表示容器的异常终止消息的路径
          terminationMessagePolicy: File                     # 仅从终止消息文件中检索终止消息。
          imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 30      # 优雅关闭的宽限期,即在收到停止请求后,有多少时间来进行资源释放或者做其它操作,如果到了最大时间还没有停止,会被强制结束。
      dnsPolicy: ClusterFirst   
      securityContext: {} 
      schedulerName: default-scheduler 
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

通过公网访问Prometheus平台

当工作负载创建完成后,您可以给负载绑定ELB实例,通过公网访问Prometheus平台,查看监控数据。

配置公网访问-工作负载创建完成后设置

在工作负载创建完成后对Service进行配置,此配置对工作负载状态无影响,且实时生效。具体操作如下:

  1. 登录云容器实例管理控制台,左侧导航栏中选择“网络管理 > 服务(Service)”,在右侧页面单击“添加服务”
  2. “添加服务”页面,访问类型选择“负载均衡 LoadBalancer”
  3. 设置弹性负载均衡访问参数。

    • 服务名称:服务名称即Service的名称,Service是用于管理Pod访问的对象。
    • 命名空间:工作负载所在命名空间。
    • 关联工作负载:要添加Service的工作负载。
    • 负载均衡:选择公网ELB实例,如没有ELB实例可以单击“创建ELB实例”去创建。

      此处创建的ELB需要与负载所在命名空间在同一个VPC内。

      CCI暂时不支持独享型负载均衡,建议您创建共享型ELB实例。

    • 负载端口配置
      • 协议:访问负载的通信协议,可选择TCP或UDP。
      • 访问端口:负载提供的访问端口,即为服务端口,可自定义。
      • 容器端口:容器监听的端口,负载访问端口映射到容器端口,Prometheus的默认端口号为9090。
    图2 配置公网访问-工作负载创建完成后

  4. 单击“提交”,工作负载已添加“负载均衡 LoadBalancer”的服务。
  5. 创建完成后在浏览器访问“负载均衡公网IP地址:服务端口”,访问Prometheus。

相关文档