LoginSignup
8

More than 5 years have passed since last update.

HarborでPrivate Registryをつくってみる

Last updated at Posted at 2018-12-22

はじめに

Kubernetes Advent Calendar 22日目です。
Harborの概要と,手元のKubernetes上で試せることを目標とします。
(※ネットワークがしばらく無いので検証結果やスクリーンショット等は後ほど載せますっ!)

What's Harbor?

  • 2014年にVMwareが開発
  • 現在はCNCFに移管されてIncubationプロジェクトの位置付け
  • オープンソース Apache2.0
  • コンテナレジストリ,Helm Chartのプライベートレジストリとして使用できる
  • イメージの脆弱性スキャン
  • イメージ署名 (Notaryを使っている)
  • LDAP/AD連携とRBACでコンテンツ保護
  • Web UI
  • Harbor自体がコンテナ上で動作

Harborを構築しよう

Helm Chartが用意されているので,GitHubの導入手順に沿ってKubernetesクラスターにデプロイします。

  • 前提
    • Kubernetes クラスター v1.10+
    • Helm v2.8.0+

0) Helm Chartをクローン

$ git clone https://github.com/goharbor/harbor-helm
$ cd harbor-helm
$ git checkout -b myharbor <== 任意のブランチ名

1) PVを準備

Helm Chartでは5つのPVC(Persistent Volume Claim)の定義が用意されています。
今回はhostPathで明示的に5つ用意することにします。

  • 1GiのPVを3つ
    • jobservice
    • database
    • redis
  • 5GiのPVを2つ
    • registry
    • chartmuseum
以下は1Giの例

...
"spec": {
    "capacity": {
      "storage": "1Gi"
    },
    "hostPath": {
      "path": "/xxxxx",
      "type": ""
    },
    "accessModes": [
      "ReadWriteOnce"
    ],
...

2) values.yamlを編集

今回は外部アクセスはNodePortで実施してみます。

  • expose: typeを nodePortに変更
  • expose: commonNameに nodePortを指定
  • externalURL: に https://169.62.99.180/harbor を指定 (今回はシングルVMにK8sクラスターを構成済)
values.yaml
expose:
  # Set the way how to expose the service. Set the type as "ingress",
  # "clusterIP" or "nodePort" and fill the information in the corresponding
  # section
  type: nodePort
    ...
  ...
  ...
  commonName: "nodePort"
...
...
externalURL: https://169.62.99.180/harbor
...

※もちろんvalues.yamlを編集せずに helm install時に --setフラグをつけて直接指定しても構いません。

3) helm installを実行

$ helm install --name myharbor --tls

$ helm install --name myharbor . --tls

NAME:   myharbor
LAST DEPLOYED: Sat Dec 22 08:12:57 2018
NAMESPACE: kube-system
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME                           DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
myharbor-harbor-adminserver    1        1        1           0          1s
myharbor-harbor-chartmuseum    1        0        0           0          1s
myharbor-harbor-clair          1        0        0           0          1s
myharbor-harbor-core           1        0        0           0          1s
myharbor-harbor-jobservice     1        0        0           0          1s
myharbor-harbor-notary-server  1        0        0           0          1s
myharbor-harbor-notary-signer  1        0        0           0          1s
myharbor-harbor-portal         1        0        0           0          1s
myharbor-harbor-registry       1        0        0           0          1s

==> v1/StatefulSet
NAME                      DESIRED  CURRENT  AGE
myharbor-harbor-database  1        1        1s
myharbor-harbor-redis     1        1        1s

==> v1beta1/Ingress
NAME                     HOSTS                                    ADDRESS  PORTS  AGE
myharbor-harbor-ingress  core.harbor.domain,notary.harbor.domain  80, 443  1s

==> v1/Pod(related)
NAME                                            READY  STATUS             RESTARTS  AGE
myharbor-harbor-adminserver-78458f9bdb-ctqtv    0/1    ContainerCreating  0         1s
myharbor-harbor-chartmuseum-6775b948c7-4crvg    0/1    Pending            0         1s
myharbor-harbor-clair-78c4c75949-j6z7n          0/1    ContainerCreating  0         1s
myharbor-harbor-core-5db7d4474-t82fw            0/1    ContainerCreating  0         1s
myharbor-harbor-jobservice-75865bb84b-p4tck     0/1    Pending            0         1s
myharbor-harbor-notary-server-65d7b56fd5-ghchj  0/1    ContainerCreating  0         1s
myharbor-harbor-notary-signer-dc7cf48b8-8hw45   0/1    ContainerCreating  0         1s
myharbor-harbor-portal-5499d76f78-glv68         0/1    Pending            0         1s
myharbor-harbor-database-0                      0/1    Pending            0         1s
myharbor-harbor-redis-0                         0/1    Pending            0         1s

==> v1/Secret
NAME                         TYPE               DATA  AGE
myharbor-harbor-adminserver  Opaque             4     1s
myharbor-harbor-chartmuseum  Opaque             1     1s
myharbor-harbor-core         Opaque             4     1s
myharbor-harbor-database     Opaque             1     1s
myharbor-harbor-ingress      kubernetes.io/tls  3     1s
myharbor-harbor-jobservice   Opaque             1     1s
myharbor-harbor-registry     Opaque             1     1s

==> v1/ConfigMap
NAME                           DATA  AGE
myharbor-harbor-adminserver    39    1s
myharbor-harbor-chartmuseum    24    1s
myharbor-harbor-clair          1     1s
myharbor-harbor-core           1     1s
myharbor-harbor-jobservice     1     1s
myharbor-harbor-notary-server  5     1s
myharbor-harbor-registry       2     1s

==> v1/PersistentVolumeClaim
NAME                         STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
myharbor-harbor-chartmuseum  Pending  1s
myharbor-harbor-jobservice   Pending  1s
myharbor-harbor-registry     Pending  1s

==> v1/Service
NAME                           TYPE       CLUSTER-IP  EXTERNAL-IP  PORT(S)            AGE
myharbor-harbor-adminserver    ClusterIP  10.0.0.68   <none>       80/TCP             1s
myharbor-harbor-chartmuseum    ClusterIP  10.0.0.4    <none>       80/TCP             1s
myharbor-harbor-clair          ClusterIP  10.0.0.43   <none>       6060/TCP           1s
myharbor-harbor-core           ClusterIP  10.0.0.89   <none>       80/TCP             1s
myharbor-harbor-database       ClusterIP  10.0.0.212  <none>       5432/TCP           1s
myharbor-harbor-jobservice     ClusterIP  10.0.0.224  <none>       80/TCP             1s
myharbor-harbor-notary-server  ClusterIP  10.0.0.65   <none>       4443/TCP           1s
myharbor-harbor-notary-signer  ClusterIP  10.0.0.107  <none>       7899/TCP           1s
myharbor-harbor-portal         ClusterIP  10.0.0.164  <none>       80/TCP             1s
myharbor-harbor-redis          ClusterIP  10.0.0.108  <none>       6379/TCP           1s
myharbor-harbor-registry       ClusterIP  10.0.0.6    <none>       5000/TCP,8080/TCP  1s

pvを用意し忘れているとpendingになったり,K8sクラスター環境によってはセキュアに構成されていてイメージプルできない場合があります。
その場合はimagePolicyの定義を変更してdocker.io/harbor*を許可したりなど,適宜対応してください。

WebUIでログイン

ブラウザでhttps://<IP>:30003/harborにアクセス
デフォルトのログイン情報はadmin/Harbor12345

image.png

ログイン後,以下のような画面に遷移すればOKです。
image.png

Harborの機能を試してみよう

TBD

リンク集

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8