目录

    在之前的文章 使用 Helm 安装 harbor 中,我已经详细描述了安装 Ingress 、Harbor ,最后成功推送镜像的步骤。其中的域名是公网可以访问的,证书是认证机构签发的。但是在内网环境下,我们需要使用内网域名进行访问。本文主要解决使用自签证书通过 Https 访问 Harbor 的问题。

    1. 生成自签证书

    这里以 *.harbor.dev.chenshaowen.com 域名为例。

    1.1 创建 CA 证书

    • 生成 CA 证书私钥
    openssl genrsa -out ca.key 4096
    
    • 生成 CA 证书
    openssl req -x509 -new -nodes -sha512 -days 3650 \
     -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=dev.chenshaowen.com" \
     -key ca.key \
     -out ca.crt
    

    1.2 创建域名证书

    • 生成私钥
    openssl genrsa -out harbor.dev.chenshaowen.com.key 4096
    
    • 生成证书签名请求 CSR
    openssl req -sha512 -new \
        -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=*.harbor.dev.chenshaowen.com" \
        -key harbor.dev.chenshaowen.com.key \
        -out harbor.dev.chenshaowen.com.csr
    
    • 生成 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.dev.chenshaowen.com
    DNS.2=*.harbor.dev.chenshaowen.com
    DNS.3=hostname
    EOF
    
    • 创建 Harbor 访问证书
    openssl x509 -req -sha512 -days 3650 \
        -extfile v3.ext \
        -CA ca.crt -CAkey ca.key -CAcreateserial \
        -in harbor.dev.chenshaowen.com.csr \
        -out harbor.dev.chenshaowen.com.crt
    
    • 将 crt 转换为 cert ,以供 Docker 使用
    openssl x509 -inform PEM -in harbor.dev.chenshaowen.com.crt -out harbor.dev.chenshaowen.com.cert
    

    最终在目录下得到如下文件:

    ls
    
    ca.crt  ca.key  ca.srl  harbor.dev.chenshaowen.com.cert  harbor.dev.chenshaowen.com.crt  harbor.dev.chenshaowen.com.csr  harbor.dev.chenshaowen.com.key  v3.ext
    

    2. 部署 Harbor

    • 安装 Ingress Controller
    helm install --name nginx-ingress --set "rbac.create=true,controller.service.externalIPs[0]=192.168.13.20" stable/nginx-ingress
    
    • 创建 Namespace
    kubectl create ns harbor
    
    • 创建证书秘钥
    kubectl create secret tls harbor.dev.chenshaowen.com --key harbor.dev.chenshaowen.com.key --cert harbor.dev.chenshaowen.com.crt -n harbor
    
    • 添加 Chart 库
    helm repo add harbor https://helm.goharbor.io
    helm repo update
    
    • 安装 Harbor
    helm install --name harbor --namespace harbor harbor/harbor \
      --set expose.ingress.hosts.core=core.harbor.dev.chenshaowen.com \
      --set expose.ingress.hosts.notary=notary.harbor.dev.chenshaowen.com \
      --set expose.tls.secretName=harbor.dev.chenshaowen.com \
      --set persistence.enabled=true \
      --set externalURL=https://core.harbor.dev.chenshaowen.com \
      --set harborAdminPassword=Harbor12345
    

    如果没有默认的 storageClass 可以将 persistence.enabled 设置为 false ,不使用持久化存储。

    如果需要使用持久化存储可以参考文档,使用 StorageClass 提供 PV 动态存储

    3. 配置及使用

    3.1 页面访问

    配置 hosts 之后,通过 https://core.harbor.dev.chenshaowen.com 访问:

    这是因为自签的证书不被信任。我们需要将 harbor.dev.chenshaowen.com.crt 证书导入系统,下面以 OS X 系统为例:

    将证书保存一份到本地,拖拽到 Keychain 中,然后双击证书,设置为 Always Trust 。如下图:

    再次访问时,就可以正常打开页面登陆。

    3.2 Docker 访问

    • 将拷贝证书至 Docker 的证书配置目录
    mkdir -p /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/
    cp harbor.dev.chenshaowen.com.cert /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/
    cp harbor.dev.chenshaowen.com.key /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/
    cp ca.crt /etc/docker/certs.d/core.harbor.dev.chenshaowen.com/
    

    这里的 core.harbor.dev.chenshaowen.com 目录一定要与服务保持一致,如果有端口,也应该用 : 连接带上。

    • 登陆 core.harbor.dev.chenshaowen.com
    docker login core.harbor.dev.chenshaowen.com -u admin
    
    Password:
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    
    
    • 推送镜像
    docker tag nginx core.harbor.dev.chenshaowen.com/library/nginx
    
    docker push  core.harbor.dev.chenshaowen.com/library/nginx
    
    The push refers to repository [core.harbor.dev.chenshaowen.com/library/nginx]
    be91fceb796e: Pushed
    919b6770519b: Pushed
    b60e5c3bcef2: Pushed
    latest: digest: sha256:6b3b6c113f98e901a8b1473dee4c268cf37e93d72bc0a01e57c65b4ab99e58ee size: 948
    
    • 页面查看推送的镜像

    由于推送之后,我又删除本地镜像,再次拉取,这里的下载次数为 1 。