«

etcd 监控指南

要想用好 etcd ,特别是定位性能问题,监控必不可少。

etcd 服务原生就提供了度量(metrics)接口,配合 Prometheus 和 Garafana,就可以达到很好的监控效果。

本文就以 etcd v3(3.1.19)为例,介绍如何快速搭建 etcd 监控组件。

零、准备工作

首先你需要有一个可以监控的etcd集群,自行搭建的话可以参考我这篇博文中的容器搭建方式。

接着建议找一台执行机用来搭建etcd监控组件,尽量不要在现有环境上搭建,减少干扰。

执行机配置要求不高,2C4G都够用了,最重要是保证和etcd集群网络相通。

同时监控是以图表方式展示,需要通过浏览器访问,至少要暴露2个端口(Prometheus和Grafana),所以确保执行机还能被桌面云访问即可。

一、确定接口

万事开头难,第一步就是要确认 etcd 服务的 metrics 接口是否暴露了、暴露在哪了,否则就是无源之水,谈何监控。

如果是用官方etcd执行搭建的集群,metrics接口默认提供,一般就暴露在 client 端口的 /metrics 下,比如,在某个etcd服务所在节点上,执行如下指令:

$ curl -L http://localhost:2379/metrics

如果是FusionStage的环境,etcd有通过静态pod或Statefulset来搭建,那么可以通过 etcd 服务的环境变量获取,通常可用如下2种方法获取:

  1. 通过 kubectl 查看 etcd 所在pod的 yaml 输出,操作类似如下:
# 加载环境变量,获取etcd-server的pods
kubectl get pod -nmanage | grep etcd-server  
# 查看某个etcd-server 的pod信息
kubectl get pod -nmanage -oyaml etcd-server-paas-192-17-1-3  
  1. 通过 docker inspect 查看 etcd 所在的容器,操作类似如下:
# 获取etcd-server的容器
docker ps | grep etcd-server  
# 找到etcd容器id
docker inspect f33b254ccd02 | less  

无论哪一种方法,搜索 METRIC,通常你能看到如下相关信息:

"ETCD_LISTEN_METRIC_URLS=https://192.17.1.3:4005",
"ETCD_ENABLE_METRIC_TLS=true",
"ETCD_METRICS_CERT_FILE=/srv/kubernetes/server.cer",
"ETCD_METRICS_KEY_FILE=/srv/kubernetes/server_key.pem",

其中:

ETCD_ENABLE_METRIC_TLS=true,说明开启了etcd 的 metrics 接口。

ETCD_LISTEN_METRIC_URLS=https://192.17.1.3:4005, 正是我们要的接口URL。

证书其实我们可以跳过。

我们测试看看,在你的执行机上,调用接口试试:

curl -k https://${etcd-ip}:${etcd-port}/metrics  

注:-k 就表示我们不需要通过证书来访问 SSL, 这样更简单。

只要有一大段指标输出,类似于:

# HELP etcd_debugging_mvcc_db_compaction_pause_duration_milliseconds Bucketed histogram of db compaction pause duration.
# TYPE etcd_debugging_mvcc_db_compaction_pause_duration_milliseconds histogram
etcd_debugging_mvcc_db_compaction_pause_duration_milliseconds_bucket{le="1"} 0  

那么恭喜你,成功完成了最重要的一步。

二、搭建Prometheus

第二步,就是要搭建 Prometheus,用来收集和分析上面的 metrics 接口中的数据。

Prometheus 作为CNCF的第二名成员(第一名是K8S),可以说是监控领域的后起之秀,用来监控 etcd 再好不过。

这里不说细节,只谈用法:

1. 安装

需要通过代理从官网下载最新版本的 Prometheus ,我下的版本是:prometheus-2.2.1.linux-amd64.tar.gz

注:如果你的执行机上,配置通了代理,还可以直接通过 wget 安装,否则建议通过浏览器先下载,再通过sftp上传。

PROMETHEUS_VERSION="2.2.1"

mkdir -p  /data/prometheus/

# wget下载或通过 sftp上传
wget https://github.com/prometheus/prometheus/releases/download/v$PROMETHEUS_VERSION/prometheus-$PROMETHEUS_VERSION.linux-amd64.tar.gz -O /data/prometheus/prometheus-$PROMETHEUS_VERSION.linux-amd64.tar.gz

# 解压
cd  /data/prometheus/  
tar -xvzf prometheus-$PROMETHEUS_VERSION.linux-amd64.tar.gz

