Amazon S3와 harbor를 활용한 도커 레지스트리 구축

1. 서론
CI/CD 파이프라인은 크게 형상관리, 빌드, 테스트, 배포, 모니터링으로 구성되어있다.
그중 ‘레지스트리’ 는 CI/CD 파이프라인을 통해 빌드된 이미지를 관리하는 서비스이며, 대표적으로 우리가 가장 많이 사용하는 docker hub, AWS ECR 등의 서비스가 있다.
docker hub의 경우 무료로 사용할수 있지만, 배포된 이미지가 공개 되기 때문에 누구나 다운로드 해서 받아볼수 있는 단점을 가지고 있다.
이를 위해선 docker hub의 유료 플랜을 이용하거나 ECR등의 서비스를 이용해 이미지를 관리하는 방법이 있지만, 이 글에선 aws ec2, s3와 오픈소스 레지스트리 서비스인 “Harbor”를 활용하여 직접 레지스트리를 구축해보자 한다.
­
2. harbor registry 구축 준비
1. ec2 인스턴스 생성
Amazon Elastic Compute Cloud(EC2)는 컴퓨팅 엔진 (원하는 연산 능력을 가진 컴퓨터)을 제공해주는 서비스이다.
harbor registry를 동작 시키기 위해선 CPU, RAM, STORAGE등의 인프라가 필요한데 이를 위해 ec2 인스턴스 한대가 필요하다.
Harbor 공식 github 문서에 따르면 다음과 같은 pre-requirements들이 필요하다.
하지만 테스트 용도의 레지스트리 구축이며, 도커 이미지가 실제로 저장되는 스토리지는 어차피 s3를 사용할것이기 때문에 Amazon Linux 2 AMI 기반의 t2.micro 인스턴스 한대를 기본 옵션으로 생성하였다. 인스턴스에 필요한 보안그룹의 inbound 설정은 22(SSH), 80(HTTP) 를 open 시켜주었다.

 

2. s3 버켓 생성
모든 레지스트리들은 이미지를 저장하기 위한 스토리지가 필요하다.
AWS가 제공하는 스토리지 서비스는 EBS, EFS, S3 등이 있는데, 이중에 나는 s3를 선택하여 버켓 하나를 생성하였다.
ec2의 디폴트 스토리지는 EBS는 속도가 빠르지만 비용이 s3에 비해 많이 들고, 스케일 업이 어려운 단점이 있기 때문이다.

 

3. 인증서 발급
도커 레지스트리의 보안 연결을 위해서 인증서 발급이 필요하다.
AWS Certificate Manager에 접속하여 내가 원하는 도메인 이름을 바탕으로 인증서를 생성해주었다.
예를 들어 내가 소유하고 있는 도메인이 hello.com인데 원하는 레지스트리 도메인 이름이 registry.hello.com이라면 인증서 생성시 도메인 이름을 ‘registry.hello.com’ 혹은 *.hello.com으로 설정하여 발급해야 한다.

 

4. 로드 밸런서 생성
향후 레지스트리의 확장성과 SSL 인증서 연동의 편리함을 이유로 ec2와 route53 사이에 로드밸런서를 한대 생성하였다.
aws는 여러 종류의 로드밸런서를 제공하는데 그중에 나는 Application 타입의 로드밸런서를 생성하였다.
로드밸런서의 inbound는 443(HTTPS)로 열어주고, 보안 연결을 위해 필요한 위의 ACM에서 만든 인증서를 사용하였다.
로드밸런서의 대상그룹의 inbound는 80(HTTP)로 열어주고 대상그룹의 80번 포트로 요청을 받으면 ec2의 80번 포트로 보내도록 설정하였다.

 

5. Route53 으로 도메인과 로드밸런서 연동하기
Route53은 aws가 제공하는 DNS 서비스이다. 도메인을 구매하거나 등록, 라우팅을 할수 있는 재미있는 친구인데, 내가 구매했던 도메인을 활용하여 생성했던 로드밸런서와 연결시키는 작업을 진행했다.

 

6. s3 접근을 위한 IAM key 생성
harbor registry 접근을 위해선 s3에 읽기, 쓰기 권한을 가진 IAM 계정이 필요하다.
IAM 서비스를 이용하여 AmazonS3FullAccess 권한을 가지고 있는 프로그래밍 엑세스가 가능한 계정을 하나 생성하여 엑세스 키 ID와액세스 키 ID와 비밀 액세스 키를 따로 기록해두었다.

 

3. harbor registry 구축하기
1. ec2 인스턴스에 docker, docker-compose 설치
harbor를 구동시키기 위해선 docker와 docker-compose가 필요하다.
amazon linux AMI 2 버전 기준으로 필요한 명령어를 작성해보았다.
아래 명령어를 차례로 실행해준다음에 ssh에 재접속 해주면 된다.
sudo amazon-linux-extras install -y docker
sudo service docker start
sudo usermod -a -G docker ec2-user
docker version
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose version

 

2. harbor 설치 프로그램 다운로드 및 압축풀기
harbor github에 접속해서 최신 release 설치용 파일 링크을 찾은후 wget으로 다운로드 해준다.
wget https://github.com/goharbor/harbor/releases/download/v1.10.1/harbor-offline-installer-v1.10.1.tgz
tar xvzf harbor-offline-installer-v1.10.1.tgz
이과정이 끝나면 다음과 같은 폴더 구조가 될것이다.
harbor폴더 안으로 이동해주자.

 

