Post

Kubernetes에서 Harbor 구축하기

Harbor는 오픈소스 컨테이너 이미지 레지스트리로, Docker 및 OCI 이미지 포맷을 저장하고 관리할 수 있는 솔루션입니다. 기본적으로 안전한 이미지 관리를 위해 보안 스캠, 서명, 복제 등의 기능을 제공하며, 대규모 엔터프라이즈 환경에서 다양한 이미지 관리 요구를 충족시키기 위해 설계되었습니다. Harbor는 특히 프라이빗 이미지 레지스트리를 구축하는 데 유용하며, 클라우드 환경뿐만 아니라 온프레이스에서도 사용할 수 있어 다양한 인프라 요구사항에 적용할 수 있습니다.

이전에 진행했던 Weasel 프로젝트를 클라우드에서 로컬 Kubernetes로 마이그레이션하는 작업을 시작하며 컨테이너 이미지를 ECR이 아닌 온프레미스에서 관리해볼까? 라는 생각에 여러가지 솔루션을 고민하였습니다. Line EngineeringSKT Enterprise 기술 블로그를 보고 오픈소스 기반, 강력한 보안 기능을 갖춘 Harbor에 매력을 느끼게 되었고, 도입을 확정하게 되었습니다. 해당 포스트에서는 Kubernetes에서 Harbor를 구축하는 과정에 대해 다뤄보도록 하겠습니다.


사전 조건

  • Kubernetes cluster 1.10+
  • Helm 2.8.0+
  • High available Ingress Controller
  • High available PostgreSQL database
  • High available Redis
  • PVC (Persistent Volume Claim) 또는 외부 오브젝트 스토리지

실습 환경

  • Kubernetes cluster v1.29.6
  • Helm v3.15.3
  • Nginx Ingress Controller
  • Local Path Provisioner

Helm 저장소 추가

Helm 패키지를 사용하여 Harbor를 구축하기 위해 Harbor Chart가 있는 Helm 저장소를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
❯ helm repo add harbor https://helm.goharbor.io
"harbor" has been added to your repositories
❯ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "aws-secrets-manager" chart repository
...Successfully got an update from the "secrets-store-csi-driver" chart repository
...Successfully got an update from the "harbor" chart repository
...Successfully got an update from the "fluent" chart repository
...Successfully got an update from the "cilium" chart repository
...Successfully got an update from the "prometheus-community" chart repository
Update Complete. ⎈Happy Helming!⎈

Namespace 생성

Harbor를 설치할 Namespace를 생성합니다.

1
2
❯ kubectl create namespace harbor
namespace/harbor created

Helm으로 Harbor 설치

Helm을 사용해 Harbor를 설치하기 위해 values.yaml 파일을 다운로드 후 필요에 맞게 설정하고 설치를 진행하도록 하겠습니다.

values.yaml 다운로드

1
2
3
❯ helm show values harbor/harbor > values.yaml
❯ ls
values.yaml

values.yaml 파일 수정

Redis, PostgreSQL, Ingress, externalURL, AdminPassword 등 관련된 설정을 올바르게 수정합니다. TLS 인증서는 자동으로 생성하도록 설정 해주었으며, 여기 나와있는 내용 이외의 이미지 서명 기능인 Notary, 이미지 취약점 스캐너인 Clair, Webhook 등의 설정도 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
expose:
  type: ingress
  tls:
    enabled: true  # TLS 활성화
    certSource: auto  # TLS 인증서 자동 생성
    auto:
      commonName: "~~~~"  # 인증서에 사용할 도메인
  ingress:
    hosts:
      core: ~~~~  # Harbor에 접근할 도메인
    controller: default  # NGINX Ingress Controller 사용
    className: "nginx" # ingress className 입력
    annotations:
      nginx.ingress.kubernetes.io/ssl-redirect: "true"  # HTTPS 리디렉션
      nginx.ingress.kubernetes.io/proxy-body-size: "0"  # 업로드 크기 제한 해제
...
...
...
externalURL: # Harbor에 접근할 도메인
...
...
...
persistence:
  enabled: true
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      existingClaim: ""
      storageClass: "local-path" # 사용할 StorageClass
      subPath: ""
      accessMode: ReadWriteOnce
      size: 10Gi # 이미지 저장을 위한 스토리지 용량
      annotations: {}
    database:
      existingClaim: ""
      storageClass: "local-path" # 사용할 StorageClass
      subPath: ""
      accessMode: ReadWriteOnce
      size: 1Gi
      annotations: {}
    redis:
      existingClaim: ""
      storageClass: "local-path" # 사용할 StorageClass
      subPath: ""
      accessMode: ReadWriteOnce
      size: 1Gi
      annotations: {}
...
...
...
harborAdminPassword: # Admin Password

Harbor 배포

1
helm install harbor harbor/harbor --namespace harbor -f values.yaml

접속 확인

values.yaml 파일에 입력한 AdminPassword를 사용해 접속해봅니다.

harbor connection

harbor login


Reference


궁금하신 점이나 추가해야 할 부분은 댓글이나 아래의 링크를 통해 문의해주세요.
Written with KKam._.Ji

This post is licensed under CC BY 4.0 by the author.