世の中には、Docker Hub、GitHubやAWSであれば、ECR、GCPでGCR等のコンテナレジストリサービスは、いっぱいあります。
今回は、Harborというコンテナイメージ管理を導入方法について、紹介します。

Harborを導入しようと思ったきっかけ

近年では、コンテナでアプリを開発することが多くなってきました。コンテナでアプリケーション開発をする場合、コンテナレジストリをどうするのかという問題は常につきまとってきます。頻繁にコンテナレジストリの開発をしているとコンテナレジストリサービスでも費用がかかります。開発に関連する費用は、最小にしたいというのが経営者の感覚だと思います。調査をする中で、 OSSで費用がかからないとういう点、オンプレミスでのコンテナレジストリとしてもよく利用されている”Harbor”に行き着きました。

HelmでHarborを導入する

導入する環境

  • オンプレミス(VPSのサーバ)に構築したkubernetes環境
  • storageは、hostpathを利用

Helm Chartを利用する

まずは、helmにリポジトリを登録します。

                                                     
# helm にリポジトリ登録
$ helm repo add harbor https://helm.goharbor.io
"harbor" has been added to your repositories

# リポジトリ登録確認
$ helm repo list
NAME            URL
harbor          https://helm.goharbor.io

helmfileファイルを準備します。

                                                                         
releases:
  - chart: harbor/harbor
    name: harbor
    namespace: harbor-system
    values:
      - ./values.yaml

valuesファイルを準備します。今回は、ingressとして公開します。事前にcert-managerを使って、”dummy-cert”を作っておいたので、それをsecretNameに指定します。各パラメータの詳細は、https://github.com/goharbor/harbor-helmを確認して下さい。

                                                                         
expose:
  type: ingress
  tls:
    enabled: ture
    certSource: secret
    commonName: "harborをたてる際のHOST名"
    secret:
      secretName: "dummy-cert". <- cert-managerを利用して作っておいたものを指定。
  ingress:
    hosts:
      core:  "harborをたてる際のHOST名"
    annotations:
      kubernetes.io/ingress.class: nginx
      ingress.kubernetes.io/ssl-redirect: "true"
      ingress.kubernetes.io/proxy-body-size: "0"
      nginx.ingress.kubernetes.io/ssl-redirect: "true"
      nginx.ingress.kubernetes.io/proxy-body-size: "0"
      cert-manager.io/cluster-issuer: "dummy-issuer"

persistence:
  enabled: true

externalURL: "https://harborをたてる際のHOST名"

いざ、デプロイする。

                                                                         
$ helmfile apply

導入後の多かったトラブルシュートの一つを紹介

postgresのPODでCrashLoopBackOffが表示される

ログを見ると特定のディレクトリがないという状況になっていました。1-2時間悩んだのですが、この現象が起こっているポッドでは、securityContextでユーザが指定されているという状況になってました。

 
https://github.com/goharbor/harbor-helm/blob/master/templates/database/database-ss.yam

{{- end }}
    spec:
      securityContext:
        runAsUser: 999 <-- ここ!
        fsGroup: 999.  <-- ここ!
{{- if .Values.database.i
                                                                    
$ helmfile apply

この設定を現状マウントしているPVのホスト側のパスのオーナーを変更することで問題が解決しました。他のPODでもsecurityContextでユーザが指定されている箇所があるので、同じように対処すれば、解決すると思います。

まとめ

駆け足ですが、Harborを利用してプライベートなコンテナイメージ環境として構築する際の環境をIngressで構築するときのポイントを紹介しました。ネットでは、NodePortで公開する方法が多くあったので、Ingressで自前の開発環境を構築する際の参考になればと思って記載しました。お疲れ様でした。