Room9

Harbor - Installation 본문

Kubernetes/Ops

Harbor - Installation

Room9_ 2024. 11. 28. 16:31

Details

  • 인증서구성
  • Harbor 설치
  • 컨테이너 이미지 PUSH / PULL

인증서 구성

자체 서명된 인증서 구성이 필요함

  • CA 인증서 생성(자체 서명된 인증서를 위함)
  • 서버 인증서 생성
  • Harbor 및 Docker에 인증서 제공
인증서 구성과 관련된 용어
https://guide.ncloud-docs.com/docs/privateca-glossary

 


 

CA 인증서 생성

프로덕션 환경에서는 CA에서 인증서를 받아야 합니다. 테스트 또는 개발 환경에서는 자체 CA를 생성할 수 있습니다. 내부 사설 레지스트리로 사용할 것이기 때문에 아래와 같이 진행합니다.

 

CA 인증서 개인키 생성

openssl genrsa -out ca.key 4096

 

CA 인증서 생성

openssl req -x509 -new -nodes -sha512 -days 3650

 

파라미터

  • -x509 : CSR 대신 자체 서명된 인증서를 생성
  • -new : 새 CSR 파일을 생성
  • -nodes : 개인 키를 암호화하지 않고 평문으로 저장
  • -sha512 : SHA-512 해시 알고리즘을 사용하여 인증서를 서명
  • -days <숫자> : 인증서의 유효기간을 일단위로 설정

ca.key , ca.crt 파일이 생성되게 됩니다.


서버 인증서 생성

위에서 만든 CA 인증서를 통한 서버 인증서를 생성합니다.

 

서버 인증서 개인키 생성(KEY)

openssl genrsa -out harbor.key 4096

 

서버 인증서 서명 요청서 생성(CSR)

openssl req -sha512 -new \\
-subj "/C=KR/ST=Seoul/L=Seoul/O=<회사명>/OU=<부서명>/ \\
       CN=<도메인또는IP>" \\
-key harbor.key \\
-out harbor.csr

 

명령어 실행하면 harbor.keyharbor.csr 파일이 생성되게 됩니다.

 

x509 v3 확장 파일 생성

Harbor 호스트에 연결하기 위해 FQDN 또는 IP 주소를 사용하든 관계없이 이 파일을 만들어야 SAN(Subject Alternative Name) 및 x509 v3 확장 요구 사항을 준수하는 Harbor 호스트에 대한 인증서를 생성할 수 있습니다. DNS도메인을 반영하도록 항목을 바꾸세요.

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=<하버에서 사용할 도메인 or IP 주소>
DNS.2=<하버에서 사용할 도메인 or IP 주소>
DNS.3=hostname
EOF

 

v3.ext 파일을 사용하여 서버 인증서 생성

openssl x509 -req -sha512 -days 3650 \\
-extfile v3.ext \\
-CA ca.crt<실제 ca.crt 파일의 경로> -CAkey ca.key -CAcreateserial \\
-in harbor.csr
-out harbor.crt

 

해당 명령을 실행하게되면 harbor.crt 파일이 생성되고, 디렉토리에 남게되는 최종파일들의 목록은 아래와 같음

-rw-r--r-- 1 root root  1931 11월 21 16:01 ca.crt
-rw------- 1 root root  3247 11월 21 15:59 ca.key
-rw-r--r-- 1 root root    41 11월 22 13:25 ca.srl
-rw-r--r-- 1 root root  1854 11월 21 16:03 harbor.crt
-rw-r--r-- 1 root root  1679 11월 21 16:03 harbor.csr
-rw------- 1 root root  3243 11월 21 16:02 harbor.key
-rw-r--r-- 1 root root    75 11월 21 16:01 v3.ext 

Harbor 및 Docker에 인증서 제공

생성된 서버인증서 harbor.key 와 harbor.crt 파일을 Harbor와 Docker에 제공하고 적용

 

Docker에 적용

Docker 데몬은 .crt 파일을 CA인증서로, .cert 파일을 서버인증서로 해석하기 때문에 형식 변환이 필요합니다.

아래 명령어를 통해 crt 파일을 cert 파일로 형식을 변환합니다.

openssl x509 -inform PEM -in harbor.crt -out harbor.cert

 

ca.crt , harbor.cert , harbor.key 파일을 Docker 인증서 디렉토리로 복사해줍니다.

docker에서 인증서를 읽는 패턴은 /etc/docker/certs.d/<도메인 or IP:port> 경로입니다.

mkdir -p /etc/docker/certs.d/<IP주소>:443
cp ca.crt harbor.key harbor.cert /etc/docker/certs.d/<IP주소>:443/

 

docker 다시시작

systemctl restart docker

 

Harbor에 적용

아직 harbor를 설치하지 않았지만, 설치시에 harbor가 인증서를 읽는 경로를 /data/cert/ 경로로 수정할 예정이기 때문에 사전에 인증서를 옮겨둡니다.

cp harbor.crt harbor.key /data/cert/

Harbor 설치

Harbor다운로드 및 설정

wget을 이용하여 설치파일을 다운로드 받고 압축을 해제 합니다.

