ECS의 태스크 정의를 위해서사용할 테스트 이미지를 생성하였다. 이미지 생성 과정에서 생긴 이슈를 다음과 같이 정리하였다.
SSH 이슈
git clone을 ssh 인증을 이용하여 사용하기 위해서는 ssh가 설치되어야 한다. 하지만 기본 이미지에서는 ssh를 수동으로 설치해야 하는데 이 과정에서 interactive 창이 등장하였다.
timezone을 묻는 창이 생긴다.
위의 문제를 해결하기 위해서 몇가지 환경변수 세팅이 필요하였다.
ENV PYTHONUNBUFFERED 1
ENV TZ Etc/UTC
RUN sudo apt update && \\
sudo ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \\
sudo touch /etc/timezone && \\
sudo chmod 666 /etc/timezone && \\
sudo echo $TZ > /etc/timezone && \\
sudo apt install -y ssh
권한에 따라서 chmod
나 sudo
는 선택적으로 적용하자.
상황에 따라서는 다음과 같은 환경변수 설정만으로 충분하다고 한다.
ENV DEBIAN_FRONTEND noninteractive
ENV TZ Etc/UTC
git clone 이슈
git clone을 도커파일 내에서 실행하기 위해선 SSH 인증 방식을 채택하였다. 먼저 private key를 복사하며 호스트(gitlab.com)를 known_hosts에 등록해야 한다.
RUN mkdir /home/ubuntu/.ssh
COPY id_rsa /home/ubuntu/.ssh/
RUN sudo chmod +r /home/ubuntu/.ssh/id_rsa && \\
ssh-keyscan gitlab.com >> /home/ubuntu/.ssh/known_hosts
위의 방식으로 호스트가 잘 등록되었다면 터미널이 중단되는 문제는 없어진다.
테라폼을 이용해서 오토스케일링 그룹과 클러스터를 만들어주면 EC2기반의 ECS 클러스터가 생성된다. 코드 내역은 다음을 참고하자
‣
롤링업데이트의 경우 서비스를 정의하는 상황에서 최소 정상상태 백분율과 최대 백분율에 기반하여 RUNNING과 PENDDING 상태를 번갈아 적용하여 무정지 배포를 수행한다.
→ 하지만 백분율의 범위에 따라서 무정지 배포가 적용되지 않을 수 있다.
간단하게 pikurate에서 통계서버로 활용되고 있는 django 기반 서버를 태스크 정의로 묶자
태스크 정의
태스크의 컨테이너 정의는 다음과 같다.
구성 | 이미지 | 메모리 | 컨테이너 포트 |
---|---|---|---|
web | jerryjho/ecs-demo:1.3 | 300MiB | 80 |
celery | jerryjho/ecs-demo:1.3 | 300MiB | - |
redis | redis:5.0.3 | 300MiB | - |
태스크 정의의 태그는 다음과 같이 구별된다. 컨테이너 포트는 바꿀 수 없기 때문에 통일성 있게 설정하도록 하자
이름:태그 | 호스트 포트 | 컨테이너 포트 |
---|---|---|
demo-dashboard:4 | 80 | 80 |
demo-dashboard:7 | 3000 | 80 |
컨테이너 포트가 달라질 경우 아래와 같은 에러 메시지를 보게 된다.
서비스 업데이트 정의
업데이트 방식의 경우는 서비스를 정의할 때, 생성하기 때문에 바꿀 수 없다.
업데이트 방식 | 롤링 업데이트 |
---|---|
최소 정상상태 백분율 | 100 |
최대 백분율 | 200 |
배포 진행 과정
초기에는 최대 백분율은 200으로 잡았기 때문에 새로운 태스크가 전부 올라갈 수 있다. 이 상태에서는 아래와 같이 태스크가 모두 떠 있는 것을 볼 수 있다.
해당 상태는 아래처럼 모든 컨테이너 인스턴스에 태스크들이 활성화된 상태로 로드밸런서로 요청을 보낼 시 아래 4개의 컨테이너가 트래픽을 분산하여 받게된다.
이후 헬스체크가 끝난 상황에서는 원하는 태스크만 남겨두고 타겟 그룹에서 기존의 태스크를 제거하게 된다.
draining 상태에서 완전히 분리가 되면 타겟 그룹에서도 등록이 제외되며 원하는 태스크만 컨테이너 인스턴스에 남게 된다.