Harbor的部署

Harbor官方文档

Harbor Github仓库

Harbor 入门指南-腾讯云开发者社区-腾讯云 (tencent.com)

配置

  • 服务器:腾讯云
  • Linux版本:Linux VM-4-12-centos 3.10.0-1160.90.1.el7.x86_64
  • Docker:Docker version 24.0.5, build ced0996
  • Docker-Comose:docker-compose version 1.24.1, build 4667896b

下载Harbor离线安装包

Harbor Github Releases

解压后的目录如下

harbor
├── common.sh # 通用命令,使用install.sh驱动
├── harbor.v2.7.3.tar.gz
├── harbor.yml.tmpl # 配置模板
├── install.sh # 安装脚本
├── LICENSE
└── prepare

OpenSSL自签证书

为了保证Harbor的安全性,我们需要为Harbor配置一个SSL证书以保证安全,防止黑客篡改

使用可信证书颁发机构(CA)签发的证书,要么1年需要换一次,要么3个月需要续签名一次。可是我们的Harbor启动后,除非有安全漏洞,否则启动后,可能几年都不会做一次变更。这个时候,怎么办呢?

我们使用OpenSSL自签名证书,不过浏览器不信任这种证书,用户在首次访问时会收到安全警告

创建目录

存放生成的证书

mkdir /root/cert
cd /root/cert/

生成CA证书

生成CA密钥

openssl genrsa -out ca.key 4096
  • genrsa:表示要生成一个 RSA 密钥对。
  • -out ca.key:指定生成的私钥将保存在名为 ca.key 的文件中。
  • 4096:表示生成的 RSA 私钥使用 4096 位的密钥长度。

生成CA证书

openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Chongqing/L=Chongqing/O=Redrock/OU=Personal/CN=harbor.yiiong.top" \
-key ca.key \
-out ca.crt
  • -x509:表示生成自签名的 X.509 格式证书。

  • -new:表示生成一个新的证书请求。

  • -nodes:表示生成的私钥不加密。

  • -sha512:表示使用 SHA-512 算法进行签名。

  • -days 3650:表示证书的有效期为 3650 天(大约 10 年)。

  • -subj "/C=CN/ST=Chongqing/L=Chongqing/O=Redrock/OU=Personal/CN=harbor.yiiong.top":设置证书的 Subject 字段信息,包括国家(C=CN)、省份(ST=Chongqing)、城市(L=Chongqing)、组织(O=Redrock)、组织单位(OU=Personal)和通用名称(CN=harbor.yiiong.top)。

  • -key ca.key:指定使用之前生成的 ca.key 文件作为证书的私钥。

  • -out ca.crt:指定生成的证书将保存在名为 ca.crt 的文件中。

    .crt (Certificate).crt 文件是数字证书文件的扩展名,用于存储证书的内容。证书通常用于建立安全连接,并验证服务器(或客户端)的身份和信任

生成Server证书

生成 Server 证书私钥

# 生成密钥
openssl genrsa -out server.key 4096

生成Server证书签名请求(CSR)

openssl req -sha512 -new \
-subj "/C=CN/ST=Chongqing/L=Chongqing/O=Redrock/OU=Personal/CN=harbor.yiiong.top" \
-key server.key \
-out server.csr
  • -out server.csr:指定生成的证书签名请求将保存在名为 server.csr 的文件中。

    .csr (Certificate Signing Request).csr 文件用于向证书颁发机构(CA)提交请求,申请签发数字证书。

生成 x509 v3 证书扩展文件

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor.yiiong.top
DNS.2=hostname
EOF

v3.ext 可以被用于在签署证书时指定证书的一些属性和要求,比如证书的用途、适用主题名称等。通常用于构建自签名证书或配置 CA 签发证书时的扩展属性。

使用 CA 证书签发 Server 证书

openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in server.csr \
-out server.crt
  • -extfile v3.ext:指定了存储证书扩展信息的文件 v3.ext
  • -CA ca.crt:指定了 CA 证书文件 ca.crt,用于签署服务器证书。
  • -CAkey ca.key:指定用于签署证书的 CA 私钥文件 ca.key
  • -CAcreateserial:表示自动生成一个序列号文件,用于签署的证书。
  • -in server.csr:表示输入待签署的服务器证书签名请求文件 server.csr
  • -out server.crt:表示输出签署的服务器证书文件为 server.crt

一共有如下这些

