本頁面說明如何使用已填入資料的現有永久磁碟建立 PersistentVolume,以及如何在 Pod 中使用 PersistentVolume。
總覽
使用現有永久磁碟的常見情境有兩種。
- 手動建立 PersistentVolumeClaim 和 PersistentVolume,將兩者繫結在一起,並在 Pod 規格中參照 PersistentVolumeClaim。
- 使用 StatefulSet 自動產生 PersistentVolumeClaim,並繫結至手動產生的 PersistentVolume,這些 PersistentVolume 對應一系列既有的永久磁碟。
本頁面的範例使用現有的 Compute Engine 永久磁碟。
ext4 是預設的檔案系統類型,但只要節點映像檔支援,您也可以使用具有 xfs 檔案系統的現有永久磁碟。如要使用 xfs 磁碟,請在 PersistentVolume 資訊清單中將 spec.csi.fsType 變更為 xfs。
Windows 不支援 ext4 檔案系統類型。您必須使用 Windows Server 節點集區的 NTFS 檔案系統。如要使用 NTFS 磁碟,請在 PersistentVolume 資訊清單中將 spec.csi.fsType 變更為 NTFS。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
- 確認您有現有的永久磁碟。如要佈建磁碟,請參閱「佈建地區永久磁碟」。
- 確認叢集使用 Compute Engine 永久磁碟 CSI 驅動程式。
使用繫結至 PersistentVolume 的 PersistentVolumeClaim
如要讓容器存取現有的永久磁碟,請完成下列步驟:
- 將現有的永久磁碟佈建為 PersistentVolume。
- 將 PersistentVolume 繫結至 PersistentVolumeClaim。
- 讓 Pod 中的容器存取 PersistentVolume。
建立 PersistentVolume 和 PersistentVolumeClaim
您可以透過幾種方式,將 PersistentVolumeClaim 繫結至特定 PersistentVolume。舉例來說,下列 YAML 資訊清單會建立新的 PersistentVolume 和 PersistentVolumeClaim,然後使用 PersistentVolume 上定義的 claimRef,將磁碟區繫結至要求。
如要將 PersistentVolume 繫結至 PersistentVolumeClaim,這兩項資源的storageClassName必須相符,capacity、accessModes 和 volumeMode 也必須相符。您可以省略 storageClassName,但必須指定 "",避免 Kubernetes 使用預設的 StorageClass。
storageClassName 不一定要參照現有的 StorageClass 物件。如果您只需要將聲明繫結至磁碟區,可以使用任何名稱。不過,如果您需要 StorageClass 設定的額外功能 (例如調整磁碟區大小),則 storageClassName 必須參照現有的 StorageClass 物件。
詳情請參閱 Kubernetes 說明文件中的 PersistentVolumes。
儲存下列 YAML 資訊清單:
apiVersion: v1 kind: PersistentVolume metadata: name: PV_NAME spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK_SIZE accessModes: - ReadWriteOnce claimRef: name: PV_CLAIM_NAME namespace: default csi: driver: pd.csi.storage.gke.io volumeHandle: DISK_ID fsType: FS_TYPE --- apiVersion: v1 kind: PersistentVolumeClaim metadata: namespace: default name: PV_CLAIM_NAME spec: storageClassName: "STORAGE_CLASS_NAME" accessModes: - ReadWriteOnce resources: requests: storage: DISK_SIZE更改下列內容:
PV_NAME:新 PersistentVolume 的名稱。STORAGE_CLASS_NAME:新 StorageClass 的名稱。DISK_SIZE:現有永久磁碟的大小。例如:500G。PV_CLAIM_NAME:新 PersistentVolumeClaim 的名稱。DISK_ID:現有永久磁碟的 ID。格式為區域永久磁碟的projects/{project_id}/zones/{zone_name}/disks/{disk_name},或地區永久磁碟的projects/{project_id}/regions/{region_name}/disks/{disk_name}。FS_TYPE:檔案系統類型。您可以保留預設值 (ext4),或使用xfs。 如果叢集使用 Windows Server 節點集區,您必須將此值變更為NTFS。
如要套用設定並建立 PersistentVolume 和 PersistentVolumeClaim 資源,請執行下列指令:
kubectl apply -f FILE_PATH將
FILE_PATH替換為 YAML 檔案的路徑。
在 Pod 中使用 PersistentVolume
建立並繫結 PersistentVolume 和 PersistentVolumeClaim 後,您可以在 volumeMounts 欄位中指定值,讓 Pod 的容器存取磁碟區。
下列 YAML 設定會建立新的 Pod 和執行 nginx 映像檔的容器,然後將 PersistentVolume 掛接至 Pod:
kind: Pod
apiVersion: v1
metadata:
name: POD_NAME
spec:
volumes:
- name: VOLUME_NAME
persistentVolumeClaim:
claimName: PV_CLAIM_NAME
containers:
- name: CONTAINER_NAME
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: VOLUME_NAME
更改下列內容:
POD_NAME:新 Pod 的名稱。VOLUME_NAME:磁碟區名稱。PV_CLAIM_NAME:您在上一個步驟中建立的 PersistentVolumeClaim 名稱。CONTAINER_NAME:新容器的名稱。
套用設定:
kubectl apply -f FILE_PATH
將 FILE_PATH 替換為 YAML 檔案的路徑。
如要確認磁碟區已掛接,請執行下列指令:
kubectl describe pods POD_NAME
在輸出內容中,確認 PersistentVolumeClaim 已掛接:
...
Volumes:
VOLUME_NAME:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: PV_CLAIM_NAME
ReadOnly: false
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 29s default-scheduler Successfully assigned default/POD_NAME to gke-cluster-1-default-pool-d5cde866-o4g4
Normal SuccessfulAttachVolume 21s attachdetach-controller AttachVolume.Attach succeeded for volume "PV_NAME"
Normal Pulling 19s kubelet Pulling image "nginx"
Normal Pulled 19s kubelet Successfully pulled image "nginx"
Normal Created 18s kubelet Created container CONTAINER_NAME
Normal Started 18s kubelet Started container CONTAINER_NAME
在 StatefulSet 中使用現有磁碟
您可以使用 PersistentVolumes,在 StatefulSet 中使用既有的 Compute Engine 永久磁碟。StatefulSet 會自動為每個副本產生 PersistentVolumeClaim。您可以預測產生的 PersistentVolumeClaim 名稱,並使用 claimRef 將這些名稱繫結至 PersistentVolume。
在下列範例中,您會使用兩個現有的永久磁碟、建立 PersistentVolumes 來使用這些磁碟,然後在預設命名空間中,將磁碟區掛接至具有兩個副本的 StatefulSet。
- 決定新 StatefulSet 的名稱、PersistentVolumeClaim 範本的名稱,以及 StatefulSet 中的副本數量。
找出自動產生的 PersistentVolumeClaim 名稱。StatefulSet 會使用下列格式做為 PersistentVolumeClaim 名稱:
PVC_TEMPLATE_NAME-STATEFULSET_NAME-REPLICA_INDEX更改下列內容:
PVC_TEMPLATE_NAME:新 PersistentVolumeClaim 範本的名稱。STATEFULSET_NAME:新 StatefulSet 的名稱。REPLICA_INDEX:StatefulSet 副本的索引。本範例使用的是0和1。
建立 PersistentVolume。您必須為 StatefulSet 中的每個副本建立 PersistentVolume。
儲存下列 YAML 資訊清單:
apiVersion: v1 kind: PersistentVolume metadata: name: pv-ss-demo-0 spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK1_SIZE accessModes: - ReadWriteOnce claimRef: namespace: default name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 csi: driver: pd.csi.storage.gke.io volumeHandle: DISK1_ID fsType: FS_TYPE --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-ss-demo-1 spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK2_SIZE accessModes: - ReadWriteOnce claimRef: namespace: default name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-1 csi: driver: pd.csi.storage.gke.io volumeHandle: DISK2_ID fsType: FS_TYPE更改下列內容:
DISK1_SIZE and DISK2_SIZE:現有永久磁碟的大小。DISK1_ID and DISK2_ID:現有永久磁碟的 ID。PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 and PVC_TEMPLATE_NAME-STATEFULSET_NAME-1:自動產生的 PersistentVolumeClaim 名稱,格式如上一步所述。STORAGE_CLASS_NAME:StorageClass 的名稱。
套用設定:
kubectl apply -f FILE_PATH將
FILE_PATH替換為 YAML 檔案的路徑。
使用您在步驟 1 中選擇的值建立 StatefulSet。請確認您在
volumeClaimTemplates中指定的儲存空間小於或等於 PersistentVolumes 的總容量。儲存下列 YAML 資訊清單:
apiVersion: apps/v1 kind: StatefulSet metadata: name: STATEFULSET_NAME spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 2 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: PVC_TEMPLATE_NAME mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: PVC_TEMPLATE_NAME spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "STORAGE_CLASS_NAME" resources: requests: storage: 100Gi更改下列內容:
STATEFULSET_NAME:新 StatefulSet 的名稱。PVC_TEMPLATE_NAME:新 PersistentVolumeClaim 範本的名稱。STORAGE_CLASS_NAME:StorageClass 的名稱。
套用設定:
kubectl apply -f FILE_PATH將
FILE_PATH替換為 YAML 檔案的路徑。