Membuat image multi-arsitektur untuk workload Arm


Halaman ini menjelaskan apa yang dimaksud dengan image multi-arsitektur (multi-arch), alasan pentingnya arsitektur node dan image container, dan mengapa image multi-arch memudahkan deployment workload ke cluster GKE. Halaman ini juga memberikan panduan tentang cara memeriksa apakah workload Anda siap dijalankan di Arm, dan cara membuat image multi-arch.

Untuk tutorial tentang cara men-deploy di seluruh arsitektur dengan image multi-arch, lihat Memigrasikan aplikasi x86 di GKE ke multi-arch dengan Arm.

Apa yang dimaksud dengan image multi-arch?

Image multi-arch adalah image yang dapat mendukung beberapa arsitektur. Tampilannya terlihat seperti satu image dengan satu tag, tetapi sebenarnya merupakan daftar image yang menargetkan beberapa arsitektur yang diatur berdasarkan daftar manifes. Image multi-arch kompatibel dengan Docker Image Manifest V2 Scheme 2 atau Spesifikasi Image Indeks OCI. Saat Anda men-deploy image multi-arch ke cluster, GKE secara otomatis memilih image yang tepat yang kompatibel dengan arsitektur node tempat cluster tersebut di-deploy. Setelah memiliki image multi-arch untuk workload, Anda dapat men-deploy workload ini dengan lancar di berbagai arsitektur.

Image multi-arch paling berguna saat Anda ingin menggunakan workload yang sama di seluruh arsitektur. Atau, Anda dapat menggunakan image container dengan satu arsitektur dengan segala jenis node GKE. Jika hanya menggunakan workload pada satu arsitektur dan sudah memiliki image yang kompatibel, Anda tidak perlu membuat image multi-arch.

Jika menggunakan image arch tunggal atau image multi-arch yang kompatibel dengan Arm dan ingin men-deploy-nya ke node Arm, Anda harus mengikuti petunjuk untuk menyertakan kolom yang diperlukan agar GKE menjadwalkan workload seperti yang diharapkan. Untuk mempelajari lebih lanjut, lihat Menyiapkan workload Arm untuk deployment. Anda tidak perlu menambahkan kolom ini untuk menjadwalkan workload jika workload hanya akan dijadwalkan ke node berbasis x86.

Mengapa arsitektur node GKE penting untuk workload?

Node GKE adalah instance VM Compute Engine individu yang dibuat dan dikelola oleh GKE untuk Anda. Setiap node adalah jenis mesin standar (misalnya, t2a-standard-1) yang menggunakan prosesor x86 (Intel atau AMD) atau Arm. Untuk mempelajari lebih lanjut, lihat platform CPU.

Anda harus menggunakan image container yang kompatibel dengan arsitektur node tempat Anda ingin menjalankan workload. Misalnya, jika ingin menjalankan image container dengan arsitektur arm64, Anda harus menggunakan jenis mesin yang mendukung workload Arm, seperti t2a-standard-1 dari seri mesin Tau T2A Anda dapat menggunakan node dengan beberapa jenis arsitektur dalam satu cluster GKE. Jika ingin menggunakan satu workload di beberapa jenis arsitektur, Anda harus menyimpan semua image container dan file deployment untuk image khusus arsitektur. Image multi-arch menyederhanakan proses deployment di berbagai jenis arsitektur.

Membangun image multi-arch untuk di-deploy di seluruh node x86 dan Arm

Petunjuk berikut ditujukan untuk Developer Aplikasi yang sudah memiliki:

  • lingkungan build dengan alat container yang didownload (misalnya, Docker).
  • image container yang ada.

Perintah berikut menggunakan Docker, tetapi Anda mungkin dapat menggunakan alat container lain untuk menyelesaikan tugas yang sama.

Apakah workload saya siap untuk Arm?

Jika sudah memiliki image container, Anda dapat memeriksa apakah workload ini siap dijalankan pada node Arm. Bagian berikut menjelaskan cara melakukannya menggunakan docker run untuk mencoba menjalankan penampung dengan arsitektur Arm.

Menyiapkan Docker di lingkungan x86 untuk memeriksa image container

Jika menjalankan Docker di lingkungan x86, Anda harus mendownload paket tambahan untuk menjalankan image container arm64. Petunjuk ini menggunakan apt untuk pengelolaan paket, tetapi Anda dapat menggunakan pengelola paket lingkungan untuk mendownload paket yang diperlukan.

Jika menjalankan Docker di lingkungan Arm, Anda dapat melewati bagian ini.

Perintah berikut mendownload paket dan mendaftarkan QEMU sebagai penafsir binfmt untuk arsitektur yang tidak didukung mesin Anda:

