“ 根本不存在無狀态化的架構
There is no such thing as a stateless architecture ”
– Jonas Boner
Lightbend創始人兼CTO ,Akka作者
應用程式需要資料, IT方案被創造出來是為了解決商業業務資料的問題。
容器問世之時,它最初的目的是應對無狀态化服務。随着容器技術的成熟,越來越多的人希望容器化應用可以直接關聯資料。不論是傳統的還是新型應用,都需要存儲,如檔案、塊、對象存儲的形式,通過文檔、關系型資料庫或者流媒體等等。
虛拟化技術的 hypervisor 虛拟機器螢幕在硬體模拟層上有很多要求,而比起虛拟化技術,容器将應用的可移植性大大提升。應用程式的可移植性,依賴于容器編排系統的互操作性。但是,需要看到的是即使是現代化的雲原生應用,存儲也是不可缺少的關鍵子產品,因為有了持久化存儲,應用程式就可以基于此開發出很多功能。
容器編排系統和運作時通過特定請求來接通存儲服務,如 Creat / Remove, Inspect / List, Attach / Detach, Mount / Unmount等。目前看來,業界都是在通過容器編排系統解決存儲問題,能否實作此點也成為了工業界的分水嶺。
通過 API 方式連結外部存儲服務有兩種方式:第一種是 in-tree 驅動,由在容器編排系統内部的原生化代碼實作;第二種 out-of-tree驅動,由插件實作。前者受制于容器編排系統的釋出周期,而後者可能無法提供容器編排系統配套的加強功能。
Docker率先嘗試通過 out-of-tree模式解決了如何與外部存儲協同的問題,在 1.7 Experimental 版本中建立了Docker Volume Driver接口。
而 Kubernetes 則提供 in-tree 和 out-of-tree兩種模式。
In-tree是 Kubernetes 标準版的一部分,已經寫入 Kubernetes 代碼中。通過基于 Kubernetes 内置 interface 的API指令如 Mount / Unmount, Creat / Delete等進行存儲平台的操作。Kuberentes 會在
pod 建立時進行所有相關的必要操作,并且找到相關驅動執行特定 API 背後的所需動作。使用者可以充分發揮 Kubernetes 中動态配置和存儲類等新特性。唯一的缺點就是,如果存儲平台需要 bug 修複或者功能添加的話,需要等待 Kubernetes 的釋出周期。一般而言,Kubernetes 的釋出周期在3-6個月,這意味着 bug 修複或者持續更新并不能随心所欲。
Out-of-tree 是通過 Flexvolume 接口實作的,Flexvolume 可以使得使用者在 Kubernetes 内自己編寫驅動或添加自有資料卷的支援。第三方驅動通過資料卷插件路徑安裝在每個 Kubelet 和 master 節點。這使得存儲驅動可以與 Kubernetes 核心代碼獨立開來,bug 修複和功能更新都不需要等待 Kubernetes 的日程計劃。Flexvolume 接口設定認為資料卷的建立和删除都是發生在其外部,是以隻有 Attach / Detach 和 Mount / Unmount操作可行,并且也不是在資料卷的全部生命周期可行。
阿裡雲容器服務全球首批通過 Kubernetes 一緻性認證,使用者可以通過 in-tree 形式挂載存儲。
而對于 out-of-tree,阿裡雲容器服務支援 Kubernetes Pod 自動綁定阿裡雲雲盤、NAS、OSS存儲服務。目前對于靜态存儲卷和動态存儲卷的支援情況如下:
操作指南:
<a href="https://help.aliyun.com/document_detail/63955.html">使用阿裡雲雲盤</a>
<a href="https://help.aliyun.com/document_detail/63956.html">使用阿裡雲 NAS</a>
<a href="https://help.aliyun.com/document_detail/63957.html">使用阿裡雲 OSS</a>
在使用容器過程中,你可能會在日志、資料備份、配置資訊等場景中需要用到存儲,不如按照上述辦法嘗試下吧? 對了,你也可以使用日志服務來應對日志的問題哦!
<a href="https://yq.aliyun.com/articles/459462">全面提升,阿裡雲 Docker / Kubernetes(K8S) 日志解決方案與選型對比</a>
<a href="https://blog.thecodeteam.com/2017/06/27/container-storage-architectures-kubernetes-docker-mesos-compare/">Container Storage Architectures: How Does Kubernetes, Docker, and Mesos Compare?</a>