通過helm在k8s上搭建Harbor

環(huán)境:
kuberneters版本:v1.22.3
helm版本:v3.7.1
helm chart版本:1.8.0

下文所需yaml文件在DeploymentFiles可下載

Harbor 是一個(gè)開源注冊(cè)表磺芭,它通過策略和基于角色的訪問控制來(lái)保護(hù)工件,確保鏡像被掃描且沒有漏洞,并將鏡像簽名為受信任的隅居。

前期準(zhǔn)備

1赞警、安裝helm

官網(wǎng)地址:【https://helm.sh/zh/docs/
helm是k8s的包管理器花竞,是查找侮攀、分享和使用軟件構(gòu)建k8s的最優(yōu)方式倦沧。
charts代表著helm包蔗怠,它包含在k8s集群內(nèi)部運(yùn)行應(yīng)用程序墩弯,工具或服務(wù)所需的所有資源定義;
repository是用來(lái)存放和共享charts的地方寞射;
release是運(yùn)行在k8s集群中的chart的實(shí)例渔工。

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
2、創(chuàng)建namespace
kubectl create namespace harbor
3桥温、掛載NFS與創(chuàng)建目錄

nfs服務(wù)的部署在另一篇文章引矩,在此不贅述 (http://www.reibang.com/p/2c20efbd5855
①掛載nfs

$sudo vim /etc/exports
#增加以下內(nèi)容
/hdd/nfs *(rw,sync,no_root_squash,no_subtree_check)

②在/hdd/nfs下創(chuàng)建所需要的目錄

sudo mkdir -p /hdd/nfs/harbor/registry
sudo mkdir -p /hdd/nfs/harbor/chartmuseum
sudo mkdir -p /hdd/nfs/harbor/jobservice
sudo mkdir -p /hdd/nfs/harbor/database
sudo mkdir -p /hdd/nfs/harbor/redis
sudo mkdir -p /hdd/nfs/harbor/trivy

③修改文件目錄權(quán)限
文件權(quán)限很重要,在這踩了很大的坑,Redis和database一直報(bào)權(quán)限不足
-R 代表harbor下的所有文件夾

sudo chmod -R 777 /hdd/nfs/harbor

如果以上權(quán)限還不夠的話脓魏,將文件屬主改為你當(dāng)前用戶

sudo chown -R 1000:1000 /hdd/nfs/
4兰吟、創(chuàng)建PV和PVC

①創(chuàng)建PV部署文件harbor-pv.yaml
spec.nfs.path和spec.nfs.server根據(jù)自己實(shí)際路徑和IP填寫;
spec.storageClassName與PVC中的storageClassName保持一致茂翔。
spec.capacity.storage可根據(jù)實(shí)際情況調(diào)整混蔼,PVC<=PV。

#registry-PV
apiVersion: v1
kind: PersistentVolume
metadata:
  name: harbor-registry
  labels:
    app: harbor-registry
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: "harbor"
  mountOptions:
    - hard
  nfs:
    path: /hdd/nfs/harbor/registry
    server: 192.168.100.24
---
#harbor-chartmuseum-pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: harbor-chartmuseum
  labels:
    app: harbor-chartmuseum
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: "harbor"
  mountOptions:
    - hard
  nfs:
    path: /hdd/nfs/harbor/chartmuseum
    server: 192.168.100.24
---
#harbor-jobservice-pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: harbor-jobservice
  labels:
    app: harbor-jobservice
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: "harbor"
  mountOptions:
    - hard
  nfs:
    path: /hdd/nfs/harbor/jobservice
    server: 192.168.100.24
---
#harbor-database-pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: harbor-database
  labels:
    app: harbor-database
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: "harbor"
  mountOptions:
    - hard
  nfs:
    path: /hdd/nfs/harbor/database
    server: 192.168.100.24
---
#harbor-redis-pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: harbor-redis
  labels:
    app: harbor-redis
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: "harbor"
  mountOptions:
    - hard
  nfs:
    path: /hdd/nfs/harbor/redis
    server: 192.168.100.24
---
#harbor-trivy-pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: harbor-trivy
  labels:
    app: harbor-trivy
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: "harbor"
  mountOptions:
    - hard
  nfs:
    path: /hdd/nfs/harbor/trivy
    server: 192.168.100.24

創(chuàng)建PV資源
-f 指定資源配置文件
PV相對(duì)集群而言珊燎,所以不需要指定命名空間

kubectl apply -f /etc/kubernetes/harbor/harbor-pv.yaml

②創(chuàng)建PVC部署文件harbor-pvc.yaml

#harbor-registry-pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: harbor-registry
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "harbor"
  resources:
    requests:
      storage: 20Gi
  selector:
    matchLabels:
      app: harbor-registry
---
#harbor-chartmuseum-pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: harbor-chartmuseum
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "harbor"
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      app: harbor-chartmuseum
---
#harbor-jobservice-pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: harbor-jobservice
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "harbor"
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      app: harbor-jobservice 
---
#harbor-database-pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: harbor-database
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "harbor"
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      app: harbor-database  
---
#harbor-redis-pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: harbor-redis
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "harbor"
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      app: harbor-redis
---
#harbor-trivy-pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: harbor-trivy
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "harbor"
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      app: harbor-trivy

創(chuàng)建PVC資源
-n 指定命名空間

kubectl apply -f /etc/kubernetes/harbor/harbor-pvc.yaml -n harbor

創(chuàng)建自定義證書

默認(rèn)情況下惭嚣,harbor不附帶證書』谡可以在沒有安全性的情況下部署晚吞,通過HTTP連接。要配置HTTPS必須創(chuàng)建SSL證書谋国。
創(chuàng)建/home/master/harbor_crt文件夾槽地,cd進(jìn)入harbor_crt文件夾內(nèi)操作(可選,個(gè)人為了統(tǒng)一好管理)
①生成證書文件

## 獲得證書
$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt  -subj  "/C=CN/ST=Guangdong/L=Guangzhou/O=example/OU=example/CN=192.168.100.51"

## 生成證書簽名請(qǐng)求
$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout tls.key -out tls.csr  -subj  "/C=CN/ST=Guangdong/L=Guangzhou/O=example/OU=example/CN=192.168.100.51"

通過IP連接時(shí)芦瘾,CN貌似是不生效的捌蚊,會(huì)被忽略,因此需要?jiǎng)?chuàng)建一個(gè)配置文件來(lái)指定IP地址:

$vim extfile.cnf
#填入以下內(nèi)容
subjectAltName = IP:192.168.100.51
## 生成證書
$ openssl x509 -req -days 3650 -in tls.csr -CA ca.crt -CAkey ca.key -CAcreateserial  -extfile extfile.cnf -out tls.crt

②生成secret資源
創(chuàng)建 Kubernetes 的 Secret 資源近弟,且將證書文件導(dǎo)入:

kubectl create secret generic harbor-tls --from-file=tls.crt --from-file=tls.key --from-file=ca.crt -n harbor

設(shè)置harbor配置清單

①?gòu)墓倬W(wǎng)【https://github.com/goharbor/harbor-helm】下載v1.7.4Latest版本的values.yaml文件
②修改配置文件
我采用的是nodePort方式缅糟,修改expose.type為nodePort,按照別的方式的修改相應(yīng)type即可祷愉。
externalURL窗宦,選擇你任意可用的節(jié)點(diǎn)IP:port(注意協(xié)議與端口號(hào)匹配);盡量別去修改默認(rèn)密碼二鳄,我第一次的時(shí)候是改成了別的密碼赴涵,因?yàn)楦鞣N坑刪除多次release然后pgdata沒刪干凈,默認(rèn)密碼一直登不上去订讼。
內(nèi)容太多注釋部分被我刪除了句占,仔細(xì)對(duì)照下

expose:
  type: nodePort
  tls:
    enabled: true
    certSource: secret
    auto:
      commonName: ""
    secret:
      secretName: "harbor-tls"
      notarySecretName: "harbor-tls"
.(不變)
.
.
  nodePort:
    name: harbor
    ports:
      http:
        port: 80
        nodePort: 30002
      https:
        port: 443
        nodePort: 30003
      notary:
        port: 4443
        nodePort: 30004
  loadBalancer:
.(不變)
.
.
externalURL: https://192.168.100.51:30003

internalTLS:
. (不變)
.
.

persistence:
  enabled: true
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      existingClaim: "harbor-registry"
      storageClass: "harbor"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 20Gi
    chartmuseum:
      existingClaim: "harbor-chartmuseum"
      storageClass: "harbor"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 5Gi
    jobservice:
      existingClaim: "harbor-jobservice"
      storageClass: "harbor"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 5Gi
    database:
      existingClaim: "harbor-database"
      storageClass: "harbor"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 5Gi
    redis:
      existingClaim: "harbor-redis"
      storageClass: "harbor"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 5Gi
    trivy:
      existingClaim: "harbor-trivy"
      storageClass: "harbor"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 5Gi
.(不變)
.

安裝harbor

①添加helm倉(cāng)庫(kù)

$ helm repo add harbor https://helm.goharbor.io

②部署harbor

helm install harbor harbor/harbor -f /etc/kubernetes/harbor/deployment_nodeport.yaml -n harbor

③查看是否部署完成

$ kubectl get deployment -n harbor

④訪問harbor
瀏覽器輸入地址(前面配置的externalURL)
默認(rèn)用戶:admin
默認(rèn)密碼:Harbor12345

服務(wù)器配置鏡像倉(cāng)庫(kù)

在Ubuntu上通過docker login訪問前面部署好的harbor時(shí)出錯(cuò)


圖片.png

①因此要讓docker信任我們的證書,為docker配置harbor證書
在/etc/docker目錄下創(chuàng)建certs.d 文件夾躯嫉,然后在 certs.d 文件夾下創(chuàng)建192.168.100.51:30003(IP:port)文件夾

$ mkdir -p /etc/docker/certs.d/192.168.100.51:30003

轉(zhuǎn)換tls.crt為tls.cert,供docker使用杨拐,Docker 守護(hù)進(jìn)程將.crt文件解釋為 CA 證書祈餐,將.cert文件解釋為客戶端證書。

$cd harbor_tls/
$sudo openssl x509 -inform PEM -in tls.crt -out tls.cert

將前面創(chuàng)建了HTTPS的證書ca.crt哄陶、tls.cert帆阳、tls.key證書復(fù)制到192.168.100.51:30003文件夾內(nèi)(每一臺(tái)docker主機(jī)都需要)

$sudo cp harbor_tls/ca.crt /etc/docker/certs.d/192.168.100.51\:30003/
$sudo cp harbor_tls/tls.key /etc/docker/certs.d/192.168.100.51\:30003/
$sudo cp harbor_tls/tls.cert /etc/docker/certs.d/192.168.100.51\:30003/
#重啟docker
$sudo systemctl daemon-reload
$sudo systemctl restart docker.service 

②讓系統(tǒng)信任我們的根證書(可選)
update-ca-certificates命令將PEM格式的根證書內(nèi)容附加到/etc/ssl/certs/ca-certificates.crt ,而/etc/ssl/certs/ca-certificates.crt 包含了系統(tǒng)自帶的各種可信根證書.

$sudo cp harbor_tls/tls.crt /usr/local/share/ca-certificates
$sudo update-ca-certificates

再次訪問harbor,成功登陸~快樂蜒谤!


圖片.png

參考文檔:【http://www.mydlq.club/article/66/#documentTop

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末山宾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鳍徽,更是在濱河造成了極大的恐慌资锰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阶祭,死亡現(xiàn)場(chǎng)離奇詭異绷杜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)濒募,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門鞭盟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瑰剃,你說(shuō)我怎么就攤上這事齿诉。” “怎么了晌姚?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵粤剧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我舀凛,道長(zhǎng)俊扳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任猛遍,我火速辦了婚禮馋记,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懊烤。我一直安慰自己梯醒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布腌紧。 她就那樣靜靜地躺著茸习,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壁肋。 梳的紋絲不亂的頭發(fā)上号胚,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音浸遗,去河邊找鬼猫胁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跛锌,可吹牛的內(nèi)容都是我干的弃秆。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼菠赚!你這毒婦竟也來(lái)了脑豹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衡查,失蹤者是張志新(化名)和其女友劉穎瘩欺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峡捡,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡击碗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了们拙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稍途。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砚婆,靈堂內(nèi)的尸體忽然破棺而出械拍,到底是詐尸還是另有隱情,我是刑警寧澤装盯,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布坷虑,位于F島的核電站,受9級(jí)特大地震影響埂奈,放射性物質(zhì)發(fā)生泄漏迄损。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一账磺、第九天 我趴在偏房一處隱蔽的房頂上張望芹敌。 院中可真熱鬧,春花似錦垮抗、人聲如沸氏捞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)液茎。三九已至,卻和暖如春辞嗡,著一層夾襖步出監(jiān)牢的瞬間捆等,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工续室, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栋烤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓猎贴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子她渴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容