Sửa lỗi 'exec format error' (standard_init_linux.go:211) trong Kubernetes: ARM và x86

intermediate☸️ Kubernetes2026-05-02| Kubernetes Clusters (EKS, GKE, K3s), Docker, ARM64 (Apple Silicon, AWS Graviton), x86_64 (Intel/AMD)

Error Message

standard_init_linux.go:211: exec user process caused "exec format error"
#kubernetes#docker#arm64#devops

Bẫy "Chạy Tốt Trên Máy Tôi"

Đây là một kịch bản kinh điển: Docker image của bạn chạy hoàn hảo trên máy cục bộ, nhưng ngay khi đưa lên Kubernetes, pod bị lỗi. Bạn kiểm tra log và thấy thông báo gây ức chế này:

standard_init_linux.go:211: exec user process caused "exec format error"

Pod của bạn có khả năng đang bị kẹt trong vòng lặp CrashLoopBackOff. Đây không phải là lỗi trong mã nguồn ứng dụng, mà là sự không tương thích về kiến trúc nền tảng. Bạn đang cố gắng chạy một container được build cho một loại CPU trên một máy chủ sử dụng một ngôn ngữ hoàn toàn khác.

Nguyên Nhân Gốc Rễ: ARM64 và x86_64

Bối cảnh điện toán đám mây đã thay đổi. Hầu hết các nhà phát triển hiện nay sử dụng Mac với Apple Silicon (ARM64), trong khi nhiều cụm server production vẫn chạy trên phần cứng Intel hoặc AMD (x86_64/AMD64) truyền thống.

Khi bạn chạy docker build trên Mac M1, M2 hoặc M3, Docker sẽ tạo ra image ARM64 theo mặc định. Nếu bạn triển khai image đó lên một instance AWS t3.medium tiêu chuẩn (x86_64), kernel Linux sẽ không thể thực thi các lệnh. Việc này giống như cố gắng chơi đĩa PlayStation trên máy Xbox vậy—định dạng vật lý đơn giản là không tương thích.

Xác Nhận Sự Không Tương Thích Kiến Trúc

Trước khi sửa lại quy trình build, hãy xác nhận xem kiến trúc CPU có thực sự là nguyên nhân hay không.

1. Kiểm Tra Phần Cứng Của Node

Xác định kiến trúc mà các node Kubernetes của bạn đang chạy bằng lệnh sau:

kubectl get nodes -o custom-columns=NAME:.metadata.name,ARCH:.status.nodeInfo.architecture

Nếu kết quả hiển thị amd64 nhưng bạn đang build trên một chiếc MacBook đời mới, bạn đã tìm thấy điểm không tương thích.

2. Kiểm Tra Image

Bước tiếp theo là kiểm tra metadata của image trực tiếp trong registry:

docker pull your-repo/your-image:tag
docker inspect your-repo/your-image:tag | grep Architecture

Nếu bạn thấy "Architecture": "arm64" nhưng node của bạn là amd64, container sẽ không bao giờ khởi động được.

Giải Pháp Triệt Để: Build Đa Kiến Trúc với Docker Buildx

Giải pháp lâu dài và tin cậy nhất là tạo một "Manifest List". Điều này cho phép một image tag duy nhất hỗ trợ nhiều kiến trúc khác nhau. Khi Kubernetes pull image, registry sẽ tự động gửi phiên bản phù hợp với phần cứng của node.

Bước 1: Thiết Lập Builder

Docker Buildx đảm nhận phần việc nặng nhọc là biên dịch chéo (cross-compiling) cho các nền tảng khác nhau. Đầu tiên, hãy tạo một instance builder mới:

# Tạo builder mới hỗ trợ đa kiến trúc
docker buildx create --name global-builder --use
# Khởi tạo builder
docker buildx inspect --bootstrap

Bước 2: Build Cho Cả Hai Thế Giới

Sử dụng flag --platform để nhắm mục tiêu cả hai kiến trúc cùng lúc. Lưu ý rằng bạn phải --push trực tiếp lên registry, vì bộ lưu trữ Docker cục bộ thường chỉ giữ được một kiến trúc tại một thời điểm.

docker buildx build --platform linux/amd64,linux/arm64 -t your-repo/your-app:v1.0 --push .

Chỉ với một lệnh duy nhất này, ứng dụng của bạn sẽ được đóng gói cho cả hệ thống Intel/AMD và ARM64 (như AWS Graviton).

Cách Nhanh: Ép Buộc Một Kiến Trúc Duy Nhất

Đôi khi bạn chỉ cần một bản sửa lỗi nhanh cho một kiến trúc nhất định. Nếu không cần hỗ trợ ARM, hãy ép Mac của bạn build một image tương thích với Intel:

docker build --platform linux/amd64 -t your-repo/your-app:v1.0 .

Cảnh báo: Cách này sử dụng trình giả lập QEMU. Một quá trình build bình thường mất 30 giây có thể tốn tới 5 phút vì máy Mac của bạn đang giả lập một bộ vi xử lý hoàn toàn khác.

Xử Lý Cụm Server Hỗn Hợp Kiến Trúc

Nếu cụm server của bạn sử dụng hỗn hợp các instance (ví dụ: kết hợp Intel m5.large và ARM m6g.large), bạn phải điều hướng Kubernetes. Sử dụng nodeSelector trong file deployment.yaml để đảm bảo pod được đặt trên phần cứng tương thích:

spec:
  template:
    spec:
      nodeSelector:
        kubernetes.io/arch: amd64 # Hoặc arm64 nếu đó là mục tiêu của bạn

Xác Minh Cuối Cùng

Sau khi push image mới, hãy khởi động lại deployment để pull manifest mới nhất:

kubectl rollout restart deployment your-app-name

Kiểm tra trạng thái pod. Nếu bạn thấy Running, nghĩa là file thực thi và phần cứng của bạn đã đồng bộ.

Những Điểm Cần Lưu Ý

  • Buildx là thiết yếu: Nếu bạn làm việc trong một team có phần cứng hỗn hợp, hãy chọn docker buildx làm công cụ build mặc định.
  • Kiểm tra base image: Hầu hết các image chính thức như python:3.12-slim hay node:20-bookworm đã hỗ trợ đa kiến trúc, nhưng các image nội bộ tùy chỉnh thì có thể không.
  • Kiểm tra log sớm: Nếu bạn thấy lỗi "Exec format error", hãy ngừng xem xét logic ứng dụng. Vấn đề nằm ở sự tương thích vật lý, không phải lỗi code.

Related Error Notes