Sar*_*pta 10 kubernetes persistent-volumes
我已经使用 为我的 Pod 生成了日志kubectl logs 'pod name。但我想将这些日志保存在一个卷(某种持久存储)中,因为如果 Pod 宕机,容器日志将被清除。有没有办法做到这一点?我必须写某种脚本吗?我已经阅读了很多答案,但我仍然不明白如何去做,非常感谢任何帮助。谢谢!
小智 8
我知道这是一个老问题,但我刚刚遇到了同样的问题,并且我花了一些时间来找出解决方案,所以我想分享一个更详细的解决方案。
正如 Aayush Mall 所说,您需要PersistentVolume和PersistentVolumeClaim对象来创建卷,然后将其链接到 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-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
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-pvc。myapp-log-pv由于我们使用相同的volumeMode、accessModes和字段创建了 ,storageClassName并且具有比 所需的更多的存储容量myapp-log-pvc,因此它们将被绑定。因此,您的应用程序日志将存储在运行 pod 的节点内的路径/var/log/myapp(规范spec.local.path中的字段)中。myapp-log-pv
我希望它有帮助:)
另外,我对 kubernetes 世界还算陌生,所以如果您发现我误解了某些内容或者是否有更好的方法来做到这一点,请告诉我。
在Logging ArchitectureKubernetes文档中,通过几种方式在集群中设置登录。
对您来说最有趣的可能是Cluster-level logging architecture:
虽然 Kubernetes 没有提供集群级日志记录的本机解决方案,但您可以考虑几种常见的方法。以下是一些选项:
- 使用在每个节点上运行的节点级日志记录代理。
- 包括用于登录应用程序 Pod 的专用 Sidecar 容器。
- 从应用程序内将日志直接推送到后端
有许多解决方案可用于收集 Pod 日志并将其发送到集中位置,例如:
将日志保留在集群之外有好处。如果您的集群开始出现问题,那么您的内部日志架构也很可能会面临这些问题。
您还需要使用 PersistentVolume 和 PersistentVolumeClaim 将容器内的日志目录挂载到主机。
这样,即使容器被终止,您也可以保留这些日志。
为日志路径创建 PersistentVolume 和 PersistentVolumeClaim,并将它们用作 kubernetes 部署或 Pod 的卷挂载。
| 归档时间: |
|
| 查看次数: |
12386 次 |
| 最近记录: |