k8s & docker Pod CrashLoopBackOff / docker multi platform exec format error

개발새발·2023년 11월 15일

docker

목록 보기
1/2

편의상 반말로 글을 남기오니, 양해 부탁 드립니다.

k8s를 활용한 docker 관련 Study를 진행하던 중 Pod 실행 시 문제가 발생하던 부분을 해결하는 과정 및 docker multi platform 문제를 해결하는 과정을 남긴다.

1. open /run/flannel/subnet.env: no such file or directory Error

jenkins + ansible + k8s를 위해 실제 Sample Project를 ansible playbook을 활용하고 k8s를 통해 배포하는 과정을 진행하던 중 deployment를 생성하고 pod를 확인해보니 다음과 같은 error를 마주칠 수 있었다. 🧐

network: open /run/flannel/subnet.env: no such file or directory

에러에 대해서 찾아보니, k8s에서 add-on에서 사용하는 flannel 사용 시 위 경로에 subnet.env 파일을 참조하여 실행하는데, 해당 파일이 없다는 내용이라고 한다.

subnet.env 파일은 보통 flannel을 add-on 설치 시 자동으로 생성하는 파일이지만, 이상하게도 나는 flannel을 다시 add-on 하여도 해당 파일이 생성되지 않았다.
(+ sudo 명령어를 통해서도 생성되지 않음.)

2. open /run/flannel/subnet.env: no such file or directory Error 해결과정

난감해하던 중 해당 파일을 해당 경로에 수기로 생성해주면 해결이 된다는 답변을 보고 수정하기로 했다.

github에서 찾은 답변 중..

ubuntu server 내 경로에서 파일 생성 및 subnet.env 작성

subnet.env 파일을 수기 생성하고 저장한다음 다시 실행해보았다.
flannel 관련 에러는 더 이상 나지 않았지만 다른 문제를 직면했다.

3. exec format error

sample project의 war 파일을 docker image로 build하고, Dockerfile 내에서 tomcat 9 image를 불러와 tomcat으로 war파일을 실행하도록 설정해놨었는데, exec format error가 발생하였다.

exec user process caused “exec format error” 

처음에는 무슨 문제인가 싶었고 당황했다.
서버도 같은 linux 계열 (ubuntu -> centos) 인데, 무슨 문제가 있는거지? 하며 의아해 하던 중 한 가지 생각이 스쳐지나갔다.

ubuntu 서버의 경우 Razberry Pi 4에 설치하여 사용하던 중이였고, CentOS의 경우 MSI 미니서버에 설치하여 사용하던 중이였다.
Razberry의 경우 arm, CentOS의 경우 AMD로 jenkins는 Razberry Ubuntu에 위치하여 docker image를 빌드하여 Dockerhub로 Push하였고 CentOS에서는 Dockerhub에 올라간 이미지를 pull 받아 실행되도록 구성 되어 있었다.

구성도

아키텍처 구성이 다른 서버를 생각하고 명령어를 감안했어야 했는데, 그러지 못한 내 잘못이다 아주 그냥.....🤬

4. exec format error 해결 과정

다행히도 docker에서는 docker buildx 명령어를 통한 Multi Platform Build를 지원 해주어 image Build 시 명령어를 수정하면 해결이 되었다.

As-Is Build 명령어

docker build <docker-hub-id>/<docker-image-name> .

To-Be Build 명령어

docker buildx build --platform=linux/amd64 --tag <docker-hub-id>/<docker-image-name> .

이런식으로 platform 하나를 지정하여 build도 가능하며, 여러 플랫폼을 모두 적용시키는 방법도 가능하다.

4.1 추가 문제

'이렇게 build를 하고 이 후 생성된 image를 docker hub로 push하면 되겠다'
라고 생각하고 build 이 후 해당 image를 찾아 push하도록 ansible-playbook을 아래와 같이 세팅하였다.

- name: docker build
  command: docker buildx build --platform=linux/amd64 --tag <docker-hub-id>/<docker-image-name> .
- name: docker push image
  command: docker push <docker-hub-id>/<docker-image-name>
- name: local docker image remove
  ...

하고 실행하였더니 엥?🤨 image를 찾을 수 없다는 error가 튀어 나왔다.

아무리 실행해도 image는 생성되지 않는다. docker buildx 명령어 관련하여 찾아보았다.

docker buildx의 경우 image를 push/load 옵션을 통해 바로 docker hub로 push하거나 build를 진행하는 디바이스에 image를 저장하도록 따로 옵션을 지정하여야 되는 것 같았다.

해서 다음과 같이 명령어를 수정하였다.

- name: docker build & push
  command: docker buildx build --platform=linux/amd64 --tag <docker-hub-id>/<docker-image-name> ./ --push

build 즉시 push를 할 경우 내가 처음 생성한 task보다 훨씬 간결하게 task를 구성할 수 있어 push 옵션을 통해 build 즉시 docker hub로 push할 수 있도록 구성하였다.

결과는?
너무도 잘된다. 사실 flannel 문제보다도 해당 문제 관련해서 더 많이 시간이 소요 됬다. 이상하게도 가끔 금방 찾는 문제도 이렇게 무엇에 홀린 듯 해결이 더딘 경우가 있는데, 그래도 해결해서 너무~ 기분이 좋았다.

끝으로, docker buildx의 경우 특정 버전 이 후에서만 사용 가능하니 docker version을 꼭 확인하고 진행하기를 바란다.

profile
개발을 개발새발

0개의 댓글