【问题标题】:What Persistent Volume storage solutions I can use when I run my Kubernetes cluster on GCP?在 GCP 上运行 Kubernetes 集群时可以使用哪些持久卷存储解决方案?
【发布时间】:2021-04-25 12:51:18
【问题描述】:

我已在 GCP 计算引擎上部署了我的 Kubernetes 集群,并拥有 3 个主节点和 3 个工作节点(它不是 GKE 集群)。谁能建议我可以为我的集群使用哪些存储选项?如果我在 GCP 上创建一个虚拟磁盘,我可以将该磁盘用作持久存储吗?

【问题讨论】:

  • 您有什么要求?你需要在同一个存储上同时读写吗?
  • @guillaumeblaquiere,我的 pod 很少,我需要将每个 pod 的数据分别存储在磁盘中,彼此分开。你会推荐什么选项?

标签: kubernetes google-cloud-platform persistent-storage


【解决方案1】:

有两种类型的配置持久卷: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 可能会很有用。

【讨论】:

  • 我遵循了您在动态配置中提到的相同步骤。但是当我检查 PVC 的状态时,它处于挂起状态。以下是我得到的错误。
  • 无法使用 StorageClass "ssd" 配置卷:无法获取 GCE GCECloudProvider 并出现错误
  • @Dusty 您可能没有将 GCE 配置为云提供商。请按照此answer 中的步骤操作
  • 他们在那里编辑了 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 文件。但是当我检查我的集群时,我在这个位置没有文件。请帮忙
  • 您是否使用 kubeadm 部署了 k8s?您使用哪个 Linux 发行版?
【解决方案2】:

您可以使用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

【讨论】:

  • 如果我继续这个解决方案,我需要编辑 kubernetes 配置吗?指定云提供商之类的?
  • @Dusty 是的,我认为您必须为每个实例配置 IAM(基本上设置一个具有足够存储权限的服务帐户).. 而且由于您在 GKE 之外工作,您应该配置 @987654326 @ to GCE 在配置中
  • 我应该在哪里提供 cloud-provider 参数?
  • 试试this commit diff,也许吧? (我没有做这个配置的经验,抱歉)
  • 它正在工作。由于我在 GKE 外部运行集群,我们需要在 api 和 contoller-manager conf 文件中专门提供 --cloud-provider=gce 参数。并重新启动 kubelet。顺便说一句,感谢您的支持。
猜你喜欢
  • 1970-01-01
  • 2019-07-13
  • 2018-07-01
  • 2018-03-21
  • 2019-03-29
  • 2019-08-11
  • 2010-11-06
  • 2018-07-26
  • 2017-12-18
相关资源
最近更新 更多