如果您已经在Kibana上实现Elasticsearch日志可视化,想要将日志数据从Elasticsearch迁移到SLS,可以使用SLS提供的Elasticsearch兼容接口,无需改动业务代码。
本文档为阿里云原创文档,知识产权归阿里云所有,由于本文档旨在介绍阿里云与第三方产品交互的服务能力,因此可能会提及第三方公司或产品等名称。
前提条件
已创建Project、标准型Logstore并完成日志采集。具体操作,请参见创建项目Project、创建Logstore和数据采集概述。
查询日志前,已配置索引。具体操作,请参见创建索引。
已创建RAM用户的AccessKey,并且为RAM用户授予Logstore的查询权限。具体操作,请参见RAM授权。
背景信息
Kibana是一款基于Elasticsearch的数据可视化和探索工具。您可以通过Kibana对Elasticsearch中的数据进行查询、分析和可视化。对于已经习惯使用Kibana做日志查询和可视化报表的用户,日志服务提供了兼容Elasticsearch的接口,用户可以使用这些兼容接口实现在Kibana中查询和分析日志服务中的数据。
操作视频
本视频指导您使用Kibana访问日志服务的Elasticsearch兼容接口。
工作原理
您需要在客户端环境中部署Kibana、Proxy和Elasticsearch。
Kibana:用于查询、分析和可视化展示数据。
Elasticsearch:用于存储Kibana的Meta数据(主要为配置信息,数据量极小)。
由于Kibana的Meta信息经常需要更新,而日志服务不支持更新操作。因此需要部署一个Elasticsearch专门用于存储Kibana的Meta数据。
Proxy:用于区分Kibana对Meta数据和日志服务Elasticsearch兼容接口的API请求,需要部署一个Proxy对Kibana的API请求进行路由。
步骤一:部署Elasticsearch、Kibana和Proxy
建议服务器的内存为8G及以上。
使用Docker Compose部署
在服务器执行以下命令,创建一个名为
sls-kibana
的新目录,在sls-kibana
目录下创建一个名为data
子目录。更改data
目录的权限,确保Elasticsearch容器具有对该目录的读、写和执行权限。mkdir sls-kibana cd sls-kibana mkdir data chmod 777 data
在
sls-kibana
目录创建.env
文件,内容如下,请根据实际参数修改。ES_PASSWORD=aStrongPassword # 请根据实际情况修改 SLS_ENDPOINT=cn-huhehaote.log.aliyuncs.com SLS_PROJECT=etl-dev-7494ab**** SLS_ACCESS_KEY_ID=xxx SLS_ACCESS_KEY_SECRET=xxx # 下面值可以不设,如果觉得SLS_PROJECT名字太长,可以设置一下别名 # SLS_PROJECT_ALIAS=etl-dev # 如果有更多project,可以继续加; 注意超过6个的话,docker-compose.yml中引用也要加 #SLS_ENDPOINT2=cn-huhehaote.log.aliyuncs.com #SLS_PROJECT2=etl-dev2 #SLS_PROJECT_ALIAS2=etl-dev2 #SLS_ACCESS_KEY_ID2=xxx #SLS_ACCESS_KEY_SECRET2=xxx
参数
说明
ES_PASSWORD
Elasticsearch的密码,也是Kibana的密码。
SLS_ENDPOINT
Project的访问域名,请参见管理Project。
SLS_PROJECT
日志服务的Project名称,请参见管理Project。
SLS_ACCESS_KEY_ID
前提条件中创建的RAM用户的AK。RAM用户需要具备Logstore的查询权限,请参见RAM授权。
SLS_ACCESS_KEY_SECRET
前提条件中创建的RAM用户的SK。RAM用户需要具备Logstore的查询权限,请参见RAM授权。
在
sls-kibana
目录中创建docker-compose.yaml
文件,内容如下。services: es: image: sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/elasticsearch:7.17.3 environment: - "discovery.type=single-node" - "ES_JAVA_OPTS=-Xms2G -Xmx2G" - ELASTIC_USERNAME=elastic - ELASTIC_PASSWORD=${ES_PASSWORD} - xpack.security.enabled=true volumes: # TODO 这里的./data目录需要提前建立, 确认已经mkdir data && chmod 777 data - ./data:/usr/share/elasticsearch/data kproxy: image: sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kproxy:2.0.8 depends_on: - es environment: - ES_ENDPOINT=es:9200 # 第一个sls project - SLS_ENDPOINT=${SLS_ENDPOINT} - SLS_PROJECT=${SLS_PROJECT} - SLS_PROJECT_ALIAS=${SLS_PROJECT_ALIAS} - SLS_ACCESS_KEY_ID=${SLS_ACCESS_KEY_ID} - SLS_ACCESS_KEY_SECRET=${SLS_ACCESS_KEY_SECRET} # 第二个sls project - SLS_ENDPOINT2=${SLS_ENDPOINT2} - SLS_PROJECT2=${SLS_PROJECT2} - SLS_PROJECT_ALIAS2=${SLS_PROJECT_ALIAS2} - SLS_ACCESS_KEY_ID2=${SLS_ACCESS_KEY_ID2} - SLS_ACCESS_KEY_SECRET2=${SLS_ACCESS_KEY_SECRET2} - SLS_ENDPOINT3=${SLS_ENDPOINT3} - SLS_PROJECT3=${SLS_PROJECT3} - SLS_PROJECT_ALIAS3=${SLS_PROJECT_ALIAS3} - SLS_ACCESS_KEY_ID3=${SLS_ACCESS_KEY_ID3} - SLS_ACCESS_KEY_SECRET3=${SLS_ACCESS_KEY_SECRET3} - SLS_ENDPOINT4=${SLS_ENDPOINT4} - SLS_PROJECT4=${SLS_PROJECT4} - SLS_PROJECT_ALIAS4=${SLS_PROJECT_ALIAS4} - SLS_ACCESS_KEY_ID4=${SLS_ACCESS_KEY_ID4} - SLS_ACCESS_KEY_SECRET4=${SLS_ACCESS_KEY_SECRET4} - SLS_ENDPOINT5=${SLS_ENDPOINT5} - SLS_PROJECT5=${SLS_PROJECT5} - SLS_PROJECT_ALIAS5=${SLS_PROJECT_ALIAS5} - SLS_ACCESS_KEY_ID5=${SLS_ACCESS_KEY_ID5} - SLS_ACCESS_KEY_SECRET5=${SLS_ACCESS_KEY_SECRET5} - SLS_ENDPOINT6=${SLS_ENDPOINT6} - SLS_PROJECT6=${SLS_PROJECT6} - SLS_PROJECT_ALIAS6=${SLS_PROJECT_ALIAS6} - SLS_ACCESS_KEY_ID6=${SLS_ACCESS_KEY_ID6} - SLS_ACCESS_KEY_SECRET6=${SLS_ACCESS_KEY_SECRET6} # 如有更多,可以继续加,最多255个 kibana: image: sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kibana:7.17.3 depends_on: - kproxy environment: - ELASTICSEARCH_HOSTS=http://kproxy:9201 - ELASTICSEARCH_USERNAME=elastic - ELASTICSEARCH_PASSWORD=${ES_PASSWORD} - XPACK_MONITORING_UI_CONTAINER_ELASTICSEARCH_ENABLED=true ports: - "5601:5601" # 这个服务组件是可选的,作用是自动创建kibana index pattern index-patterner: image: sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kproxy:2.0.8 command: /usr/bin/python3 -u /workspace/create_index_partten.py depends_on: - kibana environment: - KPROXY_ENDPOINT=http://kproxy:9201 - KIBANA_ENDPOINT=http://kibana:5601 - KIBANA_USER=elastic - KIBANA_PASSWORD=${ES_PASSWORD} - SLS_PROJECT_ALIAS=${SLS_PROJECT_ALIAS} - SLS_ACCESS_KEY_ID=${SLS_ACCESS_KEY_ID} - SLS_ACCESS_KEY_SECRET=${SLS_ACCESS_KEY_SECRET} - SLS_PROJECT_ALIAS2=${SLS_PROJECT_ALIAS2} - SLS_ACCESS_KEY_ID2=${SLS_ACCESS_KEY_ID2} - SLS_ACCESS_KEY_SECRET2=${SLS_ACCESS_KEY_SECRET2} - SLS_PROJECT_ALIAS3=${SLS_PROJECT_ALIAS3} - SLS_ACCESS_KEY_ID3=${SLS_ACCESS_KEY_ID3} - SLS_ACCESS_KEY_SECRET3=${SLS_ACCESS_KEY_SECRET3} - SLS_PROJECT_ALIAS4=${SLS_PROJECT_ALIAS4} - SLS_ACCESS_KEY_ID4=${SLS_ACCESS_KEY_ID4} - SLS_ACCESS_KEY_SECRET4=${SLS_ACCESS_KEY_SECRET4} - SLS_PROJECT_ALIAS5=${SLS_PROJECT_ALIAS5} - SLS_ACCESS_KEY_ID5=${SLS_ACCESS_KEY_ID5} - SLS_ACCESS_KEY_SECRET5=${SLS_ACCESS_KEY_SECRET5} - SLS_PROJECT_ALIAS6=${SLS_PROJECT_ALIAS6} - SLS_ACCESS_KEY_ID6=${SLS_ACCESS_KEY_ID6} - SLS_ACCESS_KEY_SECRET6=${SLS_ACCESS_KEY_SECRET6} # 如有更多,可以继续加,最多255个
执行以下命令,启动服务。
docker compose up -d
执行以下命令,查看服务状态。
docker compose ps
部署完成后,在浏览器中输入
http://${部署Kibaba的IP地址}:5601
,进入Kibana的登录页面,输入第一步中设置的Elasticsearch的用户名和密码。重要必须在服务器的安全组规则中添加5601端口,请参见添加安全组规则。
http://${部署Kibana的IP地址}:5601
使用Helm部署
前提条件
确保阿里云容器服务 Kubernetes 版ACK集群中有以下组件。查看已安装组件的操作步骤,请参见管理组件。
以下任意一种Ingress controller:
操作步骤
创建命名空间(Namespace)。
# 创建namespace kubectl create namespace sls-kibana
创建并编辑
values.yaml
文件,内容如下,请根据实际情况修改。kibana: ingressClass: nginx # 根据实际安装的ingress controller修改 # 根据ack集群->运维管理->组件管理下搜ingress,查看已安装的ingress控制台确定该值 # ALB Ingress Controller 设置为alb # MSE Ingress Controller 设置为mse # Nginx Ingress Controller 设置为nginx ingressDomain: #可以为空,如果需要通过域名访问kibana,可以设置该值 ingressPath: /kibana/ # 必填,访问时的子路径 # 如果ingressDomain非空, 那么ingressPath支持设置为/ elasticsearch: password: aStrongPass # 请根据实际情况修改es的密码,同时也是kibana的访问密码,对应账号为elastic #diskZoneId: cn-hongkong-c # 指定es使用的云盘所在的az。不设置的情况下az会系统选择 repository: region: cn-hangzhou # 镜像所在区域,中国固定设置为cn-hangzhou 海外固定设置为ap-southeast-1;会使用公网拉取镜像 sls: - project: k8s-log-c5****** # sls的project endpoint: cn-huhehaote.log.aliyuncs.com # sls project对应的endpoint # alias: etl-logs # 可选,如果觉得project名在kibana中显示太长,可以设置别名 accessKeyId: 具有sls访问权限的accessKeyId accessKeySecret: 具有sls访问权限的accessKeySecret # 如果有第二个继续按上面的格式添加 #- project: etl-dev2 # sls的project # endpoint: cn-huhehaote.log.aliyuncs.com # sls project对应的endpoint # accessKeyId: 具有sls访问权限的accessKeyId # accessKeySecret: 具有sls访问权限的accessKeySecret
参数说明
说明
kibana.ingressClass
根据实际安装的ingress controller修改,查看组件的步骤请参见管理组件。
ALB Ingress Controller:设置为alb
MSE Ingress Controller:设置为mse
Nginx Ingress Controller:设置为nginx
kibana.ingressDomain
可以为空,如果需要通过域名访问kibana,需要设置该值。
repository.region
镜像所在区域,中国固定设置为
cn-hangzhou
,海外固定设置为ap-southeast-1
,会使用公网拉取镜像。kibana.ingressPath
访问时的子路径。如果ingressDomain非空, 那么ingressPath支持设置为
/
。elasticsearch.password
请根据实际情况修改Elasticsearch的密码,同时也是Kibana的访问密码,Elasticsearch账号为
elastic
。project
日志服务的Project名称,请参见管理Project。
endpoint
Project的访问域名,请参见管理Project。
accessKeyId
前提条件中创建的RAM用户的AK。RAM用户需要具备Logstore的查询权限,请参见RAM授权。
accessKeySecret
前提条件中创建的RAM用户的SK。RAM用户需要具备Logstore的查询权限,请参见RAM授权。
执行以下命令,使用Helm部署。
helm install sls-kibana https://sls-kproxy.oss-cn-hangzhou.aliyuncs.com/sls-kibana-1.3.0.tgz -f values.yaml --namespace sls-kibana
部署完成后,在浏览器中输入
http://${ingress地址}/kibana/
,进入Kibana的登录页面,输入第一步中设置的Elasticsearch的用户名和密码。http://${ingress地址}/kibana/
使用Docker部署
第一步:部署Elasticsearch
使用Docker部署,必须先安装和启动Docker,请参见安装Docker并使用(Linux)。
在服务器上执行如下命令,部署Elasticsearch。
sudo docker pull sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/elasticsearch:7.17.3 sudo mkdir /data # Elasticsearch数据的存储目录, 请根据实际情况修改。 sudo chmod 777 /data # 配置权限。 sudo docker run -d --name es -p 9200:9200 \ -e "discovery.type=single-node" \ -e "ES_JAVA_OPTS=-Xms2G -Xmx2G" \ -e ELASTIC_USERNAME=elastic \ -e ELASTIC_PASSWORD=passwd \ -e xpack.security.enabled=true \ -v /data:/usr/share/elasticsearch/data \ sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/elasticsearch:7.17.3
参数
说明
ELASTIC_USERNAME
登录Elasticsearch的用户名,固定为elastic。
ELASTIC_PASSWORD
登录Elasticsearch的密码。Elasticsearch的密码必须是字符串类型。
/data
Elasticsearch在物理机上的数据存储位置,请根据情况修改。
部署完成后,请执行如下命令验证Elasticsearch是否部署成功。如果使用公网IP,必须在服务器的安全组规则中添加9200端口,请参见添加安全组规则。
curl http://${Elasticsearch所在机器的IP地址}:9200
如果返回结果是包含
security_exception
的JSON格式数据,则表示Elasticsearch已经成功部署。{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}
第二步:部署Proxy
Kibana对接日志服务时,支持对接单个或多个Project,您需要在部署Proxy时,添加对应的Project信息。对应的部署示例如下所示。
单个Project
sudo docker pull sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kproxy:2.0.8
sudo docker run -d --name proxy \
-e ES_ENDPOINT=${Elasticsearch所在机器的IP地址}:9200 \
-e SLS_ENDPOINT=https://prjA.cn-guangzhou.log.aliyuncs.com/es/ \
-e SLS_PROJECT=prjA \
-e SLS_ACCESS_KEY_ID=${aliyunAccessId} \
-e SLS_ACCESS_KEY_SECRET=${aliyunAccessKey} \
-p 9201:9201 \
-ti sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kproxy:2.0.8
多个Project
最多可添加32个Project。
SLS_PROJECT、SLS_ENDPOINT、SLS_ACCESS_KEY_ID、SLS_ACCESS_KEY_SECRET为第一个Project相关的变量名称。从第二个Project开始,其相关变量名称需加数字后缀,例如SLS_PROJECT2、SLS_ENDPOINT2。
如果后面某Project的相关变量取值与第一个Project相同,则该Project对应的Endpoint、AccessKey可省略配置。
sudo docker pull sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kproxy:2.0.8
sudo docker run -d --name proxy \
-e ES_ENDPOINT=${Elasticsearch所在机器的IP地址}:9200 \
-e SLS_ENDPOINT=https://prjA.cn-guangzhou.log.aliyuncs.com/es/ \
-e SLS_ENDPOINT2=https://prjB.cn-guangzhou.log.aliyuncs.com/es/ \
-e SLS_PROJECT=prjA \
-e SLS_PROJECT2=prjB \
-e SLS_ACCESS_KEY_ID=${aliyunAccessId} \
-e SLS_ACCESS_KEY_SECRET=${aliyunAccessKey} \
-e SLS_ACCESS_KEY_ID2=${aliyunAccessId} \ #如果值和SLS_ACCESS_KEY_ID相同,无需配置。
-e SLS_ACCESS_KEY_SECRET2=${aliyunAccessKey} \ #如果值和SLS_ACCESS_KEY_SECRET相同,无需配置。
-p 9201:9201 \
-ti sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kproxy:2.0.8
示例1
对接2个Project(prjA和prjB),且使用相同的AccessKey,则示例如下:
sudo docker pull sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kproxy:2.0.8 sudo docker run -d --name proxy \ -e ES_ENDPOINT=${Elasticsearch所在机器的IP地址}:9200 \ -e SLS_ENDPOINT=https://prjA.cn-guangzhou.log.aliyuncs.com/es/ \ -e SLS_ENDPOINT=https://prjB.cn-guangzhou.log.aliyuncs.com/es/ \ -e SLS_PROJECT=prjA \ -e SLS_PROJECT2=prjB \ -e SLS_ACCESS_KEY_ID=${aliyunAccessId} \ -e SLS_ACCESS_KEY_SECRET=${aliyunAccessKey} \ -p 9201:9201 \ -ti sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kproxy:2.0.8
示例2
对接3个Project(prjA、prjB、prjC),其中prjA和prjC使用相同的AccessKey,则示例如下:
sudo docker run -d --name proxy \ -e ES_ENDPOINT=${Elasticsearch所在机器的IP地址}:9200 \ -e SLS_ENDPOINT=https://prjA.cn-guangzhou.log.aliyuncs.com/es/ \ -e SLS_ENDPOINT2=https://prjB.cn-guangzhou.log.aliyuncs.com/es/ \ -e SLS_ENDPOINT3=https://prjC.cn-guangzhou.log.aliyuncs.com/es/ \ -e SLS_PROJECT=prjA \ -e SLS_PROJECT2=prjB \ -e SLS_PROJECT3=prjC \ -e SLS_ACCESS_KEY_ID=${aliyunAccessId} \ -e SLS_ACCESS_KEY_SECRET=${aliyunAccessKey} \ -e SLS_ACCESS_KEY_ID2=${aliyunAccessId} \ -e SLS_ACCESS_KEY_SECRET2=${aliyunAccessKey} \ -p 9201:9201 \ -ti sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kproxy:2.0.8
重要参数说明如下表所示。
参数 | 说明 |
| Elasticsearch的访问地址,格式为 |
| 数据访问地址,格式为 重要 必须使用HTTPS协议。 |
| 日志服务的Project名称,请参见管理Project。 |
| 阿里云AccessKey ID。 建议使用RAM用户的AccessKey,该RAM用户需具备Logstore的数据查询权限。您可以通过权限助手,配置权限。具体操作,请参见配置权限助手。AccessKey的获取方法,请参见访问密钥。 |
| 阿里云AccessKey Secret。 建议使用RAM用户的AccessKey,该RAM用户需具备Logstore的数据查询权限。您可以通过权限助手,配置权限。具体操作,请参见配置权限助手。AccessKey的获取方法,请参见访问密钥。 |
部署完成后,您可以执行如下命令验证是否部署成功。如果使用公网IP,必须在服务器的安全组规则中添加9201端口,请参见添加安全组规则。
curl http://${Proxy所在机器IP地址}:9201
如果返回结果中包含security_exception
的JSON格式数据,则表示Proxy已经成功部署。
{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}
第三步:部署Kibana
参见如下示例,部署Kibana。本文以Kibana 7.17.3版本为例。
sudo docker pull sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kibana:7.17.3
sudo docker run -d --name kibana \
-e ELASTICSEARCH_HOSTS=http://${Proxy所在机器的IP地址}:9201 \
-e ELASTICSEARCH_USERNAME=elastic \
-e ELASTICSEARCH_PASSWORD=passwd \
-e XPACK_MONITORING_UI_CONTAINER_ELASTICSEARCH_ENABLED=true \
-p 5601:5601 \
sls-registry.cn-hangzhou.cr.aliyuncs.com/kproxy/kibana:7.17.3
参数 | 说明 |
| Proxy的访问地址,格式为 |
| 登录Kibana的用户名。 需与您在部署Elasticsearch时设置的Elasticsearch用户名一致。 |
| 登录Kibana的密码。 需与您在部署Elasticsearch时设置的Elasticsearch密码一致。 |
部署完成后,在浏览器中输入http://${部署Kibaba的IP地址}:5601
,进入Kibana的登录页面,输入第一步中设置的Elasticsearch的用户名和密码。
必须在服务器的安全组规则中添加5601端口,请参见添加安全组规则。
http://${部署Kibana的IP地址}:5601
步骤二:访问Kibana
配置索引。
在左侧导航栏中,选择Management > Stack Management。
在左侧导航栏中,选择Kibana > Index Patterns。
首次使用时,请先在提示框中单击create an index pattern against hidden or system indices.
说明在Index pattern列表中看不到数据是正常的,日志服务的logstore映射到Kibana中的Index patterns需要手动创建。
在Create index pattern窗口中,配置相关参数。
参数名称
说明
Name
索引名称,该名称的命名规则为
${日志服务Project名称}.${Logstore名称}
。重要索引名称仅支持精准匹配,不支持使用通配符,即您需要输入完整的索引名称。
例如Project名称为etl-guangzhou,Logstore名称为es_test22,那么此处名称为
etl-guangzhou.es_test22
。Timestamp field
时间戳字段,固定选择为
@timestamp
。单击Create index pattern。
查询和分析数据。
在左侧导航栏中,选择Analytics>Discover。
重要使用Kibana和Elasticsearch兼容接口分析日志服务数据时,目前只支持使用Discover和Dashboard这两个模块。
在页面左上角选择目标索引,在页面右上角选择时间范围,查询日志数据。
常见问题
使用Docker Compose部署,无法访问Kibana?
在
sls-kibana
目录里,执行docker compose ps
查看容器的启动状态STATUS,确保都处于UP状态。如果三个容器的状态都为UP,则查看每个容器的错误日志。
docker logs sls-kibana_es_1 # 查看es启动日志 docker logs sls-kibana_kproxy_1 # 查看kproxy启动日志 docker logs sls-kibana_kibana_1 # 查看kibana启动日志
使用Helm部署,无法访问Kibana?
如何卸载helm?
helm uninstall sls-kibana --namespace sls-kibana