다음 링크에서 원하는 버전의 인스톨러를 다운받을 수 있습니다.

https://github.com/goharbor/harbor/releases/

wget <https://github.com/goharbor/harbor/releases/> \\
download/v2.8.0/harbor-online-installer-v2.8.0.tgz
tar xf harbor-online-installer-v2.8.0.tgz

 

이후 압축 해제된 디렉토리에서 harbor.yaml.tmpl 파일을 harbor.yml 로 복사합니다.

cd harbor
cp harbor.yml.tmpl harbor.yml

 

harbor.yml 파일을 열어서 내용 수정

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: <hostname>

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

# https related config
https:
  # https port for harbor, default is 443
  port: 443
  certificate: /data/cert/harbor.crt
  private_key: /data/cert/harbor.key

 

harbor.yml을 기반으로 설치 스크립트를 실행

./prepare # --with-trivy (trivy설치옵션사항)
./install.sh

설치가 완료되고 난 뒤 docker의 프로세스를 확인하면 다음과 같은 내용을 확인할 수 있습니다.

계정은 admin / Harbor12345(초기비밀번호) 로 로그인 할 수 있습니다. 로그인까지 완료되었다면, 설치는 완료되었습니다. 저장소를 설치한 목적이 컨테이너 이미지를 push하고 pull하는 목적이기 때문에 이어서 push 및 pull 해보겠습니다.

다음 링크에서 원하는 버전의 인스톨러를 다운받을 수 있습니다.

https://github.com/goharbor/harbor/releases/

wget <https://github.com/goharbor/harbor/releases/> \\
download/v2.8.0/harbor-online-installer-v2.8.0.tgz
tar xf harbor-online-installer-v2.8.0.tgz

 

이후 압축 해제된 디렉토리에서 harbor.yaml.tmpl 파일을 harbor.yml 로 복사합니다.

cd harbor
cp harbor.yml.tmpl harbor.yml

 

harbor.yml 파일을 열어서 내용 수정

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: <hostname>

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

# https related config
https:
  # https port for harbor, default is 443
  port: 443
  certificate: /data/cert/harbor.crt
  private_key: /data/cert/harbor.key

 

harbor.yml을 기반으로 설치 스크립트를 실행

./prepare # --with-trivy (trivy설치옵션사항)
./install.sh

설치가 완료되고 난 뒤 docker의 프로세스를 확인하면 다음과 같은 내용을 확인할 수 있습니다.

 

계정은 admin / Harbor12345(초기비밀번호) 로 로그인 할 수 있습니다. 로그인까지 완료되었다면, 설치는 완료되었습니다. 저장소를 설치한 목적이 컨테이너 이미지를 push하고 pull하는 목적이기 때문에 이어서 push 및 pull 해보겠습니다.


컨테이너 이미지 PUSH / PULL

컨테이너 이미지 PUSH

harbor에 이미지를 push하기 위해서 로그인과정을 거쳐야합니다.

docker login <서버IP>:443
Username: admin
Password : 

Login Succeeded

 

Push 명령어를 이용하여 생성된 이미지를 harbor로 push 합니다. 기존 사용하고 있는 이미지의 태그를 변경해줍니다.

docker tag optimal-img:0.0.1 <서버IP>:443/library/optimal-img:latest
docker push <서버IP>:443/library/optimal-img:latest

 

웹 콘솔화면에서도 이미지가 PUSH 된 것을 확인할 수 있습니다.


컨테이너 이미지 PULL

기존 로컬에 저장되어있는 이미지를 삭제하고 Harbor에 등록되어 있는 이미지는 PULL해보겠습니다.

docker rmi 39f7c7795b88
docker images
REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
goharbor/redis-photon         v2.8.0    ef1f410f9255   19 months ago   127MB
goharbor/harbor-registryctl   v2.8.0    165749c6eedc   19 months ago   141MB
goharbor/registry-photon      v2.8.0    8bfd12c2163d   19 months ago   78.5MB
goharbor/nginx-photon         v2.8.0    cfc2401896e1   19 months ago   126MB
goharbor/harbor-log           v2.8.0    f31ccc3d46f0   19 months ago   134MB
goharbor/harbor-jobservice    v2.8.0    1b00a3a474e1   19 months ago   140MB
goharbor/harbor-core          v2.8.0    15f4066c1707   19 months ago   164MB
goharbor/harbor-portal        v2.8.0    ae18a071cdce   19 months ago   133MB
goharbor/harbor-db            v2.8.0    f3d4373617a2   19 months ago   179MB
goharbor/prepare              v2.8.0    daa44ccf3b06   19 months ago   170MB

 

harbor 관련 이미지를 제외하고 나머지 이미지는 삭제된것을 확인할 수 있습니다.

docker pull <서버IP>:443/library/optimal-img:latest
docker images
REPOSITORY                             TAG       IMAGE ID       CREATED         SIZE
<서버IP>:443/library/optimal-img   latest    39f7c7795b88   8 days ago      148MB

 

docker pull 명령어를 통해 harbor에 업로드된 이미지를 당겨옵니다. 이후 당겨온 이미지를 통해 애플리케이션을 실행합니다.

 

Comments