• CauchyK零SK壹S

部署说明

1) 本文以 Harbor v2.10.2 为例。
2) 安装包已下载并解压至待安装机器。(安装包下载地址: https://github.com/goharbor/harbor/releases
3) 待部署服务器已安装好 docker 以及 docker-compose。

本文将介绍以下几种部署方式:
1) HTTP 模式部署
2) HTTPS 模式部署
3) 反向代理模式部署(nginx)

HTTP 模式部署

# 解压 harbor 安装包后,进入 harbor 目录
# 基于 harbor.yml.tmpl 创建 harbor.yml
cp harbor.yml.tmpl harbor.yml
# 注释掉 harbor.yml 中 https 相关配置。

./install.sh

验证

由于是 http 仓库,docker 使用时需要将仓库地址配置为 insecure-registries

HTTPS 模式部署

开启 TLS 认证需要在安装前准备好域名以及配套证书,本文以自签名证书为例。

自签名证书生成

假设 Harbor 部署完之后的访问域名是: hub.demo.local

创建证书文件目录

mkdir -p /etc/ssl/harbor/hub.demo.local
cd /etc/ssl/harbor/hub.demo.local

生成 CA 私钥

openssl genrsa -out ca.key 4096

生成 CA 证书

# 以下命令中的 -days 3650 表示证书有效期为 10 年
openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=MyPersonal Root CA" \
 -key ca.key \
 -out ca.crt

生成服务端证书私钥

openssl genrsa -out hub.demo.local.key 4096

生成服务端证书签名请求

# 注意 -subj 中 CN 设置为目标域名
openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=hub.demo.local" \
    -key hub.demo.local.key \
    -out hub.demo.local.csr

生成证书配置文件(x509 v3 extension file)

# 注意 alt_names 中域名和 ip 地址会被写入证书,请按规划及访问需求进行填写
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=hub.demo.local
DNS.2=hub.demo
IP.1=192.168.6.5
IP.2=192.168.6.6
EOF

生成 Harbor 服务端证书

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in hub.demo.local.csr \
    -out hub.demo.local.crt

基于 crt 证书文件创建 cert 证书文件 (For Docker)

openssl x509 -inform PEM -in ca.crt -out ca.cert
openssl x509 -inform PEM -in hub.demo.local.crt -out hub.demo.local.cert

部署 Harbor

填写配置文件

# 解压 harbor 安装包后,进入 harbor 目录
# 基于 harbor.yml.tmpl 创建 harbor.yml
cp harbor.yml.tmpl harbor.yml
# 注意 hostname 配置为目标域名,证书地址配置为实际生成的证书路径

执行安装

# 注意 安装前请确保机器已经安装了 docker 和 docker-compose
./install.sh

验证

# 添加 /etc/hosts (如果域名没有加入环境中的 dns)
# hub.demo.local  192.168.6.5

# 注意 使用自签名证书仓库有两种方式:
# 1. 将证书拷贝至 /etc/docker/certs.d 目录下 (需要使用该仓库的所有节点,都需要证书) 
#    cp -r /etc/ssl/harbor/hub.demo.local /etc/docker/certs.d
# 2. 将仓库地址在 /etc/docker/daemon.json 中设置为 insecure-registries

反向代理模式部署

本文以 nginx 部署反向代理为例。

如果 nginx 后端为开启 https 的 Harbor,则无法通过代理地址使用 Harbor 页面,但命令行可以正常使用。如果需要通过 nginx 代理地址访问 Harbor 页面,需要在安装 Harbor 时在 harbor.yml 中设置 external_url 为代理地址,但内外网所有请求都会被转发到代理地址。

nginx 示例配置:
server {
  listen 8080;
  # 开启 nginx ssl 认证
  # listen 9443 ssl;
  
  # server_name hub.demo.nginx
  
  # SSL 证书配置
  # 此处证书需适配 server_name ,不是安装 harbor 时生成的证书。可参考上文中生成自签证书步骤或通过其他渠道获取证书。 
  # ssl_certificate /etc/nginx/ssl/harbor.crt;
  # ssl_certificate_key /etc/nginx/ssl/harbor.key;
    
  # SSL 协议和加密套件配置
  # ssl_protocols TLSv1.2 TLSv1.3;
  # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  # ssl_prefer_server_ciphers off;
    
  # SSL 会话配置
  # ssl_session_timeout 1d;
  # ssl_session_cache shared:SSL:50m;
  # ssl_session_tickets off;
  
  location / {
    # 代理 http 模式部署的 Harbor
    proxy_pass http://192.168.6.5:80;
    
    # 代理 https 模式部署的 Harbor
    # proxy_pass https://hub.demo.local;
    # proxy_ssl_verify off;

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_buffering off;
    proxy_request_buffering off;

    client_max_body_size 0;
    chunked_transfer_encoding on;
  }
}

