如何将我的 pod 日志存储在持久存储中?

Sar*_*pta 10 kubernetes persistent-volumes

我已经使用 为我的 Pod 生成了日志kubectl logs 'pod name。但我想将这些日志保存在一个卷(某种持久存储)中,因为如果 Pod 宕机,容器日志将被清除。有没有办法做到这一点?我必须写某种脚本吗?我已经阅读了很多答案,但我仍然不明白如何去做,非常感谢任何帮助。谢谢!

小智 8

我知道这是一个老问题,但我刚刚遇到了同样的问题,并且我花了一些时间来找出解决方案,所以我想分享一个更详细的解决方案。

正如 Aayush Mall 所说,您需要PersistentVolumePersistentVolumeClaim对象来创建卷,然后将其链接到 pod(最好通过Deployment对象)。

基本上,PersistentVolume 将定义卷在主机中的存储方式和位置,而 PersistentVolumeClaim 将定义将卷绑定到某个容器的约束。

来自文档

PersistentVolume (PV) 是集群中的一块存储,由管理员配置或使用存储类动态配置。它是集群中的资源,就像节点是集群资源一样。PV 是像 Volumes 一样的卷插件,但其生命周期独立于使用 PV 的任何单个 Pod。此 API 对象捕获存储实现的详细信息,无论是 NFS、iSCSI 还是特定于云提供商的存储系统。

PersistentVolumeClaim (PVC) 是用户对存储的请求。它类似于 Pod。Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU 和内存)。声明可以请求特定的大小和访问模式(例如,它们可以安装 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany,请参阅 AccessModes)。

因此,假设您的 Pod 在两个节点中运行:mynode-1mynode-2

您的PersistentVolume规格将如下所示。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: myapp-log-pv
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /var/log/myapp
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - mynode-1
          - mynode-2
Run Code Online (Sandbox Code Playgroud)

PersistentVolumeClaim这个样子。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myapp-log-pvc
spec:
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  storageClassName: local-storage
  resources:
    requests:
      storage: 2Gi
  volumeName: myapp-log
Run Code Online (Sandbox Code Playgroud)

然后,您只需告诉部署对象如何将卷挂载到容器内。所以,你的Deployment规格将如下所示。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myrepo/myapp:latest
        volumeMounts:
          - name: log
            mountPath: /var/log
      volumes:
      - name: log
        persistentVolumeClaim:
          claimName: myapp-log-pvc
      
Run Code Online (Sandbox Code Playgroud)

就是这样。当您的部署开始时,它将使用容器创建 pod,安装一个以log路径/var/log(容器内部)命名的卷,并将该卷绑定到某个与名为 的 PVC 的要求相匹配的 PV myapp-log-pvcmyapp-log-pv由于我们使用相同的volumeModeaccessModes和字段创建了 ,storageClassName并且具有比 所需的更多的存储容量myapp-log-pvc,因此它们将被绑定。因此,您的应用程序日志将存储在运行 pod 的节点内的路径/var/log/myapp(规范spec.local.path中的字段)中。myapp-log-pv

我希望它有帮助:)

另外,我对 kubernetes 世界还算陌生,所以如果您发现我误解了某些内容或者是否有更好的方法来做到这一点,请告诉我。

  • 假设“myapp-deploy”创建了 2 个 pod,在同一主机“mynode-1”上运行。当他们同时写入同一个文件夹“/var/log/myapp/myapp.log”中的同一个日志时,是否会出现混乱? (2认同)

aci*_*uji 7

Logging ArchitectureKubernetes文档中,通过几种方式在集群中设置登录。

对您来说最有趣的可能是Cluster-level logging architecture

虽然 Kubernetes 没有提供集群级日志记录的本机解决方案,但您可以考虑几种常见的方法。以下是一些选项:

  • 使用在每个节点上运行的节点级日志记录代理。
  • 包括用于登录应用程序 Pod 的专用 Sidecar 容器。
  • 从应用程序内将日​​志直接推送到后端

有许多解决方案可用于收集 Pod 日志并将其发送到集中位置,例如:

将日志保留在集群之外有好处。如果您的集群开始出现问题,那么您的内部日志架构也很可能会面临这些问题。


Aay*_*all 5

您还需要使用 PersistentVolume 和 PersistentVolumeClaim 将容器内的日志目录挂载到主机。

这样,即使容器被终止,您也可以保留这些日志。

为日志路径创建 PersistentVolume 和 PersistentVolumeClaim,并将它们用作 kubernetes 部署或 Pod 的卷挂载。