为Kubernetes部署中的每个副本绑定不同的持久卷

时间:2019-01-01 17:45:03

标签: kubernetes persistent-volumes persistent-volume-claims

我正在使用具有ReadWriteOnce访问模式的PVC,由logstash部署使用它将运行有状态的应用程序并使用此PVC。部署中的每个pod都将尝试绑定到相同的持久卷声明。如果副本数> 1,它将失败(因为它支持ReadWriteOnce,因此只有第一个可以成功绑定)。如何指定将每个吊舱绑定到单独的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副本的方法。

1 个答案:

答案 0 :(得分:3)

使用展开,您将无法正确执行此操作。您应该将StatefulSet与PVC模板一起使用以实现目标。您的StatefulSet YAML代码段的一部分可能看起来像这样:

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

假设您有3个副本,您会看到按顺序依次创建容器,并且在容器创建期间请求了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控制平面组件(例如   控制器-经理)来实现这一目标,因为您将需要   配置的持久性存储(其中之一)提供程序并了解   您数据的保留政策,但这完全是另一回事   问题...