Kubernetes每个Pod具有statefulset的多个PVC与所有Pod的单个PVC相比?

时间:2018-12-26 04:59:08

标签: kubernetes kubernetes-pvc

我已经为Kubernetes集群部署了带状态Pod的mysql。每个豆荚都有不同的pvc。

例如:如果3盒3 3GB EBS PVC

SO最好在所有吊舱中使用一个PVC或对每个吊舱使用不同的pvc。

2 个答案:

答案 0 :(得分:2)

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

请记住,在StatefulSet中每个副本需要一个PVC。如果手动完成,为副本创建PVC会很快出现问题,这就是为什么正确的方法是使用volumeClaimTemplates来为您扩展集动态地为您创建PVC。

答案 1 :(得分:1)

如果要为集合的每个Pod专用存储,则

StatefulSet必须使用volumeClaimTemplates。基于该模板,为每个吊舱创建PersistentVolumeClaim并配置要绑定到该声明的卷。生成的PersistentVolumeClaims名称由volumeClaimTemplate名称+ pod名称+序号组成。 因此,如果将volumeClaimTemplate部分添加到StatefulSet YAML(并删除特定的persistentVolumeClaim引用),则如下所示:

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

然后创建StatefulSet,然后检查其中一个pod(kubectl get pod 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上(请记住,集合中的每个吊舱都必须引用不同的PVC ,1PVC-1PV): Statefulset YAML的“容器”定义的一部分:

volumeMounts:
        - name: mysql-data   || references your PVC by -name(not PVC name itself) 
          mountPath: /var/lib/mysql

因此,要使集合中的每个吊舱都具有专用存储空间而不使用volumeClaimTemplates,会导致很多问题,并且会导致管理和扩展它的复杂性。