【问题标题】:In GKE, can we specify the zone or region of a persistent volume when we create it through a PVC object在 GKE 中,我们可以通过 PVC 对象创建持久化卷时指定其区域或区域吗?
【发布时间】:2021-01-30 05:10:10
【问题描述】:

我希望我的持久卷驻留在特定区域中,例如 us-central1-a,但我想通过 PVC 部署它,而不是直接创建 PV 对象。这在 GKE 中可行吗?

【问题讨论】:

  • 你的节点在同一个区域吗?通过这个doc k8s 会选择一个随机区域来创建磁盘。选区有什么要求?也许还有另一种方法可以实现您想要的。
  • @KoopaKiller 我想在区域集群中创建一个 PV,所以存在很多区域,所以当我创建 PVC 时,随机区域被分配给它们各自的 PV。所以我想在创建 PVC 时指定区域。

标签: google-kubernetes-engine gke-networking


【解决方案1】:

您似乎无法为 PV 或 PVC 指定区域,但您可以在 StorageClass 上设置 volumeBindingMode: WaitForFirstConsumer 以确保 PV 与使用它的 pod 位于同一区域。然后可以使用 pod 上的 nodeSelector 来选择区域。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ssd
parameters:
  type: pd-ssd
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: db
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 200Gi
  storageClassName: ssd

吊舱:

kind: Pod
apiVersion: v1
metadata:
  name: foo
spec:
  nodeSelector:
    failure-domain.beta.kubernetes.io/zone: us-central1-a
  containers:
    ...

【讨论】:

    【解决方案2】:

    你应该使用Regional persistent disks

    要启用区域永久性磁盘的动态配置,请使用复制类型参数创建一个 StorageClass,并在 allowedTopologies 中指定区域约束。

    例如,以下清单描述了一个名为 regionpd-storageclass 的 StorageClass,它使用标准永久性磁盘并将数据复制到 europe-west1-b 和 europe-west1-c 区域:

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: regionalpd-storageclass
    provisioner: kubernetes.io/gce-pd
    parameters:
      type: pd-standard
      replication-type: regional-pd
    volumeBindingMode: WaitForFirstConsumer
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.kubernetes.io/zone
        values:
        - europe-west1-b
        - europe-west1-c
    

    创建一个 PersistentVolumeClaim 对象,并使用 storageClassName 字段来引用您创建的 StorageClass。例如,以下清单创建了一个名为 region-pvc 的 PersistentVolumeClaim 并引用了 regionpd-storageclass

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: regional-pvc
      namespace: testns
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 200Gi
      storageClassName: regionalpd-storageclass
    

    以下清单是使用之前创建的 PersistentVolumeClaim 的示例 Pod:

    kind: Pod
    apiVersion: v1
    metadata:
      name: task-pv-pod
    spec:
      volumes:
        - name: task-pv-storage
          persistentVolumeClaim:
            claimName: regional-pvc
      containers:
        - name: task-pv-container
          image: nginx
          ports:
            - containerPort: 80
              name: "http-server"
          volumeMounts:
            - mountPath: "/usr/share/nginx/html"
              name: task-pv-storage
    

    你可以关注这个guide,告诉你如何做到这一点

    【讨论】:

    • @RuchidnyaKadam,如果我的回答解决了您的问题,请考虑通过单击复选标记接受它。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
    • 区域磁盘比区域磁盘更贵。此外,区域磁盘具有亲和力,因此它将 pod 固定到区域,这取决于需求可能是好事还是坏事。很高兴能回答原始问题。
    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    相关资源
    最近更新 更多