使用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文件。
以下示例是为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进行配置,此配置对工作负载状态无影响,且实时生效。具体操作如下:
- 登录云容器实例管理控制台,左侧导航栏中选择“网络管理 > 服务(Service)”,在右侧页面单击“添加服务”。
- 在“添加服务”页面,访问类型选择“负载均衡 LoadBalancer”。
- 设置弹性负载均衡访问参数。
- 服务名称:服务名称即Service的名称,Service是用于管理Pod访问的对象。
- 命名空间:工作负载所在命名空间。
- 关联工作负载:要添加Service的工作负载。
- 负载均衡:选择公网ELB实例,如没有ELB实例可以单击“创建ELB实例”去创建。
此处创建的ELB需要与负载所在命名空间在同一个VPC内。
CCI暂时不支持独享型负载均衡,建议您创建共享型ELB实例。
- 负载端口配置
- 协议:访问负载的通信协议,可选择TCP或UDP。
- 访问端口:负载提供的访问端口,即为服务端口,可自定义。
- 容器端口:容器监听的端口,负载访问端口映射到容器端口,Prometheus的默认端口号为9090。
图2 配置公网访问-工作负载创建完成后
- 单击“提交”,工作负载已添加“负载均衡 LoadBalancer”的服务。
- 创建完成后在浏览器访问“负载均衡公网IP地址:服务端口”,访问Prometheus。