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



我已经使用kubectl logs 'pod name为我的pod生成了日志。但我想将这些日志保存在一个卷中(某种持久存储(,因为如果pod坏了,容器日志就会被删除。有办法做到这一点吗?我必须写一些剧本吗?我已经读了很多答案,但我仍然不知道如何去做,任何帮助都是感激的。谢谢

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

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

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

来自文档:

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

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

因此,假设您的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

你的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

然后,您只需要告诉部署对象如何在容器中装载卷。因此,您的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

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

我希望它能帮助:(

此外,我对kubernetes世界有点陌生,所以如果你注意到我误解了什么,或者有更好的方法可以做到这一点,请告诉我。

Logging Architecture下,Kubernetes文档通过两种方法在集群中设置loggin。

你最感兴趣的可能是Cluster-level logging architecture:

虽然Kubernetes不提供集群级的本地解决方案日志记录,有几种常见的方法可以考虑。在这里有一些选择:

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

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

  • 流动
  • 挥霍
  • 弹性的

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

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

通过这种方式,即使容器被杀死,也可以持久保存这些日志。

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

相关内容

  • 没有找到相关文章

最新更新