sudo apt-get install qemu binfmt-support qemu-user-static
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

Setelah menyetel penafsir binfmt, Anda dapat menjalankan image arm64 di lingkungan x86.

Memeriksa workload untuk kesiapan Arm

Jika Anda menjalankan Docker di lingkungan Arm, atau telah menyiapkan lingkungan x86 untuk menjalankan image Arm, jalankan perintah berikut:

docker run --platform linux/arm64 IMAGE_NAME

Ganti IMAGE_NAME dengan nama image container.

Output berikut menunjukkan bahwa image container Anda siap dijalankan di node Arm dengan cluster GKE:

Hello from Docker!
This message shows that your installation appears to be working correctly.

Jika workload Anda siap dijalankan di Arm, Anda dapat melanjutkan ke Menyiapkan workload Arm untuk deployment.

Output berikut menunjukkan bahwa image Anda belum siap dijalankan di Arm:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
93288797bd35: Pull complete
Digest: sha256:507ecde44b8eb741278274653120c2bf793b174c06ff4eaa672b713b3263477b
Status: Downloaded newer image for hello-world:latest
standard_init_linux.go:219: exec user process caused: exec format error

Output ini menunjukkan bahwa ini adalah image x86_64 atau amd64 dan Anda harus membangun image arm64. Lanjutkan ke bagian berikutnya, Membangun image multi-arch. Di sini, Anda dapat menggunakan image container yang tidak kompatibel dengan Arm, Dockerfile, dan membangun image multi-arch yang dapat berjalan di seluruh jenis arsitektur.

Membangun image multi-arch

Jika memiliki Dockerfile, Anda dapat menggunakannya untuk membangun image multi-arch yang kompatibel dengan Arm dan kompatibel dengan x86 yang dapat di-deploy di berbagai node dengan jenis arsitektur yang berbeda.

Anda harus mendownload Docker Buildx untuk menyelesaikan langkah-langkah berikut. Anda juga harus memiliki Dockerfile yang sudah ada.

Menyiapkan lingkungan jika Anda memiliki VM x86 dan VM Arm

Perintah berikut mengasumsikan bahwa Anda memiliki VM build Arm dan VM build x86 di lingkungan build, dan VM x86 dapat menjalankan SSH sebagai root ke VM Arm Anda. Jika Anda hanya memiliki VM x86 dalam lingkungan build, ikuti petunjuk di bagian berikutnya, Menyiapkan lingkungan jika Anda hanya memiliki VM x86.

Siapkan lingkungan Anda untuk membangun image multi-arch:

  1. Buat konteks untuk node x86 menggunakan soket lokal, dan konteks untuk node Arm menggunakan SSH:

     docker context create amd_node --docker "host=unix:///var/run/docker.sock"
     docker context create arm_node --docker "host=ssh://root@NODE_IP"
    

    Ganti NODE_IP dengan alamat IP node Arm.

  2. Buat builder menggunakan node x86:

    docker buildx create --use --name BUILDER_NAME --platform linux/amd64 amd_node
    docker buildx create --append --name BUILDER_NAME --platform linux/arm64 arm_node
    

    Ganti BUILDER_NAME dengan nama yang Anda pilih untuk builder Buildx.

Menyiapkan lingkungan jika Anda hanya memiliki VM x86

Jika hanya memiliki VM x86 di lingkungan build, Anda dapat mengikuti langkah-langkah berikut untuk menyiapkan lingkungan pembuatan image multi-arch. Dengan opsi ini, langkah build mungkin memerlukan waktu lebih lama.

  1. Instal paket QEMU:

    docker run --rm --privileged multiarch/qemu-user-static
    
  2. Buat builder multi-arch (builder default tidak mendukung multi-arch):

    docker buildx create --name BUILDER_NAME --use
    

    Ganti BUILDER_NAME dengan nama yang Anda pilih untuk builder Buildx.

Membangun image

Setelah lingkungan Anda siap, jalankan perintah berikut untuk membangun image multi-arch:

docker buildx build . -t PATH_TO_REGISTRY  --platform linux/amd64,linux/arm64 --push

Ganti PATH_TO_REGISTRY dengan jalur ke registry Anda, yang diakhiri dengan nama image container dan tag (misalnya, gcr.io/myproject/myimage:latest).

Jika Anda mendapatkan pesan error pada langkah ini, lihat panduan Docker dan dokumentasi terkait untuk memecahkan masalah lebih lanjut.

Setelah membangun image multi-arch, workload Anda siap dijalankan di Arm. Lanjutkan ke Menyiapkan workload Arm untuk deployment.

Langkah berikutnya