본문 바로가기

About/Kubernetes

[k8s][Error] Arm-AMD CPU 사이 문제 해결 - 파드 생성 시 CrashLoopBackOff, exec user process caused: exec format error 문제

에러 상황

Docker를 이용해서 개발한 서비스를 컨테이너로 빌드하였고, 레포지토리에도 push하였습니다. 이 이미지를 이용해서 쿠버네티스로 Deployment를 배포하였고 계속해서 CrashLoopBackOff -> Error -> CrashLoopBackOff 가 반복되는 상황

파드의 로그를 확인해보면 다음과 같습니다.


standard_init_linux.go:228: exec user process caused: exec format error

exec format error?  보통은 Dockerfile의 ENTRYPOINT, CMD 가 잘못 선언되었거나, 실행할 스크립트의 권한이 없는 등 도커 이미지를 컨테이너로 실행할 때 잘못 설정해서 생기는 문제라고 합니다. 하지만 local에서 해당 이미지를 실행했을 땐 너무나 잘 실행이 됩니다. local에서도 실행이 안된다면 플랫폼 문제가 아니라 위와 같은 이유일 수도 있습니다.

문제 해결

예전에 docker buildx에 대한 포스팅을 한 적이 있습니다. 도커 이미지를 다양한 아키텍처에서 실행할 수 있도록 빌드하는 방법인데, 이를 이용해서 해결할 수 있었습니다.

2021.12.27 - [About/Docker] - [Docker] Docker Buildx를 통한 Multi-architecture 이미지 빌드(x86, ARM)

Dockerfile을 빌드한 PC는 저의 맥북 M1으로 arm 기반 CPU이고, Kubernetes의 클러스터들은 저의 Windows 데스크톱으로, amd 기반 CPU 입니다.

kubenetes control plane의 CPU 정보

따라서 AMD 기반 서버에서 ARM에서 작성한 도커 이미지를 실행했기 때문에 생긴 문제입니다. 

docker buildx 를 통해서 다시 이미지를 빌드하고, 레포지토리에 올려보도록 하겠습니다. 문제가 생기지 않도록 amd, arm 모두다 빌드하겠습니다. 이 때 Base 이미지 또한 멀티 아키텍처를 지원해야합니다.

$ docker buildx build \
--platform linux/amd64,linux/arm64,linux/arm/v7 \
-t <태그명> \
--push .

 

  • --push 명령어는 빌드 후 바로 레포지토리에 push하도록 하는 옵션입니다.

빌드가 모두 완료되었다면 다음과 같이 3개의 아키텍처에 대한 이미지가 모두 생긴 것을 알 수 있습니다. 저는 Docker Hub를 이용했습니다.

다시 쿠버네티스에서 해당 이미지를 이용하여 Deployment를 생성하니 정상적으로 동작하는 것을 알 수 있습니다.


M1 맥북이 인기가 많아지다 보니 많이 접할 수 있는 문제인 것 같습니다. 다른 분들은 시간 낭비하지 않았으면 해서 정리해보았습니다. 특히 AWS에서도 AMD 서버가 많으니 주의해야할 것 같네요. 또한 docker buildx 가 정말 편하다는 것도 느낄 수 있었던 것 같습니다.