System Engineering/CI, CD

CI/CD #17. CentOS7 Harbor 설치하기 # 원격 Harbor Login

ZunoXI 2021. 12. 6.

 

개요

Harbor 설치를 통한 Private Image Repository 구축

 

Harbor 설치

DevOps용 파이프라인을 만들다 보면 일반적인 회사 환경에서는 프로그램의 소스에 대해 사내 gitlab을 운영하거나 private github을 사용하여 중요한 소스코드를 외부에 노출시키지 않게 한다. 이 개념과 마찬가지로 docker image를 만들었을 때, docker hub에 image 업로드하지 않고 사내에서 사용할 용도로 image를 저장할 private docker image repository가 있으면 좋을 것이다. 이번 포스팅에서는 이러한 기능을 제공해주는 Harbor를 설치하고 harbor login, push, pull 하는 과정에 대해 알아보려 한다.

 

 

 


 

 

1. docker 설치

  

Harbor를 설치하려면 docker와 docker-compose가 기본으로 필요하다. 특히 docker는 17.06 버전 이상이 필요하다. 그 이하 버전이라면 아래 사진처럼 에러 메시지가 출력될 것이다.

 

 

먼저 docker를 최신 버전으로 설치해주자. 

 

* 구버전 삭제가 필요할 때는 다음 명령어를 사용해서 지워주면 된다.

 

(root 계정이 아닌 경우 앞에 sudo를 붙여준다. 이하 모든 명령어 동일 적용)

 

$ yum remove docker*

 

 

yum 패키지 관리 저장소 설치 

 

$ yum install -y yum-utils

 

docker 레포지터리 등록

 

$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

 

 

docker 최신 버전 설치 및 실행

 

$ yum install docker-ce docker-ce-cli containerd.io
$ systemctl enabel docker
$ systemctl start docker

 

※ 참고. 특정 docker 버전 설치 시에는 아래 명령어 참조 

 

$ yum list docker-ce --showduplicates | sort -r
$ yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

 

참고 포스팅 : 링크

 

[Docker] 도커 최신버전 설치및 삭제

쿠버네티스 환경에서 도커 이미지로 실행중인 컨테이너의 로그를 json 형식으로 출력해야되서 도커 설정을 변경했는데 도커 서비스 재시작이 제대로 되지않는 일이 있었습니다. 구글링을 이리

ksr930.tistory.com

 

설치된 도커 확인

 

$ docker version

 

 

 

 

 

※ docker 데이터 및 container 파일에 대한 데이터 경로 변경은 다음 링크 참고

 

Docker #5. CentOS7 Docker 데이터 경로 변경하기

개요 Docker 데이터 경로 변경 설정 Docker path 도커를 사용하다보면 서버의 root 폴더에 docker image와 컨테이너가 계속 쌓이게된다. 이런 환경에서 서버 운영체제를 다시깔게 되면 이미지 파일이 모

zunoxi.tistory.com

 

 

 

 

2. docker-compose 설치

 

docker-compose는 docker의 멀티 컨테이너를 관리해주고 일반적인 커맨드 라인 인터페이스 관리가 아닌 yaml파일로 관리하는 기능을 제공한다.

$ curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

 

 

 

 

 

 

3. harbor 설치

 

필자의 경우 최초 harbor-online-installer-v1.9.4 버전을 설치했으나, 추후 운영상의 문제로 harbor-offline-installer-v1.10.0 로 변경하여 재설치했다. 이번 포스팅에서는 harbor-offline-installer-v1.10.0 ver 설치를 다룬다.

 

$ wget https://github.com/goharbor/harbor/releases/download/v1.10.1/harbor-offline-installer-v1.10.1.tgz
$ tar xvfz harbor-offline-installer-v1.10.1.tgz
$ cd harbor

 

이 부분에서 시간을 꽤 소비했는데, 기본적으로 다른 시스템들도 그러하듯 harbor는 https 통신이 기본이고 또 그것을 권장한다.  다만, 테스트 서버의 경우 http로 통신을 시도해볼 수 있기 때문에 아래 링크의 내용처럼 harbor 공식 문서에서도 http로 통신할 수 있는 방법을 제공해주기는 한다. 따라서 어쩔 수 없이 http 통신을 해야 하는 경우는 아래 문서를 참고하는 게 좋을 것 같다.

 