3. harbor.yml 수정
harbor.yml은 harbor 구축시 필요로 하는 설정들이 들어있는 파일이다.
hostname을 본인의 원하는 도메인으로 설정해주고, 아까 s3에 접근하기 위해 발급받았던 엑세스키 ID(accesskey), 비밀 엑세스키(secretkey)를 넣어주자.
아까 생성했던 s3 bucket에 관한 정보도 집어넣어어야 하는데, 본인이 만든 bucket의 region과 이름을 잘확인하여 기입한다.
hostname: myregistry.knufesta2019.de
storage_service:
  s3:
    accesskey: xxxxxxxxxxxxxxxxxxxxxxxxxxxx
    secretkey: xxxxxxxxxxxxxxxxxxxxxxxxxxxx
    region: ap-southeast-1
    bucket: tuna-registry-test
harbor.yml 수정이 끝나면 다음 명령어를 실행한다.
sudo ./prepare

 

4. config.yml, nginx.conf 수정
./prepare 명령어 실행이 완료되면 common 폴더가 생성 되었을텐데, common 폴더의 일부 파일들의 설정을 바꿔주는 작업을 진행해야 한다.
가장먼저 common/config/registry 폴더에 있는 config.yml 의 auth 부분을 다음과 같이 수정해주자.
# before
auth:
  token:
    issuer: harbor-token-issuer
    realm: http://myregistry.knufesta2019.de/service/token
    rootcertbundle: /etc/registry/root.crt
    service: harbor-registry

# after: "realm"에 여러분이 설정한 도메인이 있을것이다, 앞에 http를 https로 바꾸어주자
auth:
  token:
    issuer: harbor-token-issuer
    realm: https://registry.knufesta2019.de/service/token
    rootcertbundle: /etc/registry/root.crt
    service: harbor-registry
다음으로 common/config/nginx 폴더에 존재하는 nginx.conf 를 수정해줘야한다. nginx.conf 에 존재하는 특정 설정들을 모주 주석처리 해주면 된다.
# before
proxy_set_header X-Forwarded-Proto $scheme;

# after: 위 설정을 보이는대로 모두 주석처리 해주자
# proxy_set_header X-Forwarded-Proto $scheme;

 

5. Harbor 배포 하기
다음명령어를 입력하여 Harbor를 배포 할수 있다.
sudo docker-compose up -d
먼저 우리가 정했던 도메인 (예: myregistry.knufesta2019.de)으로 접속되는지 확인해보자.
다음 화면이 나온다면 harbor 구축의 큰산을 넘은것이다.
아이디로 admin, 패스워드로 Harbor12345 (기본계정)을 입력해서 로그인 하도록하자.

 

메인화면이 뜨면 화면 우측 상단의 admin메뉴의 ‘Change Password’를 클릭하여 계정의 기본 패스워드를 빠르게 바꿔주자.
harbor-registry

 

패스워드가 바뀌면 Project 메뉴를 들어가서 원하는 이름으로 project를 추가해주자. project란 이미지 이름 앞에 붙은 namespace 정도로 생각하시면 될것 같다.
ex) project_1/image:tag, project_2/image:tag …

 

6. Harbor 레지스트리에 push 해보기
먼저 우리가 구축한 registry에 로그인한다.
#Username: admin
#Password: xxxxxxxx (아까 재설정한 패스워드)
# 본인이 route53에서 만든 url
docker login myregistry.knufesta2019.de

그리고 로컬에 가지고 있던 이미지를 우리가 만든 레지스트리에 푸시할수 있도록 tagging 한다.

docker tag myimage:hoho myregistry.knufesta2019.de/organization/myimage:hoho

tagging이 끝나면 push가 잘 되는지 확인한다.

docker push myregistry.knufesta2019.de/organization/myimage:hoho

 

7. Harbor 레지스트리에 pull 해보기
pull 테스트용 이미지를 docker hub에서 골라서 받아주도록 하자.
그리고 우리가 만든 레지스트리에 push 하기 위해서 tagging 해보자.
docker pull mariadb:latest
docker tag mariadb:latest registry.knufesta2019.de/organization/mariadb:latest
tagging이 끝나면 우리가 만든 레지스트리에 푸시해보자.
# push 테스트
docker push myregistry.knufesta2019.de/organization/mariadb:latest
푸시가 완료되었다면 로컬에 있는 이미지를 지우고 다시 풀을 받아보자.
풀이 정상적으로 완료된다면 성공이다!
# pull 테스트
docker push myregistry.knufesta2019.de/organization/mariadb:latest

 

4. 참고자료 및 출처
1. 이미지
2. 참고자료

https://github.com/goharbor/harbor/issues/3114

위글은 https://lunacircle4.github.io/ci/cd/2020/03/11/Private-Registry/에서도 보실수 있습니다

0 0 votes
Article Rating
Subscribe
Notify of
guest

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

0 Comments
Inline Feedbacks
View all comments
Scroll to top
0
Would love your thoughts, please comment.x
()
x