认识

loki 一般组合起来名为loki-stack ;具体stack组件为:Loki、Promtail、Grafana

Loki-stack和常用 EFK(Elasticsearch + Filebeat + Kibana)日志采集方案类似,基本架构都是在应用节点有代理进程(Promtail)收集日志,传输到集中化的服务(Loki)存储和索引,最后通过图形化界面(Grafana)统一查询; 受到Prometheus的启发。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。官方介绍说到:Like Prometheus, but for logs.

这是从网上抄的架构图😂

官方介绍可参考:https://grafana.com/docs/loki/latest/overview/

两者区别

efk和loki的区别。todo....

运行模式

单进程模式非常适合本地开发、小工作负载和评估目的。单片模式可以通过多个进程进行扩展,但有以下限制:

“当运行具有多个副本的单体模式时,当前无法使用本地索引和本地存储,因为每个副本必须能够访问相同的存储后端,并且本地存储对于并发访问是不安全的。单个组件无法独立扩展,因此读取组件不可能多于写入组件。”

部署

基础环境准备

# 安装kustomize-cli
wget https://init.ac/files/kustomize -P /usr/local/bin/ && chmod +x /usr/local/bin/kustomize

# 克隆代码
git clone https://git.itan90.cn/bohai/loki-stack.git -b develop && cd loki-stack/

# 命名空间创建
kubectl create ns loki

修改挂载路径

根据具体环境信息调整

vim promtail/overlays/demo/daemonset.yaml

39-44行(若不使用docker运行时删除即可):
          - mountPath: /data/docker/containers/
            name: docker
            readOnly: true
          - mountPath: /var/log/pods
            name: pods
            readOnly: true

75-80行(若不使用docker运行时删除即可):
        - name: docker
          hostPath:
            path: /data/docker/containers/
        - name: pods
          hostPath:
            path: /var/log/pods

修改位置为你环境中的实际docker目录和pod logs目录

部署loki

kustomize build loki/overlays/demo --load-restrictor LoadRestrictionsNone | kubectl -n loki apply -f -

部署promtail

kustomize build promtail/overlays/demo --load-restrictor LoadRestrictionsNone | kubectl -n loki apply -f -

查看状态

kubectl get po -n loki

NAME                  READY   STATUS    RESTARTS   AGE
loki-0                1/1     Running   0          168m
loki-promtail-8pfgh   1/1     Running   0          48m
loki-promtail-gjw9g   1/1     Running   0          47m
loki-promtail-q6vqg   1/1     Running   0          47m

Grafana配置

安装方法这里省略...

具体配置为:Grafana安装数据源:Loki --> 添加loki数据源: http://k8s-host-ip:30201/

具体服务发布参考: loki/overlays/demo/service.yaml

资源使用

NAME                                                                            CPU %         MEM USAGE / LIMIT 
k8s_promtail_loki-promtail-q6vqg_loki_7fedde49-0b96-4aeb-a8f5-938e312115e1_0    5.82%         64.29MiB / 15.67GiB 
k8s_POD_loki-promtail-q6vqg_loki_7fedde49-0b96-4aeb-a8f5-938e312115e1_0         0.00%         36KiB / 15.67GiB    
k8s_loki_loki-0_loki_f353e83d-cbda-4e63-b780-873562e8aa59_0                     0.16%         65.87MiB / 15.67GiB 
k8s_POD_loki-0_loki_f353e83d-cbda-4e63-b780-873562e8aa59_0                      0.00%         44KiB / 15.67GiB    

选择过滤

日志选择器

对于查询表达式的标签部分,将其用大括号括起来{},然后使用键值语法选择标签。多个标签表达式用逗号分隔:

{app="mysql",name="mysql-backup"}

当前支持以下标签匹配运算符:

  • = 完全相等。
  • != 不相等。
  • =~ 正则表达式匹配。
  • !~ 不进行正则表达式匹配。

例子:

{name=~"mysql.+"}
{name!~"mysql.+"}

日志过滤器

编写日志流选择器后,您可以通过编写搜索表达式来进一步过滤结果。搜索表达式可以只是文本或正则表达式。

查询示例:

{job="mysql"} |= "error"
{name="kafka"} |~ "tsdb-ops.*io:2003"
{instance=~"kafka-[23]",name="kafka"} != kafka.server:type=ReplicaManager

过滤器运算符可以被链接,并将顺序过滤表达式-结果日志行将满足每个过滤器。例如:

已实现以下过滤器类型:

  • |= 行包含字符串。
  • != 行不包含字符串。
  • |~ 行匹配正则表达式。
  • !~ 行与正则表达式不匹配。

资源标签

资源标签的作用主要是方便我们在Grafana面板展示时,更好的过滤区分日志。

例如使用声明式Kustomize的管理编写YAML

commonLabels:
  app: loki
  product: ops
  profile: production

最终可通过Grafana获取Labels

其效果如下

发布鉴权

多套项目环境中,可能每个单独环境都需要部署lokipromtail 来采集日志,最后在统一的Grafana中展示。本文以使用ingress的形式进行演示

创建Secret

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: basic-auth
data:
  # admin:loki123
  auth: "YWRtaW46JGFwcjEkN3ZwMDZISVgkMGJWbGYvN3o2Z2ZoNU5xcm52YnR4LgoK"

发布ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: loki
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
spec:
  ingressClassName: nginx
  rules:
  - host: loki-demo.k8s.dad
    http:
      paths:
      - path: /
        backend:
          service:
            name: loki
            port:
              number: 3100
        pathType: ImplementationSpecific
  tls:
    - hosts:
        - loki-demo.k8s.dad
      secretName: k8s

访问loki的地址:https://loki-demo.k8s.dad 则会被要求认证后访问。

Last modification:November 21, 2023
如果觉得我的文章对你有用,请随意赞赏