본문 바로가기
💻 개발/졸업과제

s3와 Harbor를 활용한 docker registry 구축

by 컴쏘 2023. 7. 10.

Q. docker registry ?

A. registry는 CI/CD 파이프라인을 통해 빌드된 이미지를 관리하는 서비스이며, 대표적으로 우리가 가장 많이 사용하는 docker hub, AWS ECR 등의 서비스가 있다. docker hub의 경우 무료로 사용할 수 있지만, 배포된 이미지가 공개되기 때문에 누구나 다운로드 해서 받아볼 수 있다는 단점을 가지고 있다. 이를 위해서는 docker hub 유료 플랜을 이용하거나 ECR등의 서비스를 이용해 이미지를 관리한다.

 

따라서 private한 이미지 저장소를 s3와 harbor를 활용해서 직접 구축해보려고 한다.


엄청난 삽질의 결과이다... 

1. ec2 생성 

스펙

Ubuntu Server 22.04 LTS (프리티어 용) - 아키텍처 64비트(x86)
t2.micro (프리티어 용)
네트워크 설정

inbound 규칙에 22(ssh), 80(http) 포트 열어주기(체크 표시한 것)

  • 1번째 체크 표시 22(ssh)
  • 2번째 체크 표시 80(http)
  • 3번째 체크 표시 443(https)

인스턴스 스토리지 구성 - 15gb (인스턴스 디폴트 스토리지)

  • 지금은 15gb로 설정하였지만, 나중에 더 자세히 알아보고 설정하기

2. s3 버켓 생성 

Q. 버킷이란?

A. 객체에 대한 컨테이너

 

ec2의 디폴트 스토리지(EBS)는 속도가 빠르지만, 비용이 s3에 비해 많이 들고, 스케일 업이 어려운 단점이 있다.

프리티어 s3 사용 가능 범위

 

  • 1년간 매 달마다 5GB의 스토리지 사용 가능
  • 20000건의 get요청, 2000건의 put, delete 요청 가능

s3 생성 과정

버킷 만들기 클릭
버킷 이름, 리전(리전 중요)
퍼블릭 차단 해제

퍼블릭 액세스 차단 설정에서 차단 해제를 해준다.

나머지 설정은 그대로 두고 s3 버킷 생성하기

생성됨


3. 인증서 발급 

도커 레지스트리의 보안 연결을 위해서 인증서 발급이 필요하다.

 

aws certificate manager에 접속하여 내가 원하는 도메인 이름을 바탕으로 인증서 생성하기


삽질 중...

1. Route 53에서 인증서에 붙일 새로운 호스트 영역을 생성

검색을 해보면 다음과 같이 나온다.

route 53 선택
route 53 대쉬보드로 가면 호스팅 영역 생성
호스팅 영역을 생성
생성 완료

2. certificate Manager에서 인증서 요청 (Request a certificate) 

region을 반드시 확인하고 인증서 요청을 누른다.

region : 서울
[다음]
필요한 정보 채우기
인증서가 생성되었다. (새로고침 해야 보임)
해당 인증서 ID를 클릭 >> 여기서 [Route 53에서 레코드 생성] 클릭
[레코드 생성] 클릭

시간이 조금 지난 후(꽤 오래 걸려서 30분 걸리는 것 같음) 새로 고침하면 … 해도 안되길래 구글링해서 잘못된 점을 파악하였다.


오류 수정

안되는 이유 추측 : route 53에서 도메인을 구입하지 않아서 (도메인 등록을 안해서)

 

1. Route 53에서 도메인 등록 진행

도메인 등록

2. 원하는 도메인 명을 입력해 사용이 가능한지 확인한다.

도메인 명이 사용할 수 없다고 나와있어 제안된 사용 가능한 도메인 중에서

다른 도메인 명을 선택하였다. (1년 사용가능)

도메인 등록

늦어도 하루 정도 기다리면 도메인이 등록된다. (실제로는 1시간 정도 걸림)

도메인 등록 성공
호스팅 영역에서도 확인 가능

3. AWS Certificate Manager로 가서 인증서 발급하기