https://goharbor.io/docs/1.10/working-with-projects/working-with-images/pulling-pushing-images/

 

Harbor – Pulling and Pushing Images in the Docker Client

Pulling and Pushing Images in the Docker Client

goharbor.io

 

 

필자의 경우, 사내에 harbor를 설치하는 경우이고 와일드카드 인증서가 있기 때문에 https 적용을 시도했다. harbor 같은 경우는 harbor에 접속하는 기본 웹서버가 nginx이기 때문에 https통신을 위해 cert(crt), key 파일의 인증서 2개가 필요하다. 공식문서에는 cert와 key파일을 권고하지만 필자가 테스트해 봤을 때는 pem형식도 호환이 가능한 것으로 보인다. 이는 harbor폴더 내의 harbor.yml에 설정할 수 있다. 

 

※ key 파일의 경우 openssl rsa -in [기존인증서파일].key -out [새로운인증서파일].key 명령어를 통해 인증서 파일을 decrypt 해줘야 한다.

 

 

 

 

yaml 파일 수정

 

harbor.yml에서 설정할 것은 크게 hostname, https, data_volume이다. hostname은 사용할 도메인명을 기입하면 되고, https는 실제 해당 서버에 인증서 파일의 위치를 지정해주면 된다. 또한 data_volume은 harbor 관련 데이터를 저장하는 곳인데 위치를 별도로 지정하지 않는다면 root파티션에 용량이 쌓이게 되어 용량 부족 현상이 발생할 테니, 별도로 여유 있는 파티션 쪽에 할당해주는 것이 좋을 것 같다.

 

 

$ vi harbor.yml



# Configuration file of Harbor

# 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: reg.mydomain.com
hostname: mydomain.com

# 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
  # The path of cert and key files for nginx
  certificate: /your/certificate/path
  private_key: /your/private/key/path


...


# The default data volume
data_volume: /infra/harbor/data

 

설정을 마친 후 ./install.sh 를 입력하여 yaml파일 기반으로 harbor를 설치 및 기동한다.

 

 

브라우저 확인

 

정상기동 되었다면 브라우저에 도메인을 입력하여 정상적으로 접근이 되고 인증서가 적용되었는지 확인한다. 위에 mydomain.com 으로 hostname을 설정했으니 도메인 등록이 된 상태라면 https://mydomain.com으로 접근하면 된다.

 

필자의 경우는 도메인에 회사명이 포함되어있어서 모자이크 처리했다. 

 

 

 

 

 

install 오류 시 

 

 

파일명에도 yaml이라고 나와있는 해당 파일은 yaml 파일이다. 따라서 yaml문법을 준수해야 하고 띄어쓰기 잘못하면 구문 오류가 떨어지는 경우가 생길 수 있다. 필자가 그랬다. 이 부분에서 상당히 고생했는데 혹시라도 작성한 harbor.yml 파일의 구문 오류가 의심된다면 링크에 들어가서 테스트해보고 돌려보길 추천한다. 

 

Online YAML Parser

 

yaml-online-parser.appspot.com

 

 

harbor 쪽에 문제가 있거나 nginx 쪽에 문제가 있다고 판단될 시에는 /var/log/harbor or /var/log/harbor/proxy.log 위치를 확인해보는 것이 좋다.

 

 

 

4. harbor login 

 

harbor login 이 부분에서도 꽤 많이 시간을 소비했다. 우선 결론만 얘기하자면 https 관련 설정이 꽤나 복잡하다. 우선 login 명령어는 docker hub에 로그인하는 것과 유사하다. 아래와 같이 사전에 선언한 도메인으로 로그인하며 id와 pw를 입력하면 된다. (개인 계정의 경우 브라우저 harbor에서 사전에 만들고, 그렇지 않은 경우 admin으로 로그인한다.)  

 

$ docker login https://mydomain.com

(admin 최초 pw는 Harbor12345이다)

 

 

