基于hostpath的k8s pod日志持久化


在这里插入图片描述

前置条件:

  1. 考虑到pod的多副本,但同时需要将日志集中收集起来,所以采用hostpath的方式将同一个服务的多pod的日志持久化到一起,日志穿插性的写在一个文件中。
  2. 由于pod重启会打散分配到不同节点上,所以基于nfs的网络文件系统通过共享目录的方式挂载到客户端节点(nfs-server:/mnt/hostpath; nfs-client: /mnt/hostpath,将nfs-server的/mnt/hostpath挂载到nfs-client的/mnt/hostpath下,从而达到同服务多pod可以写到一个文件中 )。

step1:修改服务的yaml文件

在原有的yaml文件中添加数据持久化配置(如截图中红框所示)
cat enterprise-api.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: enterprise-api-v1
  name: enterprise-api-v1
  namespace: hd-cool
spec:
  replicas: 2
  selector:
    matchLabels:
      app: enterprise-api-v1
  template:
    metadata:
      labels:
        app: enterprise-api-v1
    spec:
      imagePullSecrets:
        - name: hd-admin-token
      containers:
      - image: harbor.my.cn/hd-k8s/enterprise-api:latest
        name: enterprise-api-v1
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: data-log
          mountPath: /data/log
      volumes: 
      - name: data-log
        hostPath:
          path: /mnt/hostpath

在这里插入图片描述
可以看到初次启动pod的时候定义了两个副本,但是日志都只持久化到了/mnt/hostpath/下
在这里插入图片描述
将pod的副本数调整到三个,依然在/mnt/hostpath/只有enterprise-api这个目录,同时打开access的日志,会发现有三个pod服务启动加载时要读取的配置参数,说明pod的日志是穿插写入到文件中的。
在这里插入图片描述
在这里插入图片描述

step2:推送日志到minio版保存

由于已经将nfs-server的共享目录已经挂载到所有的nfs-client上,所以在任一节点配置minio客户端工具,将/mnt/hostpath的数据定期推到minio服务中存储起来(结合crontab和清理策略),方便后期需要和查询。
在这里插入图片描述

step3:优化

也可以无需挂载,直接将nfs挂载到pod中,(如截图中红框所示)。
cat enterprise-api.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: enterprise-api-v1
  name: enterprise-api-v1
  namespace: hd-cool
spec:
  replicas: 2
  selector:
    matchLabels:
      app: enterprise-api-v1
  template:
    metadata:
      labels:
        app: enterprise-api-v1
    spec:
      imagePullSecrets:
        - name: hd-admin-token
      containers:
      - image: harbor.my.cn/hd-k8s/enterprise-api:latest
        name: enterprise-api-v1
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: data-log
          mountPath: /data/log
      volumes: 
      - name: data-log
         nfs: 
            server: 172.16.99.140
            path: /mnt/hostpath

在这里插入图片描述

附加:简单了解

有时间需要将同一个服务的多副本pod的日志持久化到本地,方便更加pod的名称更加快速的查看完整的日志,则可以通过subpathexpr可以实现,详见官网文档介绍。
修改yaml文件为,(如截图中红框所示):
cat enterprise-api.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: enterprise-api-v1
  name: enterprise-api-v1
  namespace: hd-cool
spec:
  replicas: 2
  selector:
    matchLabels:
      app: enterprise-api-v1
  template:
    metadata:
      labels:
        app: enterprise-api-v1
    spec:
      imagePullSecrets:
        - name: hd-admin-token
      containers:
      - image: harbor.my.cn/hd-k8s/enterprise-api:latest
        name: enterprise-api-v1
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.name
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: data-log
          mountPath: /data/log
          subPathExpr: $(POD_NAME)
      volumes: 
      - name: data-log
        hostPath:
          path: /mnt/hostpath

在这里插入图片描述

可以看到不管是同一个服务的几个副本,日志都是独立持久化到对应的podname的文件夹中
在这里插入图片描述 参考:https://blog.csdn.net/weixin_44729138/article/details/121431971

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Kubernetes (K8s) 支持使用 NFS(Network File System)作为持久存储解决方案。NFS 是一种分布式文件系统协议,允许将远程文件系统挂载到本地服务器上。 要使用 NFS 进行持久存储,你需要先设置一个 NFS 服务器,并在 Kubernetes 集群中配置一个 NFS 持久卷。以下是一些步骤: 1. 配置 NFS 服务器:你需要设置一个 NFS 服务器并将其配置为共享文件系统。确保你已经安装并配置好了 NFS 服务器软件。 2. 创建 NFS 持久卷:在 Kubernetes 中,你可以使用 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)对象来定义持久卷和持久卷声明。创建一个 PV 来表示 NFS 服务器上的共享目录,并为该 PV 创建一个 PVC。 3. 部署应用程序:使用创建的 PVC,在你的应用程序中声明一个持久卷。你可以通过将 PVC 挂载到应用程序的 Pod 中来实现持久存储。 以下是一个示例的 YAML 文件,演示了如何在 Kubernetes 中配置一个 NFS 持久卷: ``` apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: server: <NFS_SERVER_IP> path: /path/to/shared/directory --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi storageClassName: "" selector: matchLabels: name: nfs-pv ``` 替换 `<NFS_SERVER_IP>` 和 `/path/to/shared/directory` 为你 NFS 服务器的 IP 地址和共享目录的路径。然后,使用 kubectl apply 命令来部署这个 YAML 文件。 一旦 PVC 和 PV 创建成功,你可以在你的应用程序中使用该 PVC 来挂载 NFS 持久卷,并在 Pod 中进行持久存储。 这就是使用 NFS 进行持久存储的基本步骤。希望对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值