https://www.yuque.com/geray-alxoc/lay37c/tagodt06voffv1me?singleDoc# 《13-openssl签发harbor多域名证书》

1、架构

IP 角色
192.168.6.31 harbor1
192.168.6.32 harbor2

2、安装配置harbor(多态主机基本相同)

https://github.com/goharbor/harbor/releases

1、解压

  1. tar xf harbor-offline-installer-v2.4.1.tgz -C /opt
  2. ll /opt/harbor
  3. drwxr-xr-x 2 root root 4096 Dec 17 14:43 cert/
  4. -rw-r--r-- 1 root root 3361 Dec 16 12:22 common.sh
  5. -rw-r--r-- 1 root root 616006217 Dec 16 12:23 harbor.v2.4.1.tar.gz
  6. -rw-r--r-- 1 root root 8999 Dec 16 12:22 harbor.yml.tmpl
  7. -rwxr-xr-x 1 root root 2500 Dec 16 12:22 install.sh*
  8. -rw-r--r-- 1 root root 11347 Dec 16 12:22 LICENSE
  9. -rwxr-xr-x 1 root root 1881 Dec 16 12:22 prepare*

2、 安装docker-compose

https://github.com/docker/compose/releases

  1. curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  2. chmod +x /usr/local/bin/docker-compose
  3. docker-compose --version

4、配置并安装启动检查

  1. cp harbor.yml.tmpl harbor.yml

1、harbor.yml详解

https://goharbor.io/docs/2.0.0/install-config/configure-yml-file/#required-parameters

  1. # hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhost
  2. hostname: 192.168.6.31
  3. # HTTP相关配置(不要在生产环境中使用)
  4. http:
  5. port: 80 # HTTP 的端口号,用于 Harbor 门户和 Docker 命令。默认值为 80。
  6. # HTTPS相关配置(需要证书可以先注释)
  7. #https:
  8. # port: 443
  9. # certificate: /your/certificate/path # SSL 证书的路径。
  10. # private_key: /your/private/key/path # SSL 密钥的路径。
  11. # 取消一下注释,harbor组件之间将使用TLS通信
  12. # internal_tls:
  13. # # set enabled to true means internal tls is enabled
  14. # enabled: true
  15. # # put your cert and key files on dir
  16. # dir: /etc/harbor/tls/internal
  17. # 为 Harbor 系统管理员设置初始密码。该密码仅在Harbor 首次启动时使用。后续登录时,将忽略此设置,并在 Harbor Portal 中设置管理员密码。默认用户名和密码是admin和Harbor12345
  18. harbor_admin_password: Harbor12345
  19. # 使用本地 PostgreSQL 数据库。您可以选择配置外部数据库
  20. database:
  21. password: root123
  22. max_idle_conns: 100 # 空闲连接池中的最大连接数。如果设置为 <=0,则不保留空闲连接。默认值为 50。如果未配置,则值为 2。
  23. max_open_conns: 900 # 与数据库的最大打开连接数。如果 <= 0,则打开连接的数量没有限制。对于到 Harbor 数据库的最大连接数,默认值为 100。如果未配置,则值为 0。
  24. # 目标主机上存储 Harbor 数据的位置。即使删除和/或重新创建 Harbor 的容器,该数据也保持不变。
  25. data_volume: /opt/harbor/data
  26. # 配置 Trivy 扫描仪
  27. trivy:
  28. ignore_unfixed: false # 将标志设置为true仅显示已修复的漏洞。默认值为false
  29. skip_update: false
  30. insecure: false
  31. jobservice:
  32. max_job_workers: 10
  33. # 设置 web hook 作业的最大重试次数。默认值为 10。
  34. notification:
  35. webhook_job_max_retry: 10
  36. chart:
  37. absolute_url: disabled
  38. # 配置日志记录。Harbor 使用 `rsyslog` 来收集每个容器的日志。
  39. log:
  40. level: info
  41. local:
  42. rotate_count: 50
  43. rotate_size: 200M
  44. location: /var/log/harbor
  45. _version: 2.4.0
  46. # 配置要由 Clair、复制作业服务和 Harbor 使用的代理。
  47. proxy:
  48. http_proxy:
  49. https_proxy:
  50. no_proxy:
  51. components:
  52. - core
  53. - jobservice
  54. - trivy

2、安装启动

  1. mkdir /opt/harbor/data
  2. ./install.sh

