九零不老心
发布于 2019-09-03 / 22 阅读 / 0 评论 / 0 点赞

harbor安装配置

# https://github.com/goharbor/harbor
# https://goharbor.io

# 建议阅读概览:
    https://github.com/goharbor/harbor/wiki/Architecture-Overview-of-Harbor
# 概念:
    一种开源可信云本机注册表项目,用于存储,签名和扫描内容。
# 特征
    云本机注册表:Harbour 支持容器映像和Helm图表,可作为容器运行时和业务流程平台等云本机环境的注册表。
    基于角色的访问控制:用户和存储库通过“项目”进行组织,用户可以对项目下的图像或Helm图表拥有不同的权限。
    基于策略的复制:可以基于具有多个过滤器(存储库,标记和标签)的策略在多个注册表实例之间复制(同步)图像和图表。如果遇到任何错误,Harbor会自动重试复制。非常适合负载平衡,高可用性,多数据中心,混合和多云场景。
    漏洞扫描:Harbor定期扫描图像并警告用户漏洞。
    LDAP / AD支持:Harbor与现有企业LDAP / AD集成以进行用户身份验证和管理,并支持将LDAP组导入Harbor并为其分配适当的项目角色。
    OIDC支持:Harbour利用OpenID Connect(OIDC)来验证由外部授权服务器或身份提供商进行身份验证的用户的身份。可以启用单点登录以登录Harbor门户。
    图像删除和垃圾收集:可以删除图像,并可以回收它们的空间。
    公证人:可以确保图像的真实性。
    图形用户门户:用户可以轻松浏览,搜索存储库和管理项目。
    审计:跟踪存储库的所有操作。
    RESTful API:适用于大多数管理操作的RESTful API,易于与外部系统集成。嵌入式Swagger UI可用于探索和测试API。
    轻松部署:提供在线和离线安装程序。此外,Helm Chart可用于在Kubernetes上部署Harbor。
# installation guide
    https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md
    # 安装docker,安装docker compose
    # 安装harbor offline
        # downalod offline tar
            cd /opt/
            wget https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.2.tgz
            tar xvf harbor-offline-installer-v1.8.2.tgz
            cd harbor
        # 自签ssl证书 https://github.com/goharbor/harbor/blob/master/docs/configure_https.md
            # Getting Certificate Authority
                openssl genrsa -out ca.key 4096
                openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/CN=guojingyi.cn" -key ca.key -out ca.crt
            # Getting Server Certificate
                # 创建自己的私钥:
                    openssl genrsa -out guojingyi.cn.key 4096
                # 生成证书签名请求:
                    # 如果您使用像guojingyi.cn这样的FQDN连接注册表主机,那么您必须使用guojingyi.cn作为CN(通用名称)。
                    openssl req -sha512 -new -subj "/C=CN/CN=guojingyi.cn" -key guojingyi.cn.key -out guojingyi.cn.csr
                # 生成harbor server所在主机的证书:
                    # 无论您是使用类似guojingyi.cn的 FQDN 还是IP来连接注册表主机,请运行此命令以生成符合主题备用名称(SAN)和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=guojingyi.cn
