问题是我想持久化某个服务的一个状态文件(服务生成的状态),而不是目录,以防服务重启时状态丢失,如何解决?
2 回答
如果它只是一个状态文件,您应该能够将其写入配置映射。请参阅将 ConfigMap 数据添加到卷。如果你有卷
volumes:
- name: status
configMap:
name: status
defaultMode: 420
optional: true
在volumeMounts中
volumeMounts:
- name: status
mountPath: /var/service/status
那么你应该可以在里面写了。另请参阅 kube-dns 如何使用来自config-map的kube-dns-config
挂载。kube-dns
您可以在 pod 规范中包含一个emptyDir 卷。这将创建一个与 pod 一样长的空目录,即使它已重新启动或迁移。
如果您的 pod 属于要更新的部署,这不一定能很好地发挥作用,因为部署的核心操作是创建新的 pod 并删除旧的 pod。在这种情况下,您需要一个持久的卷声明。这更复杂:它涉及拥有另一个 Kubernetes 对象,这意味着有一个地方来存储实际的卷。(例如,如果您在 AWS 上运行,则持久卷可能会由 EBS 卷支持。)对于简单的状态来说,这可能有点矫枉过正。
另一种选择是设置某种小型数据库(Redis很流行)并将状态存储在那里。现在您没有将状态存储在容器的文件系统中,并且您实际上并不关心 pod 是退出还是被删除。
还要考虑如果同时运行多个 pod 副本会发生什么。如果不出意外,由于部署的默认行为是创建新 pod,等待其运行状况检查通过,然后删除旧 pod,因此您通常可以使用同一个 pod 的两个并发副本结束。单个共享状态可能没有您想要的行为。