【问题标题】:PVC template and failure-domain.beta.kubernetes.io/zonePVC 模板和 failure-domain.beta.kubernetes.io/zone
【发布时间】:2016-11-17 02:17:06
【问题描述】:

我有一个带有

的 PetSet
  volumeClaimTemplates:
  - metadata:
      name: content
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Gi
  - metadata:
      name: database
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Gi
  - metadata:
      name: file
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Gi
  - metadata:
      name: repository
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Gi

如果我使用动态卷配置对其进行注释,它将在随机可用区域中创建卷声明和卷,并且宠物将无法启动,因为在此示例中,每个宠物都需要四个大小为 2Gi 的卷来实际调度。 如果我手动创建卷,我可以将它们标记为 failure-domain.beta.kubernetes.io/zone: us-east-1d 例如,这样我可以使用 matchLabels 的选择器创建 PVC故障域。但是如何使用 volumeClaimTemplates 做类似的事情?我的意思是我不想将它们全部固定在一个故障域中。但由于某种原因,卷声明模板不会为同一故障域中的一只宠物创建所有卷。

想法?

【问题讨论】:

    标签: amazon-web-services kubernetes


    【解决方案1】:

    您可以创建一个存储类并在其中添加故障区域。例如,像这样创建一个存储类:

    kind: StorageClass
    apiVersion: storage.k8s.io/v1beta1
    metadata:
      name: gp2storage
    provisioner: kubernetes.io/aws-ebs
    parameters:
      type: gp2
      zone: us-east-1b
      encrypted: "true"
    

    在上面的示例中,我们在 AWS 上的区域 us-east-1b 中创建 PV。然后在您的模板中引用该存储类:

    volumeClaimTemplates:
      - metadata:
          name: data
          annotations:
            volume.beta.kubernetes.io/storage-class: default
    

    【讨论】:

    • 现在 StatefulSet/PetSet 将尝试在所有可用区域中配置容器,但不会因为我指定了一个仅在给定 AZ 中可用的类而为它们提供存储空间。那行不通:)
    【解决方案2】:

    PV 创建不是 StatefulSet 代码的一部分,因此对于给定的 pod,它不“知道”它们都需要位于同一个故障域中。

    卷配置器中有一段代码recognises PetSet-style names 对基本名称进行哈希处理,然后将该数字用作偏移量。

    因此,具有相同基本名称的卷会分布在多个区域中 - 但这里我们有多个卷名称,因此它们的散列方式不同,-0 最终会分布在多个区域中

    如果这是一项要求,在跟踪器中提出问题可能是您前进的最佳方式

    但是,您是否考虑过执行以下操作?

    apiVersion: apps/v1alpha1
    kind: PetSet
    spec:
      template:
        spec:
          containers:
          -
            volumeMounts:
            - name: contentdatabasefilerepository
              mountPath: /var/www/content
              subPath: content
            - name: contentdatabasefilerepository
              mountPath: /var/database
              subPath: database
      volumeClaimTemplates:
      - metadata:
          name: contentdatabasefilerepository
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 8Gi
    

    每个宠物只有一个卷,但您可以在多个位置安装它的子路径。 虽然这不会将每个目录限制为 2Gi,但可能不适合您的用例

    【讨论】:

    • 您好,很遗憾,由于各种原因(包括性能),我无法将数据放在同一卷上。感谢您的建议。我会尝试在 Github 上提出问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 2023-01-10
    • 2012-04-04
    相关资源
    最近更新 更多