DNS.2=reg.guojingyi.cn
EOF
                    # 签名生成crt
                        openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in guojingyi.cn.csr -out guojingyi.cn.crt
            # 配置和安装
                # 配置harbor服务端的证书和密钥
                    # 获取guojingyi.cn.crt和guojingyi.cn.key文件后,您可以将它们放入以下目录/opt/harbor/cert:
                        mkdir -pv /opt/harbor/cert/
                        \cp -f guojingyi.cn.crt /opt/harbor/cert/
                        \cp -f guojingyi.cn.key /opt/harbor/cert/
                # 为Docker客户端配置服务证书、密钥和CA,用来访问harbor服务.
                    # Docker守护程序将.crt文件解释为CA证书,将.cert文件解释为客户端证书。
                        # 需要转换guojingyi.cn.crt为guojingyi.cn.cert:
                        openssl x509 -inform PEM -in guojingyi.cn.crt -out guojingyi.cn.cert
                    # Delpoy guojingyi.cn.cert,guojingyi.cn.key和ca.crtDocker:(https://docs.docker.com/engine/security/certificates/)
                        mkdir -pv /etc/docker/certs.d/guojingyi.cn/
                        \cp -f guojingyi.cn.cert /etc/docker/certs.d/guojingyi.cn/
                        \cp -f guojingyi.cn.key /etc/docker/certs.d/guojingyi.cn/
                        \cp -f ca.crt /etc/docker/certs.d/guojingyi.cn/
                    # 以下说明了使用自定义证书的配置:
                        /etc/docker/certs.d/
                            └── guojingyi.cn:port
                                ├── guojingyi.cn.cert  <-- Server certificate signed by CA
                                ├── guojingyi.cn.key   <-- Server key signed by CA
                                └── ca.crt               <-- Certificate authority that signed the registry certificate
        # Configure harbor.yml
            # 按需修改harbor.yml:
                修改域名
                修改/data为/opt/harbor/data
                开启https访问配置
        # install
            chmod u+x install.sh
            ./install.sh
            # 安装完毕
                # 配置数据基本存放在/opt/harbor
                # 日志存放在/var/log/harbor/
                    # core.log  jobservice.log  portal.log  postgresql.log  proxy.log  redis.log  registryctl.log  registry.log
        # 将dns/ip对应解析写入/etc/hosts
            echo "192.168.1.249 guojingyi.cn reg.guojingyi.cn" >> /etc/hosts
        # web访问
            https://reg.guojingyi.cn admin/admin # 密码等在harbor.yml中设置
            系统管理——用户管理——新建user01
            项目——新建test01项目,并分配该项目的user01的角色权限(私有项目需要docker login,公共项目不需要)
        # 登录测试使用
            docker pull nginx
            docker images
            docker tag nginx:latest guojingyi.cn/test01/nginx:latest
            docker login guojingyi.cn # url需要跟/etc/docker/certs.d/下的domain名称一致,登录的用户可以使用web新建用户,也可以先使用超级管理员admin
                Username: user01
                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 push guojingyi.cn/test01/nginx:latest
            docker logout guojingyi.cn
            # 登录web查验刚push的镜像
                项目——test01——已经有刚才push的镜像了
        # harbor服务管理
            # 启停服务
                docker-compose stop
                docker-compose start
            # 如果修改harbor.yml配置,并生效,则流程如下:
                docker-compose down -v
                vim harbor.yml
                prepare
                docker-compose up -d
        # 重装
            # 先进行清理
                docker-compose down -v
                rm -rf /etc/docker/certs.d/guojingyi.cn/
                rm -rf /opt/harbor/
                rm -rf /var/log/harbor/
            # 然后进行重新安装流程
                yield
# 升级harbor和管理harbor数据
    cd /opt/harbor
    docker-compose down
    # 备份harbor和数据库
        # 全备
            mv /opt/harbor /backupdir/ # 因为我修改了默认harbor.yml中的data_volum路径,data目录也在此目录下
            # 如果data目录在其他路径,记得备份data目录
                \cp -r /data/Database /backupdir/
    # 下载最新harbor最新安装包
        https://github.com/goharbor/harbor/releases
    # 迁移
        docker pull goharbor/harbor-migrator:[tag]
        # 将harbor.cfg升级为harbor.yml
            docker run -it --rm -v ${harbor_cfg}:/harbor-migration/harbor-cfg/harbor.yml -v ${harbor_yml}:/harbor-migration/harbor-cfg-out/harbor.yml goharbor/harbor-migrator:[tag] --cfg up
            # NOTE: The schema upgrade and data migration of Database is performed by core when Harbor starts, if the migration fails, please check the log of core to debug.
    # 安装
        sh install.sh or ./install.sh
    # 回滚
        cd /opt/harbor
        docker-compose down
        cd /opt && rm -rf /opt/harbor/
        cp -rf /backupdir/harbor/ /opt/ # 如果data目录在其他路径,记得备份data目录 cp -rf /backupdir/database/ /data/
        cd /opt/harbor/
        sh install.sh or ./install.sh
