部署准备
环境准备
- 确认操作系统版本
[root@linuxfdc ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
- 禁用防火墙和Selinux
禁用防火墙、更新SElinux。
- 确保cfssl工具已经安装
安装证书管理工具cfssl。
- 安装Docker、Docker Compose
安装Docker,安装Docker Compose。
准备安装包
下载最新稳定版:https://github.com/goharbor/harbor/releases/download/v2.1.0/harbor-offline-installer-v2.1.0.tgz
准备自签名证书
X.509证书包含三个文件:key,csr,crt:
- csr
Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,用于提交给证书颁发机构(CA)对证书进行签名的;其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好。
- key
是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密。
- crt
是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息。
创建证书存放目录
mkdir -pv /root/harbor/certcd /root/harbor/cert
生成自签CA证书配置文件
根据自己的需要自定义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,浏览器使用该字段验证网站是否合法,一般写的是域名。
- key
生成证书的算法;
- hosts
表示哪些主机名(域名)或者IP可以使用此csr申请的证书,为空或者""表示所有的都可以使用;
- names
一些其它的属性:
- C: Country,国家
- ST: State,州或者是省份
- L: Locality Name,地区,城市
- 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 CSR2020/09/08 16:38:48 [INFO] generate received request2020/09/08 16:38:48 [INFO] received CSR2020/09/08 16:38:48 [INFO] generating key: rsa-20482020/09/08 16:38:49 [INFO] encoded CSR2020/09/08 16:38:49 [INFO] signed certificate with serial number 262743830065161790985636603005551175222856124160[root@K8S-HARBOR cert]# lltotal 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
- .crt:是用于存放证书,它是2进制形式存放的,不含私钥。
- .pem:跟crt的区别是它以ASCII来表示的,可查看。
生成harbor.cluster.local证书请求文件
[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
生成harbor.cluster.local证书
[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 harbor2020/09/18 15:38:18 [INFO] generate received request2020/09/18 15:38:18 [INFO] received CSR2020/09/18 15:38:18 [INFO] generating key: rsa-20482020/09/18 15:38:19 [INFO] encoded CSR2020/09/18 15:38:19 [INFO] signed certificate with serial number 1603817886858326945020091932057509312669645658232020/09/18 15:38:19 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable forwebsites. For more information see the Baseline Requirements for the Issuance and Managementof 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]# lltotal 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上做SSL termination。
解压
[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_vo
lume等参数:
# 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 confighttp: # port for http, default is 80. If https enabled, this port will redirect to https port port: 80# https related confighttps: # 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 volumedata_volume: /data/apps/harbor #修改数据存放目录...
安装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
下面操作需要在访问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
...
192.168.122.90 harbor.cluster.local
**更新Docker配置**
vi /etc/docker/daemon.json
{
"insecure-registries": ["harbor.cluster.local"]
}
[root@K8S-PROD-M1 ~]# systemctl reload docker && systemctl status docker
**Docker Client访问**默认管理员账户: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
**Harbor UI测试访问*** 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:80iptables -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