인증서 요청 클릭
인증서 요청

이때 요청서에 도메인 이름을 메인 도메인과 서브 도메인 2개를 등록했다.

ex. example.com과 *.example.com 

인증서 ID 클릭
Route 53에서 레코드 생성하기
레코드 생성하기
좀 기다리다가 상태 확인하기 (성공이 뜨면 된다.)

참고 글 [AWS] Certificate Manager를 사용해서 인증서 생성하는 법


4. 로드 밸런서 생성 & Route 53으로 도메인과 로드밸런서 연동하기

ec2와 route 53 사이에 로드밸런서 한대 생성 (지금은 ec2가 1대이지만, 향후 레지스트리의 확장성과 SSL 인증서 연동의 편리함을 생각하여 구축


Q. route 53?

A. AWS에서 제공하는 DNS이다.

 

일반 DNS와의 차이점

 

일반 DNS : DNS 동작 과정이 도메인을 IP로 변환하여 IP 네트워크 통신하여 목적지 IP를 찾아가는 과정

 

Route 53

Route 53에서 네임서버(Name Server : 대표적으로 IP 주소와 도메인 주소를 연결해주는 역할) 등록 시 순서가 다르다.

  • 일반적으로 도메인 등록 시에 네임서버를 지정한다.
  • Route 53에서는 할당받은 후, 네임서버 정보를 도메인 등록대행기관(가비아, 아이네임즈, 후이즈) 사이트에 접속해 네임서버를 지정한다.
    • 예를 들면, 일반적인 도메인 서버 등록 방법example.com 도메인 등록 시, 등록 대행 기관에 네임서버를 ns1.example.com, ns2.example.com 등으로 등록한다.
    • Route 53에서 네임서버 등록방법은 route53 사이트에서 NS 레코더 정보를 확인하고 해당 정보를 도메인 등록 대행기관에 네임서버 정보로 입력한다. (순서는 참고 블로그에 나와있음)
  • Route 53에서는 Public Host zone과 Private Host zone이 있다.
    • Public Host Zone은 일반 네임서버로 글로벌하게 동작한다. (일반 네임서버로 동작)
    • Private Host Zone은 AWS내에서만 동작
  • Route 53 특이 레코더, ALIAS(별칭)가 있다.
    • 도메인 자체에 ALIAS를 줄 수 있다.

기능

Route 53 = DNS + 모니터링 + L4 + GSLB 기능을 제공한다.

  • 모니터링 : 특정 포트에 대해 모니터링 기능이 있음
  • L4 스위치 (Layer 4 Switch) : 서버나 네트워크의 트래픽을 로드밸런싱하는 스위치 (TCP, UDP 등의 헤더를 보고 그게 FTP, HTTP, SMTP 어떤 프로토콜인지를 확인해 스위칭의 우선 순위를 판단)
  • GSLB (Global Server Load Balancing) 기능 : 지역에 상관없이 부하를 분산해주는 기능을 제공 (특정 IDC(데이터 센터)에 의존적이지 않게, 지역과 나라에 무관하게 로드밸런싱)

참고 글 52. Route53 이란?


생성 과정 

1. 로드 밸런서 생성

ec2의 왼쪽 메뉴 창에 있음

2. 로드 밸런서 생성

Create load balancer
HTTP, HTTPS를 지원하는 Application Load Balancer를 선택
loadbalance 이름 정해주기
Mapping에서 2개 이상을 선택해준다. (2개만 선택)
security 그룹 선택
Listeners and routing 포트 추가 (Add listener 누르면 추가 가능)
여기서는 무조건 target group을 설정해주어야 한다. (없으면 Create target group 클릭)
https target group
[만든 인스턴스 선택] - [Include as pending below]

http도 같은 방식으로 만들어 준다.

결과
그리고 다시 Listeners and routing으로 돌아오면, 다음과 같이 설정할 수 있다.
Secure listener settings 설정


오류 수정

Target groups에서

Target is in an Availability Zone that is not enabled for the load balancer 오류 발생

오류 발생 ...
오류 발생 ...
2개 모두 ap-northeast-2c가 인스턴스의 Zone 영역

따라서, 로드 밸런서의 네트워크 매핑을 바꾸어 주었다.

 

변경 후

결과

그런데 ... 이렇게 해줘도 unhealthy가 나온다. 

 

살펴보면, 80과 443 두 개의 리스너가 존재하고, 443에는 SSL 인증서(브라우저와 서버 사이에 발생하는 정보 통신을 안전하게 하는 역할)도 연결되어 있다.

Listener port 규칙 편집해주기

1) HTTPS 

