2

我已经为 mysql 部署了带有状态 pod 的 kubernetes 集群。对于每个吊舱,我有不同的 pvc。

例如:如果 3 pod thn 3 5GB EBS PVC

所以哪种方式更好地为所有 Pod 使用一个 PVC 或为每个 Pod 使用不同的 pvc。

4

2 回答 2

3

StatefulSet 必须使用 volumeClaimTemplates 如果您想为集合的每个 pod 提供专用存储。基于该模板 PersistentVolumeClaim 为每个 pod 创建并配置要绑定到该声明的卷。生成的 PersistentVolumeClaims 名称由 volumeClaimTemplate 名称 + pod-name + 序号组成。因此,如果您将 volumeClaimTemplate 部分添加到您的 StatefulSet YAML(并删除特定的 persistentVolumeClaim 引用),就像这样:

volumeClaimTemplates:
  - metadata:
      name: mysql-data    
    spec:
      resources:
        requests:
          storage: 10Gi
      accessModes:
      - ReadWriteOnce

然后去创建你的 StatefulSet,然后检查它的一个 pod(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 会导致很多问题以及管理和扩展它的复杂性。

于 2018-12-26T12:29:25.220 回答
2

PVC 绑定到特定的 PV。对于 StatefulSet,在大多数可以想象的情况下,您希望拥有一个只能由特定 pod 访问的 PV,以便数据不会被来自并行进程/pod 的写入尝试破坏(RWO 而不是 RWX 模式)。

考虑到这一点,StatefulSet 中的每个副本都需要一个 PVC。如果手动完成,为副本创建 PVC 会很快出现问题,这就是为什么正确的方法是使用volumeClaimTemplates它将在您扩展集合时为您动态创建 PVC。

于 2018-12-26T08:23:43.057 回答