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 buildxlà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-slimhaynode: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.