验证测试:
nginx 未开启 ssl

nginx 开启 ssl

  • cici 回复了此帖
    • 小kK零S

      感谢您的分享,这份详细的 Harbor 部署指南对社区成员来说非常有帮助!希望您继续贡献更多有价值的内容。

      14 天 后

      Cauchy 請問像是公司用內部Harbor是有網址的,也可以用一樣方式?
      如果在離線部署可以做到嗎

        • CauchyK零SK壹S

        cici
        离线环境用域名访问,需要把域名加到内部的dns服务器里或者配到客户端机器的 hosts 里。

        • cici 回复了此帖

          Cauchy
          如果在k8s時直接用的話該怎麼做呢?
          vi config-sample.yaml

          registry:
              type: harbor
              auths:
                "<我的harbor域名 http>":
                  username: <acc>
                  password: <pwd>
                  skipTLSVerify: true
              privateRegistry: "<我的harbor域名 http>"
              namespaceOverride: "<我的harbor namespace>"
              registryMirrors: []
              insecureRegistries: []

          這樣正確嗎?

            • CauchyK零SK壹S

            cici
            镜像仓库是http的,要在仓库设置里加上 plainHTTP: false, skipTLSVerify这个设置对于http的仓库没用

            cici http,insecureRegistries 应该要配一下

            5 天 后
            • 已编辑

            @Cauchy @sylvia 可協助看一下哪邊錯了嗎?

            apiVersion: kubekey.kubesphere.io/v1alpha2
            kind: Cluster
            metadata:
              name: sample
            spec:
              hosts:
              - {name: coverity-ms, address: 172.1.30.21, internalAddress: 172.1.30.21, user: userrrrrr, password: "pwddd"}
              roleGroups:
                etcd:
                - coverity-ms
                control-plane: 
                - coverity-ms
                worker:
                - coverity-ms
                registry:
                - coverity-ms
            
              controlPlaneEndpoint:
                ## Internal loadbalancer for apiservers 
                # internalLoadbalancer: haproxy
            
                domain: lb.kubesphere.local
                address: ""
                port: 6443
              kubernetes:
                version: v1.28.0
                clusterName: cluster.local
                autoRenewCerts: true
                containerManager: containerd
              etcd:
                type: kubekey
              network:
                plugin: calico
                kubePodsCIDR: 10.233.64.0/18
                kubeServiceCIDR: 10.233.0.0/18
                ## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
                multusCNI:
                  enabled: false
              registry:
                type: harbor
                auths:
                  "https://XXXXX.com":
                    username: user
                    password: "@pwd"
                    skipTLSVerify: true
                privateRegistry: "https://XXXXX.com"
                namespaceOverride: "kubesphereio"
                registryMirrors: []
                insecureRegistries: []
              addons: []

            錯誤訊息:

            13:40:38 CST [InstallRegistryModule] Generate harbor config
            13:40:38 CST [FATA] Failed to Parse Registry Auths configuration: [123 34 104 116 116 112 115 58 47 47 102 105 99 109 115 45 109 115 45 99 110 115 46 109 121 102 105 105 110 101 116 46 99 111 109 34 58 110 117 108 108 44 34 112 97 115 115 119 111 114 100 34 58 34 64 72 115 105 110 49 49 48 57 34 44 34 115 107 105 112 84 76 83 86 101 114 105 102 121 34 58 116 114 117 101 44 34 117 115 101 114 110 97 109 101 34 58 34 72 48 48 50 56 51 34 125]
            5 天 后

            有人可幫忙看問題嗎?

              klj890
              已解決,請問我這樣配完是不是就不用執行 ./kk init registry -f config-sample.yaml -a kubesphere.tar.gz了?

                • klj890K零S

                  cici

                  如果您已有可用的镜像仓库,可跳过此步骤。 注意这里

                    • klj890K零S

                      cici 认真读文档,按照文档一步一步来。

                      klj890
                      那想再請問下
                      這步也能跳過嗎?

                        • klj890K零S

                          cici 这里逻辑是,如果有仓库,跳过创建步骤;如果是新创建的镜像仓库或者仓库中没有需要library,就需要执行第四步(创建所需的目录),然后才能push镜像到仓库。

                          如果你是第一次安装(非生产环境),那就不要跳过,每一步都尝试执行