编程技术分享平台

网站首页 > 技术教程 正文

k8s日志收集 多pod挂载不同目录方案

xnh888 2024-10-16 17:41:10 技术教程 29 ℃ 0 评论

k8s的日志收集有多种方案,其中一种是将pod的日志挂载到node节点,然后在node节点运行单独的日志收集客户端,将日志收集并分发到其他日志分析服务如elasticsearch上。

原理

借助docker的Volume功能。在host机器上开辟一个固定目录D;产生日志的容器将日志文件所在目录mount到D目录下的子目录中;收集日志的容器再把目录D mount到自己容器内。

这样日志收集容器就能访问到所有日志文件了。如下图所示:

如果pod有多个replicas时存在一个问题,多个pod的日志会写到node机器上的同一个文件中

解决办法是:利用HOSTNAME这个环境变量(每个pod的HOSTNAME值默认为pod_name),每个pod将日志写在$HOSTNAME目录下,便可以实现不同的pod日志写到不同目录下


方案:

1. 使用一个能持久化存储的公用目录,比方说hostpath:/data/logs

2. 将这个目录挂载到所有pod的/data/logs路径

3. 在pod的/data/logs创建一个不可能重名的文件夹,比如/data/logs/pod-name

mkdir -p /data/logs/$HOSTNAME

4. 将log目录软链接到pod里面的/data/logs/pod-name目录

比如程序日志打印到/logs目录

ln -s /data/logs/$HOSTNAME /logs

假设程序日志输出到 /logs

母机上设置日志目录:/data/logs


案例:

制作好镜像:

一:dockerfile

#dockerfile

FROM nginx

MAINTAINER mengshiye "shiye@meng.com"

CMD mkdir -p /data/logs/${HOSTNAME} && ln -s /data/logs/${HOSTNAME} /logs && nginx -g "daemon off;"

二:生成镜像

docker build -t nginx:v1 .

三:yaml 文件

#svc-nginx.yaml

apiVersion: v1
kind: Service
metadata:
  name: svc-nginx-30083
spec:
  ports:
    - port: 8003
      targetPort: 80
      nodePort: 30083
      protocol: TCP
  type: NodePort
  selector:
    app: svc-nginx-30083

创建服务

kubectl create -f svc-nginx.yaml

四:deployment 创建Pods

#deploy-nginx-30083.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx-30083
spec:
  replicas: 2
  selector:
    matchLabels:
      app: svc-nginx-30083
  template:
    metadata:
      labels:
        app: svc-nginx-30083
    spec:
      nodeSelector:
        node: k2
      containers:
       - name: contain-nginx-30083
         image: nginx:v1
         volumeMounts:
         - mountPath: /data/logs
           name: ledou-volume-log
         ports:
           - containerPort: 80
      volumes:
      - name: ledou-volume-log
        hostPath:
          path: /data/logs
          type: DirectoryOrCreate

创建deploy

kubectl create -f deploy-nginx-30083.yaml

四:验证日志信息

1.进入pods

docker exec -it 0c387469be94 /bin/bash

2.查看日志目录

ls -l /logs

logs -> /data/logs/nginx-deploy-30083-6cd88c7c94-lszrk

3.打印日志测试

4.母机上验证

ls /data/logs/*

5.通过母机上的filebeat 搜集并传到logstash/kafka/redis/es


方案2:直接修改deployment 注入command方式

(覆盖默认的nginx -g "daemon off;",需要单独加上)

#nginx-deploy-30083.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy-30083
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-svc-30083 
  template:
    metadata:
      labels:
        app: nginx-svc-30083
    spec:
      nodeSelector:
        node: k6
      containers:
       - name: nginx-deploy-30083
         image: nginx
         command: ["/bin/bash", "-c"]
         args:
         - "mkdir -p /data/logs/${HOSTNAME} && ln -s /data/logs/${HOSTNAME} /logs &&  nginx -g 'daemon off;'"
         volumeMounts:
         - mountPath: /data/logs
           name: ledou-volume-log  
         ports:
           - containerPort: 80
      volumes:
      - name: ledou-volume-log
        hostPath:
          path: /data/logs
          type: DirectoryOrCreate



Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表