本頁面說明如何使用已填入資料的現有永久磁碟建立 PersistentVolume,以及如何在 Pod 中使用 PersistentVolume。
總覽
使用現有永久磁碟的常見情境有兩種。
- 手動建立 PersistentVolumeClaim 和 PersistentVolume,將兩者繫結在一起,並在 Pod 規格中參照 PersistentVolumeClaim。
- 使用 StatefulSet 自動產生 PersistentVolumeClaim,並繫結至手動產生的 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
,取得最新版本。
- 確認您有現有的永久磁碟。如要佈建磁碟,請參閱「佈建地區永久磁碟」。
- 確認叢集使用 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 檔案的路徑。