Docker_deploy_Optimazation

장준영·2024년 6월 7일

개요

최근 롤링배포에서의 순단현상을 해결하며 배포시간이 많이 증가하게 되었다.

배포시간이 길어진다면 빠른 배포에 불리하기 때문에 빌드 및 배포시간을 최적화하는 과정을 추가하려 한다.

원인파악

젠킨스의 로그파일을 확인해 보았다.

위의 방식을 분석해본 결과 아래와 같은 개선할 수 있는 문제를 확인하였다.

  1. full-version의 jdk
  2. Run레이어의 분산화
  3. arm까지 애뮬레이팅을 통해 빌드하는 multi-buildx
  4. 비효율적인 ssh배포방식

1,2번은 Dockerfile의 최적화를 통해 해결을 할수 있으며 3번은 매니저노드를 arm서버인 인터널 서버로 변경하여 해결을 할 수 있으며, 4번은 ssh배포를 한 서버씩 처리하는 것이 아닌 일괄 배포를 통해 처리를 하는 방식을 고려해 보았다.

개선

  1. 도커파일 최적화
    도커 최적화 pr을 통해 일단 일반 jdk에서 alpine버전의 가벼운 jdk로 변경하였다. Multi-Stage-Build 방식을 사용해 이미 젠킨스에서 빌드된 jar파일을 바탕으로 jre를 통해 실행시키는 방법도 있지만 공식 amazon-java17-alpine-jre이미지가 없어, 보안이슈로 alpine-jdk로 채택하였다.
    또한 이전 Run의 여러 레이어로 빌드되는 이미지를 한개의 레이어로 만들어 도커캐시의 최적화를 하였다.
  1. 이미지 병렬 배포
#!/bin/bash

# 서버 목록
servers=(
  "젠킨스 유저명@서버주소"
  "젠킨스 유저명@서버주소"
  "젠킨스 유저명@서버주소"
  ...
  
)

# SSH 키 파일 경로
identity_file="ssh키 경로"

# 원격 스크립트 경로
remote_script="/usr/local/koin_api_stage/deploy.sh"

# SSH 연결에 사용할 포트
ssh_port="22222"

# 병렬 실행을 위해 백그라운드로 실행
for server in "${servers[@]}"; do
  echo "Deploying to $server..."
  ssh -i "$identity_file" -p "$ssh_port" "$server" "sudo sh $remote_script" &
  sleep 5
done


# 모든 백그라운드 작업이 끝날 때까지 대기
wait

echo "Deployment to all servers completed."

이전까지는 코인의 배포가 젠킨스의 ssh push over방식으로 한개의 서버씩 진행이 되고 있었다.
당장은 3개의 서버에 한개씩 이미지를 pull당겨와서 속도가 크게 차이가 안나지만, 만약 서버의 개수가 늘어난다면 Ansible같은 툴을 활용해서 일괄 배포를 진행하면 되겠지만 현재는 그럴수 없는 상황이기에 빌드서버에 스크립트를 작성하여 이미지를 병렬로 받아와 속도를 감축하였다.

개선중 문제점


새로운 버전을 배포하는데, 적용이 된 노드가 있고 안된 노드가 발생하는 것이었다.


맙소사... 확인해보니 위의 마지막에 정렬시켰던 노드에 이미지가 적용이 안되는 경우가 계속 생겼던 것이다.

위의 노드가 정상적으로 배포가 된 모습이다.

따라서 위의 스크립트에서 sleep시간을 주어 리스트 마지막에 있는 서버에도 이미지 업데이트 요청이 갈수 있도록 수정을 하였다.

결론

위와 같이 빌드 및 배포시간을 5분대로 감축할 수 있게 되었다. 구조적으로 monolithic구조이기 때문에 JAR파일이 무거워 배포속도를 더 감축하기는 문제가 있지만 MSA로 가기에는 ROI가 많이 들것 같아 당장은 monolithic으로 가는게 좋을 것 같다.

0개의 댓글