PVC模板和failure-domain.beta.kubernetes.io/zone

时间:2016-11-11 08:13:35

标签: amazon-web-services kubernetes

我有一个PetSet with

  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 标记它们,这样我就可以用匹配标签的选择器创建PVC故障域。但是我如何使用volumeClaimTemplates做类似的事情呢?我的意思是我不想把它们全部固定在一个故障领域。但由于某种原因,卷声明模板不会为同一个失败域中的一只宠物创建所有卷。

想法?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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,但可能不适合您的用例