Harbor の docker registry 機能と helm chart repo 機能を使ってみる

# Docker Registry

Harbor の主要なユースケースである private docker registry を試してみます。

まずは Harbor にログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/43dc1b52-1bb5-e818-4c56-997f2b99e84f.png)

admin ユーザでログインし、まずは Project を作ります。
Harbor の Registry は基本 Project 単位で管理していきます。
1 Project = 1 application の感覚で、Project にユーザを参加させ、権限を付与して利用していく流れです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/90925b7f-ceb0-fec7-bf37-704265b640f7.png)

**Public Project** : 誰でも参照、Pull 可能
**Private Project** : Project Member のみが参照、Pull 可能

Project 作成後、ユーザを追加します。ユーザ追加する際に、role も指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/ceb07e11-3a6d-744e-48f0-fbd3e77eed10.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/6b3392bd-194d-fdd2-1ad4-c76367379d70.png)

準備が終わったら、docker client から操作してみます。

Harbor に login
```bash
$ docker login https://harbor.nfvlab.test
```

Local registry にある nginx image に tag をつけます。
```bash
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    c919045c4c2b   8 days ago   142MB

$ docker tag nginx harbor.nfvlab.test/test/nginx:v1

$ docker images
REPOSITORY                      TAG       IMAGE ID       CREATED      SIZE
nginx                           latest    c919045c4c2b   8 days ago   142MB
harbor.nfvlab.test/test/nginx   v1        c919045c4c2b   8 days ago   142MB
```

tag 済みの image を push します。
```bash
$ docker push harbor.nfvlab.test/test/nginx:v1
```

push 済みの image を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/33646149-19cf-e2cd-d8fd-27ba0d7ff95e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/e06f7812-9b8c-4389-2ee4-a982f0b83569.png)

1つのイメージが1つの repository となり、tag が変わると、同じ repository のなかに異なるバージョンのイメージが保存されます。

タグが多すぎると、管理しにくくなるので、Harbor は tag retention の機能を提供しています。
例えば最新の5バージョンのみを保存するとか、30日以内に push された image のみ保存するとかのルールを定義することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/1b093334-1a94-72cf-7581-25830cc138ba.png)
最新の5バージョンのみを保存するルール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/b232c492-4ca9-43a1-4c01-15b1433f1c80.png)
30日以内に push された image のみ保存するルール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/1f1a0a52-ae3b-7fdb-8a9c-3d4341d271fc.png)

ルールは1 Project 15つまで設定可能、実行も手動もしくは schedule による自動実施が可能。

# Helm Charts Repo

Harbor は docker registry だけではなく、1.6.0 バージョン以降、Helm と連携し、Helm Chart の repo としても使えます。

Harbor に Helm Chart Repo の機能を有効にするためには Harbor install 時に、--with-chartmuseum のオプションをつけて install.sh を実行する必要があります。
既にインストールされた場合、Harbor の再起動プロセスが install.sh に組み込まれているので、もう一度 install.sh を実行すれば OK です。
便宜のために、Notary(イメージ署名) と Clair（イメージ脆弱性の解析） も併せて有効化しておきます。

```bash
$ sudo ./install.sh --with-notary --with-clair --with-chartmuseum
```

したら、Project の画面に Helm Chart が選べるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385161/c8589c53-7c38-7fb2-87ae-8aca8c2a45cd.png)

ここから helm char の upload/download が可能になります。

そして、client 側の helm も連携しておきます。
下記のコマンドを実行すると、Harbor は helm repo として登録されます。
そして、登録された repo から chart を pull したり、install したりすることが可能になります。

```bash
$ helm repo add --ca-file /etc/docker/certs.d/harbor.nfvlab.test/ca.crt --username=admin --password=VMware1! myrepo https://harbor.nfvlab.test/chartrepo/

$ helm repo list
NAME    URL
myrepo  https://harbor.nfvlab.test/chartrepo/
stable  https://charts.helm.sh/stable
```