Loki是一个水平可扩展,高可用性,支持多租户的日志聚合系统,使用了和 Prometheus 相同的服务发现机制,将标签添加到日志流中而不是构建全文索引,而是为每个日志流编制一组标签。
Grafana 是一个用于监控和可视化观测的开源平台,支持非常丰富的数据源,支持Prometheus 和 Loki 等数据源的时间序列数据。
Grafana和Loki的组合使得我们日志收集聚合简单高效,而且查看起来更接近在控制台实时查看日志。
Loki由3个组成部分组成:
- loki 是主服务器,负责存储日志和处理查询。
- promtail 是代理,发现采集目标以及给日志流添加上 Label 标签,然后发送给 Loki,也可以选择fluent-bit。
- 用户界面的Grafana。
部署方式
由于我们服务有同时运行在k8s集群上和ECS服务器上,所以规划Loki server使用helm部署在k8s中,grafana也部署在k8s中,promtail部署在k8s和其他ECS服务器上以docker方式运行。
Loki和grafana通过ingress暴露服务。
1. 安装helm
wget https://get.helm.sh/helm-v3.3.4-linux-amd64.tar.gztar zxf helm-v3.3.4-linux-amd64.tar.gzmv linux-amd64/helm /usr/bin/helm version # 查看helm 版本
添加Loki源
helm repo add loki https://grafana.github.io/loki/charts && helm repo updatehelm search repo loki
2.创建PVC
为了使Loki数据持久化,k8s集群需要准备好StorageClass,这里使用了阿里云的Default StorageClass
执行以下命令将StorageClass (alicloud-disk-efficiency)配置为一个Default StorageClass。
kubectl patch storageclass alicloud-disk-efficiency -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
kubectl get sc
创建PVC
注,在阿里云k8s设置了Default StorageClass后可以不指定StorageClass,但其他情况需要指定
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: loki-server-pvcspec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi
集群会自动创建一个云盘卷(PV),且配置了Default StorageClass(alicloud-disk-ssd)。
kubectl get pvc
3. 下载Loki并改造
helm fetch loki/loki
编辑 loki/value.yaml修改配置
14 enabled: true19 - host: loki.k8s.example.com # 开启ingress, ingress域名20 paths: ['/loki/api/v1/push']72 ingestion_rate_mb: 32121 enabled: true #开启持久化存储129 existingClaim: loki-server-pvc # 为之前创建的PVC
左侧为value.yaml的行数
4. 安装Loki
helm install loki-server ./loki # 指定release的名称
5.在k8s上安装promtail
安装日志采集端在k8s中
helm install promtail loki/promtail --set "loki.serviceName=loki-server" # 要指定loki-server的名称
6. 安装grafana
grafana.yml如下
kind: DeploymentapiVersion: apps/v1beta2metadata: labels: app: grafana name: grafanaspec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: grafana template: metadata: labels: app: grafana spec: securityContext: runAsUser: 0 containers: - name: grafana image: grafana/grafana:latest imagePullPolicy: IfNotPresent env: - name: GF_AUTH_BASIC_ENABLED value: "true" - name: GF_AUTH_ANONYMOUS_ENABLED value: "false" readinessProbe: httpGet: path: /login port: 3000 ports: - containerPort: 3000 protocol: TCP---apiVersion: v1kind: Servicemetadata: name: grafana-service labels: app: grafanaspec: ports: - port: 3000 name: grafana targetPort: 3000 selector: app: grafana---apiVersion: extensions/v1beta1kind: Ingressmetadata: name: grafana-public-ingress #annotations: # kubernetes.io/ingress.class: shujiajia-public-ingressspec: rules: - host: grafana.k8s.example.com # 注意修改为自己的域名 http: paths: - backend: serviceName: grafana-service servicePort: 3000
登入 Grafana,添加 Loki 作为数据源,如:http://loki-server:3100。添加之后,就可以点击 Explore 按钮,然后根据label选择不同服务查看日志了。
7. 在其他服务器上安装promtail进行日志收集
安装日志采集端在服务器上-docker方式
配置文件如下:cat config.yml
server: http_listen_port: 0 grpc_listen_port: 0positions: filename: /etc/promtail/positions.yaml # 游标记录上一次同步位置 sync_period: 10s #10秒钟同步一次clients: - url: http://loki.k8s.example.com/loki/api/v1/push # 替换为自己的Loki server的地址,ingress暴露的地址scrape_configs:- job_name: gateway static_configs: - targets: - localhost labels: # 自定义标签 app: gateway __path__: /data/logs/*/*.log # 需要收集的日志目录,支持正则匹配
启动
docker run -d --name promtail -v /data/apps/promtail:/etc/promtail -v /data/logs:/data/logs grafana/promtail
注意,由于是docker方式运行,所以需要把配置文件目录和服务运行的日志目录进行挂载,如果目录下有多个日志,比如error.log和log.log,Loki会对日志进行聚合显示。
8.升级/更新loki
helm upgrade --install loki-server ./loki
查看日志