# 重命名
mv prometheus-$PROMETHEUS_VERSION.linux-amd64 $PROMETHEUS_VERSION

# 查看版本
/data/prometheus/${PROMETHEUS_VERSION}/prometheus --version
# 正常输出
prometheus, version 2.2.1 (branch: HEAD, revision: bc6058c81272a8d938c05e75607371284236aadc)  
  build user:       root@149e5b3f0829
  build date:       20180314-14:15:45
  go version:       go1.10

注意:这里的安装目录,和后面的配置及启动是有关联的,如果你的目录不同,请对应修改即可。

2. 配置

以 etcd-server 为例,Prometheus 配置如下:

cat > /data/prometheus/prometheus-config.yaml <<EOF  
global:  
  scrape_interval: 10s
scrape_configs:  
  - job_name: test-etcd-server
    scheme: https
    tls_config:
      insecure_skip_verify: true
    static_configs:
    - targets: ['etcd-0-ip:etcd-0-port','etcd-1-ip:etcd-1-port','etcd-2-ip:etcd-2-port']
EOF  
cat /data/prometheus/prometheus-config.yaml  

具体配置细节可以参考官方文档

这里唯一要修改的 targets 中的三个IP:PORT,对应的是etcd-server集群的三个节点,请参考上文“一、确认接口”获取。

3. 启动

简单点,通过 nohup,常驻在后台运行(以2.2.1版本为例):

nohup /data/prometheus/2.2.1/prometheus \  
    --config.file /data/prometheus/prometheus-config.yaml \
    --web.listen-address "0.0.0.0:9090" \
    --storage.tsdb.path "/data/prometheus/prometheus.data" >> /data/prometheus/prometheus.log  2>&1 &

注意:
1. 暴露的IP和Port可以自定义,这里是:"0.0.0.0:9090"
2. 这里同时指定了config文件(/data/prometheus/prometheus-config./data/prometheus/prometheus.data)以及日志输出文件(/data/prometheus/prometheus.log)。

4. 查看

好的习惯,是先看日志。

查看 Prometheus 启动日志:

tailf -100 /data/prometheus/prometheus.log  

正常启动日志类似如下:

evel=info ts=2018-04-28T08:14:30.955135384Z caller=main.go:220 msg="Starting Prometheus" version="(version=2.2.1, branch=HEAD, revision=bc6058c81272a8d938c05e75607371284236aadc)"  
level=info ts=2018-04-28T08:14:30.955241681Z caller=main.go:221 build_context="(go=go1.10, user=root@149e5b3f0829, date=20180314-14:15:45)"  
level=info ts=2018-04-28T08:14:30.955286128Z caller=main.go:222 host_details="(Linux 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 HSH1000058306 (none))"  
level=info ts=2018-04-28T08:14:30.955321982Z caller=main.go:223 fd_limits="(soft=1024, hard=4096)"  
level=info ts=2018-04-28T08:14:30.957861759Z caller=web.go:382 component=web msg="Start listening for connections" address=0.0.0.0:9090  
level=info ts=2018-04-28T08:14:30.957352155Z caller=main.go:504 msg="Starting TSDB ..."  
level=info ts=2018-04-28T08:14:30.964300533Z caller=main.go:514 msg="TSDB started"  
level=info ts=2018-04-28T08:14:30.964362518Z caller=main.go:588 msg="Loading configuration file" filename=/data/prometheus/test-etcd-server-new-build.yaml  
level=info ts=2018-04-28T08:14:30.964805601Z caller=main.go:491 msg="Server is ready to receive web requests."  

其中可以看到,暴露的URL地址是:address=0.0.0.0:9090

接着在浏览器中,访问前端页面,查看targets:

http://${执行机IP}:9090/targets  

如果state都是UP状态,恭喜你,Prometheus搭建成功了,Metrics已经开始收集了,你成功完成了80%了。

三、搭建Grafana

最后20%,就是第三步:搭建 Grafana。

Grafana 内置 Prometheus 支持,简直是天造地设的一对。

同样,先不深究细节,直接用起来看看,搭建也并不复杂。

1. 下载

在Grafana官网,下载最新版本,我下的版本是:grafana-5.0.4.linux-x64.tar.gz

GRAFANA_VERSION="5.0.4"

mkdir -p /data/grafana/

wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-$GRAFANA_VERSION.linux-x64.tar.gz  -O /data/grafana/grafana-$GRAFANA_VERSION.linux-x64.tar.gz

cd  /data/grafana/

tar -zxvf /data/grafana/grafana-$GRAFANA_VERSION.linux-x64.tar.gz

