Harbor 설치 및 방법

Hyeseong·2022년 4월 12일
1

harbor

목록 보기
1/1

Harbor

Harbor는 20년 CNCF(Cloud Native Computing Foundation)의 오픈소스 프로젝트로 Docker hub

처럼 이미지를 저장할 수 있는 저장소이다. Docker는 이미 docker registry라는 이름으로 개인 이미지 저장소를 컨테이너화 하였습니다. Harbor는 사실 내부적으로 dcoker registry를 사용하고 있으며, 여기에 RBAC(Roll Base Access Control), Web page, Image scan 같은 기능을 추가하였습니다.

외부 서비스를 이용하는 것이 아닌 내부에서 이미지 파일을 저장하기 때문에 사내 보안 정책에도 알맛게 사용할 수 있습니다. 아니면 필요에 따라 S3, Minio(Object Storage Server)를 사용할 수 있기도 합니다.

Archetecture

Features

  • 이미지 복제(Harbor 외부 ≤—> Harbor 내부)
  • 이미지 주기적 삭제(tag retention)
  • Project별 disk quota 기능
  • Project별 Private/Public 기능
  • Webhook 기능
  • OCI(Open Container Initiative) Support 기능
  • docker registry API 사용 가능
  • API Docs제공

Opinion

docker registry를 사용시 가장 아쉬운 부분은 뭐니뭐니해도 GUI 복잡한 CLI과정을 편리하고 빠르게 단순하게 할 수 있게 기능을 제공하는 Harbor를 써야하는 이유 중 하나가 바로 이 부분입니다.

이미지 복제도 GUI로 할 수 있고 기본적인 이미지 삭제나 특정 기간을 지난 이미지 삭제 또는 가장 최근에 Pull 된 N개의 이미지만 제외하고 삭제하기 등 운용하기에 편하다는것이 사람들에게 널리 알려져 있는 상태입니다.

Installation

HTTPS 지원을 위한 인증서 생성 및 업데이트

Certification 파일 디렉터리 생성

인증서 생성 및 기타 작업을 수행하기 위한 디렉터리를 생성합니다

$ cd ~
$ mkdir -p ~/certs
$ cd ~/certs

CA Certificates 생성

실제 RootCA (신뢰할 수 있는 루트 인증 기관)를 사용하는게 아니라면, 직접 CA (인증 기관)를 생성하여 Server의 인증서가 안전하다고 인증해주어야 합니다. 따라서 아래의 명령어로 개인용 Root CA 역할을 할 CA.key를 생성하고, CA.key의 짝이 되는 CA.crt 공개키를 생성합니다.


# Root CA의 비밀키 생성
$ openssl genrsa -out ca.key 4096

#Root CA의 비밀키와 짝을 이룰 공개키 생성
$ openssl req -x509 -new -nodes -sha512 -days 365 \
-key ca.key \
-out ca.crt

Server Certificates 생성

이번에는 서버의 인증서를 생성합니다. Root CA의 비밀키와 공개키를 만들 때와 마찬가지로 서버의 비밀키를 생성하고, 생성한 비밀키를 넣어 CSR 파일을 생성합니다. CSR 파일은 Certificate Signing Request 파일로, 인증서를 발급하기 위해 필요한 정보를 담고 있는 데이터입니다. CSR 파일은 SSL 발급을 신청하기 위해 해당 파일 내용을 Root CA에 제출하는 용도로 사용하게 됩니다.

# Server의 비밀키 생성
$ openssl genrsa -out server.key 4096

# Server의 CSR 파일 생성
$ openssl req -sha512 -new \
-key server.key \
-out server.csr

SAN 등록

이제 위에서 생성한 서버의 CSR 파일을, 직접 만든 Root CA에 인증해달라고 요청하는 작업을 수행합니다. CSR 파일을 가지고 서버의 인증키를 생성하게 됩니다.

$ vi v3ext.cnf
# 아래 내용 추가
subjectAltName = IP:192.168.X.X,IP:127.0.0.1
v3v# 위 작업 수행 이후, SAN 등록하는 작업 수행
$ openssl x509 -req -sha512 -days 365 \
-extfile v3ext.cnf \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in server.csr \
-out server.crt

Certificate 업데이트

Docker에서는 .crt 파일을 CA (인증 기관)의 인증서라고 간주합니다. 서버의 인증서라는 것을 표현하고 싶다면 .crt 형식이 아닌 .cert 형식으로 변환해주어야 합니다. 따라서 server.crt 파일을 server.cert 파일로 변환합니다.

$ openssl x509 -inform PEM -in server.crt -out server.cert

만들어진 인증서 파일들을 Docker와 Host에 등록, 업데이트하는 작업을 수행합니다.

