연재 시리즈

pkos 스터디 3주차 2편 - 도커 레지스트리 harbor

악분 2023. 3. 25. 09:00
반응형

3주차 2편에서는 gitops시스템에서 도커 이미지를 저장하는 harbor를 다룹니다.

 

📘 harbor란?

harbor는 도커 이미지를 저장하는 레지스트리입니다. harbor의 특징은 도커 이미지 보안관리 기능이 다루기 쉽습니다. 도커 이미지 취약점 검사, 접근권한 설정, 이미지 서명 등을 지원합니다. 도커 이미지 이외에 helm 차트 관리 기능도 지원합니다.

 

harbor는 gitops시스템에서 도커 이미지 관리를 담당합니다.

 

📘설치하지 않고 harbor 체험하는 방법

감사하게도 harbor는 데모 사이트를 운영하고 있습니다. 누구나 데모 사이트에 들어가서 harbor를 체험할 수 있습니다.

링크: https://demo.goharbor.io

 

📘설치

harbor설치는 yaml, helm으로 설치할 수 있습니다. 저는 helm으로 설치했습니다.

 

먼저 helm차트를 등록합니다.

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

 

helm 차트 오버라이딩 할 values.yaml은 아래와 같습니다. ALB ingress설정과 tls설정을 했습니다. tls를 aws certificate manager를 사용하므로 annotations에 certficate-arn을 설정했습니다.

 

aws certificate-arn은 aws CLI로 쉽게 구할 수 있습니다.

aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
# values.yaml
expose:
  tls:
    certSource: none
  ingress:
    hosts:
      core: harbor.choilab.xyz
      notary: notary.choilab.xyz
    controller: alb
    className: alb
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: ${aws certificate-arn}

alb:
  ingress:
    kubernetes.io/scheme: internet-facing
    kubernetes.io/target-type: ip
    kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
    kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-2:467606240901:certificate/c4c4c3ec-cf3e-4759-885a-e5017b065207

externalURL: https://harbor.choilab.xyz

 

helm 차트를 릴리즈합니다. 저는 harbor 네임스페이스에 릴리즈했습니다.

helm upgrade --install harbor harbor/harbor \
--create-namespace \
-f ./values.yaml \
--namespace harbor \
--version 1.11.0

 

helm 차트 릴리즈를 성공하면 harbor 네임스페이스에 pod가 실행됩니다.

 

Ingress설정도 확인해보세요. 저는 ALB Ingress와 Route 53 reocrd가 정상적으로 생성되었습니다.

 

harbor에 접속하면 로그인 페이지 나옵니다. tls를 설정했으므로 https가 인증되었는지 확인합니다.

 

📘계정과 비밀번호

디폴트 계정/비밀번호는 admin/Harbor12345 입니다.

 

📘harbor 프로젝트(project)

프로젝트란?

harbor 프로젝트는 도커 이미지를 논리적으로 그룹핑하는 기능으로, harbor에 도커 이미지를 저장하기 위해 프로젝트가 필수입니다. 그리고 접근권한이 설정된 계정도 필요합니다. harbor는 각 프로젝트마다 접근권한을 설정할 수 있습니다.

admin계정은 모든 프로젝트의 모든 권한을 갖습니다.

출처: https://goharbor.io/docs/2.7.0/administration/managing-users/

 

프로젝트 조회

프로젝트 목록은 왼쪽 메뉴 Projects에서 볼 수 있습니다.

 

프로젝트 생성

프로젝트는 New Project버튼을 눌러 생성할 수 있습니다.

 

test라는 이름으로 프로젝트를 생성합니다. 저는 아무나 프로젝트를 public으로 설정했습니다. public은 누구나 프로젝트 도커 이미지에 접근(push는 불가)할 수 있습니다.

 

프로젝트가 잘 생성되면 test프로젝트가 목록에서 보입니다.

 

📘도커 이미지 push

harbor test프로젝트에 nginx:latest이미지를 push해보겠습니다. 저는 docker tag를 이용하여 기존 nginx:latest이미지를 변경하고 push했습니다.

먼저 dockerhub에 있는 nginx:latest이미지를 pull합니다. 저는 nerdctl를 사용했습니다.

nerdctl -n k8s.io pull nginx

 

docker tag명령어로 pull한 nginx이미지를 harbor주소로 수정합니다.

nerdctl -n k8s.io tag nginx harbor.choilab.xyz/test/nginx

 

그리고 harbor에 이미지를 push합니다. push하기전 docker login을 해야 합니다.

nerdctl login -u admin -p Harbor12345 harbor.choilab.xyz
nerdctl -n k8s.io push harbor.choilab.xyz/test/nginx

 

harbor에서 확인하면 nginx 도커 이미지가 보입니다.

 

📘harbor push로그 확인

harbor 로그는 대시보드에서 쉽게 볼 수 있습니다. admin계정이 nginx:latest를 push했다는 로그가 보입니다.

 

📘 도커 이미지 취약점 검사

harbor는 trivy라는 오픈소스를 이용하여 도커 이미지 취약점을 검사합니다. trivy는 pod로 실행되고 있습니다.

 

취약점 점검되지 않은 도커 이미지는 Not Scanned라고 표시됩니다.

 

취약점 점검은 Scan버튼을 눌러서 실행할 수 있습니다. 

 

취약점 스캔이 끝나면 자동으로 결과 보고서가 생성됩니다.

반응형