8

如何用Prometheus和Grafana监控多云Kubernetes

 4 years ago
source link: http://dockone.io/article/1326665
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

介绍

为什么可能需要监控不止一个Kubernetes集群,一般这有两大原因。第一个场景是不同阶段各有专门的集群,比如开发集群,预生产集群和生产集群。另一个场景是集群上运行着受托服务,或者有客户在集群上运行着工作负载,而你需要监控集群的可靠性,或者是监控自己服务的消费情况。

bqqY7jR.png!mobile

使用Prometheus和inlets监控多集群Kubernetes

上图架构图左侧我们有多个“Client(客户)”集群。使用的是Prometheus,它是应用广泛的,开源的,基于metric的监控和报警系统,正主动监控着应用程序和集群。每个集群的监控很健壮也很完整;但是,没有统一的视图来展现跨集群的metric。

使用安全的inlets tunnel,可以从右侧的集群访问到这些Prometheus服务器。这样,左侧的Prometheus服务器就可以从其他Prometheus服务器里获得选定的时间序列,这也就是 Prometheus Federation

对于长期的存储,你可能还会考虑 Thanos 或者 Cortex

让我们看看这一切是如何实现的!

前提条件

  • 一些运行在不同地方的Kubernetes集群,比如,在公有云上(比如GKE,AKS,EKS,DOKS等)或者在私有云里。
  • kubectl,配置好并且可以连接到集群上
  • kubectx,可选,但是在管理不同集群时很有用
  • arkade,便携的Kubernetes marketplace
  • 一个域并且可以访问DNS管理panel去创建子域
    本文使用inlets PRO是因为它很容易配置,并且遇到问题可以获得支持,但如果你想自己配置也可以使用免费版的inlets。

两个版本的区别在这里: inlets文档

本文准备了3个Kubernetes集群:

  • 运行在Equinix Metal的Kubernetes集群, orion-equinix
  • 运行在Amazon Web Services的Kubernetes集群, orion-aws
  • 运行在Google Cloud Platform的Kubernetes集群, orion-gcp

前两个集群作为“客户”集群, monitoring 的namespace里运行了Prometheus服务器。除了Prometheus,还安装了一些metric的导出器,比如 node-exporterkube-state-metrics 和我的最爱 kube-eagle

第三个集群作为“Observability(观测)”集群,和前两个类似,也安装了Prometheus。

有多种方式来安装Prometheus和所有组件,但是最常用的还是使用Prometheus Operator或者官方的Helm chart来安装。

$ kubectx

orion-aws

orion-gcp

orion-equinix



$ kubectl get pods,services --context orion-aws -n monitoring

NAME                                                       READY   STATUS    RESTARTS   AGE

pod/node-exporter-dh75f                                    1/1     Running   0          63m

pod/kube-eagle-6687579fd8-xcsns                            1/1     Running   0          63m

pod/prometheus-54d7b46745-lvbvk                            1/1     Running   0          63m

pod/node-exporter-w6xx6                                    1/1     Running   0          63m

pod/node-exporter-p7dbv                                    1/1     Running   0          63m

pod/kube-state-metrics-7476dc6466-74642                    1/1     Running   0          63m



NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE

service/prometheus   ClusterIP   10.43.97.123   <none>        9090/TCP   63m





$ kubectl get pods,services --context orion-equinix -n monitoring

NAME                                                     READY   STATUS    RESTARTS   AGE

pod/node-exporter-mzbv2                                  1/1     Running   0          61m

pod/prometheus-67746cf46c-twbjk                          1/1     Running   0          61m

pod/node-exporter-9m4nc                                  1/1     Running   0          61m

pod/kube-eagle-546bd88874-p4wfd                          1/1     Running   0          61m

pod/node-exporter-fjjqv                                  1/1     Running   0          61m

pod/kube-state-metrics-cbfb75b4-kndwz                    1/1     Running   0          61m



NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE

service/prometheus   ClusterIP   10.43.148.58   <none>        9090/TCP   61m

准备观测集群

首先需要准备观测集群。目标是要让运行在远端“客户”集群的Prometheus服务器在观测集群里也能用。要实现这个目标,我们使用inlets PRO来创建观测和客户集群之间的安全通道(tunnel)。这些tunnel的服务器,exit-node必须在观测集群里创建,之后,客户端就可以连接并且将Prometheus连接到观测集群了。

