一:部署harbor镜像仓库
Docker容器應用的開發和運行離不開可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉庫,但是從安全和效率等方面考慮,部署我們私有環境內的Registry
也是非常必要的。之前介紹了Docker私有倉庫Registry,這里介紹另一款企業級Docker鏡像倉庫Harbor的部署和使用,在Kubernetes集群中,推薦使用Harbor倉庫環境。
一、Harbor倉庫介紹
我們在日常Docker容器使用和管理過程中,漸漸發現部署企業私有倉庫往往是很有必要的, 它可以幫助你管理企業的一些敏感鏡像, 同時由于Docker Hub的下載速度和GFW的原因, 往往需要將一些無法直接下載的鏡像導入本地私有倉庫. 而Harbor就是部署企業私有倉庫的一個不二之選。Harbor是由VMware公司開源的企業級的Docker Registry管理項目,Harbor主要提供Dcoker Registry管理UI,提供的功能包括:基于角色訪問的控制權限管理(RBAC)、AD/LDAP集成、日志審核、管理界面、自我注冊、鏡像復制和中文支持等。Harbor的目標是幫助用戶迅速搭建一個企業級的Docker registry服務。它以Docker公司開源的registry為基礎,額外提供了如下功能:
-
-> 基于角色的訪問控制(Role Based Access Control)
-
-> 基于策略的鏡像復制(Policy based image replication)
-
-> 鏡像的漏洞掃描(Vulnerability Scanning)
-
-> AD/LDAP集成(LDAP/AD support)
-
-> 鏡像的刪除和空間清理(Image deletion & garbage collection)
-
-> 友好的管理UI(Graphical user portal)
-
-> 審計日志(Audit logging)
-
-> RESTful API
-
-> 部署簡單(Easy deployment)
Harbor的所有組件都在Dcoker中部署,所以Harbor可使用Docker Compose快速部署。需要特別注意:由于Harbor是基于Docker Registry V2版本,所以docker必須大于等于1.10.0版本,docker-compose必須要大于1.6.0版本!
二、Harbor倉庫結構
Harbor的每個組件都是以Docker容器的形式構建的,可以使用Docker Compose來進行部署。如果環境中使用了kubernetes,Harbor也提供了kubernetes的配置文件。Harbor大概需要以下幾個容器組成:ui(Harbor的核心服務)、log(運行著rsyslog的容器,進行日志收集)、mysql(由官方mysql鏡像構成的數據庫容器)、Nginx(使用Nginx做反向代理)、registry(官方的Docker registry)、adminserver(Harbor的配置數據管理器)、jobservice(Harbor的任務管理服務)、redis(用于存儲session)。
Harbor是一個用于存儲和分發Docker鏡像的企業級Registry服務器,整體架構還是很清晰的。下面借用了網上的架構圖:
Harbor依賴的外部組件
-> Nginx(即Proxy代理層): Nginx前端代理,主要用于分發前端頁面ui訪問和鏡像上傳和下載流量; Harbor的registry,UI,token等服務,通過一個前置的反向代理統一接收瀏覽器、Docker客戶端的請求,并將請求轉發給后端不同的服務。
-> Registry v2: 鏡像倉庫,負責存儲鏡像文件; Docker官方鏡像倉庫, 負責儲存Docker鏡像,并處理docker push/pull命令。由于我們要對用戶進行訪問控制,即不同用戶對Docker image有不同的讀寫權限,Registry會指向一個token服務,強制用戶的每次docker pull/push請求都要攜帶一個合法的token, Registry會通過公鑰對token進行解密驗證。
-> Database(MySQL或Postgresql):為core services提供數據庫服務,負責儲存用戶權限、審計日志、Docker image分組信息等數據。
Harbor自有組件
-> Core services(Admin Server): 這是Harbor的核心功能,主要提供以下服務:
-> UI:提供圖形化界面,幫助用戶管理registry上的鏡像(image), 并對用戶進行授權。
-> webhook:為了及時獲取registry 上image狀態變化的情況, 在Registry上配置webhook,把狀態變化傳遞給UI模塊。
-> Auth服務:負責根據用戶權限給每個docker push/pull命令簽發token. Docker 客戶端向Regi?stry服務發起的請求,如果不包含token,會被重定向到這里,獲得token后再重新向Registry進行請求。
-> API: 提供Harbor RESTful API
-> Replication Job Service:提供多個 Harbor 實例之間的鏡像同步功能。
-> Log collector:為了幫助監控Harbor運行,負責收集其他組件的log,供日后進行分析。
再來仔細看下Harbor主要組件和數據流走向:
-> proxy,它是一個nginx前端代理,主要是分發前端頁面ui訪問和鏡像上傳和下載流量,上圖中通過深藍色先標識;
-> ui提供了一個web管理頁面,當然還包括了一個前端頁面和后端API,底層使用mysql數據庫;
-> registry是鏡像倉庫,負責存儲鏡像文件,當鏡像上傳完畢后通過hook通知ui創建repository,上圖通過紅色線標識,當然registry的token認證也是通過ui組件完成;
-> adminserver是系統的配置管理中心附帶檢查存儲用量,ui和jobserver啟動時候回需要加載adminserver的配置,通過灰色線標識;
-> jobsevice是負責鏡像復制工作的,他和registry通信,從一個registry pull鏡像然后push到另一個registry,并記錄job_log,上圖通過紫色線標識;
-> log是日志匯總組件,通過docker的log-driver把日志匯總到一起,通過淺藍色線條標識。
Harbor的誤區
誤區一: Harbor是負責存儲容器鏡像的 (Harbor是鏡像倉庫,那么它就應當是存儲鏡像的)
其實關于鏡像的存儲,Harbor使用的是官方的docker registry服務去完成,至于registry是用本地存儲或者s3都是可以的,Harbor的功能是在此之上提供用戶權限管理、鏡像復制等功能,提高使用的registry的效率。
誤區二:Harbor鏡像復制是存儲直接復制 (鏡像的復制,很多人以為應該是鏡像分層文件的直接拷貝)
其實Harbor鏡像復制采用了一個更加通用、高屋建瓴的做法,通過docker registry 的API去拷貝,這不是省事,這種做法屏蔽了繁瑣的底層文件操作、不僅可以利用現有docker registry功能不必重復造輪子,而且可以解決沖突和一致性的問題。
Harbor的部署
這里不建議使用kubernetes來部署, 原因是鏡像倉庫非常重要, 盡量保證部署和維護的簡潔性, 因此這里直接使用compose的方式進行部署。官方提供3種部署Harbor的方式:
1)在線安裝: 從Docker Hub下載Harbor的鏡像來安裝, 由于Docker Hub比較慢, 建議Docker配置好加速器。
2)離線安裝: 這種方式應對與部署主機沒聯網的情況使用。需要提前下載離線安裝包: harbor-offline-installer-.tgz 到本地
3)OVA安裝: 這個主要用vCentor環境是使用
三、安裝Harbor
安裝系統工具插件
yum -y install yum-utils device-mapper-persistent-data lvm2安裝docker-compose
curl -L https://github.com/docker/compose/releases/download/1.25.0-rc4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-composels -l /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose #查看版本 docker-compose -v下載harbor
wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.4.tgztar zxvf harbor-offline-installer-v1.7.4.tgzcd harbor修改配置文件
vim harbor.cfg hostname=#修改為自己的IP啟動運行
./install.sh #執行安裝腳本[Step 4]: starting Harbor ... Creating network "harbor_harbor" with the default driver Creating harbor-log ... done Creating registryctl ... done Creating harbor-adminserver ... done Creating registry ... done Creating harbor-db ... done Creating redis ... done Creating harbor-core ... done Creating harbor-portal ... done Creating harbor-jobservice ... done Creating nginx ... done? ----Harbor has been installed and started successfully.---- #等待安裝完成后訪問配置文件中輸入的hostname對應的IP或域名 #默認用戶名:admin,密碼:Harbor12345harbor的啟動,停止
啟動停止 [root@k8s-node01 harbor]# docker-compose stop Stopping nginx ... done Stopping harbor-portal ... done Stopping harbor-jobservice ... done Stopping harbor-core ... done Stopping redis ... done Stopping harbor-db ... done Stopping harbor-adminserver ... done Stopping registry ... done Stopping registryctl ... done Stopping harbor-log ... done使用harbor鏡像倉庫
在另外一臺docker 上添加不安全的鏡像倉庫
[root@k8s-node02 ~]# vim /etc/docker/daemon.json [root@k8s-node02 ~]# cat /etc/docker/daemon.json{"insecure-registries": ["http://192.168.10.101:80"] #修改192.168.10.101為自己的ip}重啟docker
systemctl daemon-reload systemctl restart docker登錄并上傳鏡像
在Harbor管理頁面創建一個項目
上傳完成后前往horbor確認
此時鏡像已經上傳完成
K8s 訪問私有倉庫
默認是可以拉取公開倉庫的鏡像,但如果是私有倉庫就需要進行認證
測試私有倉庫
測試拉取鏡像
vim test.yaml
總結
以上是生活随笔為你收集整理的一:部署harbor镜像仓库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云原生时代,如何保证容器镜像安全?
- 下一篇: 减少USB 1.1 2.0 端口驱动程