目前 Google Cloud 支持 Regional Disk,当 Zone 出现故障时, GKE 的pod在另外一个zone部署时,会自动挂载 Regional Disk 。这样使得 GKE 的可靠性更高。如下图:

本文将介绍如何实现 GKE 上挂载 Region Persistent Disk。
一 创建两个 zone 的 GKE Cluster
通过gcloud命令行:
CLUSTER_VERSION=$(gcloud beta container get-server-config --region us-west1 --format=‘value(validMasterVersions[0])’)
export CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false
gcloud beta container clusters create hw-rg-pd
–cluster-version=${CLUSTER_VERSION}
–machine-type=n1-standard-1
–region=us-west1
–num-nodes=1
–node-locations=us-west1-b,us-west1-c
–network=hw-mic-text
–subnetwork=vlan5
通过命令行查看创建的 Cluster:

二 创建 Regional Disk
在Compute Engine中选择 Disks:

点击 create disk:

按如下参数创建 Persistent Disk:

三 创建 Storage Class
首先要创建支持多 zone 的 Storage Class。编辑yaml文件:
vim gke-rg-pd-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: rg-pd-sc
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
replication-type: regional-pd
zones: us-west1-b, us-west1-c
通过 kubectl apply -f gke-rg-pd-sc.yaml 创建 StorageClass。

可以看到,这个 StorageClass 支持多个 Zone。
四 MANUAL PROVISIONING
1 创建 PersistentVolume
编辑 yaml 文件:
vim gke-rg-pd-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: rg-pd-pv
labels:
failure-domain.beta.kubernetes.io/zone: us-west1-b__us-west1-c
spec:
storageClassName: rg-pd-sc
capacity:
storage: 200Gi
accessModes:
- ReadWriteOnce
gcePersistentDisk:
pdName: hw-gke-pv-04
fsType: ext4
通过kubectl apply -f gke-rg-pd-pv.yaml创建PV。
查看创建情况:

2 创建 PersistentVolumeClaim
编辑 yaml 文件:
vim gke-rg-pd-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rg-pd-pvc
spec:
storageClassName: rg-pd-sc
volumeName: rg-pd-pv
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 200G
通过 kubectl apply -f gke-rg-pd-pvc.yaml 创建 PV。
查看创建情况:

这样 pd、sc、pv、pvc 都关联起来了。
五 DYNAMIC PROVISIONING
这种模式下,在创建Pod时,系统会自动创建 Regional Persistent Disk。
1 创建 PersistentVolumeClaim
编辑 PVC的yaml文件:
vim rg-pd-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rgpdpvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 200Gi
storageClassName: rg-pd-sc
通过 kubectl apply -f rg-pd-pvc.yaml 创建这个 PVC。
六 创建 volume 基于 regional disk 的 pod
编辑 pod 的 yaml 文件:
vim gke-rg-pd-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: rg-pd-pod
spec:
containers:
- image: nginx
name: rg-pd-container
volumeMounts:
- mountPath: /usr/share/nginx/html
name: rg-pd-volume
volumes:
- name: rg-pd-volume
persistentVolumeClaim:
claimName: rg-pd-pvc
通过 kubectl apply -f gke-rg-pd-pod.yaml 创建 pod.
查看 pod 的情况:kubectl describe pods/rg-pd-pod,可以看到最后部分的 Volume 一句 Attach 成功:

Pod运行正常:

可以看到 pod 挂载了200G的 disk:

创建 index.html文件:

七 创建 volume 基于 regional disk 的 deployment
删除 pod,创建 deployment:
vim gke-rg-pd-dplymt.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: rg-pd-dplymt
spec:
replicas: 1
template:
metadata:
labels:
service: nginx
app: nginx
spec:
containers:
- image: nginx
name: rg-pd-container
volumeMounts:
- mountPath: /usr/share/nginx/html
name: rg-pd-volume
volumes:
- name: rg-pd-volume
persistentVolumeClaim:
claimName: rg-pd-pvc

文章版权归作者所有,未经许可不得转载。
文章信息
相关推荐