[root@VM-4-12-centos harbor]# cd /root/cert
[root@VM-4-12-centos cert]# ll
总用量 28
-rw-r--r-- 1 root root 2045 12月 30 23:32 ca.crt
-rw-r--r-- 1 root root 3247 12月 30 23:32 ca.key
-rw-r--r-- 1 root root 17 12月 30 23:39 ca.srl
-rw-r--r-- 1 root root 2094 12月 30 23:39 server.crt
-rw-r--r-- 1 root root 1712 12月 30 23:38 server.csr
-rw-r--r-- 1 root root 3243 12月 30 23:32 server.key
-rw-r--r-- 1 root root 248 12月 30 23:35 v3.ext

image-20240321225956058

为 Harbor 和 Docker 配置证书

将 server 证书和密钥复制到 Harbor 主机上的 /data/cert 目录中

mkdir -p /data/cert
cp server.crt /data/cert/
cp server.key /data/cert/

转换 server.crt 为 server.cert

.crt 和 .cert 本质上没有区别,并且通常可以互换使用。为什么还要把.crt转为.cert呢?因为Docker 客户端默认将文件名 .cert 视为客户端证书.

openssl x509 -inform PEM -in server.crt -out server.cert

将 server 证书,密钥和 CA 证书复制到 Harbor 主机上的 Docker 证书目录中

mkdir -p /etc/docker/certs.d/harbor.yiiong.top:8443
cp server.key /etc/docker/certs.d/harbor.yiiong.top:8443
cp server.cert /etc/docker/certs.d/harbor.yiiong.top:8443
cp ca.crt /etc/docker/certs.d/harbor.yiiong.top:8443

查看 Docker 证书目录文件

[root@VM-4-12-centos harbor.yiiong.top:8443]# ll
总用量 12
-rw-r--r-- 1 root root 2045 12月 30 23:42 ca.crt
-rw-r--r-- 1 root root 2094 12月 30 23:41 server.cert
-rw-r--r-- 1 root root 3243 12月 30 23:41 server.key

重启Docker

systemctl restart docker

初始化Harbor

将模板复制一份

cp harbor.yml.tmpl harbor.yml

harbor.yml中修改如下的参数

  • hostname:Harbor的访问地址,最好写ip
  • https/port:对外暴露8443端口,记得放行8443端口
  • https/certificate: 使用宿主机的SSL证书文件。也就是.crt的位置
  • https/certificate: 使用宿主机的SSL证书文件,是.key的位置

image-20231230235823077

安装

./install.sh

访问

https访问,并且加上8443端口号

登录

/etc/docker/daemon.json中加入Harbor仓库地址以允许 Docker 客户端连接到该不安全的注册表而不进行证书验证。

{
"insecure-registries":["https://harbor.yiiong.top:8443"]
}

更改配置的操作

使用 prepare 脚本生成 HTTPS 配置

./prepare

删除原有 Harbor 容器

docker-compose down -v

重新启动 Harbor

docker-compose up -d

问题与解决

1.出现

root@master2:~# docker login https://harbor.yiiong.top:8443
Username: admin
Password:
Error response from daemon: Get "https://harbor.yiiong.top:8443/v2/": Get "https://172.20.14.31:8443/service/token?account=admin&client_id=docker&offline_token=true&service=harbor-registry": tls: failed to verify certificate: x509: cannot validate certificate for 172.20.14.31 because it doesn't contain any IP SANs

原因: /etc/docker/daemon.json中没有更新 Harbor 注册表的证书配置,我们只需要把Harbor地址添加到 Docker 的不安全注册表列表中,允许 Docker 客户端连接到该不安全的注册表而不进行证书验证。

1.出现Error response from daemon: failed to create task for container: failed to initialize logging driver: dial tcp [::1]:1514: connect: connection refused

取消rsyslog.conf文件第19,20行注释,并将514改为1514

vim /etc/rsyslog.conf

# 取消注释并修改
$ModLoad imtcp
$InputTCPServerRun 1514

harbor

# 重启rsyslog
systemctl restart rsyslog.service

2.出现Error response from daemon: driver failed programming external connectivity on endpoint nginx (191f6b9a13a1d60e6f9656c7f8030be35bcd96395c524f8fc4af5c83e2b45f26): Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use

修改harbor.yml中的http/port为没有占用的端口即可,然后记得放行端口

Kubernetes的部署

Kubernetes部署 – Yiiong’s blog (bearxiong2003.xyz)