docker私有倉(cāng)庫(kù)管理系統(tǒng)harbor的部署使用

一、Harbor簡(jiǎn)介

  Harbor是一個(gè)用于存儲(chǔ)和分發(fā)Docker鏡像的企業(yè)級(jí)Registry服務(wù)器,可以用來(lái)構(gòu)建企業(yè)內(nèi)部的Docker鏡像倉(cāng)庫(kù)。它在Docker的開(kāi)源項(xiàng)目 Distribution的基礎(chǔ)上,添加了一些企業(yè)需要的功能特性,如鏡像同步復(fù)制、漏洞掃描和權(quán)限管理等。Harbor是由VMware公司開(kāi)源的企業(yè)級(jí)的Docker Registry管理項(xiàng)目,它包括權(quán)限管理(RBAC)、LDAP、日志審核、管理界面、自我注冊(cè)、鏡像復(fù)制和中文支持等功能。

二、Harbor組件

Harbor在架構(gòu)上主要由以下組件構(gòu)成:

Proxy:Harbor的registry, UI, token等服務(wù),通過(guò)一個(gè)前置的反向代理統(tǒng)一接收瀏覽器、Docker客戶端的請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)給后端不同的服務(wù)。

Registry: 負(fù)責(zé)儲(chǔ)存Docker鏡像,并處理dockerpush/pull 命令。由于我們要對(duì)用戶進(jìn)行訪問(wèn)控制,即不同用戶對(duì)Docker image有不同的讀寫權(quán)限,Registry會(huì)指向一個(gè)token服務(wù),強(qiáng)制用戶的每次docker pull/push請(qǐng)求都要攜帶一個(gè)合法的token,Registry會(huì)通過(guò)公鑰對(duì)token 進(jìn)行解密驗(yàn)證。

Core services: 這是Harbor的核心功能,主要提供以下服務(wù):

UI:提供圖形化界面,幫助用戶管理registry上的鏡像(image), 并對(duì)用戶進(jìn)行授權(quán)

webhook:為了及時(shí)獲取registry 上image狀態(tài)變化的情況, 在Registry上配置webhook,把狀態(tài)變化傳遞給UI模塊。

token服務(wù):負(fù)責(zé)根據(jù)用戶權(quán)限給每個(gè)docker push/pull命令簽發(fā)token.Docker 客戶端向Regi?stry服務(wù)發(fā)起的請(qǐng)求,如果不包含token,會(huì)被重定向到這里,獲得token后再重新向Registry進(jìn)行請(qǐng)求。

Database:為coreservices提供數(shù)據(jù)庫(kù)服務(wù),負(fù)責(zé)儲(chǔ)存用戶權(quán)限、審計(jì)日志、Docker image分組信息等數(shù)據(jù)。

Job Services:提供鏡像遠(yuǎn)程復(fù)制功能,可以把本地鏡像同步到其他Harbor實(shí)例中。

Log collector:為了幫助監(jiān)控Harbor運(yùn)行,負(fù)責(zé)收集其他組件的log,供日后進(jìn)行分析。

這幾個(gè)容器通過(guò) Docker link 的形式連接在一起,這樣,在容器之間可以通過(guò)容器名字互相訪問(wèn)。對(duì)終端用戶而言,只需要暴露 proxy (即 Nginx)的服務(wù)端口。

三、工作原理

  用戶通過(guò) docker login 命令向這Harbor 服務(wù)kube.com發(fā)起登錄請(qǐng)求:docker login kube.com當(dāng)用戶輸入所需信息并點(diǎn)擊回車后,Docker 客戶端會(huì)向地址“kube.com/v2/” 發(fā)出 HTTP GET 請(qǐng)求。Harbor 的各個(gè)容器會(huì)通過(guò)以下步驟處理:

3.1 Docker login

首先,這個(gè)請(qǐng)求會(huì)由監(jiān)聽(tīng) 80 端口的 proxy 容器接收到。根據(jù)預(yù)先設(shè)置的匹配規(guī)則,容器中的 Nginx會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給后端的 registry 容器;

