본문 바로가기
Linux/OpenShift

RHOCP Installation (2) - Harbor Registry 설치

by LILO 2023. 7. 19.
반응형

INTRO

RHOCP(OpenShift) 테스트를 위해 최소한의 스펙으로 VM을 준비하였습니다.

Machine OS CPU (vCPU) RAM (GB) Storage (GB) Container Tool
harbor RHEL 8.8 2 4 100 + NFS Docker
bastion1 RHEL 8.8 2 4 100 Podman
bastion2 RHEL 8.8 2 4 100 Podman
bootstrap RHCOS 4.13.0 4 16 100 CRI-O
master1 RHCOS 4.13.0 4 16 100 CRI-O
master2 RHCOS 4.13.0 4 16 100 CRI-O
master3 RHCOS 4.13.0 4 16 100 CRI-O
worker1 RHCOS 4.13.0 2 8 100 CRI-O
worker2 RHCOS 4.13.0 2 8 100 CRI-O

Private registry로 Harbor를 선택한 이유는 Docker Registry를 구축하여 간단하게 사용하는 방법도 있지만 사용자 친화적인 웹 페이지를 사용하고 싶어서 Harbor를 선택하게 되었습니다.

☞ Private Registry: 개인 서버에 구축하는 이미지 저장소(Image Registry) 

 

 

Harbor 설치 전 확인사항

Harbor 설치를 위해 필요한 최소 사양은 아래와 같습니다.

Docker Compose를 사용해서 컨테이너에서 운영되므로 OS는 Docker 17.06.0을 설치할 수 있는 환경이라면 크게 문제되지 않을 것 같습니다.

 

Chart Museum 기능을 사용하기 위해 Latest Version인 2.8.0이 아닌 2.7.0을 설치하였습니다.

Resource Minimum Recommended
CPU 2 CPU 4 CPU
MEM 4 GB 8 GB
Disk 40 GB 160 GB
Docker engine 17.06.0 이상
Docker Compose v1.18.0 이상 or v2
OpenSSL 최신 버전 선호 (크게 상관 없음)
 

Harbor – Harbor Installation Prerequisites

Harbor Installation Prerequisites

goharbor.io

 

 

 

Harbor 오프라인 설치 전 사전 작업 (Docker Local DNF Repository 구축)

CentOS 계열의 Docker-CE 레포를 추가합니다. (외부망과 통신이 되는 서버)

# cat << EOF >> /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
EOF

 

reposync 명령을 통해 Repository를 서버에 다운로드 받습니다. (외부망과 통신이 되는 서버)

# reposync -p /root/repo/docker --download-metadata --repo=docker-ce-stable
-p: RPM 다운로드 경로,  --download-metadata: Repository의 metadata 다운로드,  --repo: 다운로드할 Repo ID

 

정상적으로 다운로드가 되면 다운로드한 Repository를 DNF Repo 서버에 옮겨줍니다. (외부망과 통신이 되는 서버)

# rsync -az /root/repo/docker  bastion1:/data/repo

 

Harbor 서버에 DNF Repository 설정합니다. (Harbor 서버)

# cat << EOF >> /etc/yum.repos.d/docker-ce.repo
[docker-ce]
name=docker-ce
baseurl=repo.example.com
gpgcheck=0
enabled=1
EOF

# dnf repolist -vv

 

 

Harbor Offline Installation (Harbor 오프라인 설치)

Docker를 설치합니다.

# dnf install docker-ce docker-ce-cli

 

Docker Compose를 업로드한 후 명령어를 편하게 사용하기 위해서 "/usr/local/bin"으로 옮깁니다.

 

Releases · docker/compose

Define and run multi-container applications with Docker - docker/compose

github.com

# chmod +x docker-compose-linux-x86_64  docker-compose
# mv docker-compose-linux-x86_64  docker-compose
# mv docker-compose  /usr/local/bin/docker-compose

 

Harbor Offline 설치 파일 압축을 해제합니다.

 

Releases · goharbor/harbor

An open source trusted cloud native registry project that stores, signs, and scans content. - goharbor/harbor

github.com

# tar xzf harbor-offline-installer-v2.7.1.tgz -C /usr/local/harbor-2.7.1
# ln -s /usr/local/harbor-2.7.1 /usr/local/harbor

 

Harbor 설정 템플릿 파일을 복사하여 Harbor 설정 파일을 생성합니다.

# cp /usr/local/harbor/harbor.yml.tmpl  /usr/local/harbor/harbor.yml

 

Harbor 설정을 위해 아래의 설정을 수정합니다.

아래는 설정파일에서 주석을 제외하고 출력한 내용이며 "/data" 경로는 OCP 클러스터 및 Operator 이미지로 인해 많은 용량이 필요해 NFS로 마운트하였습니다.

# cat /usr/local/harbor/harbor.yml |grep -v "#"
hostname: harbor.example.com	# Harbor DNS 주소

http:
  port: 80

https:
  port: 443
  certificate: /usr/local/harbor/certs/harbor.example.com.crt		#Harbor SSL 인증서 crt 파일
  private_key: /usr/local/harbor/certs/harbor.example.com.key		#Harbor SSL 인증서 key 파일



harbor_admin_password: Harbor12345        # Harbor Password

