ハーバー可用性の理論と実践(収束記事)

まず、理論的な概要

港とは何ですか

ハーバーエンタープライズレジストリは、ドッカーミラーを格納して配布するためのサーバである企業ドッカー画像記憶の中に構築するために使用することができます。

港には、適切なエンタープライズクラスの拡張性に基づくドッキングウィンドウのレジストリで取得するために、より広く使われている、新機能が含まれます:ように管理ユーザーインターフェースベースのアクセス制御、AD / LDAP統合および監査ログの役割とを。

港の解決すべき問題は、

コンテナ技術が表現ドッキングウィンドウに見える、伝統的な配信方法を変更しました。鏡の中に、ビジネスとその依存ドッカー環境をパッケージ化することにより、差異の開発環境と本番環境の問題を解決し、サービス提供の効率を高めます。どのように効率的に管理し、ドッカーミラーを配布するには?多くの企業が検討する必要があります質問です。

なぜドッキングウィンドウの独自のレジストリを持っているだけでなく、港で

  1. 港のセキュリティメカニズム

役割によると、訪問者が権利を引っ張って同じように、柔軟なアクセス制御することができ

  1. 同期メカニズムをミラーリング港

なぜ我々は、ミラーの同期が必要なのか

1. 对系统稳定性要求高,需要多个仓库保证高可用性

2. 更常用的场景是,在企业级软件环境中,会在软件开发的不同阶段存在不同的镜像仓库

従来のアプローチは、2つの倉庫間の同期ミラーリングサービスが定義されてRSYNCミラーデータの同期を使用することです!

港同期メカニズム

1. 采用用Harbor自己的API来进行镜像下载和传输,作到与底层存储环境解耦。 

2. 利用任务调度和监控机制进行复制任务的管理,保障复制任务的健壮性。在同步过程中,如果源镜像已删除,Harbor会自动同步删除远端的镜像。在镜像同步复制的过程中,Harbor会监控整个复制过程,遇到网络等错误,会自动重试。 


3. 提供复制策略机制保证项目级的复制需求。在Harbor中,可以在项目中创建复制策略,来实现对镜像的同步。与Docker Registry的不同之处在于,Harbor的复制是推(PUSH)的策略,由源端发起,而Docker Registry的复制是拉(PULL)的策略,由目标端发起。 
  1. グラフィカルなインターフェイスを使用すると、鏡のように管理することができます

参考記事

  1. 階層伝送メカニズムを提供し、ネットワーク送信を最適化します

ドッカーミラーリングは階層的であり、各転送の全額がファイルを使用している場合、明らかに不経済、(アプローチが合わないように、FTPを使用して)。我々は、オブジェクトの送信を決定し、階層的な伝送、層を識別するためのUUIDを識別するためのメカニズムを提供しなければなりません。

建築コンポーネントを抱きます

  • ハーバーは、アーキテクチャの5つの主要コンポーネントで構成されています。
1. Proxy:Harbor的registry,UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。

2. Registry: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Dockerimage有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token,Registry会通过公钥对token 进行解密验证。

3. Core services: 这是Harbor的核心功能,主要提供以下服务:

    UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。

    webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。

    token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。

4. Database:为core services提供数据库服务,负责储存用户权限、审计日志、Dockerimage分组信息等数据。

5. Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
  • 各コンポーネントの実装を港

各コンポーネントは、フォームハーバードッカー容器内に構築されているので、当然、我々はそれを展開するドッカー作曲を使用しました。