# harbor高可用方案:
    # 双主复制
        # 主从同步
            # harbor官方默认提供主从复制的方案来解决镜像同步问题,通过复制的方式,我们可以实时将测试环境harbor仓库的镜像同步到生产环境harbor,类似于如下流程:
                git——CI系统——开发registry——测试registry——staging registry——生产registry
            # 在实际生产运维的中,往往需要把镜像发布到几十或上百台集群节点上。这时,单个Registry已经无法满足大量节点的下载需求,因此要配置多个Registry实例做负载均衡。手工维护多个Registry实例上的镜像,将是十分繁琐的事情。Harbor可以支持一主多从的镜像发布模式,可以解决大规模镜像发布的难题
        # 双主复制
            # 所谓的双主复制其实就是复用主从同步实现两个harbor节点之间的双向同步,来保证数据的一致性,然后在两台harbor前端顶一个负载均衡器将进来的请求分流到不同的实例中去,只要有一个实例中有了新的镜像,就是自动的同步复制到另外的的实例中去,这样实现了负载均衡,也避免了单点故障,在一定程度上实现了Harbor的高可用性
                                    ——harbor master01——master01存储
                请求——LB(负载均衡)     复制||复制
                                    ——harbor master02——master02存储
        # 实际缺点
            # 这个方案有一个问题就是有可能两个Harbor实例中的数据不一致。假设如果一个实例A挂掉了,这个时候有新的镜像进来,那么新的镜像就会在另外一个实例B中,后面即使恢复了挂掉的A实例,Harbor实例B也不会自动去同步镜像,这样只能手动的先关掉Harbor实例B的复制策略,然后再开启复制策略,才能让实例B数据同步,让两个实例的数据一致。
            # 在实际生产使用中,主从复制十分的不靠谱。
    # 多实例共享后端存储(较推荐)
        # 共享后端存储算是一种比较标准的方案,就是多个Harbor实例共享同一个后端存储,任何一个实例持久化到存储的镜像,都可被其他实例中读取。通过前置LB进来的请求,可以分流到不同的实例中去处理,这样就实现了负载均衡,也避免了单点故障
                                    ——harbor instance01
            请求——LB(负载均衡) redis(高可用)||mysql(高可用)  ——共享存储
                                    ——harbor instance02
        # 方案要考虑的三个问题:
            1、共享存储的选取,Harbor的后端存储目前支持AWS S3、Openstack Swift, Ceph等,
            2、Session在不同的实例上共享,这个现在其实已经不是问题了,在最新的harbor中,默认session会存放在redis中,我们只需要将redis独立出来即可。可以通过redis sentinel或者redis cluster等方式来保证redis的可用性。在我们的实验环境里,仍然使用单台redis
            3、Harbor多实例数据库问题,这个也只需要将harbor中的数据库拆出来独立部署即可。让多实例共用一个外部数据库,数据库的高可用也可以通过数据库的高可用方案保证。

# kubernetes helm方式安装harbor官方教程
    https://github.com/goharbor/harbor-helm

# 开发人员国际化指南
    https://github.com/goharbor/harbor/blob/master/docs/developer_guide_i18n.md

# harbor源码编译指南:
    https://github.com/goharbor/harbor/blob/master/docs/compile_guide.md

# harbor默认为本地仓库,还可以设置成其他仓库的镜像
    # 注意:此设置下,harbor仅充当镜像服务器,不再接受image的推送
    操作步骤:
        # 修改配置
            vi Deploy/templates/registry/config.yml
            # 添加:
                proxy:
                    remoteurl: https://registry-1.docker.io
                # 如果连接docker hub私库,还需提供用户名和密码
                proxy:
                    remoteurl: https://registry-1.docker.io
                    username: [username]
                    password: [password]
                    
        # 重新生效配置
            ./prepare
        # docker使用此harbor镜像仓库
            docker --registry-mirror=https://<my-docker-mirror-host> daemon
            # 或者将registry-mirror添加到daemon.json
            {
                "registry-mirrors": ["https://<my-docker-mirror-host>"]
            }