共享相同主机路径/pvc 的多个 Kubernetes pod 将重复输出

Zee*_*Zee 4 kubernetes

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

我已经在 Kubernetes 上部署了几个 pod,到目前为止,我很享受学习 Kubernetes 和使用 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"
Run Code Online (Sandbox Code Playgroud)

索赔-光伏:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ls-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi
Run Code Online (Sandbox Code Playgroud)

我如何在部署中使用我的 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
Run Code Online (Sandbox Code Playgroud)

Jan*_*art 6

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

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