在源代码中(https://github.com/vmware/harbor), 用于部署Harbor的Docker Compose 模板位于/Deployer/docker-compose.yml. 打开这个模板文件,会发现Harbor由5个容器组成:

1. proxy:由Nginx 服务器构成的反向代理。

2. registry:由Docker官方的开源registry 镜像构成的容器实例。

3. ui: 即架构中的coreservices, 构成此容器的代码是Harbor项目的主体。

4. mysql: 由官方MySql镜像构成的数据库容器。

5. log: 运行着rsyslogd的容器,通过log-driver的形式收集其他容器的日志。

各々がコンテナ間コンテナの名前でアクセスすることができるように、これらの容器は、ドッカーリンクの形で一緒に接続されています。エンドユーザーのために、それだけでは、プロキシ(すなわち、nginxの)サービスポートを公開する必要があります。

ハーバー作品

唯一のより抽象的なその乾燥を言うので、私たちは、研究業績ワークフローの形として、特定のコマンドを使用します。

  • ドッキングウィンドウログインloginコマンド

我々はIPハーバーがマシン192.168.1.10上で展開すると仮定します。ユーザーは、ハーバードッキングウィンドウloginコマンドを使用してサービスにログイン要求を開始します。

ドッキングウィンドウのログイン192.168.1.10

当用户输入所需信息并点击回车后,Docker 客户端会向地址 “192.168.1.10/v2/” 发出HTTP GET请求。 Harbor的各个容器会通过以下步骤处理:

1.. 1.10机器上收到该请求,会有映射到宿主机80端口的容器接收到。根据匹配规则,容器中Nginx将请求转发给registry容器;

2.. registry容器,由于基于token认证,registry返回错误代码401,提示docker客户端访问token去访问token服务绑定的URL。在harbor中,这个URL指向的是CoreServices(核心服务组件);

3.. Docker  客户端在接到这个错误代码后,会向token服务的URL发出请求,并根据HTTP协议的BasicAuthentication规范,将用户名密码组合并编码,放在请求头部(header);

4.. 这个请求通过1.10:80发送到proxy容器后,Nginx根据规则吧请求转发给UI容器,UI容器监听token服务网址的处理程序,接收到请求后,将请求头解码,得到了用户名和密码;

5.. 得到用户名、密码后,UI容器中的代码会查询数据库,将用户名、密码与mysql容器中的数据进行比对。比对成功的话,UI容器返回表示成功状态吗,用秘钥生成token,放在响应体中返回给docker客户端

ドッキングウィンドウのプッシュ192.168.1.10/library/hello-word

1.. docker客户端重复login的过程,首先发送请求到registry,之后得到token服务的地址;

2.. 之后,docker客户端在访问UI容器的token服务时会提供额外的信息,指明它要申请一个对library/hello-word进行push操作的token;

3.. token服务在经过Nginx转发得到了这个请求后,访问数据库合适当前用户是否有权限对该image进行push操作。如果有权限,会把image信息以及push动作进行编码,并且用私钥签名,生成token返回给docker客户端

4.. 得到token之后docker客户端将token放在请求头部,向registry发出请求,师徒开始推送image。registry收到请求后会用公钥解码token并且进行核对,一切成功后,image传输就开始了

参考記事

いくつかの高可用性ソリューションリファレンス記事を抱く - 理論

第二に、港とは、マスタースレーブレプリケーションを展開します

環境

ホスト名 IPアドレス 役割
harbor1 192.168.111.3 港の倉庫
harbor2 192.168.111.4 バックアップ港の倉庫
クライアント 192.168.111.5 ドッキングウィンドウのクライアント

場合は、高可用性ミラーリング港の倉庫を設定しますが、原因港へと推奨該当する公式プログラムはありません、この場合には、単に主要なメインの高可用性を使用して、keepalivedのベースのVIPを達成します

  • 展開ドッカ
  • Community Editionのドッキングウィンドウを展開する3台のマシン
[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
#安装依赖

[root@localhost ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
#下载docker的repo

[root@localhost ~]# yum -y install docker-ce

[root@localhost ~]# mkdir /etc/docker
[root@localhost ~]# vim /etc/docker/daemon.json

{
        "registry-mirrors":["https://*******.mirror.aliyuncs.com"]
}
#阿里云镜像加速

#systemctl start docker

個人のニーズに対応するアリクラウドへのアクセスを取得し、このドキュメントを参照してください。

まず、この場合、私は、初心者の心は、HTTPSベースの高可用性ミラーリング港の倉庫で、それ以降のドメイン名を使用する必要があることが判明したときに証明書のみ生成する必要があるが、その後、ドメイン名であれば、どのように私の可用性VIPデプロイしたいです達成するため、除去HTTPS構成、従来によって接続

  • 展開港
  • 二つの港の展開

公式サイトのリリースページを抱いてgithubのからのインストールパッケージの指定されたバージョンをダウンロードしてください。

1、在线安装包
    $ wget https://github.com/vmware/harbor/releases/download/v1.1.2/harbor-online-installer-v1.1.2.tgz
    $ tar xvf harbor-online-installer-v1.1.2.tgz
2、离线安装包
    $ wget https://github.com/vmware/harbor/releases/download/v1.1.2/harbor-offline-installer-v1.1.2.tgz
    $ tar xvf harbor-offline-installer-v1.1.2.tgz

[root@harbor1 ~]# mv harbor /usr/local/
[root@harbor1 ~]# vim /usr/local/harbor/harbor.cfg
hostname = 192.168.111.3
ui_url_protocol = http


[root@harbor2 cert]# vim /usr/local/harbor/harbor.cfg
hostname = 192.168.111.4
ui_url_protocol = http
  • 二つの港の展開ドッキングウィンドウ、コン
curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m`
[root@harbor2 ~]# mv docker-compose /usr/local/bin/docker-compose
[root@harbor2 ~]# chmod +x !$
chmod +x /usr/local/bin/docker-compose
  • ブート設定
[root@harbor2 ~]# sh /usr/local/harbor/install.sh 
[root@harbor1 ~]# sh /usr/local/harbor/install.sh
#此过程比较慢

ブラウザのアクセステストhttps://192.168.111.3/https://192.168.111.4/

  • テスト
[root@localhost anchors]# docker pull cirros

[root@localhost anchors]# docker login 192.168.111.3
Username: admin
Password: 

[root@localhost anchors]# docker tag cirros:latest 192.168.111.3/joinbest1/cirros:test1
[root@localhost anchors]# docker push 192.168.111.3/joinbest1/cirros:test1
The push refers to repository [192.168.111.3/joinbest1/cirros]
abbd6d6ac643: Pushed 
75b99987219d: Pushed 
0cc237193a30: Pushed 
test1: digest: sha256:96137d51e0e46006243fa2403723eb47f67818802d1175b5cde7eaa7f19446bd size: 943

  • メインプライマリコピーの展開(変更を実現するミラー・ウェアハウスは、もう一方の側に同期されなければなりません)

これは、両端に真であります

この時、港の終わりには、既に作成したばかりのテスト画像を見ることができます。

主主、ピア港倉庫業務の展開は、以上でなければならないため

  • クイズ
[root@localhost anchors]# docker tag cirros:latest 192.168.111.4/joinbest1/cirros:test2
[root@localhost anchors]# docker push 192.168.111.4/joinbest1/cirros:test2 
The push refers to repository [192.168.111.4/joinbest1/cirros]
abbd6d6ac643: Layer already exists 
75b99987219d: Layer already exists 
0cc237193a30: Layer already exists 
test2: digest: sha256:96137d51e0e46006243fa2403723eb47f67818802d1175b5cde7eaa7f19446bd size: 943
#上面的部分输出含义是该层数据已经存在,但是不影响,因为在harbor中并不是每个镜像都要全量上传,而是分层存储,更利于节省空间,以层的UUID为标识

次に、2つの倉庫のミラーがあります

言い換えれば、何でも私は再び任意の倉庫オペレーション、他の倉庫に同期されます

  • ハイアベイラビリティ展開を実現keepalivedの

著者からあまりにも多くの主観的な要因は、おそらく信頼性の高いこの場合は、信頼性がないかもしれません

两台harbor安装keepalived
#yum -y install keepalived

[root@harbor1 harbor]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   script_user root
   #需要制定脚本运行用户
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script check_harbor {
    script "/opt/harbor.sh"
    interval 2
    weight 20

}
#使用监控脚本来监控自身80端口,因为他是整个harbor的访问入口

vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.111.100/32 dev ens32 label ens32:2
    }
    track_script {
    check_harbor
    } 
}

--------------注意修改关键配置项------------
[root@harbor2 harbor]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   script_user root
   #需要制定脚本运行用户
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL1
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script check_harbor {
    script "/opt/harbor.sh"
    interval 2
    weight 20

}

vrrp_instance VI_1 {
    state BACKUP
    interface ens32
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.111.100/32 dev ens32 label ens32:2
    }
    track_script {
    check_harbor
    } 
}


----------故障切换脚本-----------
[root@harbor1 harbor]# vim /opt/harbor.sh 

#!/bin/bash

sum=`netstat -lnpt | grep -wo 80 | wc -l`

if [ $sum -eq 0 ]; then
        pkill -9 keepalived
fi

[root@harbor1 harbor]# chmod +x /opt/harbor.sh 


[root@localhost anchors]# vim /usr/lib/systemd/system/docker.service 
#主机3

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock  --insecure-registry 192.168.111.3 --insecure-registry 192.168.111.4 --insecure-registry 192.168.111.100
#将VIP添加入可不安全访问

[root@localhost anchors]# docker login 192.168.111.100
Authenticating with existing credentials...
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
#目前是可以访问

[root@localhost anchors]# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
192.168.111.4/joinbest1/cirros   test2               bc94bceaae77        5 months ago        10.3MB
cirros                           latest              bc94bceaae77        5 months ago        10.3MB
192.168.111.3/joinbest1/cirros   test1               bc94bceaae77        5 months ago        10.3MB
#镜像也正常

[root@harbor1 harbor]# docker-compose stop
Stopping harbor-jobservice  ... done
Stopping nginx              ... done
Stopping harbor-ui          ... done
Stopping harbor-adminserver ... done
Stopping redis              ... done
Stopping registry           ... done
Stopping harbor-db          ... done
Stopping harbor-log         ... done
#测试故障切换

[root@harbor2 harbor]# ip a | grep ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.111.4/24 brd 192.168.111.255 scope global noprefixroute ens32
    inet 192.168.111.100/32 scope global ens32:2
#ip切过来了
  • 测试keepalived的VIP的写入是否同步其余仓库
[root@localhost anchors]# docker tag cirros:latest 192.168.111.100/joinbest1/cirros:test3
[root@localhost anchors]# docker push 192.168.111.100/joinbest1/cirros:test3 
The push refers to repository [192.168.111.100/joinbest1/cirros]
abbd6d6ac643: Layer already exists 
75b99987219d: Layer already exists 
0cc237193a30: Layer already exists 
test3: digest: sha256:96137d51e0e46006243fa2403723eb47f67818802d1175b5cde7eaa7f19446bd size: 943
#目前正常写入

#通过web界面对111.3和111.4的joinbest1仓库看看镜像是否同步
#这里先把刚才测试关闭的harbor1仓库给启动
Starting log         ... done
Starting registry    ... done
Starting mysql       ... done
Starting adminserver ... done
Starting ui          ... done
Starting redis       ... done
Starting jobservice  ... done
Starting proxy       ... done
#好,我这里是全部可以正常同步,就算是刚才客户端上传时,harbor1是宕机的,但是重新启动后,还是会进行同步,不过应该是有触发机制,我后来又创建了一个test4,刚开始harbor1是没有test3的,我上传test4之后出发了同步机制,这时harbor1的镜像仓库也是正常工作了,便将3.4一起同步过去了

三、总结

  • 1.本高可用方案,生产环境有待考量
  • 2.刚开始是尝试着做基于https的连接,但是因为诸多因素:ssl工具或许不支持基于ip的加密只支持域名,但是要配合keepalived肯定是需要ip的,故舍弃https;经过思考,如果只是做私有仓库使用的话,那么不使用https或许也是非常可行的。
  • 3.keepalived很好用,很有感触
  • 4.本案例环境都是在测试环境,在生产环境的相应压力中,并不知道会有怎么样的后果

报错

raise Exception("Error: the protocol must be https when Harbor is deployed with Notary")
Exception: Error: the protocol must be https when Harbor is deployed with Notary
#我输入得命令是sh install.sh --with-notary --with-clair
#其中使用--with-notary含义是启用镜像签名;必须是https才可以,把该选项去掉即可·




[root@localhost anchors]# docker login 192.168.111.3
Username: admin
Password: 
Error response from daemon: Get https://192.168.111.3/v2/: dial tcp 192.168.111.3:443: connect: connection refused
#客户端连接报错,默认使用的是https我需要修改为可以使用http来进行连接

[root@localhost anchors]# vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock  --insecure-registry 192.168.111.3 --insecure-registry 192.168.111.4

おすすめ

転載: www.cnblogs.com/joinbestgo/p/11114828.html