# Docker
# host의 이름을 server라고 했으므로, /certs.d/server로 생성합니다.
sudo mkdir -p /etc/docker/certs.d/server
cp server.cert /etc/docker/certs.d/server/
cp server.key /etc/docker/certs.d/server/
cp ca.crt /etc/docker/certs.d/server/

# Host
sudo cp ca.crt /usr/local/share/ca-certificates/harbor-ca.crt
sudo cp server.crt /usr/local/share/ca-certificates/harbor-server.crt
sudo update-ca-certificates

Harbor package 다운로드

Harbor는 Offline Install과 Online Install 두 가지 방식으로 설치를 지원하고 있습니다. 본 포스트에서는 Offline Install 을 기준으로 설치하도록 하겠습니다. 현재 2021년 5월 27일 기준으로 v2.2.2 릴리즈가 최신입니다.

# 홈 디렉터리로 이동합니다.
$ cd ~

# 설치 파일을 다운로드 합니다.
$ wget https://github.com/goharbor/harbor/releases/download/v2.2.2/harbor-offline-installer-v2.2.2.tgz

# 다운로드한 파일을 압축 해제 합니다.
$ tar xzvf harbor-offline-installer-v2.2.2.tgz

# 압축이 해제된 harbor 디렉터리로 이동하여 작업을 수행합니다.
$ cd ~/harbor

harbor.yml 작성

바로 위 문단에서 이동한 디렉터리에서 아래의 작업을 수행합니다. 기본적으로 디렉터리 내에는 harbor.yml.tmpl 파일이 존재합니다. 이 파일의 이름을 harbor.yml로 수정하고 내용을 필요에 맞게 수정합니다. 본 포스트에서는 아래 세 개의 내용을 수정했습니다.

$ cp harbor.yml.tmpl harbor.yml
$ vi harbor.yml

# 아래 내용 수정

hostname: {IP주소로 수정 (예시, 192.168.X.X)}