在 registry 容器一方,由于配置了基于 token 的認(rèn)證,registry 會(huì)返回錯(cuò)誤代碼 401,提示 Docker客戶端訪問(wèn) token 服務(wù)綁定的 URL。在 Harbor 中,這個(gè) URL 指向 Core Services;

Docker 客戶端在接到這個(gè)錯(cuò)誤代碼后,會(huì)向token服務(wù)的URL發(fā)出請(qǐng)求,并根據(jù)HTTP協(xié)議的BasicAuthentication 規(guī)范,將用戶名密碼組合并編碼,放在請(qǐng)求頭部(header);

類似地,這個(gè)請(qǐng)求通過(guò) 80 端口發(fā)到 proxy 容器后,Nginx 會(huì)根據(jù)規(guī)則把請(qǐng)求轉(zhuǎn)發(fā)給 ui 容器,ui 容器監(jiān)聽(tīng) token 服務(wù)網(wǎng)址的處理程序接收到請(qǐng)求后,會(huì)將請(qǐng)求頭解碼,得到用戶名、密碼;

在得到用戶名、密碼后,ui 容器中的代碼會(huì)查詢數(shù)據(jù)庫(kù),將用戶名、密碼與 mysql 容器中的數(shù)據(jù)進(jìn)行比對(duì)(注:ui 容器還支持 LDAP 的認(rèn)證方式,在那種情況下 ui 會(huì)試圖和外部 LDAP 服務(wù)進(jìn)行通信并校驗(yàn)用戶名/密碼)。比對(duì)成功,ui 容器會(huì)返回表示成功的狀態(tài)碼, 并用密鑰生成 token,放在響應(yīng)體中返回給 Docker 客戶端。

這個(gè)過(guò)程中組件間的交互過(guò)程如下圖所示:

  至此,一次 docker login 成功地完成了,Docker 客戶端會(huì)把步驟(3)中編碼后的用戶名密碼保存在本地的隱藏文件中~/.docker/config.json。

3.2 Docker Push

  用戶登錄成功后用 docker push 命令向 Harbor 推送一個(gè) Docker 鏡像:docker push kube.com/library/hello-world

首先,docker 客戶端會(huì)重復(fù) login 的過(guò)程,首先發(fā)送請(qǐng)求到 registry,之后得到 token 服務(wù)的地址;

之后,Docker 客戶端在訪問(wèn)ui容器上的token服務(wù)時(shí)會(huì)提供額外信息,指明它要申請(qǐng)一個(gè)對(duì)library/hello-world 進(jìn)行 push 操作的 token;

token 服務(wù)在經(jīng)過(guò) Nginx 轉(zhuǎn)發(fā)得到這個(gè)請(qǐng)求后,會(huì)訪問(wèn)數(shù)據(jù)庫(kù)核實(shí)當(dāng)前用戶是否有權(quán)限對(duì)該 image進(jìn)行 push。如果有權(quán)限,它會(huì)把 image 的信息以及 push 動(dòng)作進(jìn)行編碼,并用私鑰簽名,生成 token返回給 Docker 客戶端;

得到 token 之后 Docker 客戶端會(huì)把 token 放在請(qǐng)求頭部,向 registry 發(fā)出請(qǐng)求,試圖開(kāi)始推送image。 Registry 收到請(qǐng)求后會(huì)用公鑰解碼 token 并進(jìn)行核對(duì),一切成功后,image 的傳輸就開(kāi)始了。

下圖描述了這個(gè)過(guò)程中各組件的通信:

四、安裝部署

4.1、harbor-ui管理后臺(tái)

1、進(jìn)入到GitHub下載官方harbor文件,下載鏈接地址為:https://github.com/vmware/harbor/releases,harbor分為在線和離線版本,我下載了1.10離線版本使用。

2、下載harbor-v1.10.1.tar.gz,解壓縮后進(jìn)入到harbor目錄,根據(jù)實(shí)際情況修改配置文件harbor.yaml

hostname: kube.com

http:

? port: 80

https:

? port: 443

? certificate: /etc/harbor/ssl/kube.com.cert#這里后面生成

