Kubernetes 多个 pvc,每个 pod 有 statefulset vs 单个 pvc 所有 pods?
Kubernetes multiple pvc with statefulset for each pod vs single pvc for all pods?
我已经为 mysql 部署了带有状态 pod 的 kubernetes 集群。对于每个 pod,我有不同的 pvc。
例如:如果 3 pod thn 3 5GB EBS PVC
所以对所有 pod 使用一个 PVC 或对每个 pod 使用不同的 pvc 哪种方法更好。
PVC 绑定到特定的 PV。对于 StatefulSet,在大多数可以想象的情况下,您希望拥有一个只能由特定 pod 访问的 PV,这样数据就不会被并行process/pod(RWO 而不是 RWX 模式)的写入尝试破坏。
考虑到这一点,StatefulSet 中的每个副本都需要一个 PVC。如果手动为副本创建 PVC 会很快出现问题,这就是为什么正确的方法是使用 volumeClaimTemplates
,它将在您扩展集合时动态地为您创建 PVC。
StatefulSet 必须使用 volumeClaimTemplates 如果你想为一个集合的每个 pod 提供专用存储。基于该模板,为每个 pod 创建 PersistentVolumeClaim 并将卷配置为绑定到该声明。生成的 PersistentVolumeClaims 名称由 volumeClaimTemplate 名称 + pod-name + 序号组成。
因此,如果您将 volumeClaimTemplate 部分添加到您的 StatefulSet YAML(并删除特定的 persistentVolumeClaim 引用),smth 就像这样:
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnce
然后去创建你的 StatefulSet,然后检查它的一个 pods (kubectl get pods pod-name-0 yaml) 你会看到类似的东西(卷的一部分输出):
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-data-pod-name-0. | dynamically created claim based on the template
因此,通过使用 volumeClaimTemplates,您无需自己创建单独的 PVC,然后在每个单独的 StatefulSet 中引用该 PVC 以特定的 mountPath 挂载到您的容器中(请记住,集合中的每个 pod 必须引用一个不同的 PVC,1PVC-1PV):
Statefulset YAML 的“容器”定义的一部分:
volumeMounts:
- name: mysql-data || references your PVC by -name(not PVC name itself)
mountPath: /var/lib/mysql
因此,旨在让集合中的每个 pod 都有专用存储而不使用 volumeClaimTemplates 会导致很多问题以及管理和扩展它的复杂性。
我已经为 mysql 部署了带有状态 pod 的 kubernetes 集群。对于每个 pod,我有不同的 pvc。
例如:如果 3 pod thn 3 5GB EBS PVC
所以对所有 pod 使用一个 PVC 或对每个 pod 使用不同的 pvc 哪种方法更好。
PVC 绑定到特定的 PV。对于 StatefulSet,在大多数可以想象的情况下,您希望拥有一个只能由特定 pod 访问的 PV,这样数据就不会被并行process/pod(RWO 而不是 RWX 模式)的写入尝试破坏。
考虑到这一点,StatefulSet 中的每个副本都需要一个 PVC。如果手动为副本创建 PVC 会很快出现问题,这就是为什么正确的方法是使用 volumeClaimTemplates
,它将在您扩展集合时动态地为您创建 PVC。
StatefulSet 必须使用 volumeClaimTemplates 如果你想为一个集合的每个 pod 提供专用存储。基于该模板,为每个 pod 创建 PersistentVolumeClaim 并将卷配置为绑定到该声明。生成的 PersistentVolumeClaims 名称由 volumeClaimTemplate 名称 + pod-name + 序号组成。 因此,如果您将 volumeClaimTemplate 部分添加到您的 StatefulSet YAML(并删除特定的 persistentVolumeClaim 引用),smth 就像这样:
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnce
然后去创建你的 StatefulSet,然后检查它的一个 pods (kubectl get pods pod-name-0 yaml) 你会看到类似的东西(卷的一部分输出):
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-data-pod-name-0. | dynamically created claim based on the template
因此,通过使用 volumeClaimTemplates,您无需自己创建单独的 PVC,然后在每个单独的 StatefulSet 中引用该 PVC 以特定的 mountPath 挂载到您的容器中(请记住,集合中的每个 pod 必须引用一个不同的 PVC,1PVC-1PV): Statefulset YAML 的“容器”定义的一部分:
volumeMounts:
- name: mysql-data || references your PVC by -name(not PVC name itself)
mountPath: /var/lib/mysql
因此,旨在让集合中的每个 pod 都有专用存储而不使用 volumeClaimTemplates 会导致很多问题以及管理和扩展它的复杂性。