1、基本知識概念
基礎概念 | 含義 |
p v | 是持久化存儲數據卷。這個 API 對象主要定義的是一個持久化存儲在宿主機上的目錄,比如一個 NFS 的掛載目錄。 |
PVC | 則是po d所希望使用的持久化存儲的屬性。比如,volume存儲的大小、可讀寫權限等等 |
容器的volume | 是將一個宿主機上的目錄,跟一個容器的目錄綁定掛載在一起 |
持久化的volume | 是這個宿主機上的目錄,具備‘持久性’ |
storageclass | 是創建p v的模板,動態創建pv |
2、用戶創建的pvc要真正被容器使用起來,就必須先和某個符合條件的pv進行綁定。
包括兩部分:
pv與PVC 的spec字段;比如,PV 的存儲(storage)大小,就必須滿足 PVC 的要求。 |
而第二個條件,則是 PV 和 PVC 的 storageClassName 字段必須一樣 |
3、創建掛載了PVC的pod
apiVersion: v1
kind: Pod
metadata:
labels:
role: web-frontend
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
volumeMounts:
- name: nfs
mountPath: "/usr/share/nginx/html"
volumes:
- name: nfs
persistentVolumeClaim:
claimName: nfs
可以看到,Pod 需要做的,就是在 volumes 字段裏聲明自己要使用的 PVC 名字。接下來,等這個 Pod 創建之後,kubelet 就會把這個 PVC 所對應的 PV,也就是一個 NFS 類型的 Volume,掛載在這個 Pod 容器內的目錄上
4、storeageclass
k8s爲我們提供了一套可以自動創建pv的機制:動態存儲
動態存儲機制工作的核心:在於一個名叫sc的api對象
s c對像的作用 就是創建p v的模版
具體地說,StorageClass 對象會定義如下兩個部分內容:
第一,PV 的屬性。比如,存儲類型、Volume 的大小等等。
第二,創建這種 PV 需要用到的存儲插件。比如,Ceph 等等。
使用sc的創建pod服務的過程:
1)創建一個 由volume的類型爲rook的s c
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: block-service
provisioner: ceph.rook.io/block
parameters:
pool: replicapool
#The value of "clusterNamespace" MUST be the same as the one in which your rook cluster exist
clusterNamespace: rook-ceph
2)在pvc裏指定要使用的SC名字即可:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: claim1
spec:
accessModes:
- ReadWriteOnce
storageClassName: block-service
resources:
requests:
storage: 30Gi
可以看到,我們創建的PVC會綁定一個kubernetes自動創建的PV
$ kubectl describe pvc claim1
Name: claim1
Namespace: default
StorageClass: block-service
Status: Bound
Volume: pvc-e5578707-c626-11e6-baf6-08002729a32b
Labels: <none>
Capacity: 30Gi
Access Modes: RWO
No Events.
通過查看這個自動創建的pv的屬性,你就可以看到它跟我們在PVC裏聲明的存儲的屬性也是一致的。
$ kubectl describe pv pvc-e5578707-c626-11e6-baf6-08002729a32b
Name: pvc-e5578707-c626-11e6-baf6-08002729a32b
Labels: <none>
StorageClass: block-service
Status: Bound
Claim: default/claim1
Reclaim Policy: Delete
Access Modes: RWO
Capacity: 30Gi
...
No events.
可查看這個自動創建的PV的sc字段的值,也是 block-service。這是因爲,Kubernetes 只會將 StorageClass 相同的 PVC 和 PV 綁定起來。