? private_key: /etc/harbor/ssl/kube.com.key

harbor_admin_password: password

database:

? password: password

? max_idle_conns: 50

? max_open_conns: 100

data_volume: /data

clair:

? updaters_interval: 12

jobservice:

? max_job_workers: 10

notification:

? webhook_job_max_retry: 10

chart:

? absolute_url: disabled

log:

? level: info

? local:

?? rotate_count: 50

?? rotate_size: 200M

?? location: /var/log/harbor

_version: 1.10.0

proxy:

? http_proxy:

? https_proxy:

? no_proxy:

? components:

?? - core

?? - jobservice

?? - clair

修改完成之后,使用官方自帶腳本更新參數(shù),在harbor目錄中執(zhí)行./prepare,這時(shí)候你會(huì)發(fā)現(xiàn)harbor是需要安裝docker和docker-compose才能使用的。3、docker安裝步驟略,docker-dompose安裝步驟如下:yum install python-pippip install docker-compose

4、接著在harbor目錄下執(zhí)行./install.sh命令即可,會(huì)自動(dòng)導(dǎo)入鏡像并啟動(dòng)對(duì)應(yīng)的容器,待腳本跑完之后使用docke-compose ps即可查看,常用命令包含以下幾個(gè):

docker-compose up-d###后臺(tái)啟動(dòng),如果容器不存在根據(jù)鏡像自動(dòng)創(chuàng)建

docker-compose down-v ###停止容器并刪除容器

docker-composestart###啟動(dòng)容器,不存在就無(wú)法啟動(dòng),不會(huì)自動(dòng)創(chuàng)建

docker-composestop###停止容器

注:其實(shí)上面是停止docker-compose.yml中定義的所有容器,默認(rèn)情況下docker-compose就是操作同目錄下的docker-compose.yml文件,如果使用其他yml文件,可以使用-f自己指定。最后使用鏈接https://domain.com(這是我自己的地址,你需要換成你自己的),輸入用戶名密碼即可登錄系統(tǒng)了。

4.2、push和pull鏡像

1、docker默認(rèn)是從官方拉取鏡像的,并且從1.12版本之后,默認(rèn)私有倉(cāng)庫(kù)是使用https來(lái)進(jìn)行連接,所以我們這里需要進(jìn)行一些相應(yīng)的修改:編輯docker啟動(dòng)文件,在啟動(dòng)命令后加入?yún)?shù):--insecure-registry kube.com,然后使用systemctl daemon-reload一下,重啟docker

2、使用docker命令對(duì)鏡像打標(biāo)簽并且上傳至私有倉(cāng)庫(kù),docker打標(biāo)簽命令:docker tag centos:latest kube/devil/centos:latest  上面的命令的意思是將centos這個(gè)鏡像的最新版latest打上標(biāo)簽,其中kube.com是倉(cāng)庫(kù)的地址,devil是倉(cāng)庫(kù)里創(chuàng)建的項(xiàng)目(可以網(wǎng)上看登錄的界面截圖,我創(chuàng)建了一個(gè)devil項(xiàng)目,項(xiàng)目分為公開(kāi)和私有,公開(kāi)項(xiàng)目不需要登錄就可以進(jìn)行拉取,私有的是需要登錄以后才能拉取的,上傳鏡像都需要登錄并且要有上傳的權(quán)限才行),centos:latest是我自己取的名字和版本,可以跟原來(lái)的保持一致,也可以自己另外取名,比如centos:mytest,打完標(biāo)簽之后登錄倉(cāng)庫(kù)并上傳鏡像:docker push kube/devil/centos:latest然后進(jìn)入web管理界面即可查看到我們最新上傳的鏡像了

3、拉取鏡像很簡(jiǎn)單,因?yàn)槲以O(shè)置的是公開(kāi)項(xiàng)目,直接docker pull kube/devil/centos:latest即可

