[ETC] exec format error

ETC

쿠버네티스에 이더리움 프라이빗 네트워크를 설치하고 접속하려는데 아래와 같은 에러가 발생했습니다.

1
2
% geth attach http://35.243.121.19:30045
Fatal: Failed to start the JavaScript console: api modules: Post "http://35.243.121.19:30045": context deadline exceeded

노드 안에 파일이 정상적으로 복사되었는지 확인했습니다.

1
2
% ls
bin boot dev etc home lib lib64 lost+found mnt opt postinst proc root run sbin sys tmp usr var

그런데 있어야할 entrypoint.sh가 없습니다?

이상하다는 생각과 함께 쿠버네티스 상태를 조회해봤습니다.

1
2
3
4
5
6
7
8
9
% kubectl get pods,deployments,service -l app=private-net                                                   
NAME READY STATUS RESTARTS AGE
pod/private-net-75c64c9b55-6drc2 0/1 CrashLoopBackOff 3 (49s ago) 106s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/private-net 0/1 1 0 106s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/private-net NodePort 10.28.0.76 <none> 8545:30045/TCP,8546:30046/TCP 106s

내용을 확인해보니 RESTART 카운터가 올라가며 CrashLoopBackOff 상태와 READY 0/1인것이 확인되었습니다.

문제가 정확히 뭔지 확인해봐야 겠다는 생각이 들었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
% kubectl describe pod

// 생략...

Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 15s default-scheduler Successfully assigned default/private-net-75c64c9b55-6drc2 to gke-private-net-default-pool-0723bf45-cj48
Normal Pulled 8s kubelet Successfully pulled image "gcr.io/flash-freehold-371706/private-net:latest" in 6.166602093s
Normal Pulling 7s (x2 over 14s) kubelet Pulling image "gcr.io/flash-freehold-371706/private-net:latest"
Normal Created 6s (x2 over 8s) kubelet Created container private-net
Normal Started 6s (x2 over 8s) kubelet Started container private-net
Normal Pulled 6s kubelet Successfully pulled image "gcr.io/flash-freehold-371706/private-net:latest" in 1.152688998s
Warning BackOff 4s (x2 over 5s) kubelet Back-off restarting failed container

이미지는 정상적으로 풀링했는데 Back-off restarting failed container라고 뜨는군요

조금 더 자세한 로그를 살펴봅니다.

1
2
% kubectl logs pod/private-net-75c64c9b55-6drc2
exec /entrypoint.sh: exec format error

역시나 entrypoint.sh와 관련이 있군요

따라서 Dockerfile 내용을 확인해봤습니다.

1
2
3
4
5
6
7
8
9
10
11
FROM ethereum/client-go

COPY genesis.json /var/share/ethereum/
COPY keystore /var/share/ethereum/keystore/
COPY password /var/share/ethereum/
COPY entrypoint.sh /
RUN chmod 744 /entrypoint.sh

EXPOSE 8545 8546 30303 30303/udp

ENTRYPOINT ["/entrypoint.sh"]

내용은 크게 문제있어보이지 않습니다.

결국 쿠버네티스 클러스터를 구성하고 생성된 노드들이 도커 이미지를 정상적으로 반영하지 못한것으로 판단했습니다.

1
% kubectl apply -f private-net.yaml

아마 위의 작업이 정상적으로 되지 않았을겁니다.

그렇다면 왜 안됐을까 고민을 했을때 M1에서 빌드했기 때문에 amd기반의 노드에서는 정상적으로 작동하지 않았을거라 생각했습니다.

크로스 플랫폼 빌드

amdarm 플랫폼에 대해 빌드를 진행하고 실습을 진행해보았습니다.

1
2
% docker buildx create --name multiarch-builder --use
% docker buildx build --push --platform linux/amd64,linux/arm64 --tag gcr.io/flash-freehold-371706/private-net:2.0 .

그리고 문제없이 실행되는것을 확인했습니다.