我想在一个由 3 个不同容器组成的 Pod 中设置一项服务。在这个容器中,有一个进程需要写入一个文件。这 3 个容器几乎同时在这些文件中写入相同的内容。为了避免并发写入,是否可以在一个 Pod(副本:3)中设置这 3 个容器,每个容器将写入 3 个不同的卷?
以我的理解目前看来这似乎相当困难。
谢谢您的帮助 !
答案1
正如我在评论中提到的,这可以借助来完成StatefulSets
。
根据 kubernetes 文档StatefulSets.:
使用 StatefulSet
StatefulSet 对于需要以下一项或多项功能的应用程序很有价值。
- 稳定、唯一的网络标识符。
- 稳定、持久的存储。
- 有序、优雅的部署和扩展。
- 有序、自动的滚动更新。
上文中,稳定与跨 Pod(重新)调度的持久性同义。如果应用程序不需要任何稳定标识符或有序部署、删除或扩展,则应使用提供一组无状态副本的工作负载对象来部署应用程序。 部署 或者 副本集 可能更适合您的无国籍需求。
限制
- 给定 Pod 的存储必须由 持久卷配置器 根据请求
storage class
或管理员预先配置。- 删除或缩减 StatefulSet 将 不是 删除与 StatefulSet 关联的卷。这样做是为了确保数据安全,这通常比自动清除所有相关的 StatefulSet 资源更有价值。
- StatefulSet 当前需要 无头服务 负责 Pod 的网络标识。您负责创建此服务。
- StatefulSet 无法保证在删除 StatefulSet 时 Pod 的终止。为了有序且优雅地终止 StatefulSet 中的 Pod,可以在删除之前将 StatefulSet 缩减为 0。
- 使用时 滚动更新 使用默认 Pod 管理策略 (
OrderedReady
),有可能进入需要 人工干预修复。
下面的示例演示了 StatefulSet 的组件。
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
在上面的例子中:
- 一种名为的无头服务
nginx
用于控制网络域。 - 名为 的 StatefulSet
web
有一个 Spec,指示将在唯一的 Pod 中启动 nginx 容器的 3 个副本。 - 将
volumeClaimTemplates
提供稳定的存储 持久卷 由 PersistentVolume Provisioner 配置。
也来自同一文档页面:
稳定存储
Kubernetes 创建一个 持久卷 对于每个 VolumeClaimTemplate。在上面的 nginx 示例中,每个 Pod 将接收一个具有 StorageClass
my-storage-class
和 1 Gib 预置存储的持久卷。如果未指定 StorageClass,则将使用默认的 StorageClass。当 Pod 被(重新)调度到节点上时,它会volumeMounts
挂载与其持久卷声明相关联的持久卷。请注意,当删除 Pod 或 StatefulSet 时,不会删除与 Pod 的持久卷声明相关联的持久卷。这必须手动完成。