4.3、鏡像倉(cāng)庫(kù)復(fù)制

  一個(gè)倉(cāng)庫(kù)的情況下如果鏡像倉(cāng)庫(kù)掛了,那么所有的鏡像也就沒(méi)有了,所以最好是創(chuàng)建一個(gè)備份倉(cāng)庫(kù),harbor提供了鏡像倉(cāng)庫(kù)復(fù)制功能,可以很好的自動(dòng)實(shí)現(xiàn);創(chuàng)建2個(gè)harbor倉(cāng)庫(kù),其中一個(gè)為主,另外一個(gè)為輔,登陸主倉(cāng)庫(kù)http://kube.com,點(diǎn)擊任意想要復(fù)制的倉(cāng)庫(kù)項(xiàng)目,然后復(fù)制,點(diǎn)擊新建規(guī)則,名稱、描述根據(jù)自己的實(shí)際隨便填寫,勾選啟用,目標(biāo)名為復(fù)制到輔倉(cāng)庫(kù)的目標(biāo)名,需要存在,如果不存在可以勾選創(chuàng)建目標(biāo),url為輔倉(cāng)庫(kù)的harbor-ui的url,賬戶密碼也是輔倉(cāng)庫(kù)賬戶密碼,點(diǎn)擊測(cè)試,測(cè)試成功代表沒(méi)有問(wèn)題了,然后就會(huì)自動(dòng)復(fù)制了,從日志處可以看到復(fù)制的過(guò)程。

4.4、https的啟用

  要啟用https,那么ca證書必不可少,一般內(nèi)網(wǎng)環(huán)境都是直接使用自建ca,這里使用openssl自建ca,openssl的配置文件默認(rèn)為/etc/pki/tls/openssl.cnf

進(jìn)入到CA目錄下執(zhí)行

(umask077;opensslgenrsa-outprivate/cakey.pem2048)

# 括號(hào)中執(zhí)行,代表使用子shell執(zhí)行,不影響本機(jī)的umask值。

?

# 作為根 CA,可以生成一個(gè)自簽名的證書,來(lái)標(biāo)明自己的身份,簽名方法如下

opensslreq-new-x509-keyprivate/cakey.pem-days3655-outcacert.pem

?

# 會(huì)提示輸入相關(guān)信息,不要隨便亂寫,其中Common Name一般填寫為域名或者ip地址,最好是域名。

?

# 開(kāi)始生成服務(wù)證書

opensslgenrsa-outkube.com.key2048

?

# 生成簽名請(qǐng)求

opensslreq-new-keykube.com.key-outkube.com.csr

?

# 使用ca證書簽署請(qǐng)求

opensslca-inkube.com.csr-outkube.com.crt-days3650

?

# 提示信息選擇yes就可以了

?

# 最后cp證書到harbor.yml配置設(shè)置好的路徑下

cp-akube.com.* /etc/harbor/ssl

?

# 同時(shí)docker登錄、推送鏡像都需要使用證書,其中需要將ca證書放置到docker目錄中,docker默認(rèn)從/etc/docker/certs.d/kube.com/ 目錄下讀取證書

cp-aca.crt /etc/docker/certs.d/kube.com/

?

# 然后重啟docker和harbor

systemctl daemon-reload && systemctlrestartdocker

docker-compose down-v&& docker-compose up-d

?

#? 注意執(zhí)行時(shí)的目錄下有docker-compose.yml文件

五、Kubelet使用私有倉(cāng)庫(kù)項(xiàng)目

5.1 身份驗(yàn)證

要想拉取私有鏡像必須在鏡像倉(cāng)庫(kù)上進(jìn)行身份驗(yàn)證。

$ dockerlogin

當(dāng)出現(xiàn)提示時(shí),輸入 Docker 用戶名和密碼。

登錄過(guò)程會(huì)創(chuàng)建或更新保存有授權(quán)令牌的 config.json 文件。

查看 config.json 文件:

cat~/.docker/config.json

輸出結(jié)果包含類似于以下內(nèi)容的部分:

{

? "auths": {

? ? "harbor.vmic.xyz": {

? ? ? "auth":"YWRtaW46ZGV2aWwyMDIx"

? ? }

? },

? "HttpHeaders": {

? ? "User-Agent":"Docker-Client/19.03.14 (linux)"

? }

}

說(shuō)明: 如果使用 Docker 憑證倉(cāng)庫(kù),則不會(huì)看到 auth 條目,看到的將是以倉(cāng)庫(kù)名稱作為值的 credsStore 條目。

5.2 在集群中創(chuàng)建保存授權(quán)令牌的 Secret

Kubernetes 集群使用 docker-registry 類型的 Secret 來(lái)通過(guò)容器倉(cāng)庫(kù)的身份驗(yàn)證,進(jìn)而提取私有映像。

創(chuàng)建 Secret,命名為 harborsecret:

$ kubectlcreate secret docker-registry harborsecret \

--docker-server=<你的鏡像倉(cāng)庫(kù)服務(wù)器> \

--docker-username=<你的用戶名> \

--docker-password=<你的密碼> \

--docker-email=<你的郵箱地址>

在這里:

<your-registry-server> 是你的私有 Docker 倉(cāng)庫(kù)全限定域名(FQDN)。 (參考 https://index.docker.io/v1/ 中關(guān)于 DockerHub 的部分)

<your-name> 是你的 Docker 用戶名。

<your-pword> 是你的 Docker 密碼。

<your-email> 是你的 Docker 郵箱。

這樣你就成功地將集群中的 Docker 憑據(jù)設(shè)置為名為 harborsecret 的 Secret。

5.3 檢查 Secret harborsecret

了解創(chuàng)建的 regcred Secret 的內(nèi)容,可以用 YAML 格式進(jìn)行查看:

kubectlgetsecret harborsecret--output=yaml

輸出和下面類似:

apiVersion: v1

data:

? .dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=

kind: Secret

metadata:

? ...

? name: harborsecret

? ...

type: kubernetes.io/dockerconfigjson

.dockerconfigjson 字段的值是 Docker 憑據(jù)的 base64 表示。

要了解 dockerconfigjson 字段中的內(nèi)容,請(qǐng)將 Secret 數(shù)據(jù)轉(zhuǎn)換為可讀格式:

kubectlgetsecret harborsecret--output="jsonpath={.data.\.dockerconfigjson}"| base64--decode

輸出和下面類似:

{"auths":{"yourprivateregistry.com":{"username":"admin","password":"xxxxxxxxxxx","email":"weiping.tao@xxx.com","auth":"c3R...zE2"}}}

要了解 auth 字段中的內(nèi)容,請(qǐng)將 base64 編碼過(guò)的數(shù)據(jù)轉(zhuǎn)換為可讀格式:

echo"c3R...zE2"| base64--decode

輸出結(jié)果中,用戶名和密碼用 : 鏈接,類似下面這樣:

admin:xxxxxxxxxxx

注意,Secret 數(shù)據(jù)包含與本地 ~/.docker/config.json 文件類似的授權(quán)令牌。

這樣你就已經(jīng)成功地將 Docker 憑據(jù)設(shè)置為集群中的名為 harborsecret 的 Secret。

5.4 創(chuàng)建一個(gè)使用你的 Secret 的 Pod

下面是一個(gè) Pod 配置文件,它需要訪問(wèn) harborsecret 中的 Docker 憑據(jù):

pods/private-reg-pod.yaml

apiVersion: v1

kind: Pod

metadata:

? name: private-reg

spec:

? containers:

? - name: private-reg-container

?? image:

? imagePullSecrets:

? - name: harborsecret

下載上述文件:

$ wget-Omy-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml

在my-private-reg-pod.yaml 文件中,使用私有倉(cāng)庫(kù)的鏡像路徑替換 <your-private-image>,例如:

janedoe/jdoe-private:v1

要從私有倉(cāng)庫(kù)拉取鏡像,Kubernetes 需要憑證。 配置文件中的 imagePullSecrets 字段表明 Kubernetes 應(yīng)該通過(guò)名為 harborsecret 的 Secret 獲取憑證。

創(chuàng)建使用了你的 Secret 的 Pod,并檢查它是否正常運(yùn)行:

$ kubectlapply-fmy-private-reg-pod.yaml

$ kubectlgetpod private-reg

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容