[원하는 리스너 선택] - [Actions] - [Manage rules]
여기는 잘 설정되어있다.

2) HTTP

[+버튼] - [+ 규칙 삽입]
규칙 추가
수정 확인

다시 확인해보면 규칙이 생성되어 있다.


오류 수정

로드밸런서 보안 그룹 인바운드, 아웃 바운드 규칙 수정

 

아직도 해결 불가 ... (글 밑에서 해결하게 된다.)

 

인바운드 규칙 수정

아웃 바운드는 수정하지 않아도 괜찮음

 

오류 추측 : 진짜 인스턴스를 연결하지 않아서..?

 

+) 추가로 해줘야 할 것 : health check 루트 설정

[Route 53] - [호스팅 영역] - [연결할 도메인]

A 레코드를 생성해야 한다. (글 밑에서 생성함)

 

Q. A 레코드란?

A. 도메인 주소와 서버의 IP 주소를 직접 매핑

 

참고 글 

https://public-cloud.tistory.com/97

[AWS] Certificate Manager에서 발급 받은 인증서 로드밸런서에 붙이기

EC2 HTTPS로 연결하기 (2) - 로드밸런서로 리다이렉트 설정하고 Health check 통과하기


5. s3 접근을 위한 IAM key 생성

harbor registry에 접근을 하기 위해서는 s3에 읽기, 쓰기 권한을 가진 IAM 계정이 필요하다.

IAM 서비스를 이용해서 AmazonS3FullAccess 권한을 가지고 있는 프로그래밍 엑세스가 가능한 계정을 하나 생성

  • 엑세스 키 ID와 비밀 엑세스 키를 따로 기록

IAM 선택
사용자 추가
사용자 이름 지정
권한 정책에서 AmazonS3FullAccess 선택

다음에 나오는 페이지에서 [사용자 생성] 버튼 클릭

사용자 생성 확인 후 해당 사용자 클릭
[보안 자격 증명] 탭에서 [액세스 키 만들기] 클릭
원하는 옵션 체크
설명 태그 입력 후 액세스 키 만들기
csv 파일 다운로드 하여 보관하기 (이때 1번만 다운 가능)

참고 글 [AWS] AWS S3 Access Key 발급


6. harbor registry 구축하기

1. docker를 구축해놓은 ec2 인스턴스에 접속하기

2. docker-compose 설치 

참고 글 Harbor 설치 :: Ibiza

 

명령어 

curl -L "<https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$>(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

결과

권한주기

chmod +x /usr/local/bin/docker-compose

명령어 입력

확인하기

docker-compose --version

결과

3. 밑의 링크로 접속해서 최신 release 설치용 파일 링크를 찾은 후 wget으로 다운로드 해주기 

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

 

4. root 계정으로 변경해주기

sudo su 

5. wget으로 다운로드 해주기 위해 wget 설치

apt-get install wget

결과

현재 v2.8.2가 가장 최신이다.

v2.8.2

6. 다운 받기 

wget <https://github.com/goharbor/harbor/releases/download/v2.8.2/harbor-offline-installer-v2.8.2.tgz>

명령어 입력

7. 다운 받은 파일 압축 풀기

tar xvzf harbor-offline-installer-v2.8.2.tgz

파일 압축 풀기 결과

harbor가 있다. (/home/ubuntu)

ls 결과

8. harbor.yml 파일을 수정하기 위해 harbor 폴더로 이동하기 

폴더 이동

9. 우선 yml 파일을 수정하기 위해 vim를 설치한다. 

 

