目录

    1. 搭建 Harbor 的要求

    Harbor 硬件要求:

    • CPU,最少 2 核,4 核更好
    • Mem,最少 4 GB,8 GB 更好
    • Disk,最少 40 GB,160 GB 更好

    Docker 版本要求:

    • 17.06.0 以上

    在 Kubernetes 上搭建 Harbor ,可以参考文档,使用 Helm 搭建 harbor

    2. Harbor 提供的功能

    Harbor 是在 Docker Registry 的基础之上,进行了企业级扩展。Harbor 提供的功能包括:

    • 基于角色的权限控制

    • 基于策略的镜像复制

    • 漏洞扫描

    • LDAP 认证

    • 镜像垃圾清理

    • Notary 镜像签名

    • 操作日志

    • RESTful API

    • Chart 包的管理

    3. Harbor 集成的组件

    3.1 Clair

    Clair 是 CoreOS 开源的镜像漏洞扫描工具。

    Clair 的原理是,首先对镜像进行特征的提取,再将这些特征匹配 CVE 漏洞库。Clair 是以静态的方式,按照镜像 layer 层级,进行扫描的。

    3.2 Notray

    在构建镜像时,通常会基于一些基础镜像,添加符合应用场景的镜像层,得到新的镜像。为了防止在构建过程中,非法植入恶意镜像层,便有了内容信任(Content Trust)机制,用以保证镜像层来源可信。

    Notary 是一套镜像的签名工具, 用来保证镜像层在 pull、push、transfer 过程中的一致性和完整性。避免中间人攻击,阻止非法的镜像更新和运行。

    镜像层的创建者可以对镜像层做数字签名,生成摘要,保存在 Notary 服务中。开启 Content Trust 机制之后,未签名的镜像无法被拉取。

    通过设置环境变量,可以开启 Content Trust 机制:

    export DOCKER_CONTENT_TRUST=1
    export DOCKER_CONTENT_TRUST_SERVER=https://notary.harbor.chenshaowen.com
    

    推、拉镜像时,要求镜像层有签名:

    docker pull core.harbor.chenshaowen.com/shaowenchen/devops-python-sample:31
    
    Error: remote trust data does not exist for core.harbor.chenshaowen.com/shaowenchen/devops-python-sample: core.harbor.chenshaowen.com does not have trust data for core.harbor.chenshaowen.com/shaowenchen/devops-python-sample
    
    docker push core.harbor.chenshaowen.com/shaowenchen/kube-apiserver:v1.15.3
    
    The push refers to repository [core.harbor.chenshaowen.com/shaowenchen/kube-apiserver]
    9b49e894f11a: Layer already exists
    fe9a8b4f1dcc: Layer already exists
    v1.15.3: digest: sha256:a21bcbcd23f7dbc6a331583645b56e639ec256cc6e2283a647ddd86505a4783e size: 741
    Signing and pushing trust metadata
    Enter passphrase for root key with ID dc948ea:
    

    3.3 Docker Registry

    Docker Registry 是 Docker 官方提供的镜像存储组件。

    registry v2 拥有断点续传、镜像多层并发拉取等功能。

    当 pull 一个镜像时,先进行认证,获取到 token 并授权通过,然后获取镜像的 manifest 文件,进行 signature 校验。校验完成之后,依据 manifest 包含的信息,拉取各层。拉取完成后,也需要先在本地进行校验。

    当 push 一个镜像时,先将镜像各层并发推送至 registry ,推送完成后,再将镜像的 manifest 推至 registry。

    在 registry 的存储目录下,能够找到两个文件夹:一个是 blobs,用于存储层级文件;另外一个是 repositories,以索引的方式保存了 registry 中镜像的元数据。

    tree -L 6
    .
    `-- docker
        `-- registry
            `-- v2
                |-- blobs
                |   `-- sha256
                       ...
                |       `-- ff
                `-- repositories
                    |-- library
                    |   `-- kube-proxy
                    `-- shaowenchen
                        |-- devops-python-sample
                        |-- docker-robotframework
                        `-- zing-gallery
    

    4. Kubernetes 中的 Harbor

    上面是 Harbor 的架构图。下面根据 Kubernetes 中运行的 Pod 了解一下 Harbor 中的相关模块:

    kubectl get pod -n harbor
    
    NAME                                           READY   STATUS    RESTARTS   AGE
    harbor-harbor-chartmuseum-6b94bdff69-2n885     1/1     Running   2          96m
    harbor-harbor-clair-5bd8f76d9c-crjqj           1/1     Running   6          96m
    harbor-harbor-core-599747cd9b-vbhv5            1/1     Running   7          96m
    harbor-harbor-database-0                       1/1     Running   2          96m
    harbor-harbor-jobservice-54686b9f7-dpvms       1/1     Running   8          96m
    harbor-harbor-notary-server-85b5587c5-tkntx    1/1     Running   1          96m
    harbor-harbor-notary-signer-7b67669b7f-q2qkl   1/1     Running   2          96m
    harbor-harbor-portal-64cff84747-tbmdp          1/1     Running   2          96m
    harbor-harbor-redis-0                          1/1     Running   2          96m
    harbor-harbor-registry-555c545d5b-gmzg5        2/2     Running   3          96m
    
    • chartmuseum, chart 存储,在挂载的 PV 中可以看到以文件目录形式存储的 chart 包。
    • clair,用于镜像安全扫描
    • core,核心功能控制
    • database,用于存储 projects、users、roles、images 等元数据。
    • jobservice,执行定时任务,提供 API 供外部提交任务及查询执行结果。
    • notary-server、notary-signer,实现 Docker Content Trust ,镜像签名。
    • portal,UI 页面入口
    • redis,缓存
    • registry,Docker 的原生 registry 组件

    5. HA 方案

    • 多主复制

    通过一个 LB ,将请求导向多个 Harbor 实例上。这种方式不能保证数据的一致性,在生产环境常会遇到问题。

    • 多实例,共享存储

    同样是,通过一个 LB ,将请求导向多个 Harbor 实例。但是全部实例共享存储,只需要存储是高可用,那么整个 Harbor 集群也就高可用了。

    6. 参考