问题描述
我已经在 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 Provisioning
和 Dynamic Provisioning
。
我将简要描述每一种类型。
Static Provisioning
使用这种方法您需要手动创建 Disk
、PersistentVolume
和 PersistentVolumeClaim
。
我已经为您创建了一个简单的例子来说明它是如何工作的。
首先我创建了磁盘,在 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
接下来我使用这个清单文件创建了 PV
和 PVC
:
---
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
应用此清单文件后,我们可以检查 PV
和 PVC
的状态:
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
可能会很有用。