Longhorn項目是Rancher Labs推出的開源的基於雲和容器部署的分佈式塊存儲新方式。Longhorn遵循微服務的原則,利用容器將小型獨立組件構建爲分佈式塊存儲,並使用容器編排來協調這些組件,造成彈性分佈式系統。前端
自2017年4月Longhorn項目發佈以來,人們對在Kubernetes集羣上運行Longhorn存儲就產生了極大的興趣。近日,Longhorn v0.2版本發佈了,它可支持任何Kubernetes集羣的持久化存儲實現!node
現在,基於雲和容器的部署規模日益擴大,分佈式塊存儲系統也正變得愈來愈複雜,單個存儲控制器上的volume數量在不斷增長。2000年代初,存儲控制器上的volume數量只有幾十個,但現代雲環境卻須要數萬到數百萬的分佈式塊存儲卷。存儲控制器變成了高度複雜的分佈式系統。nginx
分佈式塊存儲自己比其餘形式的分佈式存儲(如文件系統)更簡單。不管系統中有多少volume,每一個volume只能由單個主機進行裝載。正因如此,咱們設想,是否能夠將大型塊存儲控制器分割成多個較小的存儲控制器?若想要如此分割,咱們須要保證這些volume仍然是從公共磁盤池構建的,而且咱們須要有辦法來編排這些存儲控制器,讓它們能夠協同工做。git
爲了將這一想法發揮到極限,咱們建立了Longhorn項目。這是一個咱們認爲值得探索的方向,每一個控制器上只有一個volume,這將大大簡化存儲控制器的設計。由於控制器軟件的故障域僅限於單個volume,因此控制器若崩潰,也只會影響一個volume。github
Longhorn充分利用了近年來關於如何編排大量的容器和虛擬機的核心技術。例如,Longhorn並無構建一個能夠擴展到100,000個volume的高度複雜的控制器,而是出於讓存儲控制器簡單輕便的考慮,建立了100,000個單獨的控制器。而後,咱們能夠利用像Swarm、Mesos和Kubernetes這樣的最早進的編排系統來調度這些獨立的控制器,共享一組磁盤中的資源,協同工做,造成一個彈性的分佈式塊存儲系統。api
Longhorn基於微服務的設計還有不少其餘優點。由於每一個volume都有本身的控制器,在升級每一個volume的控制器和replica容器時,是不會致使IO操做明顯的中斷的。 Longhorn能夠建立一個長期運行的工做來編排全部live volume的升級,同時確保不會中斷系統正在進行的操做。爲確保升級不會致使意外的問題,Longhorn能夠選擇升級一小部分volume,並在升級過程當中出現問題時回滾到舊版本。這些作法在現代微服務應用中已獲得普遍應用,但在存儲系統中並不常見。咱們但願Longhorn能夠助力於微服務在存儲領域的更多應用。服務器
Longhorn v0.2 支持任何Kubernetes集羣的持久性存儲。一旦被部署到Kubernetes集羣上,Longhorn會自動地將Kubernetes集羣中全部節點上所有可用的本地存儲聚爲集羣,產生複製的以及分佈式的塊存儲。你能夠在Longhorn volume上執行快照和備份操做,並將它們同步複製到多個節點上。微信
咱們已經移植了Longhorn Manager做爲Kubernetes Controller。全部Longhorn狀態都存儲爲Custom Resource Definitions(自定義資源定義,CRD)。Longhorn也不須要單獨的etcd服務器。另外,Longhorn Manager公開了執行Longhorn volume操做和快照 / 備份操做的API,這些API將在Longhorn UI和Kubernetes Flexvolume驅動程序執行操做的過程當中使用。網絡
運行下面的這條指令,就能夠在你的Kubernetes集羣上部署整個Longhorn存儲系統:分佈式
kubectl create -f https://raw.githubusercontent.com/rancher/longhorn/v0.2/deploy/longhorn.yaml
若是你使用的是GKE,請參考這裏:https://github.com/rancher/lo...
部署以後,你能夠在UI界面經過查看Kubernetes服務找到適合的IP:kubectl -n longhorn-system get svc
如今你可使用 100.200.200.123 或經過 <node_ip>:12345 訪問UI。
Longhorn提供了Kubernetes的徹底集成。
你能夠像下面這樣經過Longhorn用卷備份建立一個pod:
apiVersion: v1 kind: Pod metadata: name: volume-test namespace: default spec: containers: - name: volume-test image: nginx:stable-alpine imagePullPolicy: IfNotPresent volumeMounts: - name: voll mountPath: /data ports: - containerPort: 80 volumes: - name: voll flexVolume: driver: "rancher.io/longhorn" fsType: "ext4" options: size: "2Gi" numberOfReplicas: "3" staleReplicaTimeout: "20" fromBackup: ""
Longhorn還支持動態的provisioner。好比,你能夠在Kubernetes像這樣定義一個StorageClass:
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: longhorn provisioner: rancher.io/longhorn parameters: numberOfReplicas: "3" staleReplicaTimeout: "30" fromBackup: ""
接着建立一個PVC(PersistentVolumeClaim)並在Pod中使用它:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: longhorn-volv-pvc spec: accessModes: - ReadWriteOnce storageClassName: longhorn resources: requests: storage: 2Gi --- apiVersion: v1 kind: Pod metadata: name: volume-test namespace: default spec: containers: - name: volume-test image: nginx:stable-alpine imagePullPolicy: IfNotPresent volumeMounts: - name: volv mountPath: /data ports: - containerPort: 80 volumes: - name: volv persistentVolumeClaim: claimName: longhorn-volv-pvc
始終秉承開源理念的Rancher Labs,推出的Longhorn依然是100%的開源軟件。您能夠在GitHub上下載Longhorn:
https://github.com/rancher/lo...
直到今日,Longhorn依然在持續不斷的優化更新之中。歡迎在GitHub上或Rancher微信羣中爲Rancher團隊提供寶貴的意見與反饋❤️
微信號:RancherLabs