1) apt-get update 먼저 해주기

apt-get update 

Q. apt-get update?

A. 'apt-get update'는 운영체제에서 사용 가능한 패키지들과 그 버전에 대한 정보를 업데이트하는 명령어다. 설치되어 있는 패키지를 최신으로 업데이트하는 것이 아닌 설치가능한 리스트를 업데이트하는 것

참고 글 우분투 aptget update와 apt-get upgrade 의 차이

 

2) vim 설치하기

apt-get install vim 

vim 설치

10. harbor.yml 수정하기

 

Q. harbor.yml ?

A. harbor.yml은 harbor 구축 시 필요로 하는 설정들이 들어 있는 파일

 

vi로 파일을 살펴보게 되면, 다음과 같이 나온다.

vi harbor.yml.tmpl

결과 (밑으로 내리면 내용이 계속 있음)

일단 harbor.yml.tmpl 파일을 원본으로 harbor.yml 파일을 복사를 통해 새로 만들었다.

cp harbor.yml.tmpl harbor.yml 

harbor.yml 파일 생성됨

harbor.yml 파일 살펴보기

vi harbor.yml

대충 이런 식이다. (밑으로 내리면 내용 더 있음)

harbor.yml 에 들어가야 할 내용 (내가 수정한 부분)

hostname: [(서브 도메인 포함한)도메인 명]
storage_service:
	s3:
		accesskey: [발급 받은 IAM Access Key]
		secretkey: [발급 받은 IAM Secret Key]
		region: ap-northeast-2
		bucket: [bucket명]
  • hostname : 본인이 원하는 도메인 이름
  • s3에 접근하기 위한 엑세스 키 ID (accesskey), 비밀 엑세스 키 (secretkey) 넣어주기
  • s3 bucket에 관한 정보도 넣기
    • 본인이 만든 bucket의 region과 이름을 잘 확인해서 기입

https 부분은 주석 처리 했다.

참고한 블로그의 예시이다.

예시

11. prepare 실행

./prepare

명령어 입력

12. install.sh 실행

./install.sh

명령어 입력
결과

13. config.yml 수정 (/home/ubuntu/harbor/common/config/registry 안에 있음)

ls 결과

auth 부분을 수정해주자

변경 전
변경 후

14. nginx.conf 수정 (/home/ubuntu/harbor/common/config/nginx) 

ls 결과
참고 블로그

proxy_set_header X-Forwarded-Proto 를 주석처리 해줌

 

참고 자료

EC2에 harbor 설치하기

Harbor 설치 :: Ibiza

Harbor – Configure HTTPS Access to Harbor

Harbor 설치 (Container Image Registry 설치)

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


이렇게 구축을 다하고

hostname으로 등록된 도메인에 접속했는데 오류 발생

DNS_PROBE_FINISHED_NXDOMAIN : DNS 서버에서 url 창에 입력한 도메인 이름과 매칭되는 IP 주소를 찾을 수 없는 경우 발생하는 오류

 

오류 수정 

원인 : target group의 인스턴스가 잘못 연결되었던 것 (docker-registry 인스턴스가 아닌 다른 인스턴스였음)

지금은 healthy로 표시되었지만, 원래는 unhealthy 였음

수정 방법

[지우고 싶은 인스턴스 선택] - [Deregister]하면 지워지고, [Register targets] 를 선택해서 원하는 ec2를 선택해주면 된다.

이렇게까지하면 로드밸런서의 DNS name으로는 접속이되지만, domain name으로는 접속이 안됨

 

domain name으로 접속할 수 있게 하기

[Route 53] - [호스팅 영역] - [해당 도메인] - [레코드 생성]

p2kcloud.com은 front 메인 화면에서 쓸 수 있도록 하기 위해

sub domain을 넣어주었다.

 

Q. sub domain ?

A. 하위 도메인으로 웹사이트의 섹션을 구분하기 위해 도메인 이름에 추가되는 프리픽스(Prefix)

 

과정

레코드 생성
원하는 정보 기입
생성완료
접속 성공 (서브 도메인)