【问题标题】:Multiple Kubernetes pods sharing the same host-path/pvc will duplicate output共享相同主机路径/pvc 的多个 Kubernetes pod 将重复输出
【发布时间】:2018-03-26 02:01:57
【问题描述】:

我有一个小问题,需要知道解决/解决我的问题的最佳方法是什么。

我在 Kubernetes 上部署了几个 pod,到目前为止,我很喜欢学习和使用 Kubernetes。是否所有的持久卷,卷声明......等等。并且可以在主机上看到我的数据,因为我需要这些文件进行进一步处理。

现在的问题是共享相同卷声明的 2 个 pod(2 个副本)正在写入主机上的相同位置,这是预期的,但不幸的是导致数据在输出文件中重复。

我需要的是:

  • 在主机上拥有每个 pod 的唯一输出。实现这一目标的唯一方法是 就我而言,有两个部署文件,每个文件都使用不同的卷声明/持久性 体积 ?同时不确定这是否是未来更新、升级、一定数量 pod 的可用性等的最佳方法。
  • 或者我是否仍然可以拥有一个具有 2 个或更多副本的部署文件,并且在共享同一个 pvc 时仍然避免输出重复?

请注意,我有一个节点部署,这就是我目前使用主机路径的原因。

创建光伏:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: ls-pv
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/ls-data/my-data2"

声明-pv:

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

我如何在我的部署中使用我的 pv:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: logstash
  namespace: default
  labels:
    component: logstash
spec:
  replicas: 2
  selector:
    matchLabels:
     component: logstash
#omitted 
        ports:
        - containerPort: 5044
          name: logstash-input
          protocol: TCP
        - containerPort: 9600
          name: transport
          protocol: TCP
        volumeMounts:
        - name: ls-pv-store
          mountPath: "/logstash-data"
      volumes:
      - name: ls-pv-store
        persistentVolumeClaim:
         claimName: ls-pv-claim

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    根据您想要实现的具体目标,您可以使用Statefulsets 而不是部署。从 Statefulset 的 Pod 模板生成的每个 Pod 都可以拥有自己的独立 PersistentVolumeClaim,该 PersistentVolumeClaim 是从 volumeClaimTemplate 创建的(有关示例,请参见链接)。您需要为此设置StorageClass

    如果您正在寻找更简单的东西,您可以从每个 Pod 写信给 /mnt/volume/$HOSTNAME。这也将确保它们使用单​​独的文件,因为 Pod 的主机名是唯一的。

    【讨论】:

    • 我决定暂时使用主机名方法作为快速解决方案,但仍然是同样的问题!如果我使用 /path/$HOSTNAME/ 或 filename-$HOSTNAME 我仍然只得到一个文件,在两个 pod 之间共享。我什至意识到一个 pod 的文件或目录将在另一个 pod 上具有自己的主机名,并且两者都将开始使用/共享同一个文件。不太确定为什么 pod 在使用唯一的主机名时看不到路径和文件名的差异。
    • 我可能错了,但是看起来当在两个或更多部署副本之间使用相同的卷声明时,一旦创建了第二个(最新的)pod,它将是使用 PVC 的那个,即使由于主机名,每个 pod 的名称或路径都是唯一的。
    • 如果您在问题中发布完整的 yaml 文件可能会有所帮助。
    • 问题已更改,添加了 yaml 文件。
    • 根据您在回答中提供的信息,我将标记为已接受的解决方案,因为基于我当前的部署主机路径无法针对没有 StorageClass 和 statefulSet 的多个副本完成。在我的情况下使用相同的 pvc 声明,即使使用 $HOSTNAME 仍然无法正常工作。所以是的,最后需要某种 StorageClass。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-01-10
    • 2019-05-24
    • 1970-01-01
    • 2022-09-29
    • 2015-11-06
    • 2020-06-16
    • 2021-04-13
    • 1970-01-01
    相关资源
    最近更新 更多