一:部署harbor镜像仓库
Docker容器應(yīng)用的開發(fā)和運行離不開可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉庫,但是從安全和效率等方面考慮,部署我們私有環(huán)境內(nèi)的Registry
也是非常必要的。之前介紹了Docker私有倉庫Registry,這里介紹另一款企業(yè)級Docker鏡像倉庫Harbor的部署和使用,在Kubernetes集群中,推薦使用Harbor倉庫環(huán)境。
一、Harbor倉庫介紹
我們在日常Docker容器使用和管理過程中,漸漸發(fā)現(xiàn)部署企業(yè)私有倉庫往往是很有必要的, 它可以幫助你管理企業(yè)的一些敏感鏡像, 同時由于Docker Hub的下載速度和GFW的原因, 往往需要將一些無法直接下載的鏡像導(dǎo)入本地私有倉庫. 而Harbor就是部署企業(yè)私有倉庫的一個不二之選。Harbor是由VMware公司開源的企業(yè)級的Docker Registry管理項目,Harbor主要提供Dcoker Registry管理UI,提供的功能包括:基于角色訪問的控制權(quán)限管理(RBAC)、AD/LDAP集成、日志審核、管理界面、自我注冊、鏡像復(fù)制和中文支持等。Harbor的目標(biāo)是幫助用戶迅速搭建一個企業(yè)級的Docker registry服務(wù)。它以Docker公司開源的registry為基礎(chǔ),額外提供了如下功能:
-
-> 基于角色的訪問控制(Role Based Access Control)
-
-> 基于策略的鏡像復(fù)制(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倉庫結(jié)構(gòu)
Harbor的每個組件都是以Docker容器的形式構(gòu)建的,可以使用Docker Compose來進(jìn)行部署。如果環(huán)境中使用了kubernetes,Harbor也提供了kubernetes的配置文件。Harbor大概需要以下幾個容器組成:ui(Harbor的核心服務(wù))、log(運行著rsyslog的容器,進(jìn)行日志收集)、mysql(由官方mysql鏡像構(gòu)成的數(shù)據(jù)庫容器)、Nginx(使用Nginx做反向代理)、registry(官方的Docker registry)、adminserver(Harbor的配置數(shù)據(jù)管理器)、jobservice(Harbor的任務(wù)管理服務(wù))、redis(用于存儲session)。
Harbor是一個用于存儲和分發(fā)Docker鏡像的企業(yè)級Registry服務(wù)器,整體架構(gòu)還是很清晰的。下面借用了網(wǎng)上的架構(gòu)圖:
Harbor依賴的外部組件
-> Nginx(即Proxy代理層): Nginx前端代理,主要用于分發(fā)前端頁面ui訪問和鏡像上傳和下載流量; Harbor的registry,UI,token等服務(wù),通過一個前置的反向代理統(tǒng)一接收瀏覽器、Docker客戶端的請求,并將請求轉(zhuǎn)發(fā)給后端不同的服務(wù)。
-> Registry v2: 鏡像倉庫,負(fù)責(zé)存儲鏡像文件; Docker官方鏡像倉庫, 負(fù)責(zé)儲存Docker鏡像,并處理docker push/pull命令。由于我們要對用戶進(jìn)行訪問控制,即不同用戶對Docker image有不同的讀寫權(quán)限,Registry會指向一個token服務(wù),強(qiáng)制用戶的每次docker pull/push請求都要攜帶一個合法的token, Registry會通過公鑰對token進(jìn)行解密驗證。
-> Database(MySQL或Postgresql):為core services提供數(shù)據(jù)庫服務(wù),負(fù)責(zé)儲存用戶權(quán)限、審計日志、Docker image分組信息等數(shù)據(jù)。
Harbor自有組件
-> Core services(Admin Server): 這是Harbor的核心功能,主要提供以下服務(wù):
-> UI:提供圖形化界面,幫助用戶管理registry上的鏡像(image), 并對用戶進(jìn)行授權(quán)。
-> webhook:為了及時獲取registry 上image狀態(tài)變化的情況, 在Registry上配置webhook,把狀態(tài)變化傳遞給UI模塊。
-> Auth服務(wù):負(fù)責(zé)根據(jù)用戶權(quán)限給每個docker push/pull命令簽發(fā)token. Docker 客戶端向Regi?stry服務(wù)發(fā)起的請求,如果不包含token,會被重定向到這里,獲得token后再重新向Registry進(jìn)行請求。
-> API: 提供Harbor RESTful API
-> Replication Job Service:提供多個 Harbor 實例之間的鏡像同步功能。
-> Log collector:為了幫助監(jiān)控Harbor運行,負(fù)責(zé)收集其他組件的log,供日后進(jìn)行分析。
再來仔細(xì)看下Harbor主要組件和數(shù)據(jù)流走向:
-> proxy,它是一個nginx前端代理,主要是分發(fā)前端頁面ui訪問和鏡像上傳和下載流量,上圖中通過深藍(lán)色先標(biāo)識;
-> ui提供了一個web管理頁面,當(dāng)然還包括了一個前端頁面和后端API,底層使用mysql數(shù)據(jù)庫;
-> registry是鏡像倉庫,負(fù)責(zé)存儲鏡像文件,當(dāng)鏡像上傳完畢后通過hook通知ui創(chuàng)建repository,上圖通過紅色線標(biāo)識,當(dāng)然registry的token認(rèn)證也是通過ui組件完成;
-> adminserver是系統(tǒng)的配置管理中心附帶檢查存儲用量,ui和jobserver啟動時候回需要加載adminserver的配置,通過灰色線標(biāo)識;
-> jobsevice是負(fù)責(zé)鏡像復(fù)制工作的,他和registry通信,從一個registry pull鏡像然后push到另一個registry,并記錄job_log,上圖通過紫色線標(biāo)識;
-> log是日志匯總組件,通過docker的log-driver把日志匯總到一起,通過淺藍(lán)色線條標(biāo)識。
Harbor的誤區(qū)
誤區(qū)一: Harbor是負(fù)責(zé)存儲容器鏡像的 (Harbor是鏡像倉庫,那么它就應(yīng)當(dāng)是存儲鏡像的)
其實關(guān)于鏡像的存儲,Harbor使用的是官方的docker registry服務(wù)去完成,至于registry是用本地存儲或者s3都是可以的,Harbor的功能是在此之上提供用戶權(quán)限管理、鏡像復(fù)制等功能,提高使用的registry的效率。
誤區(qū)二:Harbor鏡像復(fù)制是存儲直接復(fù)制 (鏡像的復(fù)制,很多人以為應(yīng)該是鏡像分層文件的直接拷貝)
其實Harbor鏡像復(fù)制采用了一個更加通用、高屋建瓴的做法,通過docker registry 的API去拷貝,這不是省事,這種做法屏蔽了繁瑣的底層文件操作、不僅可以利用現(xiàn)有docker registry功能不必重復(fù)造輪子,而且可以解決沖突和一致性的問題。
Harbor的部署
這里不建議使用kubernetes來部署, 原因是鏡像倉庫非常重要, 盡量保證部署和維護(hù)的簡潔性, 因此這里直接使用compose的方式進(jìn)行部署。官方提供3種部署Harbor的方式:
1)在線安裝: 從Docker Hub下載Harbor的鏡像來安裝, 由于Docker Hub比較慢, 建議Docker配置好加速器。
2)離線安裝: 這種方式應(yīng)對與部署主機(jī)沒聯(lián)網(wǎng)的情況使用。需要提前下載離線安裝包: harbor-offline-installer-.tgz 到本地
3)OVA安裝: 這個主要用vCentor環(huán)境是使用
三、安裝Harbor
安裝系統(tǒng)工具插件
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 #執(zhí)行安裝腳本[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對應(yīng)的IP或域名 #默認(rèn)用戶名: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管理頁面創(chuàng)建一個項目
上傳完成后前往horbor確認(rèn)
此時鏡像已經(jīng)上傳完成
K8s 訪問私有倉庫
默認(rèn)是可以拉取公開倉庫的鏡像,但如果是私有倉庫就需要進(jìn)行認(rèn)證
測試私有倉庫
測試?yán)$R像
vim test.yaml
總結(jié)
以上是生活随笔為你收集整理的一:部署harbor镜像仓库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云原生时代,如何保证容器镜像安全?
- 下一篇: 减少USB 1.1 2.0 端口驱动程