我们没有用LoadBalancer来暴露每个exit-node,而是使用IngressController,比如nginx,联合cert-manager来获取证书。

首先,切换到正确的集群:

$ kubectx orion-gcp

Switched to context "orion-gcp".

使用 arkade 安装nginx ingress控制器和cert-manager:

arkade install ingress-nginx --namespace ingress-nginx

arkade install cert-manager --namespace cert-manager

等nginx负载均衡器创建好后,可以得到它的公开IP地址,将域指向这个IP。每个客户端都会连接到不同的子域,因此最简单的方式是创建带通配符的DNS记录(比如:*.prometheus.example.com)。如果你不喜欢通配符记录,那就将每个Prometheus客户端的记录都指向相同的公开IP地址(比如:rion-aws.prometheus.example.com, orion-equinix.prometheus.example.com, …)。

安装证书Issuer:

apiVersion: cert-manager.io/v1

kind: Issuer

metadata:

name: letsencrypt-prod

namespace: monitoring

spec:

acme:

server: https://acme-v02.api.letsencrypt.org/directory

email: <your email>

privateKeySecretRef:

  name: letsencrypt-prod

solvers:

- selector: {}

  http01:

    ingress:

      class: nginx
kubectl apply -f issuer-prod.yaml

为inlets服务器生成一个token:

export TOKEN=$(head -c 16 /dev/random | shasum|cut -d" " -f1)

kubectl create secret generic inlets-pro-secret -n monitoring --from-literal token=$TOKEN

Save a copy for later

echo $TOKEN > token.txt

在dataplane创建带有所需端口的自定义文件。比如Prometheus,使用的是9090端口:

dataPlane:

type: ClusterIP

ports:

- targetPort: 9090

protocol: TCP

name: prom-http

port: 9090

现在获得inlets-pro的helm chart,并为每个远端Prometheus服务安装这个chart。

git clone https://github.com/inlets/inlets-pro



helm install orion-aws      ./inlets-pro/chart/inlets-pro \

-n monitoring -f custom.yaml \

--set ingress.domain=orion-aws.prometheus.example.com



helm install orion-equinix  ./inlets-pro/chart/inlets-pro \

-n monitoring -f custom.yaml \

--set ingress.domain=orion-equinix.prometheus.example.com

安装完的结果是:

  • inlets PRO服务器Pod运行
  • ClusterIP类型的Control Plane服务创建出来,暴露端口8123
  • 带有证书的Ingress创建出来,以安全的方式暴露Control Plane服务
  • ClusterIP类型的Data Plane服务创建出来,暴露端口9090
    这意味着inlets PRO客户端能够使用合适的域名,比如 wss://orion-aws.prometheus.example.com/connect 连接到Control Plane上,并且不对外暴露9090端口,让它只能从集群内部访问,因为这是ClusterIP类型。

连接到客户集群

既然exit-node pod已经运行起来了,现在就可以连接到客户端,并且创建tunnel了。

在客户集群里执行如下步骤。

切换kubectl连接到正确的客户集群:

$ kubectx orion-aws

Switched to context "orion-aws".

为inlets PRO创建secret和token:

kubectl create secret generic \

-n monitoring inlets-license \

--from-file license=$HOME/inlets-license



kubectl create secret generic \

-n monitoring inlets-pro-secret \

--from-file token=./token.txt

配好合适的值,安装inlets-pro-client,在观测集群里连接到exit-node pod上:

helm install prometheus-tunnel \

./inlets-pro/chart/inlets-pro-client \

-n monitoring \

--set url=wss://orion-aws2.prometheus.sphene.io/connect \

--set upstream=prometheus \

--set ports=9090

监控客户集群

安装好所有helm chart,服务器和客户端之后,所有的Prometheus服务在观测集群里都可用了,现在我们就可能在Grafana里可视化这些metric了。

要么将所有不同的Prometheus服务器都作为独立的数据源添加到Grafana里,要么在Prometheus服务器上配置这些endpoint。绝大多数情况下优先使用第二种方案,因为这让我们可以创建聚合视图。

添加这些的最简单的方式是通过静态配置:

scrape_configs:

- job_name: 'federated-clusters'

scrape_interval: 15s



