[K8S] 프론트엔드 개발자의 EKS 경험기 1️⃣

2024-02-29T18:03:01.000Z

🤔 왜 쿠버네티스를 공부하게 되었나?

사내 프론트엔드 개발 자체는 프론트 팀이 당연히 담당하지만, CI/CD는 항상 인프라 개발자분께서 도맡아 하셨다.

따라서 프론트 프로젝트 루트 경로에 위치한 Dockerfile, 파일과, .kubernetes, .github 폴더 내 설정파일들이 어떻게 작동하는지는 전혀 알지 못했다.

현재 내 블로그는 Cloudflare Pages를 통해 배포되고 있지만, 공부할 겸 이를 EKS를 통해 배포하고자 하였다.

퇴근 이후 시간을 활용하여 쿠버네티스에 대해 계속 공부하였고, 1~2 주 정도의 시간이 지나 개발블로그를 EKS 클러스터에 배포하는데 성공하였다.

물론 아직은 쿠버네티스의 방대한 기능들의 반의 반도 모르며, 아는 것들 또한 세부적인 동작 방식을 자세히는 알지 못한다.

하지만, 이번 경험을 통해 사내 프로젝트의 CI/CD 방식을 얼추 이해할 수 있었고, 인프라 관련해서 다른 분과 초보적인 대화는 나눌 수 있는 수준이 되었다.

🛠️ 도커 이미지 빌드 (도커라이징)

쿠버네티스컨테이너를 관리하는 플랫폼이다. 컨테이너는 도커 이미지를 기반으로 생성되기 때문에, 가장 먼저 도커 이미지를 빌드해야 한다.

이미지 빌드 시 참고해야 할 정보는 아래와 같다.

  • Gatsby 리액트 프레임워크 사용
    • 빌드 시 npm run build 명령어를 사용
    • 빌드 후 npm run serve 명령어로 웹서버 서빙
  • Node 버젼: 14.18.1
  • 노드 패키지 매니저: NPM

위 정보를 바탕으로 작성한 Dockerfile은 아래와 같다.

FROM node:14.18.1

WORKDIR /app

COPY package.json package-lock.json ./

RUN npm ci

COPY . .

RUN npm run build

EXPOSE 3000

CMD ["npm", "run", "serve"]

하지만 위와 같이 작성된 Dockerfile로 이미지를 빌드하면 종속성 중 하나인 sharp 모듈이 필요로 하는 libvips 라이브러리 관련해서 에러가 발생하면서 실패한다…

추측컨대 빌드 시 사용하는 도커 이미지의 OS가, 설치하려는 libvips 라이브러리와 호환되지 않아 발생한 문제로 보인다.

sharp, libvips, arm64를 키워드로 하여 에러 내용을 검색해 보았는데, 나와 가장 비슷한 문제를 겪었던 글을 찾을 수 있었다.

해당 사이트는 Wrappler라고 하는, 비주얼 웹 앱을 만드는 툴을 사용하는 개발자 커뮤니티로, 서로 다루는 분야는 달랐지만 처한 환경에 비슷해서 도움이 될 수 있었다.

여기서 Teodor라는 사람의 답변을 보면, 빌드시 시 사용할 이미지의 OS를 debian-bullseye를 사용하라고 하였다.

dockerhub에서 bullseye를 사용하는 14.18.1 버젼의 노드 이미지를 찾아보니, node:14.18.1-bullseye로 존재하는 것을 확인할 수 있었다.

따라서 Dockerfile에서 빌드 시 사용한 이미지를 명시한 FROM 문을 다음과 같이 수정하였다.

# 기존
FROM node:14.18.1

# 수정
FROM node:14.18.1-bullseye

이후 다시 도커 이미지를 빌드하니, 이번에는 정상적으로 빌드가 된 것을 확인하였다.

빌드된 이미지가 정상적으로 동작하는 지 확인하기 위해, 로컬에서 해당 이미지로 컨테이너를 생성, 실행한다.

# 컨테이너 외부로 노출되는 포트는 3000이고,
# gatsby serve 명령어로 실행되는 웹 서버의 포트는 9000이므로,
# -p 옵션을 통해 3000:9000으로 포트 포워딩을 해주었다.
$ docker run --name my-blog-container -d -p 3000:9000 my-blog-image

# 생성된 컨테이너의 ID가 출력된다.
6d578cc9222ebc18729cd4d3233f8758200d3268efd88b988ce67b67a0606e5f

이후 localhost:3000으로 접속하면, 정상적으로 컨테이너가 실행됨을 확인할 수 있다.

🤔 다음으로 할 것은?

도커 이미지를 정상적으로 빌드하였고, 로컬에서도 정상적으로 동작함을 확인하였다.

그렇다면 할 일은, 이 이미지를 AWS ECR에 업로드하는 것이다.

ECRElastic Container RegistryAWS에서 서비스하는 이미지 저장소로, 여기에 빌드한 이미지를 저장하면 이후 EKS로 생성한 클러스터에서 해당 이미지를 사용할 수 있다.

이는 다음 포스팅에서 다루도록 하겠다… 🙇‍


Greenhead
Written by@Greenhead
프론트엔드 개발자 윤녹두입니다 :)

GitHub