K8S基本操作-46-關於儲存與 Volume
K8S 使用的儲存與網路介面
K8S 提供了三種開放的接口規範,分別是 CRI、CNI 和 CSI,用於對接不同的後端,實現計算、網路和存儲資源的管理。
只要符合這些 Interface 規範,就可以撰寫自己的 Plugin 與 Driver 來為 K8S 來進行儲存與其他操作。
這些 Interface 普遍使用 RPC 來進行交互。
CRI
CRI 是 Container Runtime Interface 的縮寫,它是容器運行時接口,用於提供計算資源。CRI 定義了容器和鏡像的服務接口,讓 K8S 可以與不同的容器運行時(如 Docker、containerd、CRI-O 等)進行通訊和協作。
CNI
CNI 是 Container Network Interface 的縮寫,它是容器網路接口,用於提供網路資源。CNI 定義了一組標準的網路操作,讓 K8S 可以與不同的網路插件(如 Calico、Flannel、Weave Net 等)進行通訊和協作。
CSI
CSI 是 Container Storage Interface 的縮寫,它是容器存儲接口,用於提供存儲資源。CSI 定義了一組標準的存儲操作,讓 K8S 可以與不同的存儲插件(如 Ceph、GlusterFS、EBS 等)進行通訊和協作。
Persistent Volume
K8S Volume 是 Kubernetes 提供的一種存儲抽象,可以將不同類型的存儲資源掛載到容器的文件系統中。K8S Volume 的功能是解決容器中的磁盤文件的非持久化和共享問題。K8S Volume 可以在容器的生命週期之外保留和訪問數據,也可以讓 Pod 中的多個容器共用同一個 Volume。K8S Volume 的類型有很多,例如 emptyDir、hostPath、nfs、awsElasticBlockStore、azureDisk、Ceph、Flocker、Scaleio 等,每種類型的 Volume 有不同的實現方式和特性。
本地的 Volume
在以下的YAML中,我們在 /opt 中掛載了一個 Volume。
apiVersion: v1
kind: Pod
metadata:
name: random-number-generator
spec:
containers:
- image: alpine
name: alpine
command: ["/bin/sh","-c"]
args: ["shuf -i 0-100 -n 1 >> /opt/number.out;"]
volumes:
- name: data-volume
hostPath:
path: /data
type: Directory
這段就是一個本地 Volume 的部分:
volumes:
- name: data-volume
hostPath:
path: /data
type: Directory
遠端 Volume
我們也可以改成 AWS EBS 上的 Volume:
volumes:
- name: data-volume
awsElasticBlockStore:
volumeID: <AWS volume ID>
fsType: ext4
節點存取模式
這是個 Volume 的定義檔案:
apiVersion:
kind: PersistentVolume
metadata:
name: pv-vol1
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
awsElasticBlockStore:
volumeID: <volume-id>
fsType: ext4
其中這段標註了 Access Modes。
Access Modes 是指 Volume 支持的被節點 (nodes) 掛載的方式。有三種模式:
-
ReadOnlyMany: PV 可以被多個節點以只讀的方式掛載。
-
ReadWriteOnce: PV 可以被一個節點以讀寫的方式掛載。
-
ReadWriteMany: PV 可以被多個節點以讀寫的方式掛載。
取得現在有多少 Volume 存在
kubectl get persistentvolume
Persistent Volume Claims
K8S Persistent Volume Claims (PVC) 是一種用戶對存儲資源的請求,可以 YAML 檔案定義。
例如: 不用特別指定某個 Volume ,只要指出"我需要一個 100 GB 的 Volume" 即可自動找到某個 Volume 掛載上去。
可以請求的選項有:
- Sufficient Capacity (指定容量)
- Access Modes
- Volume Modes
- Storage Class
- Selector (指定Label)
Persistent Volume Claims 範例1
以下指定了一個 500 Mi 的 Volume 需求,並且存取模式採用 ReadWriteOnce 。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
Persistent Volume Claims 指令
列出 Persistent Volume Claims:
kubectl get persistentvolumeclaim
刪除 Persistent Volume Claims:
kubectl delete persistentvolumeclaim myclaim
Persistent Volume Reclaim Policy
指定當刪除掉 Persistent Volume Claim 時,對 Volume 進行的操作:
persistentVolumeReclaimPolicy: Retain
可選的有:
- Delete: 刪除 Volume
- Recycle: 重複使用 Volume,但會清除其中資料,不建議使用。
- Retain: 保留數據,並且其他的 Pod 不可使用與覆蓋。