为 Kubernetes Deployment 中的每个副本绑定不同的 Persistent Volume
Bind different Persistent Volume for each replica in a Kubernetes Deployment
我正在使用具有 ReadWriteOnce 访问模式的 PVC,它由 logstash 部署使用,它将 运行 有状态应用程序并在部署中使用此 PVC.Each pod 将尝试绑定到相同的持久卷声明。如果副本 > 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 副本。
对于 Deployments,您无法正确执行此操作。您应该使用带有 PVC 模板的 StatefulSet 来实现您的目标。您的 StatefulSet YAML 代码片段的一部分可能如下所示:
...
volumeClaimTemplates:
- metadata:
name: pv-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5G
假设你有 3 个副本,你会看到 pods 按顺序一个接一个地创建,并且在 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 使您的 pods 的名称(实际上不仅仅是名称)静态化并根据副本数递增它们,这就是为什么每个 Pod 将分别匹配自己的 PVC 和 PV
Note: this is called dynamic provisioning. You should be familiar with
configuring kubernetes control plane components (like
controller-manager) to achieve this, because you will need
configured persistent storage (one of them) providers and understand
the retain policy of your data, but this is completely another
question...
我正在使用具有 ReadWriteOnce 访问模式的 PVC,它由 logstash 部署使用,它将 运行 有状态应用程序并在部署中使用此 PVC.Each pod 将尝试绑定到相同的持久卷声明。如果副本 > 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 副本。
对于 Deployments,您无法正确执行此操作。您应该使用带有 PVC 模板的 StatefulSet 来实现您的目标。您的 StatefulSet YAML 代码片段的一部分可能如下所示:
...
volumeClaimTemplates:
- metadata:
name: pv-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5G
假设你有 3 个副本,你会看到 pods 按顺序一个接一个地创建,并且在 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 使您的 pods 的名称(实际上不仅仅是名称)静态化并根据副本数递增它们,这就是为什么每个 Pod 将分别匹配自己的 PVC 和 PV
Note: this is called dynamic provisioning. You should be familiar with configuring kubernetes control plane components (like controller-manager) to achieve this, because you will need configured persistent storage (one of them) providers and understand the retain policy of your data, but this is completely another question...