首页 > 解决方案 > 为 Kubernetes Deployment 中的每个副本绑定不同的 Persistent Volume

问题描述

我正在使用具有 ReadWriteOnce 访问模式的 PVC,它由 logstash 部署使用,该部署将运行有状态应用程序并使用此 PVC。部署中的每个 pod 将尝试绑定到相同的持久卷声明。如果replicas > 1,它将失败(因为它支持ReadWriteOnce,只有第一个能够成功绑定)。如何指定每个 pod 绑定到单独的 PV。

我不想为每个 logstash 副本/实例定义 3 个单独的 yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: logstash
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: logstash
    spec:
      containers:
        image: "logstash-image"
        imagePullPolicy: IfNotPresent
        name: logstash
        volumeMounts:
        - mountPath: /data
          name: logstash-data
      restartPolicy: Always
      volumes:
      - name: logstash-data
        persistentVolumeClaim:
          claimName: logstash-vol

需要一种方法将不同的 PV 卷挂载到不同的 pod 副本。

标签: kubernetespersistent-volumespersistent-volume-claims

解决方案


使用部署,您无法正确执行此操作。您应该使用带有 PVC 模板的 StatefulSet 来实现您的目标。StatefulSet YAML 代码片段的一部分可能如下所示:

...
volumeClaimTemplates:
- metadata:
    name: pv-data
  spec:
    accessModes: 
      - ReadWriteOnce
    resources:
      requests:
        storage: 5G

假设你有 3 个副本,你会看到 Pod 是按顺序一个一个创建的,并且在 Pod 创建过程中请求 PVC。

PVC 被命名为 volumeClaimTemplate name + pod-name + ordinal number,因此,您将拥有新创建的 PVC 的列表:

pv-data-<pod_name>-0
pv-data-<pod_name>-1
pv-data-<pod_name>-N

StatefulSet 使您的 Pod 的名称(不仅仅是实际上的名称)静态并根据副本数增加它们,这就是为什么每个 Pod 将分别匹配其自己的 PVC 和 PV

注意:这称为动态配置。您应该熟悉配置 kubernetes 控制平面组件(如控制器管理器)来实现这一点,因为您将需要配置持久存储(其中一个)提供程序并了解数据的保留策略,但这完全是另一个问题。 .


推荐阅读