Open Source Software

Harbor란?

Somaz 2024. 10. 8. 20:06
728x90
반응형

Overview

오늘은 Harbor와 Harbor 구성요소에 대해서 알아본다.

 

출처 : https://vra4u.com/2023/01/11/harbor-quick-tip-leverage-oci-registry-with-helm/

 


Harbor란?

Harbor는 컨테이너 이미지를 관리, 보호, 배포하는 데 도움이 되는 오픈 소스 컨테이너 이미지 레지스트리이다. 보안, ID 관리, 취약성 검색, 콘텐츠 서명 및 역할 기반 액세스 제어(RBAC)와 같은 고급 기능을 추가하여 기본 Docker 레지스트리의 기능을 확장한다. Harbor는 컨테이너 이미지의 보안과 관리가 중요한 대규모 멀티 테넌트 Kubernetes 환경에 특히 유용하다.

 

Harbor 주요특징

  • Role-Based Access Control (RBAC): 사용자 역할을 기반으로 프로젝트 및 이미지에 대한 액세스를 세밀하게 제어할 수 있다.
  • Vulnerability Scanning(취약성 검색): 통합 Clair 또는 Trivy 취약성 스캐너를 사용하여 컨테이너 이미지에서 취약성을 검색할 수 있다.
  • Replication(복제): 여러 Harbor 인스턴스 간의 이미지 복제를 지원한다.
  • Retention Policies(보존 정책): 오래되었거나 사용되지 않는 컨테이너 이미지를 자동으로 정리하는 규칙을 정의할 수 있다.
  • Auditing(감사): 규정 준수 및 보안 목적으로 사용자와 관리자가 수행한 작업을 추적한다.
  • Multi-Tenancy(다중 테넌트): 사용자는 다양한 액세스 수준과 정책을 사용하여 격리된 프로젝트를 만들 수 있다.
  • Support for Multiple Authentication Methods(다중 인증 방법 지원): LDAP, OAuth 및 내부 데이터베이스 인증 방법이 지원한다.

 

Harbor 구성요소

  1. Core: 다른 구성 요소와 상호 작용하는 기본 API 서비스이다. 사용자 관리, 프로젝트 관리, 이미지 태그 지정, 저장소 구성과 같은 기능에 대한 액세스를 제공한다.
  2. Database (Harbor DB):  Harbor는 PostgreSQL 데이터베이스를 사용하여 사용자, 프로젝트, 로그 및 복제 규칙에 대한 모든 메타데이터를 저장한다.
  3. Registry: 컨테이너 이미지 레지스트리는 Docker 이미지를 저장한다. Harbor는 Docker의 기본 레지스트리(Distribution)와 통합되어 컨테이너 이미지를 저장하고 관리한다.
  4. Job Service:  Harbor에는 취약점 검색, 이미지 복제, 가비지 수집과 같은 비동기 작업 실행을 담당하는 작업 서비스가 있다.
  5. Clair/Trivy (Vulnerability Scanning): Harbor는 Clair 또는 Trivy와 통합되어 컨테이너 이미지에 대한 취약성 검색을 제공한다. 이미지가 푸시되면 스캐너는 이를 분석하고 모든 취약점을 보고한다.
    • Trivy: Harbor와 잘 통합되어 컨테이너 이미지에 대한 실시간 보안 검사를 제공하는 인기 있는 취약성 스캐너이다. (default)
    • Clair: 컨테이너 이미지의 취약점을 탐지하는 또 다른 보안 도구입니다. 이미지의 레이어 분석을 수행한다.
  6. Notary: DCT(Docker Content Trust)를 사용하여 컨테이너 이미지에 서명하는 서비스이다. 이미지의 신뢰성과 무결성을 확인하여 신뢰할 수 있는 이미지만 배포되도록 보장한다. (Deprecated)
    • 처음에는 효과적이었지만 Notary에는 다중 아키텍처 이미지 서명에 대한 지원 부족, 확장성 문제 등 몇 가지 제한 사항이 있다.
  7. ChartMuseum: ChartMuseum은 Kubernetes용 패키지 관리자인 Helm 차트의 저장소이다. Harbor는 이를 Kubernetes 애플리케이션을 정의, 설치 및 업그레이드하는 데 사용되는 Helm 차트를 호스팅하기 위한 선택적 구성 요소로 통합한다. 
  8. Portal: 사용자가 Harbor의 프로젝트, 사용자, 이미지 및 구성을 관리할 수 있는 웹 기반 그래픽 사용자 인터페이스(GUI)이다. 포털은 관리자와 개발자에게 컨테이너 레지스트리 및 프로젝트를 관리하기 위한 친숙한 인터페이스를 제공한다.
  9. Log Collector: 로그 수집기는 모든 Harbor 구성 요소에서 로그를 수집하여 중앙 집중식 모니터링 또는 문제 해결을 위해 제공한다.
  10. API Gateway (Nginx): Harbor는 Nginx를 역방향 프록시로 사용하여 API 요청을 적절한 서비스로 라우팅하고 보안을 처리하며 다양한 구성 요소 간의 트래픽 균형을 유지한다. Nginx는 보안 통신을 보장하고 핵심 서비스, 레지스트리, 작업 서비스 등과 같은 다양한 구성 요소에 대한 게이트웨이 역할을 한다.
  11. Replication Service: Harbor는 서로 다른 Harbor 인스턴스 또는 다른 컨테이너 레지스트리 간의 이미지 복제를 지원한다. 이는 사용자가 여러 위치에 걸쳐 이미지를 복제해야 하거나 고가용성을 위해 필요한 시나리오에서 유용하다.
  12. Harbor Admin Server: 관리 서버 구성 요소를 사용하면 관리자는 Harbor의 시스템 설정을 구성하고 사용자, 프로젝트 및 로그를 관리할 수 있다. Harbor 인스턴스의 상태를 모니터링하고 관리하는 데 중요하다.
  13. Redis: Harbor는 Redis를 메모리 내 키-값 저장소로 사용한다. 주로 작업 처리, 세션 관리 및 복제와 같은 Harbor 작업 속도를 높이기 위한 캐싱 목적으로 사용된다.
  14. Exporter: 주로 이미지 수, 사용자, 프로젝트, 저장소 등과 같은 Harbor의 다양한 구성 요소에서 측정항목을 수집하는 데 사용된다.

