kubernetes - 为 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 副本。
解决方案
使用部署,您无法正确执行此操作。您应该使用带有 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 控制平面组件(如控制器管理器)来实现这一点,因为您将需要配置持久存储(其中一个)提供程序并了解数据的保留策略,但这完全是另一个问题。 .
推荐阅读
- visual-studio - Visual Studio 2017 Vue:根级别只允许一个标签
- dart - Flutter Navigator.replace() 示例
- rest - 一个 REST 资源可以包含多个对象吗?
- postman - 将 Postman 配置备份到文件 - 环境和设置
- yii2 - yii2 在 lsphp 中运行 cron 作业
- neo4j - Neo4j 是否默认过滤匹配子句中的循环关系
- wcf - 扩展名 X 未注册 - 为什么要查看 AppData\Local\Temp?
- python - 如何从两个相关的 NumPy 数组中填充字典 - 替代追加
- javascript - 节点红色“类型错误:无法读取未定义的属性‘有效负载’”
- python - 使用 python 和 pandas 向用户分发 x 个事件