https.certificate: {server.cert로 수정 (예시, /etc/docker/certs.d/server/server.cert)
https.private_key: {server.key로 수정 (예시, /etc/docker/certs.d/server/server.key)

Deploy

위 문단에서 작업한 harbor.yml의 작성이 끝나면, Harbor 설치의 사전 작업을 수행하는 prepare 스크립트를 실행합니다. prepare 스크립트는 결과적으로 prepare 컨테이너를 생성합니다.

prepare 작업을 완료했다면 이제 설치할 시간입니다. sudo 명령을 사용하지 않으면 권한 관련한 문제가 여럿 발생하는 것을 확인했습니다. sudo를 붙여주면 문제 없이 설치가 완료됩니다. 이 작업에는 시간이 조금 소요되니 차분히 커피 한 모금하며 기다려주시면 됩니다.

$ ./prepare
$ sudo ./install.sh

로그인

설치가 완료됐다면 이제 로그인해봅시다. .로그인할 때는 기본적으로 admin 과 Harbor12345 로 로그인할 수 있습니다. 보안상 최초 로그인 이후에 해당 패스워드를 변경해줄 필요가 있습니다.

프로젝트 생성

Harbor의 프로젝에는 애플리케이션의 모든 repository가 포합됩니다. 참고로 프로젝트가 생성되기 전에는 이미지를 Harbor에 푸시 할 수 없습니다. 적절한 권한을 가진 유저만 프로젝트 작업을 원할히 수행 할 수 있습니다.

프로젝트 유형 2가지

  • 공개 : 모든 유저가 이미지를 가져올 수 있습니다. 다른 사람과 리포지토리를 공유 할 수 있는 가장 편리한 방법입니다.
  • 비공개 : 프로젝트 구성원만 이미지를 가져올 수 있습니다.

전제사항

Harbor 관리자 계정으로 로그인 하거나 프로젝트 관리자 계정으로 로그인해야 됩니다.

step

  1. 프로젝트로 이동하여 새프로젝트를 클릭합니다.
  2. 프로젝트 이름, 접근 수준(공개, 비공개), 프로젝트 사이즈 설정, 프로젝트 캐쉬 설정 유무를 적절히 셋업해줍니다.
  • 프로젝트 생성 이후 summary, repository, members, labels, scanner, logs, configuration ... 네비게이션을 화면에 볼 수 있습니다.3.

  1. 프로젝트 설정 변경

프로젝트 멤버 추가

  • private한 프로젝트에서 특정 멤버를 추가 등록하고 역활에대한 Action을 변경할 때 사용합니다.
  • +USER button을 눌러 등록된 계정의 Name과 Role을 지정하여 프로젝트의 멤버 추가를 합니다.
  • 기존 프로젝트에 추가된 유저의 역할 변경을 하고자 한다면 해당 유저의 좌측 체크박스를 클릭하고 ACTION button을 클릭하여 역할을 변경하여 줍니다.
  • 기타 LDAP/AD와 OIDC를 통한 방식은 여기서 다루지 않습니다.

용어 설명

프로젝트 설정

  1. 프로젝트 첫 생성 이후, 설정탭 에서 프로젝트의 설정을 변경 할 수 있습니다.
    1. 적절한 권한을 가진 계정으로 harbor에 로그인합니다.
    2. 좌측 프로젝트 카테고리를 클릭한 후 원하는 프로젝트를 클릭하여 선택합니다.
    3. 설정탭을 클릭합니다.
    4. 4개 항목을 확인하고 적절한 항목을 체크하여 프로젝트 설정을 변경합니다.

빌드 히스토리

이미지 빌드 내역을 상세히 보고자 할 경우 확인하고자 하는 이미지를 선택할 경우 볼 수 있습니다.

프로젝트 로그

Harbor내에서 사용자가 프로젝트에서 수행하는 모든 작업들을 로그로 확인 할 수 있습니다. 
로그 내용을 필터링하여 볼 수 도 있습니다.

이미지 push & pull

  • Warning Harbor는 Registry V2 API만 지원합니다. 그리고 Docker Clinet는 1.6.0 버전 이상 사용하여야 문제없이 이미지를 push, pull 할 수 있습니다.

image pull

  • 만약 이미지가 private 프로젝트에 있는 경우 먼저 로그인을 수행합니다.
$ docker login harbor_address
  • 이미지 가져오기
docker pull harbor_address/프로젝트이름/이미지:태그
  • warning 프로젝트 설정에서 nabled content trust 를 활성화한 경우 unsigned image의 경우 pull 할 수 없습니다. 변경하고자 하는 경우 프로젝트 설정을 바꾸어야 합니다.

image push

  • 이미지를 하보 프로젝트에 밀어넣기전 프로젝트 구성 초기화를 GUI를 통해서 먼저 선행 하여야 합니다.
    도커 로그인 → 태그 변경(ex. harbor_address/프로젝트명/이미지명:태그 )

라벨 관리

이미지 관리를 좀 더 효율적으로 사용하기 위해서 Trello, github등 여러 플랫폼의 라벨 관리를 서비스처럼 하보에서도 사용 할 수 있습니다.

  • 라벨 종류
    • 글로벌 라벨 :
      • 시스템의 모든 이미지에 적용 할 수 있습니다.
    • 프로젝트 라벨:
      • 프로젝트 레벨에 국한된 이미지에만 라벨링을 할 수 있습니다.

글로벌 라벨

AdministratorConfigurationLabels

프로젝트 라벨

프로젝트 디테일 페이지의 Labels 탭을 이용하여 라벨 생성, 변경, 삭제를 할 수 있습니다.

Retagging

매번 docker CLI를 통하여 불편하게 태그를 지정하지 않고, 하버에서 이미지에 태그를 다시 지정할 수 있습니다.

  • release/app:stg -> release/app:prd
  • develop/app:v1.0 -> release/app:v1.0

이미지에 태그를 다시 지정하려면 원본 프로젝트에서 읽기 권한(게스트 역할 이상)이 있어야 하고 대상 프로젝트에서 쓰기 권한(개발자 역할 이상)이 있어야 합니다.

Harbour 인터페이스에서 태그를 다시 지정할 이미지를 선택하고 을 클릭 Retag합니다.

태그 재지정 창에서 프로젝트 이름, 저장소 이름, 새 태그 이름을 입력하고 확인 을 클릭합니다 .

profile
어제보다 오늘 그리고 오늘 보다 내일...

2개의 댓글

comment-user-thumbnail
2022년 11월 23일

안녕하세요:) 글 잘 읽었습니다!! 지식 공유 감사해요 ㅎㅎ
다름이 아니라 따라하는 과정에서 에러가 발생해서 혹시 같은 문제가 없으셨는지 문의드리고 싶습니다!
sudo ./install.sh를 진행하는 과정에서 [Step 4]에

FileNotFoundError: [Errno 2] No such file or directory: '/hostfs/etc/docker/certs.d/server/server.key'

이러한 에러가 발생하는데, server.key의 경로를 Hyeseong님과 동일하게 설정한 것 같은데 에러가 발생하였습니다. 혹시 문제가 어떤 것인지 아시나요 ..?

답글 달기
comment-user-thumbnail
2023년 11월 23일

좋은 글 정말 감사합니다! 덕분에 한 번에 설치했어요!
좋은 하루 되세요:)

답글 달기