Docker Content Trust(DCT)는 Harbour 버전 2.0 이상에서 더 이상 사용되지 않는다. Harbor 프로젝트는 Notary 및 Docker Content Trust에 의존하는 대신 Cosign 및 OCI 이미지 서명 사양이라는 더욱 안전한 새 프레임워크로 전환했다.

 

 

Harbor 설치

Helm을 사용해서 Harbor 설치를 진행해본다. 2024.10.08 기준 최신버전으로 설치하였다.

# git clone
git clone https://github.com/goharbor/harbor-helm

# helm repo 등록
helm repo add harbor https://helm.goharbor.io

# 경로 이동 및 values 파일 복사
cd harbor-helm/
mkdir values
cp values.yaml values/somaz.yaml

# helm 의존성 설치
helm dependency update .

 

 

`values/somaz.yaml`

expose:
  type: ingress
  tls:
    enabled: true
    # The source of the tls certificate. Set as "auto", "secret"
    # or "none" and fill the information in the corresponding section
    certSource: none
  ingress:
    hosts:
      core: harbor.somaz.link
    controller: default
    className: "nginx"
    annotations:
      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"
      nginx.ingress.kubernetes.io/client-body-buffer-size: "512M" # 클라이언트로부터 받는 요청 본문(body)의 버퍼 크기를 조정한다. 이 크기가 설정된 값보다 큰 요청 본문이 들어오면 Nginx는 임시 파일을 사용하여 요청을 처리
  clusterIP:
    # The name of ClusterIP service
    name: harbor
    ports:
      # The service port Harbor listens on when serving HTTP
      httpPort: 80
      # The service port Harbor listens on when serving HTTPS
      httpsPort: 443

externalURL: https://harbor.somaz.link

persistence:
  enabled: true
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      storageClass: "default"
      accessMode: ReadWriteOnce
      size: 5Gi
    jobservice:
      jobLog:
        storageClass: "default"
        accessMode: ReadWriteOnce
        size: 1Gi
    database:
      storageClass: "default"
      accessMode: ReadWriteOnce
      size: 1Gi
    redis:
      storageClass: "default"
      accessMode: ReadWriteOnce
      size: 1Gi
    trivy:
      storageClass: "default"
      accessMode: ReadWriteOnce
      size: 5Gi
  imageChartStorage:
    disableredirect: false
    type: filesystem
    filesystem:
      rootdirectory: /storage
      #maxthreads: 100

existingSecretAdminPasswordKey: HARBOR_ADMIN_PASSWORD
harborAdminPassword: "somaz@1234"