3、检查并登陆控制台访问

  1. docker-compose ps
  2. Name Command State Ports
  3. -----------------------------------------------------------------------------------------------------------------
  4. harbor-core /harbor/entrypoint.sh Up (health: starting)
  5. harbor-db /docker-entrypoint.sh 96 13 Up (health: starting)
  6. harbor-jobservice /harbor/entrypoint.sh Up (health: starting)
  7. harbor-log /bin/sh -c /usr/local/bin/ ... Up (health: starting) 127.0.0.1:1514->10514/tcp
  8. harbor-portal nginx -g daemon off; Up (health: starting)
  9. nginx nginx -g daemon off; Up (health: starting) 0.0.0.0:80->8080/tcp,:::80->8080/tcp
  10. redis redis-server /etc/redis.conf Up (health: starting)
  11. registry /home/harbor/entrypoint.sh Up (health: starting)
  12. registryctl /home/harbor/start.sh Up (health: starting)

5、设置开机自启动

  1. vim harbor-enable.sh
  2. #!/bin/bash
  3. cd /opt/harbor
  4. docker-compose start
  5. # 赋权
  6. chmod +x harbor-enable.sh
  7. # 追加自启动脚本
  8. echo "/bin/bash /opt/harbor/harbor-enable.sh" >> /etc/rc.local

3、基本使用

  1. # 关闭harbor
  2. docker-compose down -v
  3. # 启动harbor
  4. docker-compose up -d

1、登陆控制台并新建项目

  • admin/Harbor12345

Harbor高可用集群搭建 - 图1

2、配置daemon.json并上传镜像

1、登陆仓库并上传镜像

  1. docker login -u admin -p Harbor12345 http://127.0.0.1
  2. WARNING! Using --password via the CLI is insecure. Use --password-stdin.
  3. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  4. Configure a credential helper to remove this warning. See
  5. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  6. Login Succeeded

2、上传镜像

  1. docker pull busybox
  2. docker tag busybox:latest 127.0.0.1/test/busybox:latest
  3. # 推送镜像
  4. docker push 127.0.0.1/test/busybox:latest

Harbor高可用集群搭建 - 图2

4、高可用实现

Harbor支持基于策略的Docker镜像复制功能,这类似于MySQL的主从同步,其可以实现不同的数据中
心、不同的运行环境之间同步镜像,并提供友好的管理界面,大大简化了实际运维中的镜像管理工作,
已经有用很多互联网公司使用harbor搭建内网docker仓库的案例,并且还有实现了双向复制功能

1、第二台主机上搭建Harbor

