k8s - Promtail 重写日志标签名

1. Promtail 重写日志标签名

默认Promtail会导出Pod中的一些元数据,可以通过访问Promtail的web界面,获取可以拿到的原始标签

# 获取 promtail Pod的Pod IP地址
kubectl get po -A -o wide|grep promtail
# 输出
# loki               promtail-s2c2x                                                    1/1     Running            0                 23m     172.18.77.11     192.168.1.147   <none>           <none>
# loki               promtail-xl5np                                                    1/1     Running            0                 23m     172.18.168.173   192.168.1.146   <none>           <none>

# 获取当前节点的IP
ip a|grep inet|grep global|head 1
# 输出:inet 192.168.1.146/23 brd 192.168.1.255 scope global noprefixroute eth0

# 转发当前节点的某个端口的流量到promtail的Pod中,5431是监听端口,172.18.77.11是promtail Pod的IP地址,root是登录的用户身份,192.168.1.146是宿主机IP
ssh -fNg -L  5431:172.18.77.11:80 root@192.168.1.146

# 通过浏览器访问: http://192.168.1.146:5431

image

# 修改promtail的配置文件,保存在k8s的configmap中
# 先查询出对饮的comfigmap,找出configmap资源所在的名称空间与名字
kubectl get cm -A|grep promtail
# 输出: loki               promtail                               1      15d

# 编译该comfigmap
kubectl  edit cm -n loki               promtail

# 配置文件的是Yaml格式,配置在scrape_configs配置下的relabel_configs配置中
# 配置的每一个标签重写,是yaml格式中表示的数组,每一个元素是Yaml格式表示哈希表
# action 指定动作是什么,source_labels指定原始标签,来自于访问promtail web页面中列出的Pod的元数据标签,以 __meta_kubenerts_pod开头
# target_label指定重命名后标签的名称,若重命名多个标签,则需要指定分隔符 separator 字段去拼接原始标签对应的值
		  - action: replace
            source_labels:
              - __meta_kubernetes_pod_name
            target_label: pod
          - action: replace
            source_labels:
              - __meta_kubernetes_pod_ip
            target_label: pod_ip
          - action: replace
            source_labels:
              - __meta_kubernetes_pod_annotation_tenant
            target_label: tenant
          - action: replace
            source_labels:
              - __meta_kubernetes_pod_annotation_cluster
            target_label: cluster
          - action: replace
            source_labels:
              - __meta_kubernetes_pod_container_name
            target_label: container
          - action: replace
            replacement: /var/log/pods/*$1/*.log
            separator: /
            source_labels:
              - __meta_kubernetes_pod_uid
              - __meta_kubernetes_pod_container_name
            target_label: __path__
# 修改完成后重新启动Pod让应用生效
kubectl get po -A|grep promtail
# 输出:
#loki               promtail-s2c2x                                                    1/1     Running            0                  146m
#loki               promtail-xl5np                                                    1/1     Running            0                  146m

# 删除POd,会自动重建,需要指定Pod虽在名称空间与Pod名字
# 原理是:当k8s控制循环监控到定义的daemonset中资源期望状态与集群的状态不同,则新建对应的Pod完成一次调谐
kubectl delete po -n loki   promtail-s2c2x  promtail-xl5np

# 再次查询该Pod,会发现该Pod对应的Pod IP地址有可能发生了变化
kubectl get po -A -o wide|grep promtail
# 输出:
# loki               promtail-68z75                                                    1/1     Running            0                  24s     172.18.77.11     192.168.1.147   <none>           <none>
# loki               promtail-lsp6l                                                    1/1     Running            0                  34s     172.18.168.173   192.168.1.146   <none>           <none>

# 停止原来的转发进程
ss -lntup|grep 5431
# 输出:
#tcp    LISTEN     0      128       *:5431                  *:*                   users:(("ssh",pid=24429,fd=4))
#tcp    LISTEN     0      128      :::5431                 :::*                   users:(("ssh",pid=24429,fd=5))

# 指定进程的IP - pid 杀死进程
kill -9 24429

# 重新在当前节点建立转发,修改pod的IP地址为新的地址
ssh -fNg -L  5431:172.18.168.173:80 root@192.168.1.146

# 访问浏览器:http://192.168.1.146:5431

image

2. 解决问题的思路

  1. 应用的配置以yaml格式保存到configmap中,以供多个相同的应用实例使用,应用配置更新只需要更改一次,在所有相同的副本实例生效
  2. 每个应用都会有一个自定义yaml格式文本,需要理解其含义与值的范围,再按照规范进行修改,修改完成后检查其是否生效
posted @ 2024-01-24 21:10  梦_鱼  阅读(105)  评论(0编辑  收藏  举报