database:
  password: root123
  max_idle_conns: 100
  max_open_conns: 900
  conn_max_lifetime: 5m
  conn_max_idle_time: 0

data_volume: /data/harbor		# Harbor 저장소



trivy:
  ignore_unfixed: false
  skip_update: false
  offline_scan: false
  security_check: vuln
  insecure: false

jobservice:
  max_job_workers: 10

notification:
  webhook_job_max_retry: 10

chart:
  absolute_url: disabled

log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor


_version: 2.7.0




proxy:
  http_proxy:
  https_proxy:
  no_proxy:
  components:
    - core
    - jobservice
    - trivy



upload_purging:
  enabled: true
  age: 168h
  interval: 24h
  dryrun: false

cache:
  enabled: false
  expire_hours: 24

 

Harbor에 SSL을 적용하기 위해 OpenSSL을 이용하여 Harbor용 SSL 사설 인증서를 만듭니다.

# openssl genrsa -out ca.key 4096
# openssl req -x509 -new -nodes -sha512 -days 3650  -subj "/C=CN/ST=OO/L=OO/O=example/OU=lilo/CN=harbor.example.com"  -key ca.key  -out ca.crt

# openssl genrsa -out harbor.example.com.key 4096
# openssl req -sha512 -new  -subj "/C=CN/ST=OO/L=OO/O=example/OU=lilo/CN=harbor.example.com"  -key harbor.example.com.key  -out harbor.example.com.csr

# cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEnciphermen
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.example.com
DNS.2=harbor
EOF

# openssl x509 -req -sha512 -days 3650  -extfile v3.ext  -CA ca.crt -CAkey ca.key -CAcreateserial  -in harbor.example.com.csr  -out harbor.example.com.crt
# openssl x509 -inform PEM -in harbor.example.com.crt -out harbor.example.com.cert

인증서 만드는 단계에 대한 자세한 내용은 아래의 Harbor 문서를 참고해주시면 됩니다.

 

Harbor – Configure HTTPS Access to Harbor

Configure HTTPS Access to Harbor

goharbor.io

 

Docker를 사용하는 Registry를 사용하다 보면 아래의 인증서 에러가 발생하면서 로그인이 되지 않는 현상이 발생합니다.

HTTPS 인증을 위해 CA 인증서를 설치하는 작업을 진행합니다.

<docker login 명령어 로그인시 에러 로그>
Error response from daemon: Get https://<Registry 주소>/v1/users/: x509: certificate signed by unknown authority
# mkdir -p /etc/docker/certs.d/harbor.example.com
# cp /usr/local/harbor/certs/harbor.example.com.cert  /etc/docker/certs.d/harbor.example.com
# cp /usr/local/harbor/certs/harbor.example.com.key  /etc/docker/certs.d/harbor.example.com
# cp /usr/local/harbor/certs/ca.crt  /etc/docker/certs.d/harbor.example.com

 

설치 전 모든 사전 작업이 완료되었으니 Harbor 설치를 진행합니다.

앞에서 언급한 부분과 같이 Harbor 2.7.0을 선택한 이유가 Chart museum 기능을 사용하기 위해서였습니다.

설치 옵션에 "--with-chartmuseum" 인자를 추가해줍니다. (2.8.0 이상부터는 chart museum이 아닌 OCI를 확인 바랍니다.)

# cd /usr/local/harbor/
# ./install.sh --with-chartmuseum

브라우저에서 화면을 확인합니다.

 

 

Harbor 기동 방법

시작

# cd /usr/local/harbor
# docker-compose up -d

중지

# cd /usr/local/harbor
# docker-compose down -v

상태

[root@harbor ~]# docker-compose -f /usr/local/harbor/docker-compose.yml ps
NAME                IMAGE                                COMMAND                  SERVICE             CREATED             STATUS                PORTS
harbor-core         goharbor/harbor-core:v2.7.1          "/harbor/entrypoint.…"   core                6 days ago          Up 6 days (healthy)
harbor-db           goharbor/harbor-db:v2.7.1            "/docker-entrypoint.…"   postgresql          6 days ago          Up 6 days (healthy)
harbor-jobservice   goharbor/harbor-jobservice:v2.7.1    "/harbor/entrypoint.…"   jobservice          6 days ago          Up 6 days (healthy)
harbor-log          goharbor/harbor-log:v2.7.1           "/bin/sh -c /usr/loc…"   log                 6 days ago          Up 6 days (healthy)   127.0.0.1:1514->10514/tcp
harbor-portal       goharbor/harbor-portal:v2.7.1        "nginx -g 'daemon of…"   portal              6 days ago          Up 6 days (healthy)
nginx               goharbor/nginx-photon:v2.7.1         "nginx -g 'daemon of…"   proxy               6 days ago          Up 6 days (healthy)   0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp
redis               goharbor/redis-photon:v2.7.1         "redis-server /etc/r…"   redis               6 days ago          Up 6 days (healthy)
registry            goharbor/registry-photon:v2.7.1      "/home/harbor/entryp…"   registry            6 days ago          Up 6 days (healthy)
registryctl         goharbor/harbor-registryctl:v2.7.1   "/home/harbor/start.…"   registryctl         6 days ago          Up 6 days (healthy)
반응형