参照上述步骤,在第二台主机上搭建Harbor
  1. scp -r /opt/harbor/ 192.168.6.32:/opt/
  2. scp /usr/local/bin/docker-compose 192.168.6.32:/usr/local/bin/
  • 修改harbor.yml中的IP
  • 删除/opt/harbor/data中的内容:rm -rf /opt/harbor/data/*

2、第二台harbor上新建项目

参考第一台harbor服务器的项目名称,在第二台harbor服务器上新建与之同名的项目
Harbor高可用集群搭建 - 图3 ## 3、第二台harbor上仓库管理中新建目标 参考第一台主机信息,新建复制(同步)目标信息,将第一台主机设为复制的目标
  • 输入第一台harbor服务器上的主机和用户信息

Harbor高可用集群搭建 - 图4

4、第二台harbor上新建复制规则实现到第一台harbor的单向复制

在第二台harbor上建立复制的目标主机,即第一台harbor主机,将第二台harbor上面的镜像复制到第一台harbor上

Harbor高可用集群搭建 - 图5

1、复制

Harbor高可用集群搭建 - 图6

Harbor高可用集群搭建 - 图7

5、在第一台harbor主机上重复上面操作

以上操作,只是实现了从第二台harbor主机192.168.6.32到第一台harbor主机192.168.6.31的单向同步 在第一台harbor上再执行下面操作,才实现双向同步

1、配置仓库管理(同上)

Harbor高可用集群搭建 - 图8

2、配置复制管理(同上)

Harbor高可用集群搭建 - 图9

5、配置HTTPS证书

1、配置证书

https://goharbor.io/docs/2.0.0/install-config/configure-https/

1、生成证书颁发机构证书

1、生成 CA 证书私钥。

  1. mkdir /opt/harbor/cert
  2. cd /opt/harbor/cert
  3. openssl genrsa -out ca.key 4096

2、生成 CA 证书。

调整-subj选项中的值以反映您的组织。如果使用 FQDN 连接 Harbor 主机,则必须将其指定为公用名 ( CN) 属性。
  1. openssl req -x509 -new -nodes -sha512 -days 3650 \
  2. -subj "/C=GS/ST=LZ/L=LZ/O=geray/OU=geray/CN=harbor.geray.com" \
  3. -key ca.key \
  4. -out ca.crt

CN=commonName 通用名

OU=organizationUnit 组织部门名

O=organizationName 组织名

L=localityName 地址

S=stateName 州名

C=country 城市名

-validity 3650 3650为自己定义证书的有效期,单位为天

2、生成服务器证书

证书通常包含一个.crt文件和一个.key文件

1、生成私钥。

  1. openssl genrsa -out harbor.geray.com.key 4096

2、生成证书签名请求 (CSR)。

调整-subj选项中的值以反映您的组织。如果使用 FQDN 连接 Harbor 主机,则必须将其指定为公用名 ( CN) 属性并在密钥和 CSR 文件名中使用它。
  1. openssl req -sha512 -new \
  2. -subj "/C=GS/ST=LZ/L=LZ/O=geray/OU=geray/CN=harbor.geray.com" \
  3. -key harbor.geray.com.key \
  4. -out harbor.geray.com.csr
  • 如果是ip访问, 将 harbor.geray.com 改成 ip地址

3、生成 x509 v3 扩展文件。

无论您是使用 FQDN 还是 IP 地址连接到您的 Harbor 主机,您都必须创建此文件,以便为您的 Harbor 主机生成符合主题备用名称 (SAN) 和 x509 v3 的证书扩展要求。替换DNS条目以反映您的域。
  1. cat > v3.ext <<-EOF
  2. authorityKeyIdentifier=keyid,issuer
  3. basicConstraints=CA:FALSE
  4. keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
  5. extendedKeyUsage = serverAuth
  6. subjectAltName = @alt_names
  7. [alt_names]
  8. DNS.1=harbor.geray.com
  9. DNS.2=harbor.geray
  10. DNS.3=k8s-master-1
  11. DNS.4=k8s-node-1
  12. EOF
  • 如果是ip访问
  1. cat > v3.ext <<-EOF
  2. authorityKeyIdentifier=keyid,issuer
  3. basicConstraints=CA:FALSE
  4. keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
  5. extendedKeyUsage = serverAuth
  6. subjectAltName = IP:192.168.6.31
  7. EOF

4、使用该v3.ext文件为您的 Harbor 主机生成证书。

geray.comCRS 和 CRT 文件名中的 替换为 Harbor 主机名。
  1. openssl x509 -req -sha512 -days 3650 \
  2. -extfile v3.ext \
  3. -CA ca.crt -CAkey ca.key -CAcreateserial \
  4. -in harbor.geray.com.csr \
  5. -out harbor.geray.com.crt

3、向 Harbor 和 Docker 提供证书

生成后ca.crtyourdomain.com.crtyourdomain.com.key文件,必须将它们提供给harbor和docker,和重新配置港使用它们。

1、将服务器证书和密钥复制到 Harbor 主机上的 certficates 文件夹中。

  1. mkdir /opt/harbor/tls/
  2. cp harbor.geray.com.crt /opt/harbor/tls/
  3. cp harbor.geray.com.key /opt/harbor/tls/

2、转换yourdomain.com.crtyourdomain.com.cert,供 Docker 使用。

  1. openssl x509 -inform PEM -in harbor.geray.com.crt -out harbor.geray.com.cert

3、将服务器证书、密钥和 CA 文件复制到 Harbor 主机上的 Docker 证书文件夹中。您必须首先创建适当的文件夹。

  1. mkdir /etc/docker/certs.d/harbor.geray.com -p
  2. cp harbor.geray.com.cert /etc/docker/certs.d/harbor.geray.com
  3. cp harbor.geray.com.key /etc/docker/certs.d/harbor.geray.com
  4. cp ca.crt /etc/docker/certs.d/harbor.geray.com
  • 如果您将默认nginx端口 443映射到其他端口,请创建文件夹/etc/docker/certs.d/yourdomain.com:port/etc/docker/certs.d/harbor_IP:port

4、重启 Docker 引擎。

  1. systemctl restart docker

注意:3、4、5步骤不要做

5、证书的目录结构

  1. tree /etc/docker/certs.d/
  2. /etc/docker/certs.d/
  3. └── harbor.geray.com
  4. ├── ca.crt
  5. ├── harbor.geray.com.cert
  6. └── harbor.geray.com.key

4、部署或重新配置Harbor

1、配置harbor.yml

  1. https:
  2. port: 443
  3. certificate: /opt/harbor/tls/harbor.od.com.crt
  4. private_key: /opt/harbor/tls/harbor.od.com.key
  5. external_url: https://harbor.od.com # 启用代理后将不再使用主机名
  6. # 取消一下注释,harbor组件之间将使用TLS通信
  7. internal_tls:
  8. # set enabled to true means internal tls is enabled
  9. enabled: true
  10. # put your cert and key files on dir
  11. dir: /opt/harbor/tls

2、运行prepare脚本以启用HTTPS

  1. ./prepare

错误排查

Harbor高可用集群搭建 - 图10

3、如果Harbor正在运行,请停止并删除现有实例

  • 您的图像数据保留在文件系统中,因此不会丢失任何数据
  1. docker-compose down -v

4、重启

  1. docker-compose up -d

5、访问验证