Easy Understanding

M1 맥북 사용자의 EKS 배포 오류에 대하여 본문

Infra

M1 맥북 사용자의 EKS 배포 오류에 대하여

appleg1226 2021. 7. 25. 16:00

이번에 새로 산 M1 맥북은 개발 환경 셋팅에 있어서 별다른 큰 문제는 없었다.

그래서 이쯤되면 충분히 사용하는데 문제가 없다고 생각하던 차였는데...

 

그런데 이번에 이 M1 맥북 때문에 하루 종일 삽질을 했는데, 그 현상에 대하여 간단하게 공유하려고 한다.

문제

Back-end Application을 Deployment로 EKS에 배포했으나 

Pod 내부의 Container가 실행되지 못하고 계속해서 CrashLoopBackOff 가 발생

상황

1) m1 macbook에서 node.js 어플리케이션을 docker build, tag

2) docker image를 AWS ECR에 업로드

3) AWS EKS에서 해당 이미지를 이용하여 배포 실행

4) 컨테이너가 실행되지 못하고 계속 crashloopbackoff 가 발생하였음

5) kubectl logs 도 작동하지 않는 상황

'standard_init_linux.go:228: exec user process caused: exec format error '  라는 에러가 나타나며 실행되지 않음.

해결 과정(삽질 목록)

1) AWS ECR과 관련된 문제인가 생각하여 public docker hub에 업로드한 다음 이미지 실행을 하였지만 실패.

   kubectl describe 를 실행했을 때, image pull이 항상 성공적으로 이루어지긴 했었다.

 

2) Dockerfile에 문제가 있는가 싶어서, 내부 스크립트를 이것저것 시도해보았음.

    그러나 무엇을 바꾸더라도 아무 것도 되는 것이 없었음.

 

3) 다른 Node.js 어플리케이션을 새로 작성해서 직접 이전 과정을 반복.

    Nest.js, Express.js 모두 실행 안 됨

 

4) eksctl로 만든 테스트용 쿠버네티스 클러스터가 필요한 resource가 부족해서 실행을 못하는가 생각함. 

   결국 클러스터를 제거하고 새로운 클러스터를 만들고 다시 이미지를 실행하였으나 여전히 실패.

 

5) 다른 사람들이 docker hub에 올려놓은 express.js 이미지를 사용하여 쿠버네티스에서 실행하니 이건 또 됨.

원인 발견

모든 가능성들을 가설을 세우고 검증을 해 보았고 마지막 하나가 남았다.

1. ECR 관련 문제

2. Dockerfile 내부의 문제

3. Node.js 어플리케이션 문제

4. EKS 클러스터 생성 문제

5. 다른 사람들이 만든 image와 내가 만든 image의 방식 차이

 

설마 m1 mac 때문인가라는 생각이 머리를 스쳤다.

바로 'm1 mac docker build'  라는 검색어로 구글링을 하니 바로 결과가 나왔다.

 

m1 맥북 docker build image의 기본 설정은 arm64 이다.

$ docker inspect <image>
...
  "Architecture": "arm64",
  "Os": "linux",
....

 

해결

아래의 명령어를 통하여 Image를 만들고 이전과 같은 과정으로 배포를 하였음.

docker buildx build --platform=linux/amd64 -t <tag> .

 

EKS 배포 결과는 성공적이었다.

$ docker inspect <image>
...
  "Architecture": "amd64",
  "Os": "linux",
....

 

교훈

m1 맥북을 아직까지는 완전히 믿지는 말자