认识
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
其效果如下
发布鉴权
多套项目环境中,可能每个单独环境都需要部署loki
、promtail
来采集日志,最后在统一的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
则会被要求认证后访问。