天天看點

在Docker裡運作Ceph

本文講的是<b>在Docker裡運作Ceph</b>,【編者的話】Ceph是開源社群深受歡迎的存儲方案,具有穩定性高、性能好、可擴充性強等特點。原作者的這篇文章展示并探讨了如何将Ceph運作在Docker上,無疑為Docker生态系統的完善邁出了重要一步。存儲問題是将Docker應用于生産環境中的備受關注的話題之一,這篇文章抛磚引玉,必将激發廣大開源和Docker技術愛好者探究現有存儲方案與Docker相整合的熱情。

現在讓我們具體看看如何将Ceph運作在Docker裡!

将Ceph運作在Docker中是一個比較有争議的話題,不少人質疑這樣操作的意義。雖然将檢測子產品、metadata伺服器、以及RADOS gateway容器化都沒有太大問題,但對于OSD(object storage daemon),事情會變得很棘手。Ceph的OSD專門針對實體機器進行優化,與底層硬體有很多關聯。如果實體硬碟失效,OSD也無法運作,這給容器化的場景帶來了問題。

坦白地講,在過去某個時刻我也在想:

“我不知道自己為什麼做這個,我隻知道有人需要這個功能(當然,他們可能也不知道為什麼想要)。我隻是覺得想進行技術嘗試,那就試試看!”

當然上述想法聽起來并不樂觀,但這确實是我當時真實的想法。我的觀點随後有了一些變化,我來解釋下為什麼是值得的。希望這個解釋也能改變你的看法(我的解釋不僅僅是“Docker很酷,是以我們要把所有東西都跑在Docker裡!”)。

不少開發者已經花了很多時間将他們的軟體容器化。在這個過程中,他們也用過多種不同的工具來建構和管理他們的環境。如果我看到有人用Kubernetes來作為管理工具也一點都不會吃驚。有的人就喜歡将最新潮的技術應用到生産當中,否則他們會覺得工作很無聊。是以當他們看到自己最喜歡的開源存儲方案也正在被容器化時,他們會因為這個順應了“一切容器化”的方式而感到高興。

與傳統的<code>yum</code>或<code>apt-get</code>不同,容器使得軟體的更新和回卷變得容易:我們可以通過<code>docker stop</code>或者<code>docker run</code>來釋出新的daemons版本。我們甚至可以在一台實體機器上運作多個互相隔離的叢集。這些都為開發過程提供了極大的便利。

由于監測子產品不能在NAT過的網絡中進行通信,我們必須使用 <code>--net=host</code>來将主機的網絡層開放給容器:

你可以配置如下選項:

<code>MON_IP</code>是運作Docker的主機IP

<code>MON_NAME</code>是你監測子產品的名稱(預設為$(hostname))

<code>CEPH_PUBLIC_NETWORK</code>是運作Docker的主機的CIDR。它和<code>MON_IP</code>必須是同一個網絡。

<code>CEPH_CLUSTER_NETWORK</code>是運作Docker的主機的備用網口的CIDR,為OSD的備份流量使用。

我們現在能實作允許每一個OSD程序運作在一個獨立的容器裡。按照微服務的理念,一個容器裡不應該運作超過一個服務。而在我們這裡,在同一個容器裡運作多個OSD程序,打破了這一理念,當然這也會給系統的配置和維護帶來額外的複雜度。

在這樣的配置下,我們必須使用<code>--privileged=true</code>來使得容器中的程序可以通路<code>/dev</code>等其他核心功能。然後,我們在開放OSD的目錄的基礎上也支援其他配置,開放OSD的目錄可以讓operators來對裝置做合适的準備工作。這樣我們就可以簡單地開放OSD目錄,配置OSD(<code>ceph-osd mkfs</code>)的工作就會通過Entry Point來完成。我下面介紹的配置方法是最簡單的,因為它隻需要你指定一個block device,剩下的事情都會由Entry Point完成。

如果不想用<code>--privileged=true</code>可以采用我的第二個例子。

如果你不想使用<code>--privileged=true</code>,你也可以使用你喜歡的配置管理工具來手動配置OSD。

下面這個例子我假定你已經實作分區并配置好檔案系統。運作下面的指令來生成你的OSD:

$ sudo docker exec &lt;mon-container-id&gt; ceph osd create.

然後運作你的容器:

可配置的選項如下:

<code>OSD_DEVICE i</code>是OSD裝置,例如:<code>/dev/sdb</code>

<code>OSD_JOURNAL</code>使用來儲存OSD journal的裝置,例如:<code>/dev/sdz</code>

<code>HOSTNAME</code>是運作OSD的主機(預設為$(hostname)

<code>OSD_FORCE_ZAP</code>會強制将制定的裝置内容zapping(預設為 0,設為1去開啟)

<code>OSD_JOURNAL_SIZE</code>是OSD journal的大小(預設為 100)

這個元件的設定較為直覺。唯一需要注意的地方是在Docker中我們可以通路Ceph管理者密鑰。這個密鑰會用來生成CephFS pools和檔案系統。

如果你運作0.87以前的Ceph版本,你就不需要做此配置,然而我們最好運作最新的版本!

<code>MDS_NAME</code>是Metadata伺服器的名字(預設為mds-$(hostname))。

<code>CEPHFS_CREATE</code>會為Metadata伺服器生成檔案系統(預設為0,設為1 去開啟)。

<code>CEPHFS_NAME</code>是Metadata檔案系統的名字(預設為cephfs)。

<code>CEPHFS_DATA_POOL</code>是Metadata伺服器data pool的名字(預設為cephfs_data)。

<code>CEPHFS_DATA_POOL_PG</code>是data pool的placement groups的數量 (預設為8)。

<code>CEPHFS_DATA_POOL</code>是Metadata伺服器metadata pool的名字(預設為cephfs_metadata)。

<code>CEPHFS_METADATA_POOL_PG</code>是metadata pool的placement groups的數量(預設為 8)。

我們部署RADOS gateway時預設開啟<code>civetweb</code>。當然,我們也可以通過指定位址和端口來使用不同的CGI前端: 

<code>RGW_REMOTE_CGI</code>指定是否使用嵌入的web伺服器(預設為0,設為1去關閉)。

<code>RGW_REMOTE_CGI_HOST</code>指定運作CGI程序的遠端主機。

<code>RGW_REMOTE_CGI_PORT</code>是運作CGI進行的遠端主機端口。

<code>RGW_CIVETWEB_PORT</code>是civetweb的監聽端口(預設為80)。

<code>RGW_NAME</code>是RADOS gateway執行個體的名字(預設為$(hostname))。

在預設配置下,<code>ceph.conf</code>和所有的Ceph密鑰都會在監測子產品啟動階段生成。這個過程假定了你必須在将叢集擴充到多節點的時候去把這些配置傳送到所有節點上。這個操作并不靈活,我們希望去改善它。我馬上要提出的一個方案就是利用Ansible來生成這些配置檔案和密碼,并将他們安裝到所有機器上。

也不需要做什麼,因為你可以直接将你的Docker鏡像運送到Rocket裡,然後運作。

========================================

譯者介紹:

Julia Han:School of Information Sciences, University of Pittsburgh, USA,碩士,Docker愛好者。

原文釋出時間為:2015-08-04

本文作者:juliahan

本文來自雲栖社群合作夥伴DockerOne,了解相關資訊可以關注DockerOne。

原文标題:在Docker裡運作Ceph