mv grafana-$GRAFANA_VERSION $GRAFANA_VERSION 

# 查看版本
/data/grafana/${GRAFANA_VERSION}/bin/grafana-server -v
# 正常输出
Version 5.0.4 (commit: 7dc36ae)  

2. 启动

Grafana 后台用默认配置启动即可,监控图表在启动后配置,同样以nohup方式在后台运行。

# 要在Grafana所在的目录下启动,我的是5.0.4
cd /data/grafana/5.0.4  
# 同样以nohup方式在后台运行
nohup ./bin/grafana-server web >> /data/grafana/grafana-server-web.log  2>&1 &  

正常启动日志如下:

t=2018-04-26T15:38:36+0800 lvl=info msg="Starting Grafana" logger=server version=5.0.4 commit=7dc36ae compiled=2018-03-28T19:52:41+0800  
t=2018-04-26T15:38:36+0800 lvl=info msg="Config loaded from" logger=settings file=/data/grafana/grafana-5.0.4/conf/defaults.ini  
t=2018-04-26T15:38:36+0800 lvl=info msg="Path Home" logger=settings path=/data/grafana/grafana-5.0.4  
t=2018-04-26T15:38:36+0800 lvl=info msg="Path Data" logger=settings path=/data/grafana/grafana-5.0.4/data  
t=2018-04-26T15:38:36+0800 lvl=info msg="Path Logs" logger=settings path=/data/grafana/grafana-5.0.4/data/log  
t=2018-04-26T15:38:36+0800 lvl=info msg="Path Plugins" logger=settings path=/data/grafana/grafana-5.0.4/data/plugins  
t=2018-04-26T15:38:36+0800 lvl=info msg="Path Provisioning" logger=settings path=/data/grafana/grafana-5.0.4/conf/provisioning  
t=2018-04-26T15:38:36+0800 lvl=info msg="App mode production" logger=settings  
t=2018-04-26T15:38:36+0800 lvl=info msg="Initializing DB" logger=sqlstore dbtype=sqlite3  
t=2018-04-26T15:38:36+0800 lvl=info msg="Starting DB migration" logger=migrator  
t=2018-04-26T15:38:36+0800 lvl=info msg="Executing migration" logger=migrator id="copy data account to org"  
t=2018-04-26T15:38:36+0800 lvl=info msg="Skipping migration condition not fulfilled" logger=migrator id="copy data account to org"  
t=2018-04-26T15:38:36+0800 lvl=info msg="Executing migration" logger=migrator id="copy data account_user to org_user"  
t=2018-04-26T15:38:36+0800 lvl=info msg="Skipping migration condition not fulfilled" logger=migrator id="copy data account_user to org_user"  
t=2018-04-26T15:38:36+0800 lvl=info msg="Starting plugin search" logger=plugins  
t=2018-04-26T15:38:36+0800 lvl=info msg="Initializing Alerting" logger=alerting.engine  
t=2018-04-26T15:38:36+0800 lvl=info msg="Initializing CleanUpService" logger=cleanup  
t=2018-04-26T15:38:36+0800 lvl=info msg="Initializing Stream Manager"  
t=2018-04-26T15:38:36+0800 lvl=info msg="Initializing HTTP Server" logger=http.server address=0.0.0.0:3000 protocol=http subUrl= socket=  

3. 访问

注意看启动日志的最后一行:address=0.0.0.0:3000,已经告诉我们,Grafana 默认启动端口是3000,可以在浏览器中输入:

http://${执行机IP}:3000  

默认的用户名/密码是:admin/admin

4. 配置

界面确实很赞!

登录成功后,进入Grafana的首页:http://${执行机IP}:3000/?orgId=1

会有一个流程提示

显示Grafana安装成功了,接着再做两步,你就能查看到 etcd 的监控图表了:

1. 配置数据源

重要参数如下:

Name:   test-prometheus  
Type:   Prometheus  
Url:    http://${执行机IP}:9090  
Access: proxy  

点击 Save & Test,提示Success,说明数据源添加成功。

2. 配置(导入)面板

面板的创建是一件比较繁琐的事情,用导入(import)是最方便。

打开导入页面:http://${执行机IP}:3000/dashboard/import,下载对应的dashboard模板文件,解压后将json文件内容拷贝进去:

点击Load,接着选择数据源, 再点击Import,导入完成。

5. 查看

如果前面都配置成功的话,你将能看到具体的监控图表。

恭喜你,可以尽情的查看etcd的相关监控数据了!Have fun!

分享