honor_labels: true



params:

'match[]':

  - '{app="kube-state-metrics"}'

  - '{app="kube-eagle"}'

  - '{app="node-exporter"}'



metrics_path: '/federate'



static_configs:

- targets: 

- 'orion-aws-inlets-pro-data-plane:9090'

- 'orion-equinix-inlets-pro-data-plane:9090'

应用这些配置后,本文开头图中右侧的Prometheus就会开始从其他Prometheus服务器上抓metric了。

yaUJbiV.png!mobile

现在所有metric都被收集到一个Prometheus服务器上,剩下的事情就是构建漂亮的dashboard和alert。

qyAvyu3.png!mobile

Kube Eagle仪表盘,多集群概览

总结

本文展示了如何将多个隔离的,分散在不同云供应商的Kubernetes集群,或者私有环境里的服务连接起来。

安全tunnel,服务器和客户端的Helm chart让安装变得很简单。

Prometheus Fedaration 很好地展现了这些技术。这样的搭建方式在很多情况下都可以用,比如将应用程序连接到不同集群的数据库上。

原文链接: How to monitor multi-cloud Kubernetes with Prometheus and Grafana (翻译:崔婧雯)

===========================

译者介绍

崔婧雯,现就职于IBM,高级软件工程师,负责IBM WebSphere业务流程管理软件的系统测试工作。曾就职于VMware从事桌面虚拟化产品的质量保证工作。对虚拟化,中间件技术,业务流程管理有浓厚的兴趣。


Recommend

  • 56
    • studygolang.com 6 years ago
    • Cache

    Prometheus+Grafana打造Mysql监控平台

    prometheus/node_exporter/mysqld_exporter都是由go语言编写,需要先安装GoLang环境 下载 node_exporter (监控服务器的CPU、内存、存储使用情况)和

  • 32

    在上一篇文章中,对使用 Prometheus 监控Flink进行了阐述(传送门),这里就不再赘述了。 尽管 Prometheus 自我标榜是监控解决方案, From metrics to insight Power your metrics and alerting with a leading open-...

  • 34

    环境 centOS 7.0 Prometheus2.14.0 Grafana6.5.2 下载安装Prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-386.tar.g...

  • 21

    最近在研究如何给应用添加合适的 Metrics,用来分析应用的使用情况以及调试,整体思路是使用 Prometheus 收集数据,Grafana 进行数据的展示。过程中发现了 node-exporter 项目,觉得可以直接拿来监控自己平时使用的 Linux 机器,就有了这...

  • 55

    监控报警是服务稳定的基础,是性能优化的重要依据,是可以未雨绸缪的重大利器。现代系统赋予了监控报警重要地位,近年来随着微服务设计理念不断成熟与广泛使用,做为系统方案的设计者,监控的选择和使用将是搭建系统不可或缺的一个环节。 Prometheus...

  • 28
    • 微信 mp.weixin.qq.com 5 years ago
    • Cache

    Prometheus + Grafana 监控 SpringBoot

    整体结构 SpringBoot的 actuator 提供了监控端点。 Prometheus是监控系统,可以从 Springboot 获取监控数据,以时序数据的形式存储,并提供了监控数据的查询服务。 Grafana是专业的 UI 仪表盘系统,支持...

  • 38

    Prometheus 是一套开源的系统监控、报警、时间序列数据库的组合,最初有 SoundCloud 开发的,后来随着越来越多公司使用,于是便独立成开源项目。Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,例如邮件、微信、钉钉、Slack 等...

  • 29
    • segmentfault.com 4 years ago
    • Cache

    K8S的Kafka监控(Prometheus+Grafana)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等; 对于...

  • 15

    【编者的话】对于Prometheus的组件能力是毋庸置疑的,但是使用久了会发现很多的性能问题,诸如内存问题、大规模拉取问题、大规模存储问题等等。如何基于云原生Prometheus进行Kubernetes集群基础监控大规模数据拉取,本文将会给出答案。

  • 15

    业务中是否经常遇到服务器负载过高问题,或者经常碰到后台服务挂掉,却没有自动提醒功能,因此搭建一套监控报警系统势在必行。 Prometheus 目前在开源社区相当活跃,在 GitHub 上拥有两万多 Star,是当前最流行的监控系统,相比 Zabbix,定...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK