確認作業系統版本
[root@linuxfdc ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
禁用防火牆和Selinux
禁用防火牆、更新SElinux。
確保cfssl工具已經安裝
安裝證書管理工具cfssl。
安裝Docker、Docker Compose
安裝Docker,安裝DockerCompose。
準備安裝包下載最新穩定版:https://github.com/goharbor/harbor/releases/download/v2.1.0/harbor-offline-installer-v2.1.0.tgz
準備自籤名證書X.509證書包含三個文件:key,csr,crt:
csr
Certificate SigningRequest,即證書籤名請求,這個並不是證書,而是向權威證書頒發機構獲得籤名證書的申請,用於提交給證書頒發機構(CA)對證書進行籤名的;其核心內容是一個公鑰(當然還附帶了一些別的信息),在生成這個申請的時候,同時也會生成一個私鑰,私鑰要自己保管好。
key
是伺服器上的私鑰文件,用於對發送給客戶端數據的加密,以及對從客戶端接收到數據的解密。
crt
是由證書頒發機構(CA)籤名後的證書,或者是開發者自籤名的證書,包含證書持有人的信息,持有人的公鑰,以及籤署者的籤名等信息。
創建證書存放目錄mkdir -pv /root/harbor/cert
cd /root/harbor/cert
根據自己的需要自定義ca-config.json,修改為如下配置:
[kevin@linuxfdc cert]$ cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"harbor": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
EOF
這個策略,有一個default默認的配置,和一個profiles,profiles可以設置多個profile,這裡的profile是harbor。
default
默認策略,指定了證書的默認有效期是一年(8760h);
harbor
表示該配置(profile)的用途是為harbor生成證書及相關的校驗工作;
signing
表示該證書可用於籤名其它證書;生成的ca.pem證書中CA=TRUE;
server auth
表示可以該CA對server提供的證書進行驗證;
client auth
表示可以用該CA對client提供的證書進行驗證;
expiry
也表示過期時間,如果不寫以default中的為準。
生成自籤CA證書請求文件[root@K8S-HARBOR cert]# cat > ca-csr.json << EOF
{
"CN": "harbor.cluster.local",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"C": "CN",
"ST": "Shaanxi",
"L": "Xi'an",
"O": "Harbor",
"OU": "Harbor Security"
}]
}
EOF
參數介紹:
CN
Common Name,瀏覽器使用該欄位驗證網站是否合法,一般寫的是域名。
hosts
表示哪些主機名(域名)或者IP可以使用此csr申請的證書,為空或者""表示所有的都可以使用;
O: Organization Name,組織名稱,公司名稱(在K8S中常用於指定Group,進行RBAC綁定)OU: Organization Unit Name,組織單位名稱,公司部門生成自籤名證書[root@K8S-HARBOR cert]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
2020/09/08 16:38:48 [INFO] generating a new CA key and certificate from CSR
2020/09/08 16:38:48 [INFO] generate received request
2020/09/08 16:38:48 [INFO] received CSR
2020/09/08 16:38:48 [INFO] generating key: rsa-2048
2020/09/08 16:38:49 [INFO] encoded CSR
2020/09/08 16:38:49 [INFO] signed certificate with serial number 262743830065161790985636603005551175222856124160
[root@K8S-HARBOR cert]# ll
total 24
-rw-r--r-- 1 10000 kevin 310 Sep 8 16:30 ca-config.json
-rw-r--r-- 1 root root 1029 Sep 18 15:18 ca.csr
-rw-r--r-- 1 10000 kevin 246 Sep 18 15:15 ca-csr.json
-rw-- 1 root root 1679 Sep 18 15:18 ca-key.pem
-rw-r--r-- 1 root root 1411 Sep 18 15:18 ca.pem
該命令會生成運行CA所必需的文件ca-key.pem(私鑰)和ca.pem(證書),還會生成ca.csr(證書籤名請求),用於交叉籤名或重新籤名。
將ca.pem轉換為ca.crt[root@K8S-HARBOR cert]# openssl x509 -outform der -in ca.pem -out ca.crt
[root@K8S-HARBOR cert]# cat > harbor-csr.json << EOF
{
"CN": "harbor.cluster.local",
"hosts": [
"local",
"cluster.local",
"harbor.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"C": "CN",
"ST": "Shaanxi",
"L": "Xi'an",
"O": "Harbor",
"OU": "Harbor Security"
}]
}
EOF
[root@K8S-HARBOR cert]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=harbor harbor-csr.json | cfssljson -bare harbor
2020/09/18 15:38:18 [INFO] generate received request
2020/09/18 15:38:18 [INFO] received CSR
2020/09/18 15:38:18 [INFO] generating key: rsa-2048
2020/09/18 15:38:19 [INFO] encoded CSR
2020/09/18 15:38:19 [INFO] signed certificate with serial number 160381788685832694502009193205750931266964565823
2020/09/18 15:38:19 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
[root@K8S-HARBOR cert]# ll
total 40
-rw-r--r-- 1 10000 kevin 310 Sep 8 16:30 ca-config.json
-rw-r--r-- 1 root root 1002 Sep 18 15:21 ca.crt
-rw-r--r-- 1 root root 1029 Sep 18 15:18 ca.csr
-rw-r--r-- 1 10000 kevin 246 Sep 18 15:15 ca-csr.json
-rw-- 1 root root 1679 Sep 18 15:18 ca-key.pem
-rw-r--r-- 1 root root 1411 Sep 18 15:18 ca.pem
-rw-r--r-- 1 root root 1127 Sep 18 15:38 harbor.csr
-rw-r--r-- 1 10000 kevin 341 Sep 18 15:15 harbor-csr.json
-rw-- 1 root root 1679 Sep 18 15:38 harbor-key.pem
-rw-r--r-- 1 root root 1525 Sep 18 15:38 harbor.pem
查看cert(證書信息)
[root@K8S-HARBOR cert]# cfssl certinfo -cert harbor.pem
查看CSR(證書籤名請求)信息
[root@K8S-HARBOR cert]# cfssl certinfo -csr harbor.csr
部署Harbor不建議在Harbor上啟用https,而是在將Harbor放置到一個LB的後邊,配置LB的SSL訪問,並在LB上做SSLtermination。
解壓[root@K8S-HARBOR ~]# tar -vxf harbor-offline-installer-v2.1.0.tgz -C /root/
[root@K8S-HARBOR harbor]# cp harbor.yml.tmpl harbor.yml
修改harbor.yml裡hostname、certificate、private_key、data_volume等參數:
# Configuration file of Harbor
# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: harbor.cluster.local #修改主機名
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /root/harbor/cert/harbor.pem #修改證書地址
private_key: /root/harbor/cert/harbor-key.pem #修改證書地址
...
# The default data volume
data_volume: /data/apps/harbor #修改數據存放目錄
...
Load鏡像
[root@K8S-HARBOR harbor]# docker load -i harbor.v2.1.0.tar.gz
生成docker-compose.yml配置文件,增加其他功能
[root@K8S-HARBOR harbor]# ./prepare --with-clair --with-notary --with-trivy --with-chartmuseum
#--with-clair 鏡像安全掃描插件
#--with_notary 內容信任(鏡像籤名)插件
#--with-trivy 鏡像漏洞檢測插件
#--with-chartmuseum Chart倉庫服務
啟動Harbor
docker-compose up -d
查看日誌
Harbor採用的是Log Driver是syslog,所以產生的日誌目錄為:
/var/log/harbor/
下面操作需要在訪問harbor.cluster.local的節點上執行,以K8S-PROD-M1節點為例展示。
配置證書因為我們配置使用的是自籤名的證書,因此需要將前面生成的CA證書拷貝到需要訪問Harbor倉庫的每個Docker主機的/etc/docker/certs.d/{registry-hostname}/下。
創建證書存放目錄
[root@K8S-PROD-M1 ~]# mkdir -p /etc/docker/certs.d/harbor.cluster.local
獲取自籤證書
[root@K8S-PROD-M1 ~]# scp root@192.168.122.90:/root/harbor/cert/ca.pem /etc/docker/certs.d/harbor.cluster.local/
[root@K8S-PROD-M1 ~]# vi /etc/hosts
...
# 添加Harbor域名解析
192.168.122.90 harbor.cluster.local
vi /etc/docker/daemon.json
{
"insecure-registries": ["harbor.cluster.local"]
}
[root@K8S-PROD-M1 ~]# systemctl reload docker && systemctl status docker
默認管理員帳戶:admin/Harbor12345.
[kevin@linuxfdc ~]$ docker login harbor.cluster.local
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /home/kevin/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
NAT配置
iptables -t nat -A PREROUTING -m tcp -p tcp -d 192.168.191.32 --dport 8080 -j DNAT --to-destination 192.168.122.90:80
iptables -t nat -A PREROUTING -m tcp -p tcp -d 192.168.191.32 --dport 8443 -j DNAT --to-destination 192.168.122.90:443
訪問Harbor UI
默認管理員帳戶:admin/Harbor12345.
https://harbor.cluster.local