Q. docker registry ?
A. registry는 CI/CD 파이프라인을 통해 빌드된 이미지를 관리하는 서비스이며, 대표적으로 우리가 가장 많이 사용하는 docker hub, AWS ECR 등의 서비스가 있다. docker hub의 경우 무료로 사용할 수 있지만, 배포된 이미지가 공개되기 때문에 누구나 다운로드 해서 받아볼 수 있다는 단점을 가지고 있다. 이를 위해서는 docker hub 유료 플랜을 이용하거나 ECR등의 서비스를 이용해 이미지를 관리한다.
따라서 private한 이미지 저장소를 s3와 harbor를 활용해서 직접 구축해보려고 한다.
엄청난 삽질의 결과이다...
1. ec2 생성
스펙
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에서 인증서에 붙일 새로운 호스트 영역을 생성
검색을 해보면 다음과 같이 나온다.
2. certificate Manager에서 인증서 요청 (Request a certificate)
region을 반드시 확인하고 인증서 요청을 누른다.
시간이 조금 지난 후(꽤 오래 걸려서 30분 걸리는 것 같음) 새로 고침하면 … 해도 안되길래 구글링해서 잘못된 점을 파악하였다.
오류 수정
안되는 이유 추측 : route 53에서 도메인을 구입하지 않아서 (도메인 등록을 안해서)
1. Route 53에서 도메인 등록 진행
2. 원하는 도메인 명을 입력해 사용이 가능한지 확인한다.
도메인 명이 사용할 수 없다고 나와있어 제안된 사용 가능한 도메인 중에서
다른 도메인 명을 선택하였다. (1년 사용가능)
늦어도 하루 정도 기다리면 도메인이 등록된다. (실제로는 1시간 정도 걸림)
3. AWS Certificate Manager로 가서 인증서 발급하기
이때 요청서에 도메인 이름을 메인 도메인과 서브 도메인 2개를 등록했다.
ex. example.com과 *.example.com
참고 글 [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. 로드 밸런서 생성
2. 로드 밸런서 생성
http도 같은 방식으로 만들어 준다.
오류 수정
Target groups에서
Target is in an Availability Zone that is not enabled for the load balancer 오류 발생
따라서, 로드 밸런서의 네트워크 매핑을 바꾸어 주었다.
변경 후
그런데 ... 이렇게 해줘도 unhealthy가 나온다.
살펴보면, 80과 443 두 개의 리스너가 존재하고, 443에는 SSL 인증서(브라우저와 서버 사이에 발생하는 정보 통신을 안전하게 하는 역할)도 연결되어 있다.
Listener port 규칙 편집해주기
1) HTTPS
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와 비밀 엑세스 키를 따로 기록
다음에 나오는 페이지에서 [사용자 생성] 버튼 클릭
참고 글 [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가 가장 최신이다.
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)
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
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 파일 살펴보기
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과 이름을 잘 확인해서 기입
참고한 블로그의 예시이다.
11. prepare 실행
./prepare
12. install.sh 실행
./install.sh
13. config.yml 수정 (/home/ubuntu/harbor/common/config/registry 안에 있음)
auth 부분을 수정해주자
14. nginx.conf 수정 (/home/ubuntu/harbor/common/config/nginx)
proxy_set_header X-Forwarded-Proto 를 주석처리 해줌
참고 자료
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 인스턴스가 아닌 다른 인스턴스였음)
수정 방법
이렇게까지하면 로드밸런서의 DNS name으로는 접속이되지만, domain name으로는 접속이 안됨
domain name으로 접속할 수 있게 하기
[Route 53] - [호스팅 영역] - [해당 도메인] - [레코드 생성]
p2kcloud.com은 front 메인 화면에서 쓸 수 있도록 하기 위해
sub domain을 넣어주었다.
Q. sub domain ?
A. 하위 도메인으로 웹사이트의 섹션을 구분하기 위해 도메인 이름에 추가되는 프리픽스(Prefix)
과정
'개발 > 졸업과제' 카테고리의 다른 글
EC2의 desktop 접속하기 (0) | 2023.07.24 |
---|---|
private docker registry에 local에서 생성한 desktop container 이미지 push하기 (0) | 2023.07.24 |
container에 desktop 설치하기 & 접속하기 (0) | 2023.07.24 |
docker에서 ubuntu에 noVNC 설치하기 (AWS EC2) (0) | 2023.07.02 |
docker에서 ubuntu에 noVNC 설치하기 (local) (0) | 2023.07.02 |