Harbor

Harborは、エンタープライズグレードのコンテナレジストリです。脆弱性スキャン、イメージ署名、アクセス制御などの機能を提供します。

Harborを使用すると、プライベートなコンテナイメージレジストリを構築し、セキュアに管理できます。

概要

Harborの主な特徴:

  • OCI準拠のコンテナレジストリ
  • 脆弱性スキャン(Trivy統合)
  • イメージのレプリケーション
  • RBAC(Role-Based Access Control)
  • LDAPとOIDC統合
  • Webhookサポート
  • Helmチャートのホスティング

前提条件

  • Kubernetes 1.22以上
  • Helm 3.2以上
  • PersistentVolume(Rook Cephなど)
  • Ingress Controller(CloudflareまたはNginx)
  • cert-manager(TLS証明書用)

インストール

1. Helm リポジトリの追加

helm repo add harbor https://helm.goharbor.io
helm repo update

2. values.yamlの作成

expose:
  type: ingress
  tls:
    enabled: true
    certSource: secret
    secret:
      secretName: harbor-tls
  ingress:
    hosts:
      core: harbor.example.com
    className: nginx
    annotations:
      cert-manager.io/cluster-issuer: "letsencrypt-prod"

externalURL: https://harbor.example.com

persistence:
  enabled: true
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      storageClass: rook-ceph-block
      size: 100Gi
    chartmuseum:
      storageClass: rook-ceph-block
      size: 10Gi
    jobservice:
      storageClass: rook-ceph-block
      size: 10Gi
    database:
      storageClass: rook-ceph-block
      size: 10Gi
    redis:
      storageClass: rook-ceph-block
      size: 10Gi
    trivy:
      storageClass: rook-ceph-block
      size: 10Gi

harborAdminPassword: "YourSecurePassword"

trivy:
  enabled: true

3. Harborのインストール

kubectl create namespace harbor

helm install harbor harbor/harbor \
  --namespace harbor \
  --values values.yaml

4. インストールの確認

# Podの確認
kubectl get pods -n harbor

# Ingressの確認
kubectl get ingress -n harbor

初期設定

管理画面へのアクセス

ブラウザで https://harbor.example.com を開きます。

  • ユーザー名: admin
  • パスワード: values.yamlで設定したパスワード

プロジェクトの作成

  1. ログイン後、「Projects」をクリック
  2. 「NEW PROJECT」ボタンをクリック
  3. プロジェクト名を入力(例:my-project
  4. アクセスレベルを選択(Public or Private)
  5. 「OK」をクリック

Docker Clientの設定

ログイン

docker login harbor.example.com
# ユーザー名: admin
# パスワード: 設定したパスワード

イメージのプッシュ

# イメージのタグ付け
docker tag nginx:latest harbor.example.com/my-project/nginx:latest

# プッシュ
docker push harbor.example.com/my-project/nginx:latest

イメージのプル

docker pull harbor.example.com/my-project/nginx:latest

Kubernetesからの使用

Image Pull Secretの作成

kubectl create secret docker-registry harbor-secret \
  --docker-server=harbor.example.com \
  --docker-username=admin \
  --docker-password=YourPassword \
  --docker-email=your-email@example.com \
  -n default

Podでの使用

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: harbor.example.com/my-project/nginx:latest
  imagePullSecrets:
  - name: harbor-secret

脆弱性スキャン

自動スキャンの設定

  1. プロジェクト設定を開く
  2. 「Configuration」タブを選択
  3. 「Automatically scan images on push」を有効化
  4. 「Save」をクリック

手動スキャン

リポジトリページからイメージを選択し、「SCAN」ボタンをクリックします。

レプリケーション

レプリケーションルールの作成

  1. 「Administration」→「Replications」を開く
  2. 「NEW REPLICATION RULE」をクリック
  3. ソースとターゲットのレジストリを設定
  4. フィルタールールを設定
  5. トリガー条件を設定(Manual, Scheduled, Event Based)

RBAC(アクセス制御)

ユーザーの作成

  1. 「Administration」→「Users」を開く
  2. 「NEW USER」をクリック
  3. ユーザー情報を入力

プロジェクトへのメンバー追加

  1. プロジェクトを開く
  2. 「Members」タブを選択
  3. 「+ USER」をクリック
  4. ユーザーとロールを選択

ロールの種類

  • Project Admin: プロジェクトの全権限
  • Master: イメージのプッシュ・プル、スキャン、レプリケーション
  • Developer: イメージのプッシュ・プル
  • Guest: イメージのプルのみ
  • Limited Guest: イメージのプル(特定の制限付き)

バックアップとリストア

データベースのバックアップ

# PostgreSQLのバックアップ
kubectl exec -n harbor harbor-database-0 -- \
  pg_dump -U postgres registry > harbor-backup.sql

イメージデータのバックアップ

PersistentVolumeのスナップショット機能を使用するか、レプリケーション機能で別のレジストリにバックアップします。

トラブルシューティング

ログの確認

# Core サービスのログ
kubectl logs -n harbor deploy/harbor-core

# Registry サービスのログ
kubectl logs -n harbor deploy/harbor-registry

# JobService のログ
kubectl logs -n harbor deploy/harbor-jobservice

一般的な問題

イメージのプッシュが失敗する場合:ストレージの容量が十分か確認してください。

  • ログインできない: パスワードとIngressの設定を確認
  • TLS証明書エラー: cert-managerの設定とCertificateリソースを確認
  • スキャンが動作しない: Trivyのログを確認

参考リンク