在 GCP 上运行 Kubernetes 集群时可以使用哪些持久卷存储解决方案? Static ProvisioningDynamic Provisioning

问题描述

我已经在 GCP Compute Engines 上部署了我的 Kubernetes 集群,并且有 3 个主节点和 3 个工作节点(它不是 GKE 集群)。有人可以建议我可以为我的集群使用哪些存储选项吗?如果我在 GCP 上创建了一个虚拟磁盘,我可以将该磁盘用作永久性存储吗?

解决方法

您可以使用 GCE Persistent Disk Storage Class

以下是创建存储类的方法:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ssd
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd

然后您执行以下操作来创建 PV 和 PVC 并附加到您的 Pod。

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: gce-claim
spec:
 accessModes:
   - ReadWriteOnce
 storageClassName: ssd
 resources:
   requests:
     storage: 10Gi
---
apiVersion: v1
kind: Pod
metadata:
 name: webserver-pd
spec:
 containers:
 - image: httpd
   name: webserver
   volumeMounts:
   - mountPath: /data
     name: dynamic-volume
 volumes:
 - name: dynamic-volume
   persistentVolumeClaim:
     claimName: gce-claim

示例取自 this blog post

,

有两种类型的配置持久卷:Static ProvisioningDynamic Provisioning
我将简要描述每一种类型。

Static Provisioning

使用这种方法您需要手动创建 DiskPersistentVolumePersistentVolumeClaim。 我已经为您创建了一个简单的例子来说明它是如何工作的。

首先我创建了磁盘,在 GCP 上我们可以使用 gcloud 命令:

$ gcloud compute disks create --size 10GB --region europe-west3-c test-disk
NAME       ZONE            SIZE_GB  TYPE         STATUS
test-disk  europe-west3-c  10       pd-standard  READY 

接下来我使用这个清单文件创建了 PVPVC

--- 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-test
spec:
  accessModes:
    - ReadWriteOnce  
  capacity:
    storage: 10Gi
  gcePersistentDisk:
    pdName: test-disk # This GCE PD must already exist.
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: claim-test
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  

应用此清单文件后,我们可以检查 PVPVC 的状态:

root@km:~# kubectl get pv,pvc
NAME                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE
persistentvolume/pv-test   10Gi       RWO            Retain           Bound    default/claim-test                           12m

NAME                               STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/claim-test   Bound    pv-test   10Gi       RWO                           12m

最后我用上面的声明作为音量:

apiVersion: v1
kind: Pod
metadata:
  name: web
spec:
  containers:
    - name: web
      image: nginx
      volumeMounts:
      - mountPath: "/usr/share/nginx"
        name: vol-test
  volumes:
    - name: vol-test
      persistentVolumeClaim:
        claimName: claim-test

我们可以检查创建的 Pod 以检查它是否按预期工作:

root@km:~# kubectl exec -it web -- bash
root@web:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sdb        9.8G   37M  9.8G   1% /usr/share/nginx
...

Dynamic Provisioning

在这种情况下,卷会在应用程序需要时自动提供。 首先,您需要创建 StorageClass 对象来定义供应商,例如kubernetes.io/gce-pd
我们不再需要创建 PersistenVolume,它是由 StorageClass 自动为我们创建的。
我还为你创建了一个简单的例子来说明它是如何工作的。

首先我创建了 StorageClass 作为默认存储类:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  fstype: ext4

然后是 PVC(与前面的示例相同) - 但在本例中 PV 是自动创建的:

root@km:~# kubectl get pv,pvc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE
persistentvolume/pvc-8dcd69f1-7081-45a7-8424-cc02e61a4976   10Gi       RWO            Delete           Bound    default/claim-test   standard                3m10s

NAME                               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/claim-test   Bound    pvc-8dcd69f1-7081-45a7-8424-cc02e61a4976   10Gi       RWO            standard       3m12s

在更高级的情况下,使用不同的 persistent disks types 创建多个 StorageClasses 可能会很有用。