使用 Loki 采集微服务日志

2020-12-01 11:13:00 浏览数 (1)

前面我们介绍了 Grafana Labs 推出了 Loki V2 版本,新版本提供了不少新的特性,这里我们就来介绍下如何在 Kubernetes 上使用新版本的 Loki 吧。

在配置 Loki 之前,我们先安装一些微服务来产生一些日志和事件,然后通过 Loki 来采集这些日志数据,这里我们会使用 FluentBit 将日志转发给 Loki,然后使用 Grafana 上的 Loki 数据源来分析日志。

示例应用

这里我们在 Kubernetes 集群上使用启用了 Istio 的命名空间来安装示例应用 microservices-demo,如果你没有安装 Istio,可以直接查看官方文档进行安装配置。Istio 安装完成后,我可以创建一个新的命名空间来进行测试:

代码语言:javascript复制
$ kubectl create ns demo
# Enable istio sidecar injection
$ kubectl label namespace demo istio-injection=enabled 

然后安装 microservices-demo 这个应用:

代码语言:javascript复制
# Clone the repo with all microservices to be deployed
$ git clone https://github.com/GoogleCloudPlatform/microservices-demo
$ cd microservices-demo
# Install the services
# 镜像默认是gcr的,需要自行替换可访问的镜像地址
$ kubectl apply -n demo  -f ./release/kubernetes-manifests.yaml
......
# Setup istio gateway and virtual services for routing
$ kubectl apply -n demo  -f ./release/istio-manifests.yaml
gateway.networking.istio.io/frontend-gateway created
virtualservice.networking.istio.io/frontend-ingress created
virtualservice.networking.istio.io/frontend created
serviceentry.networking.istio.io/whitelist-egress-googleapis created
serviceentry.networking.istio.io/whitelist-egress-google-metadata created

安装完成后,可以使用 kubectl -n demo get pods 来查看是否正常。

代码语言:javascript复制
$ kubectl get pods -n demo
NAME                                     READY   STATUS    RESTARTS   AGE
adservice-66949bd448-4thj4               2/2     Running   0          29m
cartservice-9d88457-27qnk                2/2     Running   2          29m
checkoutservice-5cb565d6cd-fsqdv         2/2     Running   0          29m
currencyservice-69746f5bfb-6m7dj         2/2     Running   0          29m
emailservice-f4b7dddd4-vw4gn             2/2     Running   0          29m
frontend-644d768794-glmfj                2/2     Running   0          29m
loadgenerator-7895d4cdb6-jbb68           2/2     Running   7          29m
paymentservice-7bcf59648-d2zks           2/2     Running   0          29m
productcatalogservice-797f6494f8-fgl2b   2/2     Running   0          29m
recommendationservice-7c5c6b8d56-5q99s   2/2     Running   0          29m
redis-cart-74594bd569-mt9np              2/2     Running   0          29m
shippingservice-658875bd74-gmpgn         2/2     Running   0          29m

接着我们可以通过 Istio gateway 端点来访问演示应用程序。

这个微服务演示应用是一个由多个不同语言编写的服务组成的在线商店,该应用程序可以用来添加商品到购物车、更改交易货币和结账,所有这些操作都由不同的服务来完成。

安装 Loki 和 FluentBit

示例应用程序安装完成后,我们就可以开始安装 Loki 了,这里我们使用 Helm 来快速安装,首先添加 Chart 仓库:

代码语言:javascript复制
# Add the loki helm chart
$ helm repo add loki https://grafana.github.io/loki/charts
$ helm repo update

Chart 仓库配置完成后就可以直接进行安装了:

代码语言:javascript复制
# Create the namespace to install loki
$ kubectl create ns loki
# Apply the loki helm chart
$ helm upgrade --install loki --namespace=loki loki/loki  --set fluent-bit.enabled=true,promtail.enabled=false,grafana.enabled=true,prometheus.enabled=true,prometheus.alertmanager.persistentVolume.enabled=true,prometheus.server.persistentVolume.enabled=true
Release "loki" does not exist. Installing it now.
NAME: loki
LAST DEPLOYED: Thu Nov 19 11:48:00 2020
NAMESPACE: loki
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Verify the application is working by running these commands:
  kubectl --namespace loki port-forward service/loki 3100
  curl http://127.0.0.1:3100/api/prom/label

安装的时候要注意设置 fluent-bit.enabled=true,这样就可以使用 FluentBit 作为日志转发器了,接下来,安装 FluentBit:

代码语言:javascript复制
$ helm upgrade --install fluent-bit --namespace=loki loki/fluent-bit --set loki.serviceName=loki.loki.svc.cluster.local
Release "fluent-bit" does not exist. Installing it now.
NAME: fluent-bit
LAST DEPLOYED: Thu Nov 19 11:51:12 2020
NAMESPACE: loki
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Verify the application is working by running these commands:
  kubectl --namespace loki port-forward daemonset/fluent-bit-fluent-bit-loki 2020
  curl http://127.0.0.1:2020/api/v1/metrics/prometheus

安装完成后我们可以使用用 kubectl -n loki get pods 命令查看 loki 命名空间中正在运行的 pod。

代码语言:javascript复制
$ kubectl get pods -n loki
NAME                               READY   STATUS              RESTARTS   AGE
fluent-bit-fluent-bit-loki-2jrd8   1/1     Running             5          4m20s
fluent-bit-fluent-bit-loki-knbjj   1/1     Running             0          20m
fluent-bit-fluent-bit-loki-wsbwl   1/1     Running             0          69s
grafana-5d45cc9674-wb8fn           1/1     Running             0          12m
loki-0                             1/1     Running             0          23m

接下来我们通过安装 Grafana 来使用 Loki 进行一些日志查询。

安装 Grafana

同样首先添加 Grafana Chart 仓库:

代码语言:javascript复制
$ helm repo add grafana https://grafana.github.io/helm-charts
$ helm repo update

这里我们将 Grafana 也安装在 loki 这个命名空间中:

代码语言:javascript复制
$ helm upgrade --install grafana --namespace=loki grafana/grafana

安装完成后查看 Pod 的状态:

代码语言:javascript复制
$ kubectl get pods -n loki
NAME                               READY   STATUS    RESTARTS   AGE
fluent-bit-fluent-bit-loki-4g7nh   1/1     Running   0          6m20s
fluent-bit-fluent-bit-loki-dt8bj   1/1     Running   0          6m
fluent-bit-fluent-bit-loki-wsbwl   1/1     Running   0          12m
grafana-5d45cc9674-wb8fn           1/1     Running   0          24m
loki-0                             1/1     Running   0          34m

配置 Loki

这里我们直接使用 port-forward 来访问 Grafana 服务:

代码语言:javascript复制
$ kubectl -n loki port-forward svc/grafana 8080:80
# Navigate to http://localhost:8080 in the browser

在在浏览器中打开网址 http://localhost:8080 即可访问,初次登录需要输入用户名和密码,用户名为 admin,对应的密码可以用下面的命令获取:

代码语言:javascript复制
$ kubectl get secret --namespace loki grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
# The password for the admin user

登录完成后,我们就可以添加 Loki 作为数据源了,从左侧面板,选择配置 -> 数据源:

在数据源视图中,点击添加数据源,然后选择 Loki。

给数据源起一个名字,然后设置一个 Grafana 实例可以访问的 Loki URL。我们这里由于 Loki 和 Grafana 都在相同的命名空间中运行,不需要使用任何验证方案,因此不需要其他配置,单击 "保存和测试"。您应该会看到一条确认消息 Data source connected and labels found.

日志查询

现在 Grafana 已经连接到 Loki 了,接下来我们可以查询部署到 demo 命名空间的示例应用的日志,我们可以查找错误,通过 trace id 查找事务等等。

在 Grafana 页面中,从侧面板中选择 "探索",选择上一步中添加的 Loki数据源,在查询框中,输入 {namespace="demo"},然后点击 "运行查询",正常我们就可以看到日志返回了。

此外我们还可以添加更多的过滤器和标签,来缩小我们想要查询的日志范围。要查看来自 demo 命名空间的 istio-sidecars 的日志,可以使用语句 {container="istio-proxy", namespace="demo"} 进行查询,我们也可以查找那些非正常的状态码的 http 请求 {namespace="demo"} |= "http.resp.status"!= "200"

我们还可以对来自日志的数据进行一些聚合分析。比如这里面汇总过去5分钟内 demo 命名空间的 http 状态码,查询语句为:sum(count_over_time({namespace="demo"} |= "http.resp.status" | json [5m])) by (http_resp_status)

上面的绿线代表 302 状态码,黄线代表 200 状态码,过去5分钟内没有其他状态码。关于 Loki 的查询语言 LogQL 还有很多高级的操作,我们可以通过官方文档查看更多。

此外查询历史记录还会被保存下来,这样我们就可以在将来重新访问一个查询历史了,查询检查器还可以报告有关查询执行的指标。

“参考链接:https://medium.com/swlh/getting-up-and-running-with-grafana-loki-e8d841c7182f ”

0 人点赞