일반적으로 harbor를 사용하는 이유가 프라이빗한 환경의 도커 레지스트리를 구축하는 것이 목적일 텐데, 사내에서 이런 시스템을 제공하려면 사내 이용자의 환경 혹은 이와 연동되는 툴이 위치한 서버에서 도커 이미지를 push/pull 할 경우가 대부분일 것이다. 이때 위 https 관련된 설정은 harbor가 설치된 서버에서 로컬로 docker login 할 때만 허용되지, 다른 원격지에서 접속할 때는 docker login이 허용되지 않는다.

 

예를 들어 jenkins와 harbor, 그리고 쿠버네티스가 모두 다른 서버에 위치했다면 위 설정을 harbor서버에만 했을 시 각 서버에서 docker login이 안되기 때문에 원활한 cicd가 되지 않을 것이다. 다른 방법이 있는지는 모르겠지만 구글링과 여러 시도 끝에 각 서버에서 harbor에 접근할 수 있게끔 서버 로컬 docker에도 https관련 인증서를 위치시켜야 한다는 것을 확인했다. (당연히 harbor에 로그인할 각 서버는 docker가 설치되어있어야 한다.) 

 

 

적용방법은 Harbor에 login 하려는 각 서버의 /etc/docker/certs.d/도메인명 위치에 crt, key 파일을 위치시킨 systemctl restart docker해주면 된다. 


ex ) /etc/docker/certs.d/mydomain.com
하위에 인증서 파일 복제

 

Verify repository client with certificates

 

docs.docker.com

필자는 해당 방법으로 확인했고 docker 공식문서에서도 유사한 설명을 확인하여 적용했지만 100퍼센트 정확한 방법인지 확신은 없다.. 다만 이렇게 하면 해결은 되고 구글링 했을 때도 같은 고통(?)을 겪지만 해결하지 못하고 있는 사람들이 꽤 있는 것 같다. 위 방법을 적용했을 때도 안된다면 아래 절차를 통해 이상 유무를 확인해보자.

 

 

1. docker login으로 docker hub로그인 : dokcer hub 로그인도 안된다면인터넷(외부망) 연결 네트워크 확인이나 docker 재설치를 고려한다.

 

2. 로그에서.../v2가아니라 v1 버전이 확인되는 경우는 docker docker-compose 버전이 낮은경우에 발생(docker login 하는 서버에서도 docker version harbor 권장사항에 맞아야 한다는 )

 

3. Timeout 발생 경우 : 방화벽 체크

 

4. x509: certificate signed by unknown authority 에러 발생 : 사설 인증서같은경우는 서버에 인증서 등록 혹은 공인인증서 사용 권장

 

$cp /등록할 인증서.crt & key /usr/local/share/ca-certificates/
$update-ca-trust
$systemctl restart docker

 

※ 참고 포스팅 : 링크

 

 

로그인이 정상적으로 되었다면 아래와 같이 Login Succeeded라는 문구가 출력된다.

 

 

 

 

 

5. harbor push

 

 

login을 원격지에서 성공적으로 완료했다면 push와 pull은 간단하다. 먼저 push 하기 전 tagging을 먼저 해주자. 이는 harbor 브라우저에서 더욱 쉽게 확인이 가능하다. 브라우저로 harbor에 접근하여 새로운 프로젝트를 생성하고 프로젝트 repositories 탭을 클릭했을 때 push image 시의 요령에 대해 알 수 있다. 아래 그림을 참고하면 될 것 같고 아래 명령어들은 필자의 fe/ver라는 프로젝트를 대상으로 예시를 들었다. (fe는 프로젝트명이고 ver가 이미지 명이다.)

 

 

 

 

tag 

 

$ docker tag SOURCE_IMAGE[:TAG] mydomain.com/fe/ver:v1

 

 

push

 

docker push mydomain.com/fe/ver:v1

 

 

pull 

 

 

docker pull mydomain.com/fe/ver:v1

 

 


 

 

우선은 여기까지 해서 harbor를 설치하고 원격지에서 접속하는 방법까지 알아봤다. 다음 포스팅에서는 harbor를 젠킨스와 연동하고 쿠버네티스까지 배포를 했던 과정에 대해 기술해볼 예정이다 :)

반응형

댓글