Carina 的根基與誕生背景|深入瞭解 Carina 系列 第一期

 

Carina 是由博雲主導併發起的雲原生本地存儲項目(GitHub 地址爲:https://github.com/carina-io/carina),目前已經進入 CNCF 全景圖。

 

Carina 旨在爲雲原生環境中的有狀態應用提供高性能、免運維的本地存儲解決方案,具體存儲卷生命週期管理、本地設備管理、智能調度等能力。Carina 作爲博雲容器雲平臺的組件之一,已經在多個金融機構的生產環境中穩定運行多年。


一、Carina 系列文章 - 前言

本篇是 Carina 系列文章的開篇,在該系列文章中我們將全面地展示本地存儲 Carina 項目的功能設計、功能使用及其實現細節等內容。在 Carina 系列文章中將包含如下章節功能(排名不分先後):Carina整體功能介紹Carina存儲卷創建及擴容Carina存儲卷掛載與擴容 、設備註冊與節點資源管理基於K8S的調度器擴展Carina自動管理Raid使用及原理分析Carina結合velero實現存儲備份恢復smart感知使用及原理基於cgroup v1和cgroup v2的設備限速基於磁盤IO的調度等等。

Carina 是基於 K8S CSI 實現的一個本地存儲插件,在本篇文章中我們將首先簡要介紹一下 Carina 項目的根基容器存儲接口(CSI),以及爲什麼我們需要本地存儲本地存儲誕生的契機,在之後我們將展示 Carina 項目架構設計等內容。

 

二、容器存儲接口(CSI)

1. CSI 是什麼

CSI 是Container Storage Interface(容器存儲接口)的簡寫,CSI 存在的目的便是定義存儲行業標準,使供應商(SP)能夠開發一個符合 CSI 標準的插件,在多容器編排系統中方便的提供存儲。

Kubernetes 將通過 CSI 接口與雲存儲廠商進行通信,進行卷的創建、掛載等管理操作,從而實現容器使用持久存儲卷的需求。

 

2. 爲什麼要有 CSI

在沒有 CSI 之前 Kubernetes 已經內置了強大的存儲插件系統,但是這樣的存儲插件是 Kubernetes 代碼的一部分,要跟隨 Kubernetes 的發佈而更新,這樣就存在一些問題,如果雲存儲廠商發現有些問題需要修復或者優化,雲存儲廠商無法及時修復而單獨發佈版本其必須與 Kubernetes 一塊發佈,這樣對於 K8S 和雲存儲廠商而言形成了相互依賴相互制約的關係,不利於雙方快速迭代,另外雲存儲廠商的代碼與 Kubernetes 代碼高度耦合在一起,還會引起安全性、可靠性問題,這增加了 Kubernetes 代碼的複雜度以及後續的維護成本等。

基於以上問題 Kubernetes 將存儲系統抽象出了一組外部存儲接口即 CSI,Kubernetes 通過 Grpc 接口與雲存儲廠商的 CSI 驅動服務進行通信,這樣一來對於雲存儲廠商來說,可以單獨發佈和部署自己的存儲插件,正常的迭代開發,無需接觸 Kubernetes 核心代碼,降低了開發的複雜度;同時對於 Kubernetes 來說,這樣不僅降低了維護成本,還能爲用戶提供更多的存儲選項。

 

3. CSI 系統架構

這是一張簡要的 CSI 系統架構圖:

 

首先 Kubernetes 官方爲 CSI 提供了一些輔助服務 external-provisionerexternal-attacherexternal-resizerexternal-snapshotternode-driver-registerlivenessprobe等,通過這些輔助組件 CSI 驅動開發者只需通過實現 CSI 接口和雲廠商存儲服務通信的內容,便可以方便的開發一個 K8S 存儲插件。

 

三、本地存儲誕生的契機

1. 中間件上雲的困境

Kubernetes CSI 插件機制日趨成熟,各個分佈式存儲服務分別開源了自己的存儲插件比如:ceph-csi、nfs-csi。這些網絡存儲插件極大地擴展了 Kubernetes 的能力,在過去幾年的 K8S 發展中起着至關重要的作用,分佈式網絡存儲系統在可擴展性、數據安全等方面有着巨大的優勢,在通用存儲領域發揮了很大的作用。但是,對於極高的 IOPS、極低延遲的數據庫等中間件領域,網絡存儲有其天然的劣勢。因此,推出一款延遲極低的開源 CSI 對數據庫類服務就至關重要。

Kubernetes 已經穩定運行數年之久,主要應用場景一直是無狀態服務以及對磁盤 IO 不敏感的業務服務,隨着客戶對雲平臺深入使用,希望一些中間件服務也能搬遷到雲上,對於中間件服務來說有各種開源的 operator 促使其在 K8S 中穩定運行,但是中間件服務對磁盤 IO 具有非常高的要求,網絡存儲服務受到很大的挑戰。

Kubernetes 集羣運行節點主要使用了 CPU、Memory 等資源,對本地磁盤並未有精細的使用,在一定程度上造成了本地資源的浪費。 

對於網絡存儲來說多個副本是一種基本功能,但是在中間件場景下,比如 Mysql 本身主從三副本,在網絡存儲下就變成了九份副本,也造成了存儲資源的冗餘。

 

2. 本地存儲需求

由上可知,我們迫切地需要一款本地存儲產品能解決上述困境,我們對該項目的需求如下,

1) 能夠提供基於本地磁盤的高性能存儲設備。

