我已经使用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-1
和mynode-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。由于我们已经创建了具有相同volumeMode
、accessModes
和storageClassName
字段的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的卷装载。