install harbor

# chart 저장소로 chartmuseum 을 사용중이였는데 dashboard ui 가 없어 찾아 보니 chartmuseum-ui 가 있다.
# 그런데 chartmuseum-ui 는 helm 차트가 없고 현재 차트 업로드가 안되고 조회만 된다고 한다.
# harbor(https://github.com/goharbor/harbor) 는 CNCF 졸업한 프로젝트로 
# chart 외 Open Container Initiative(OCI) 표준을 따르는 컨테이너 이미지 및 기타 아티팩트(helm chart 파일)를 저장하고 
# 프로젝트별 구분 및 RBAC(롤 기반 접근제어)
# trivy(https://github.com/aquasecurity/trivy)를 통한 취약점 파악이 가능하다.
# 그리고 db(postgresql)를 사용해 아티팩트 사용에 대한 히스토리 및 push, pull 카운트도 알 수 있다.
# 물론 UI 도 있고, chartmuseum(3k) 보다 스타수도 26k로 많다.... 해서 harbor 를 설치해보자.

# harbor 2.x 에서는 chart 저장소가 chartmuseum 에서 oci 레지스트리로 변경되었다.
# harbor 2.8 (Apr 17, 2023) 부터 chartmuseum 을 지원하지 않는다.
# chart 는 image(artifact)와 동일하게 관리된다.

# harbor helm chart 다운로드
helm repo add harbor https://helm.goharbor.io
helm repo update
helm fetch harbor/harbor
tar zxvf harbor-1.17.1.tgz
cd harbor

# values.yaml 변경
# ingress, clusterIP, nodePort, loadBalancer (대소문자 구분) 중 하나를 선택하면 나머지 설정들은 스킵된다.
# nodePort 를 사용하면 기존 ClusterIP 타입의 서비스외  NodePort 타입의 harbor 서비스가 더 생성되고 여기서 기존 서비스들로 분배된다.(configmap > nginx.conf 참고)
expose.type: ingress
expose.tls.enabled: false

# harbor 접근할 웹 주소
expose.ingress.hosts.core: https://harbor.ysoftman.test

# docker 이미지나 helm chart 를 push/pull 할때 cli 명령에서 사용될 서버 주소
externalurl: https://harbor.ysoftman.test

# pv,pvc 기본으로 Container Storage Interface (CSI) 로 생성된다.
# kubectl get storageclasses 로 csi 가 연결된 스토리지 provisioner 확인
# csi 종류
# rancher.io/local-path 는 k8s 클러스터의 각 노드에 있는 로컬 스토리지를 Persistent Volume(PV)으로 사용 
# cinder.csi 는 openstack 환경에서 cinder API 호출하여 새로운 cinder 볼륨을 사용
# reclaimpolicy(pod 삭제시 pv등 정리 방법)는 delete 인 local-path 를 사용
persistence.persistentVolumeClaim.xxxxx.storageClass: "local-path-delete"

# 별도의 nfs 사용할 경우 pv, pvc 리소스를 추가하자.
# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ysoftman-harbor
spec:
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 10Gi
  nfs:
    path: /xxxxx/ysoftman/harbor
    server: nfs.ysoftman.zzz
  persistentVolumeReclaimPolicy: Retain

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ysoftman-harbor
  namespace: harbor
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: ""
  volumeName: ysoftman-harbor

# values.yaml 설정에서 existingClaim 명시
persistence.persistentVolumeClaim.xxxxx.storageClass: ""
persistence.persistentVolumeClaim.xxxxx.existingClaim: "ysoftman-harbor"

# harbor database(postgreSQL) 데이터 저장소로 nfs 사용시 권한 문제와 디렉터리 비어있지 않음등의 문제가 있다면 로컬 스토리지를 사용하자.
persistence.persistentVolumeClaim.database.storageClass: "local-path-delete"

# image/chart 저장소 타입 filesystem, azure, gcs, s3, swift 중 선택
persistence.imageChartStorage.type: filesystem

# image/chart filesystem 선택시 저장 경로
persistence.imageChartStorage.filesystem.rootdirectory: /storage

# 배포
helm upgrade --install harbor . \
--namespace harbor \
--create-namespace \
--values values.yaml

# 이제 admin / Harbor12345 로그인해서 메뉴에서 admin 암호를 변경(대소,특수,포함 8자리 이상등의 조건)한다.
https://harbor.ysoftman.test

#####

# nodePort 와 ingress 둘 다 사용하기
# ingress 상태로 띄우고
expose.type: ingress

# ingress 리소스를 templates/ysoftman_ingress.yaml 파일로 백업
kubectl get ing -o yaml > templates/ysoftman_ingress.yaml

# nodePort 로 다시 배포(helm upgrade)하면 nodePort 서비스가 추가된다.
expose.type: nodePort

# templates/ysoftman_ingress.yaml > backend service 를 NodePort 서비스명으로 변경 후 다시 배포(helm upgrade)

#####

# harbor database(postgresql)이 nfs로 저장이 안되고, 외부 gcs(google cloud storage), s3, 등을 사용할 수 없다면 덤프파일로 백업하자.

# database container 에 접속해서 psql 로 다음과 같이 사용자명과 db명을 파악하자.

# 로컬에서 접속할 수 있도록 port-foward
kubectl port-forward svc/harbor-database 5432:5432 -n harbor

# pg cli 툴 설치
# postgresql server 와 맞는 버전을 설치해야 한다.
# 14 버전 대신 15 버전으로 설치
brew unlink postgresql@14
brew install postgresql@15

# registry db 덤프
pg_dump -h localhost -p 5432 -U postgres -d registry > harbor_backup_20250807.sql

# 덤프 파일로 복구
psql -h localhost -p 5432 -U postgres -d registry < harbor_backup_20250807.sql

#####

# helm 3.7 부터는 oci registry 연동 시 https 만 지원하고 http 사용지 동작하지 않는다.
# oci 방식으로 저장된 차트는 url 로 다운로드가 할 수 없다.
# harbor ui 에서 올라간 차트 이미지에 대해 helm pull, docker pull 등의 커맨드를 클립보드로 복사하는 기능이 있다.

# harbor registry 로그인
helm registry login -u admin -p Harbor12345 https://harbor.ysoftman.test

# harbor 2.8 chartrepo 방식이 사라져 chartrepo 엔드포인트는 사용할 수 없고 oci 프로토콜로만 사용해야 한다.
# 차트 파일 library 프로젝트에 올리기
helm push ysoftman-chart-0.0.1.tgz oci://harbor.ysoftman.test/library

# library 프로젝트의 ysoftman 차트 다운로드
helm pull oci://harbor.ysoftman.test/library/ysoftman-chart --version 0.0.1

# docker 이미지 library 프로젝트로 태깅
docker tag aaa/ysoftman-image:dev harbor.ysoftman.test/library/ysoftman-image:dev

# docker 이미지 library 프로젝트에 올리기
docker push harbor.ysoftman.test/library/ysoftman:dev

# library 프로젝트의 ysoftman:dev 이미지 다운로드
docker pull harbor.ysoftman.test/library/ysoftman:dev

# harbor 버전 확인(로그인 메뉴 > about)
https://harbor.ysoftman.test/api/v2.0/systeminfo

comments:

댓글 쓰기