2) 符合 CSI 規範,與其他網絡存儲插件使用方式完全一致。

3) 能夠十分簡易的部署,自動管理本地磁盤,使用戶幾乎無需進行維護。

4) 提供豐富的文檔資料及運行日誌,能十分輕易的進行功能使用及異常問題排查。

5) 能夠支持存儲卷的備份恢復,支持 RAID 管理、磁盤壽命監控等。

 

四、本地存儲 Carina 設計

1. 基本的 CSI 功能

該列表展示的是一個 CSI 存儲插件的基本功能,在早期設計中 Carina 需要實現的基本功能,當然經過多輪迭代的 Carina 已經有了更豐富多元的功能:

 

2. 整體架構圖

 

共有三個組件:

Carina Controller:負責監聽 pvc 的創建,並且通知 Carina Node 創建存儲卷。

Carina Node:負責維護本地設備,並且執行創建存儲卷命令、掛載捲到容器命令等。

Carina Scheduler:K8S 調度器的擴展,增加基於本地存儲的調度插件。

 

3. 節點服務

該圖描述了 Carina Node 的工作過程,自動維護本地磁盤設備並組建存儲卷組,將節點容量信息註冊到 Kubernetes Node,Kubelet 通過 grpc 調用將存儲卷掛載到指定目錄。

 

4. 整體運行流程

 

五、過去、現在與未來

筆者在書寫這篇文章時,Carina 項目自 2020 年啓動,並於 2021 年 10 月份開源,目前已經過數輪迭代。本篇文章從標準的容器接口 CSI、談到本地存儲需求的誕生以及早期 Carina 的設計,在早期的設計中除了基本的 CSI 功能外,我們期望它能夠做到簡易部署、免運維、佔用極低的資源量等。

現在的 Carina 項目實際功能已經經過多輪版本迭代,增加了更加豐富多元的功能,比如設備多級緩存、設備限速等功能,隨着版本迭代我們也使用可配置的存儲卷代替了自動組建 SSD/HDD 卷組的功能、使用 NodeStorageResource 代替了節點註冊功能、當然還有其他更多特性開發中。

在接下來的文章中,我們將首先羅列現有的 Carina 功能,正在開發中的、已經加入開發計劃中的功能,然後再在展開逐個功能點進行詳細的使用介紹及原理分析等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章