我可以在 K8s pod 中设置 3 个容器,每个容器都在自己的卷中写入吗?

我可以在 K8s pod 中设置 3 个容器,每个容器都在自己的卷中写入吗?

我想在一个由 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 的持久卷声明相关联的持久卷。这必须手动完成。

相关内容