天天看點

SUSE Portus + Docker Registry在Rancher環境下的部署實戰

在正文之前,我們先來看一下,如果沒有容器,通常會如何部署 Docker Registry?關于這個問題,我簡單畫了一個草圖: 

<a href="https://s2.51cto.com/wyfs02/M02/8D/D0/wKiom1iro8zioiWiAADUvw3I1EE218.jpg" target="_blank"></a>

下面簡單解釋一下:

Nginx:用來做 Docker Registry 的代理和軟體負載均衡Keepalived 采用主備加虛拟 IP 的方式,解決 Nginx 的單點問題,保證 Nginx 服務的高可用性。

Docker Registry:這是 Docker 官方開源的私有鏡像倉庫項目,對應 github 上的 docker-distribution 項目,也是私有鏡像倉庫的核心。

Redis:大名鼎鼎的 Key-Value 資料庫,很多應用場景中,将其作為緩存使用。在 Docker Registry中也不例外,用來緩存 Docker Image 的 laryer metadata,帶來的好處即是 laryer metadata 的快速通路。

Storage Cluster Docker Registry:以存儲驅動的方式支援多種後端存儲。例如:Docker Registry2.3 目前支援如下的存儲驅動:

<a href="https://s1.51cto.com/wyfs02/M00/8D/D0/wKiom1irpA2AS2tNAADcUvuyMJw151.jpg" target="_blank"></a>

這裡簡單做個補充,官方文檔也有介紹如何貢獻新的 Docker Registry 存儲驅動。

下面我們來看一下,在 Rancher 環境下,一個簡化版 Docker Registry 的部署結構圖,如下圖所示: 

<a href="https://s5.51cto.com/wyfs02/M01/8D/D0/wKiom1irpCyCcfk2AABlBCHbfxk826.jpg" target="_blank"></a>

這個圖是以 Rancher 下服務的視角畫的,部署這樣一個簡單的 Docker Registry,需要四個服務,分别是外部存儲服務、Redis Cache 服務、Docker Registry 服務和負載均衡服務。使用者通路 Docker Registry 通過使用負載均衡服務的IP和端口。Docker Registry 的負載均衡服務,需要做源 IP會話保持配置。

到此為止,我們就在 Rancher 環境下部署了一個簡化版的 Docker Registry 服務。至于我為什麼說其是簡化版呢?是因為現在這個版本存在一些問題。

首先,Docker Registry 本身沒有 Web UI,鏡像的檢索,隻能通過指令行工具完成,使用起來非常不友善。

其次,Docker Registry 自身沒有基于角色權限通路控制,所有可以通路負載均衡服務的使用者都能随意的推送和拉取鏡像。

最後,Docker Registry 本身是提供了基于 token 的認證機制,需要接入 Authorization Service,這個服務官方沒有實作,需要我們自己實作或者借助開源實作。

SUSE Portus 完美地解決了上述問題。下面我們看一下,在 Rancher 環境下加入 SUSE Portus的服務結構圖: 

<a href="https://s1.51cto.com/wyfs02/M00/8D/D0/wKiom1irpEHyV1O6AAEUt3AJPa8308.jpg" target="_blank"></a>

Portus Core Cluster 服務負責給 Docker Registry 提供 token 認證服務和接收 Docker Registry 發送的鏡像推送的通知,同步 Docker Registry 中的鏡像資訊到 SUSE Portus 的資料庫中。該服務本身無狀态,可以水準擴充PortusCronSync負責定時請求DockerRegistryAPI 同步鏡像資料到SUSEPortus的資料庫中。

當使用者向 Docker Registry 推送一個鏡像後,Docker Registry 會發送通知給 SUSE Portus,如果網絡閃斷,或者 SUSE Portu 服務中斷,會做有限次數的重試。這樣可能會導緻 SUSE Portu 無法收到鏡像推送的通知,造成兩端資料的不一緻。Portus Cron Sync 就是為了解決這個問題而存在的。

SUSE Portus 的 token 認證服務完全滿足官方的認證模型,Docker 官方的認證模型如下圖所示: 

<a href="https://s5.51cto.com/wyfs02/M01/8D/D0/wKiom1irpFnjsO8BAADRkPm5d80001.jpg" target="_blank"></a>

Docker Registry 關于認證服務的配置和通知目标服務的配置,都在 Docker Registry 容器的/etc/docker/registry/config.yml 中:

<a href="https://s2.51cto.com/wyfs02/M02/8D/D1/wKiom1irpHTg5_UzAABfTz-WlHU399.jpg" target="_blank"></a>

<a href="https://s2.51cto.com/wyfs02/M02/8D/D1/wKiom1irpITQJRoIAACUec9WINk023.jpg" target="_blank"></a>

最後,我們可以按照 Rancher Catalog 的規範,制作一些基礎鏡像,然後把這個服務 Catalog化,做成一鍵部署。 

<a href="https://s5.51cto.com/wyfs02/M00/8D/CE/wKioL1irpJWxdfgmAABEEaPTzuE077.jpg" target="_blank"></a>

本文轉自 RancherLabs 51CTO部落格,原文連結:http://blog.51cto.com/12462495/1899717