我使用的是具有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复制副本。
使用Deployments,您无法正确执行此操作。您应该使用StatefulSet和PVC模板来实现您的目标。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控制平面组件(如控制器管理器)来实现这一点,因为您将需要配置了持久存储(其中一个)提供程序并了解保留数据的策略,但这完全是另一回事问题