【问题标题】:Kubernetes - Generate files on all the podsKubernetes - 在所有 pod 上生成文件
【发布时间】:2020-02-05 20:44:54
【问题描述】:

我有 Java API,它将数据导出到 excel 并在提供请求的 POD 上生成一个文件。 现在下一个请求(下载文件)可能会转到不同的 POD 并且下载失败。

我该如何解决这个问题? 如何在所有 POD 上生成文件?或者我如何确保后续请求转到生成文件的同一个 POD? 我无法提供直接的 POD URL,因为客户端无法访问它。

谢谢。

【问题讨论】:

  • 根据您的集群运行的环境,您可以使用共享存储介质,而不是将文件存储在每个容器的本地存储中。如果这不是一个选项,您可以考虑在入口级别配置粘性会话(nginx 支持这一点)。
  • 将文件下载到 s3/gcp 存储或使用共享卷

标签: kubernetes


【解决方案1】:

您需要使用持久卷在容器之间共享相同的文件。您可以使用安装在容器上的节点存储(最简单的方式)或其他分布式文件系统,如 NFS、EFS (AWS)、GlusterFS 等...

如果您需要一个最简单的文件共享方式并且您的 pod 位于同一个节点中,您可以使用 hostpath 来存储文件并与其他容器共享卷。

假设您有一个只有一个节点的 kubernetes 集群,并且您希望与您的 pod 共享您的节点的路径 /mtn/data

创建一个 PersistentVolume:

hostPath PersistentVolume 使用节点上的文件或目录来模拟网络附加存储。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

创建 PersistentVolumeClaim:

Pod 使用 PersistentVolumeClaims 请求物理存储

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

查看 PersistentVolumeClaim:

kubectl get pvc task-pv-claim

输出显示 PersistentVolumeClaim 已绑定到您的 PersistentVolume task-pv-volume

NAME            STATUS    VOLUME           CAPACITY   ACCESSMODES   STORAGECLASS   AGE
task-pv-claim   Bound     task-pv-volume   10Gi       RWO           manual         30s

创建一个包含 2 个副本的部署,例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: task-pv-storage
          persistentVolumeClaim:
            claimName: task-pv-claim
      containers:
        - name: task-pv-container
          image: nginx
          ports:
            - containerPort: 80
              name: "http-server"
          volumeMounts:
            - mountPath: "/mnt/data"
              name: task-pv-storage

现在您可以检查两个容器内的路径 /mnt/data 是否具有相同的文件。

如果您有超过 1 个节点的集群,我建议您考虑其他类型的 persistent volumes

参考资料: Configure persistent volumes Persistent volumes Volume Types

【讨论】:

    猜你喜欢
    • 2019-05-24
    • 1970-01-01
    • 2017-09-12
    • 2022-08-14
    • 2021-01-28
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    相关资源
    最近更新 更多