共享同一主机路径/pvc的多个Kubernetes吊舱将复制输出

共享同一主机路径/pvc的多个Kubernetes吊舱将复制输出,kubernetes,Kubernetes,我有一个小问题,需要知道解决这个问题的最佳方法是什么 我在Kubernetes上部署了几个吊舱,到目前为止,我很喜欢学习Kubernetes并与之合作。所有的持久卷、卷声明…等等。并且可以在主机上查看我的数据,因为我需要这些文件进行进一步处理 现在的问题是共享同一卷声明的两个pod(2个副本)正在写入主机上的同一位置,这是意料之中的,但不幸的是导致数据在输出文件中重复 我需要的是: 主机上每个pod都有一个唯一的输出。实现这一目标的唯一途径是 在我的例子中,有两个部署文件,每个文件使用不同的卷

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

我在Kubernetes上部署了几个吊舱,到目前为止,我很喜欢学习Kubernetes并与之合作。所有的持久卷、卷声明…等等。并且可以在主机上查看我的数据,因为我需要这些文件进行进一步处理

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

我需要的是:

  • 主机上每个pod都有一个唯一的输出。实现这一目标的唯一途径是 在我的例子中,有两个部署文件,每个文件使用不同的卷声明/持久性 音量?同时,不确定这是否是未来更新、升级的最佳方法,是否有一定数量的POD可用。。。等等
  • 或者,我仍然可以拥有一个包含2个或多个副本的部署文件,并且在共享同一个pvc时仍然可以避免输出重复
请注意,我只有一个节点部署,这就是我现在使用hostpath的原因

创建pv:

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

根据您试图实现的具体目标,您可以使用而不是部署。Statefulset的Pod模板中的每个Pod spawn都可以有自己的PersistentVolumeClaim,它是从volumeClaimTemplate创建的(请参见链接以获取示例)。您需要为此进行设置


如果您正在寻找更简单的内容,请从每个Pod向
/mnt/volume/$HOSTNAME
写入。这还将确保它们使用单独的文件,因为pod的主机名是唯一的。

我决定现在使用主机名方法作为快速解决方案,但仍然是相同的问题!如果我使用/path/$HOSTNAME/或filename-$HOSTNAME,我仍然只得到一个文件,在两个pod之间共享。我甚至意识到,一个pod将在另一个pod上有自己的文件或目录以及自己的主机名,两个pod将开始使用/共享相同的文件。不太清楚为什么pod在使用唯一的主机名时看不到路径和文件名的差异。我可能错了,但看起来好像在两个或更多部署副本之间使用相同的卷声明时,一旦创建了第二个(最新的)pod,它将是使用PVC的pod,即使由于主机名的原因,每个POD的名称或路径都是唯一的。如果您将完整的yaml文件发布在问题中,可能会有所帮助。问题已更改,添加了yaml文件。根据您回答中提供的信息,我将标记为已接受的解决方案,因为根据我当前的部署,如果没有StorageClass和statefulSet,则无法对多个副本执行hostpath。在我的案例中,即使使用$HOSTNAME,使用相同的pvc声明仍然不起作用。因此,最终需要某种类型的StorageClass。谢谢