世の中には、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で自前の開発環境を構築する際の参考になればと思って記載しました。お疲れ様でした。