# debug, info, warning, error or fatal
logLevel: info

# Run the migration job via helm hook
enableMigrateHelmHook: false

metrics:
  enabled: true
  serviceMonitor:
    enabled: ture

trace:
  enabled: false

cache:
  # default is not enabled.
  enabled: true
  # default keep cache for one day.
  expireHours: 24


# If service exposed via "ingress", the Nginx will not be used
nginx:
  image:
    repository: goharbor/nginx-photon
    tag: v2.11.0
  automountServiceAccountToken: false
  replicas: 1
  revisionHistoryLimit: 10
  resources:
    requests:
      memory: 256Mi
      cpu: 100m
    limits:
      memory: 1Gi
      cpu: 1

portal:
  image:
    repository: goharbor/harbor-portal
    tag: v2.11.0
  replicas: 1
  revisionHistoryLimit: 10
  resources:
    requests:
      memory: 256Mi
      cpu: 100m
    limits:
      memory: 1Gi
      cpu: 1

core:
  image:
    repository: goharbor/harbor-core
    tag: v2.11.0
  replicas: 1
  resources:
    requests:
      memory: 256Mi
      cpu: 100m
    limits:
      memory: 1Gi
      cpu: 1

jobservice:
  image:
    repository: goharbor/harbor-jobservice
    tag: v2.11.0
  replicas: 1
  revisionHistoryLimit: 10
  resources:
    requests:
      memory: 256Mi
      cpu: 100m
    limits:
      memory: 1Gi
      cpu: 1

registry:
  registry:
    image:
      repository: goharbor/registry-photon
      tag: v2.11.0
    resources:
      requests:
        memory: 256Mi
        cpu: 100m
      limits:
        memory: 1Gi
        cpu: 1
  controller:
    image:
      repository: goharbor/harbor-registryctl
      tag: v2.11.0
    resources:
      requests:
        memory: 256Mi
        cpu: 100m
      limits:
        memory: 1Gi
        cpu: 1
  replicas: 1
  revisionHistoryLimit: 10
  upload_purging:
    enabled: true
    age: 168h
    interval: 24h
    dryrun: false

trivy:
  enabled: true
  image:
    # repository the repository for Trivy adapter image
    repository: goharbor/trivy-adapter-photon
    # tag the tag for Trivy adapter image
    tag: v2.11.0
  replicas: 1
  resources:
    requests:
      memory: 256Mi
      cpu: 100m
    limits:
      memory: 1Gi
      cpu: 1

database:
  type: internal
  internal:
    image:
      repository: goharbor/harbor-db
      tag: v2.11.0
    password: "somaz@1234"
    # shmSizeLimit: 512Mi
    shmSizeLimit: 2048Mi

redis:
  type: internal
  internal:
    image:
      repository: goharbor/redis-photon
      tag: v2.11.0

exporter:
  image:
    repository: goharbor/harbor-exporter
    tag: v2.11.0
  replicas: 1
  revisionHistoryLimit: 10
  resources:
    requests:
      memory: 256Mi
      cpu: 100m
    limits:
      memory: 1Gi
      cpu: 1

metrics:
  enabled: true
  serviceMonitor:
    enabled: true

 

 

설치방법은 아래와 같다.

# lint 확인
helm lint --values ./values/somaz.yaml  

# 설치전 확인
helm install harbor . -n harbor -f ./values/somaz.yaml --create-namespace --dry-run >> output.yaml

# 설치
helm install harbor . -n harbor -f ./values/somaz.yaml --create-namespace

# 업그레이드 방법
helm upgrade harbor . -n harbor -f ./values/somaz.yaml

 

 

삭제방법은 아래와같다.

# harbor 삭제
helm delete -n harbor harbor

# pvc 전부 삭제
kubectl delete pvc --all -n harbor

# pv 삭제
kubectl get pv | grep Released
kubectl delete pv $(kubectl get pv | grep Released | awk '{print $1}')

 

 

 

 


Reference

 

https://vra4u.com/2023/01/11/harbor-quick-tip-leverage-oci-registry-with-helm/

728x90
반응형

'Open Source Software' 카테고리의 다른 글

Minio란? (Object Storage)  (2) 2024.08.26
Habor Robot Account(하버 로봇 계정)란?  (0) 2024.08.21
Cephadm-ansible이란?  (3) 2024.02.29
Rook-Ceph란?  (0) 2024.02.20
Redis(Remote Dictionary Server)란?  (0) 2022.09.26