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で設定したパスワード
プロジェクトの作成
- ログイン後、「Projects」をクリック
- 「NEW PROJECT」ボタンをクリック
- プロジェクト名を入力(例:
my-project) - アクセスレベルを選択(Public or Private)
- 「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
脆弱性スキャン
自動スキャンの設定
- プロジェクト設定を開く
- 「Configuration」タブを選択
- 「Automatically scan images on push」を有効化
- 「Save」をクリック
手動スキャン
リポジトリページからイメージを選択し、「SCAN」ボタンをクリックします。
レプリケーション
レプリケーションルールの作成
- 「Administration」→「Replications」を開く
- 「NEW REPLICATION RULE」をクリック
- ソースとターゲットのレジストリを設定
- フィルタールールを設定
- トリガー条件を設定(Manual, Scheduled, Event Based)
RBAC(アクセス制御)
ユーザーの作成
- 「Administration」→「Users」を開く
- 「NEW USER」をクリック
- ユーザー情報を入力
プロジェクトへのメンバー追加
- プロジェクトを開く
- 「Members」タブを選択
- 「+ USER」をクリック
- ユーザーとロールを選択
ロールの種類
- 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のログを確認