自建K8S集群使用阿里雲分佈存儲
Categories:
引言
本文寫作於 2024.06.14, 介紹如何在阿里雲的自建集群中使用阿里雲分佈存儲, 最後附上文檔連接, 其中阿里雲的官方文檔是中文, 但阿里雲存儲插件安裝在 github 上, 目前只有英文文檔, 建議有條件的讀者儘量閱讀原文.
存儲插件安裝
- 創建自定義權限策略: https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/master/docs/ram-policies/disk.json
- 創建 RAM 角色, 授予自定義權限策略, 暫存
accesskey和secretkubectl create secret -n kube-system generic csi-access-key --from-literal=id='{id}' --from-literal=secret='{secret}'
- 安裝 CSI 驅動, 沒有 helm chart, 只能本地安裝(20240613).
git clone https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver.gitcd alibaba-cloud-csi-driver/deploy- 如果是安裝在阿里雲的 ecs 上的自建集群, 可直接執行下一句, 如果不是, 請自行閱讀: https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/master/docs/install.md
helm upgrade --install alibaba-cloud-csi-driver ./chart --values chart/values-ecs.yaml --namespace kube-system
- 確認,
watch kubectl get pods -n kube-system -l app=csi-plugin
存儲類型選型參考
- ECS 雲盤創建的最小容量是 20GB, IOPS 3000, 這個容量是比較大的, 並不太划算.
- 雲盤動態存儲卷
- 官方文檔:
- 雲盤不支持跨可用區使用,為非共享存儲,且只能同時被一個 Pod 掛載。(實測可以被同一個 deployment 的多個 pod 掛載)
- 雲盤類型和 ECS 類型需要匹配才可以掛載,否則會掛載失敗。關於雲盤類型和 ECS 類型的匹配關係,請參見實例規格族。
- 在應用部署時,通過 StorageClass 自動創建 PV 購買雲盤。如果您已經購買雲盤,推薦使用雲盤靜態存儲卷。
- 申請雲盤的大小,不能超出雲盤的單盤容量範圍。
- 當 Pod 重建時,會重新掛載原雲盤。若由於其他限制無法調度到原可用區,則 Pod 將會處於 Pending 狀態。
- 動態創建的雲盤為按量付費的雲盤
- 其它測試總結:
- 雖然雲盤可以被多 pod 掛載, 但只有一個 pod 可以讀寫, 其他 pod 不能讀寫. 因此 pvc 中
accessModes只能設置為ReadWriteOnce, 修改不會得到正確結果. - 如果 StorageClass 的
reclaimPolicy設置為Delete,則刪除 PVC 時,雲盤也可以被自動刪除。 - 如果 StorageClass 的
reclaimPolicy設置為Retain,則刪除 PVC 時,雲盤不會被自動刪除,需要手動在集群和阿里雲控制台刪除。
- 雖然雲盤可以被多 pod 掛載, 但只有一個 pod 可以讀寫, 其他 pod 不能讀寫. 因此 pvc 中
- 難以找到合適使用場景.
- 官方文檔:
- 雲盤靜態存儲卷
- 官方文檔:
- 手動創建 PV 及 PVC
- 雲盤不支持跨可用區使用,為非共享存儲,且只能同時被一個 Pod 掛載。
- 雲盤類型和 ECS 類型需要匹配才可以掛載,否則會掛載失敗。
- 可以選擇與集群屬於相同地域和可用區下處於待掛載狀態的雲盤。
- 官方文檔:
- 雲盤動態存儲卷
- NAS 操作延時較大, 表現最好 2ms, 深度存儲 10ms, 按量計費, 讀寫性能相對於對象存儲 OSS 高
- OSS 存儲卷, https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/oss-volume-overview-1?spm=a2c4g.11186623.0.0.43166a351NbtvU
- OSS 為共享存儲,可以同時為多個 Pod 提供共享存儲服務。
- (20240613)目前支持 CentOS、Alibaba Cloud Linux、ContainerOS 和龍蜥操作系統。
- 使用數據卷時,每個應用使用獨立的 PV 名稱。
- OSS 數據卷是使用 ossfs 文件進行掛載的 FUSE 文件系統。
- 適合於讀文件場景。例如,讀配置文件、視頻、圖片文件等場景。
- 不適用於寫文件的應用場景。如需寫入文件,建議您使用 SDK 實現寫操作或者使用 NAS 存儲卷服務。
- ossfs 可以通過調整配置參數的方式,優化其在緩存、權限等方面的表现
- ossfs 使用限制
- 隨機或者追加寫文件操作將導致所有文件重寫。
- 因為需要遠程訪問 OSS 伺服器,list directory 等元數據操作的性能較差。
- 文件、文件夾的 rename 操作不是原子的。
- 多個客戶端掛載同一個 OSS Bucket 時,依賴用戶自行協調各個客戶端的行為,例如,避免多個客戶端寫入同一個文件等。
- 不支持硬鏈接(Hard Link)。
- CSI plugin 為 v1.20.7 以下的版本時,僅檢測本地修改,而不能檢測其他客戶端或工具的外部修改。
- 為避免系統的負載升高,請勿在高並發讀寫的場景中使用。
- 如果是混合集群(部分節點不屬於阿里雲), 則只能使用 NAS 和 OSS 靜態卷.
- 雲盤, nas 和 oss 都有其區域限制.
總結, 雲盤以硬碟整體的形式申請和掛載, 不便共享. OSS 操作顆粒度到文件, 高並發讀寫存在性能問題, 並且支持系統有限.
- 雲盤適合數據庫等需要大量空間及高性能的場景
- 其它性能要求不高的都可以選擇 NAS
- OSS 不適合阿里雲集群的高並發寫場景, 可以應用於並發讀的場景.
阿里雲的官方文檔存在位置不統一和相互矛盾的問題, 讀者需要根據文檔的日期自行判斷, 有的聲明不支持的特性隨著版本的更新可能已經支持了, 需要自行做一些嘗試.
操作步驟
這是阿里雲官方指導文檔, 按照上文指導安裝好阿里雲存儲插件後, 可以按照使用 NAS 靜態存儲卷, 進行部署測試.
注意: k3s 用戶會遇到 local-path-storage 的問題, 報錯信息可能有,
- failed to provision volume with StorageClass “local-path”: claim.Spec.Selector is not supported
- Waiting for a volume to be created either by the external provisioner ’localplugin.csi.alibabacloud.com’ or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.
需要將persistentVolumeClaim的storageClassName設置為空, 避免使用 k3s 默認的 local-path-storage.
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-nas
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
selector:
matchLabels:
alicloud-pvname: pv-nas
storageClassName: ""
參考
- https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver
- https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/master/docs/disk.md
- https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/master/docs/install.md
- https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/master/docs/ram-policies/disk.json
- https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/master/deploy/chart/values.yaml
- https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/use-dynamically-provisioned-disk-volumes?#6d16e8a415nie
- https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/mount-statically-provisioned-nas-volumes?spm=a2c4g.11186623.0.0.125672b9VnrKw6