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 [email protected]
# 通过浏览器访问: http://192.168.1.146:5431
# 修改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 [email protected]
# 访问浏览器:http://192.168.1.146:5431
2. 解决问题的思路
- 应用的配置以yaml格式保存到configmap中,以供多个相同的应用实例使用,应用配置更新只需要更改一次,在所有相同的副本实例生效
- 每个应用都会有一个自定义yaml格式文本,需要理解其含义与值的范围,再按照规范进行修改,修改完成后检查其是否生效