View a markdown version of this page

Buat varian Bottlerocket AMI khusus untuk Amazon EKS - Amazon EKS

Bantu meningkatkan halaman ini

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Untuk berkontribusi pada panduan pengguna ini, pilih GitHub tautan Edit halaman ini di yang terletak di panel kanan setiap halaman.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Buat varian Bottlerocket AMI khusus untuk Amazon EKS

Saat menjalankan beban kerja GPU di Amazon Elastic Kubernetes Service (Amazon EKS), Anda memilih varian Bottlerocket. Varian harus sesuai dengan versi Kubernetes dan jenis akselerator Anda. Bottlerocket mengirimkan varian yang divalidasi untuk konfigurasi umum. Namun, organisasi Anda mungkin memerlukan varian yang berbeda untuk salah satu alasan berikut:

  • Cabang driver NVIDIA yang lebih baru

  • Versi driver yang disematkan untuk kepatuhan terhadap peraturan

  • Paket tambahan untuk pemantauan

  • Basis dasar yang diperketat yang dibutuhkan oleh tim keamanan Anda

Karena Bottlerocket di GitHub situs web sepenuhnya open-source, Anda dapat membuat varian khusus yang memenuhi kebutuhan ini. Topik ini menunjukkan cara mengkloning varian yang ada dan menukar driver NVIDIA dari cabang R580 ke R595 (versi 595.71.05). Anda kemudian membangun gambar dan mendaftarkannya sebagai AMI pribadi.

penting

Jenis g7 instance memerlukan driver NVIDIA versi 595 atau yang lebih baru, didukung pada EKS Bottlerocket NVIDIA 1.37 AMI. EKS Bottlerocket NVIDIA AMI 1.36 dan yang lebih lama saat ini menyertakan driver NVIDIA versi 580, yang tidak mendukung instance. g7

Lihat repositori Bottlerocket di GitHub situs web untuk petunjuk tentang membangun varian dengan driver NVIDIA versi 595. Topik ini berjalan melalui proses lengkap mulai dari Langkah 1.

Bagaimana sistem build bekerja

Ketika Anda berlaricargo make -e BUILDSYS_VARIANT=aws-k8s-1.36-nvidia, tiga hal terjadi:

  • Ambil dependensi. Twoliter (orkestrator build Bottlerocket) membaca Twoliter.toml dan menarik tiga artefak Open Container Initiative (OCI) dari: public.ecr.aws/bottlerocket

    • bottlerocket-sdk — gambar wadah dengan toolchain kompilasi silang lengkap (makro GCC, Rust, Go, RPM).

    • bottlerocket-kernel-kit — RPM pra-build untuk kernel, modul kernel (termasuk paket NVIDIA kmod), dan firmware.

    • bottlerocket-core-kit — RPM pra-bangun untuk ruang pengguna: kubelet, containerd, plugin perangkat NVIDIA dan toolkit wadah, plugin pengaturan, dan layanan sistem.

      Twoliter.tomlmenyematkan versi dan meng Twoliter.lock unci cerdasannya. Untuk mengubah keduanya, jalankan ./tools/twoliter/twoliter update untuk menyelesaikan ulang.

  • Bangun varian. Twoliter meluncurkan build Docker di dalam wadah SDK. Ini mengkompilasi peti pengaturan default varian Anda, menyelesaikan pohon ketergantungan RPM dari kit, dan merakit semuanya ke dalam gambar disk.

  • Keluaran. Twoliter menulis .img.lz4 file terakhir ke. build/images/ Build menghasilkan output deterministik: Twoliter.toml pin dan varian yang sama Cargo.toml selalu menghasilkan gambar yang sama, terlepas dari host.

Tata letak repositori

Direktori berikut relevan dengan pekerjaan varian:

bottlerocket/ ├── Cargo.toml # workspace: lists every variant ├── Twoliter.toml # pins SDK + kit versions ├── Twoliter.lock # locked digests for the above ├── Licenses.toml # you create this (NVIDIA license acknowledgement) ├── Infra.toml # you create this (AMI publish regions) │ ├── variants/ │ ├── aws-k8s-1.36-nvidia/ # example variant you'll copy │ │ ├── Cargo.toml # package list + kernel params │ │ └── amispec.toml # symlink → ../shared/amispec-split.toml │ └── shared/ # shared AMI spec templates │ ├── sources/ │ ├── Cargo.toml # workspace: lists every settings-defaults crate │ ├── shared-defaults/ # the actual defaults (symlink targets) │ └── settings-defaults/ │ └── aws-k8s-1.36-nvidia/ │ ├── Cargo.toml │ └── defaults.d/ # 30+ symlinks into shared-defaults/ │ └── packages/ ├── settings-defaults/ │ └── settings-defaults.spec # RPM: declares which variants exist └── settings-plugins/ └── settings-plugins.spec # RPM: maps variants to settings plugins

Tinjau catatan berikut tentang struktur repositori:

  • Varian sebagian besar adalah metadata. Kit eksternal menyediakan kernel, driver, dan ruang pengguna.

  • Settings-defaults file adalah symlink, bukan salinan. Gunakan cp -R (bukan cp -r di macOS) untuk melestarikannya.

  • Menambahkan varian memerlukan pengeditan di lima tempat: dua Cargo.toml file ruang kerja, dua .spec file, danREADME.md.

Prasyarat

Untuk menyelesaikan panduan, Anda perlu:

  • AWS Akun dengan izin untuk meluncurkan instans EC2 dan mendaftarkan AMI

  • Instans EC2 (atau host Linux x86_64 yang setara) dengan setidaknya 8 core, memori 16 GiB, dan disk 150 GB

  • Ubuntu 24.04 LTS (atau Fedora; macOS tidak didukung sebagai host build)

  • Docker 20.10 atau yang lebih baru

  • Karat (rantai alat stabil, dipasang melalui rustup)

  • cargo-make (versi terbaru)

  • Keakraban dengan konsep pengemasan Git, Rust's Cargo, dan RPM

catatan

Setelah menyelesaikan panduan ini, hentikan instans EC2 dan hapus pendaftaran AMI yang tidak lagi Anda perlukan untuk menghindari biaya yang sedang berlangsung. Untuk petunjuk tentang pembersihan, lihatMembersihkan.

Langkah 1: Siapkan host build

Luncurkan instance EC2 - misalnya, c7i.8xlarge (32 vCPU, memori 64 GiB). Gunakan volume root gp3 150 GB dan lampirkan kebijakan terkel AmazonSSMManagedInstanceCore ola untuk akses SSM.

Hubungkan ke instance menggunakan AWS Manajer Sesi Sistem (SSM):

aws ssm start-session --target <instance-id> cd ~

Instal paket sistem operasi yang diperlukan:

apt-get update apt-get install -y build-essential openssl libssl-dev pkg-config lz4 \ git ca-certificates curl gnupg
catatan

BUILDING.mdReferensi resmiliblz4-tool. Pada versi Ubuntu terbaru, paket tersebut diberi namalz4.

Instal Docker menggunakan perintah berikut:

install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \ https://download.docker.com/linux/ubuntu noble stable" \ > /etc/apt/sources.list.d/docker.list apt-get update apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin systemctl enable --now docker

Instal Rust dan cargo-make menggunakan perintah berikut:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y . "$HOME/.cargo/env" cargo install cargo-make

Langkah 2: Kloning repositori

Kloning repositori Bottlerocket di GitHub situs web dan navigasikan ke direktori:

cd ~/bottlerocket

Untuk membuat build yang dapat direproduksi, lihat rilis yang ditandai (misalnya,git checkout v1.62.1). Untuk menggunakan paket terbaru, tetap di develop cabang.

Langkah 3: Verifikasi versi kit

Buka Twoliter.toml dan konfirmasikan versi kit. Untuk dukungan R595, Anda memerlukan bottlerocket-kernel-kit versi 6.2.2 atau yang lebih baru:

[[kit]] name = "bottlerocket-kernel-kit" version = "6.2.2" vendor = "bottlerocket"

Jika versinya lebih lama, perbarui dan buat ulang kunci:

./tools/twoliter/twoliter update

Langkah 4: Atasi masalah jalur pembuatan kargo

Twoliter menyetel CARGO_HOME ke~/bottlerocket/.cargo, yang mencegah proses Kargo bagian dalam menemukan pabrik kargo Anda yang terpasang secara global. Buat symlink:

mkdir -p ~/bottlerocket/.cargo/bin ln -sf /root/.cargo/bin/cargo-make ~/bottlerocket/.cargo/bin/cargo-make

Tanpa langkah ini, pembangunan gagal denganerror: no such command: make.

Langkah 5: Temukan cabang driver yang tersedia

Paket NVIDIA kmod dikirim ke dalambottlerocket-kernel-kit. Untuk informasi tentang paket driver yang tersedia, lihat direktori paket kernel-kit di GitHub situs web, atau catatan rilis di situs web. GitHub

Untuk kernel 6.18 (digunakan oleh aws-k8s-1.36 varian):

kmod-6.18-nvidia-r580 ← driver 580.159.03 (current default) kmod-6.18-nvidia-r595 ← driver 595.71.05

Untuk kernel 6.12 (digunakan olehaws-k8s-1.33,1.34,1.35):

kmod-6.12-nvidia-r580 kmod-6.12-nvidia-r595
catatan

Setiap paket kmod mengirimkan subpaket (-tesla,,, -open-gpu -grid-fabricmanager,-imex). Referensi varian Bottlerocket NVIDIA resmi-tesla, yang menarik semua subpaket yang diperlukan melalui dependensi RPM. Saat boot, Bottlerocket secara otomatis memilih ragam driver yang sesuai berdasarkan jenis instance.

Langkah 6: Buat varian baru

Salin varian yang ada. Gunakan cp -R untuk mempertahankan symlink:

cp -R variants/aws-k8s-1.36-nvidia variants/aws-k8s-1.36-nvidia-595 cp -R sources/settings-defaults/aws-k8s-1.36-nvidia \ sources/settings-defaults/aws-k8s-1.36-nvidia-595

Suntingvariants/aws-k8s-1.36-nvidia-595/Cargo.toml:

- name = "aws-k8s-1_36-nvidia" + name = "aws-k8s-1_36-nvidia-595" - "kmod-6.18-nvidia-r580-tesla", + "kmod-6.18-nvidia-r595-tesla",

Suntingsources/settings-defaults/aws-k8s-1.36-nvidia-595/Cargo.toml:

- name = "settings-defaults-aws-k8s-1_36-nvidia" + name = "settings-defaults-aws-k8s-1_36-nvidia-595"

Langkah 7: Daftarkan varian

Daftarkan varian baru dalam lima file:

1. Cargo.toml— tambahkan anggota ruang kerja:

"variants/aws-k8s-1.36-nvidia", + "variants/aws-k8s-1.36-nvidia-595", "variants/aws-k8s-1.36-nvidia-fips",

2. sources/Cargo.toml— tambahkan anggota settings-dedefault:

"settings-defaults/aws-k8s-1.36-nvidia", + "settings-defaults/aws-k8s-1.36-nvidia-595",

3. packages/settings-defaults/settings-defaults.spec— tambahkan %package blok, entri di kedua loop build, dan %files bagian:

%package aws-k8s-1.36-nvidia-595 Summary: Settings defaults for the aws-k8s 1.36 nvidia-595 variant Requires: %{_cross_os}variant(aws-k8s-1.36-nvidia-595) Provides: %{_cross_os}settings-defaults(any) Provides: %{_cross_os}settings-defaults(aws-k8s-1.36-nvidia-595) Conflicts: %{_cross_os}settings-defaults(any) %description aws-k8s-1.36-nvidia-595 %{summary}.

Tambahkan ke kedua for defaults in loop:

aws-k8s-1.36-nvidia \ + aws-k8s-1.36-nvidia-595 \ metal-dev \

Tambahkan %files bagian:

%files aws-k8s-1.36-nvidia-595 %{_cross_defaultsdir}/aws-k8s-1.36-nvidia-595.toml %{_cross_tmpfilesdir}/storewolf-defaults-aws-k8s-1.36-nvidia-595.conf

4. packages/settings-plugins/settings-plugins.spec— tambahkan Provides: baris di bawah%package aws-k8s-nvidia:

Provides: %{_cross_os}settings-plugin(aws-k8s-1.36-nvidia) +Provides: %{_cross_os}settings-plugin(aws-k8s-1.36-nvidia-595) Conflicts: %{_cross_os}settings-plugin(any)

Langkah 8: Segarkan file kunci

Menambahkan anggota ruang kerja tidak validsources/Cargo.lock. Segarkan:

cd ~/bottlerocket/sources cargo update --workspace
penting

Jangan gunakancargo generate-lockfile. Ini menulis ulang seluruh lockfile dan menabrak dependensi transitif, yang menyebabkan kesalahan versi duplikat. cargo-deny

Langkah 9: Buat file lisensi NVIDIA

NVIDIA membatasi redistribusi sumber driver. Anda harus menambahkan pengakuan lisensi eksplisit sebelum membangun:

cat > ~/bottlerocket/Licenses.toml <<'EOF' [nvidia] spdx-id = "LicensesRef-NVIDIA-Customer-Use" licenses = [ { path = "LICENSE", license-url = "https://www.nvidia.com/en-us/drivers/nvidia-license/" } ] EOF

Langkah 10: Bangun dan publikasikan AMI

Buat Infra.toml dengan wilayah target Anda:

cat > ~/bottlerocket/Infra.toml <<'EOF' [aws] regions = ["us-west-2", "us-east-1", "us-east-2"] EOF

Bangun gambar:

cd ~/bottlerocket cargo make \ -e BUILDSYS_VARIANT=aws-k8s-1.36-nvidia-595 \ -e BUILDSYS_UPSTREAM_SOURCE_FALLBACK=true \ -e BUILDSYS_UPSTREAM_LICENSE_FETCH=true \ -e BUILDSYS_JOBS=32

Build pertama menarik gambar SDK dan kit (total ~ 2 GB). Build selanjutnya membutuhkan waktu 3-5 menit pada host 32-core.

Publikasikan AMI:

cargo make \ -e BUILDSYS_VARIANT=aws-k8s-1.36-nvidia-595 \ -e PUBLISH_REGIONS=us-west-2,us-east-1,us-east-2 \ ami

Build menulis ID AMI kebuild/images/x86_64-aws-k8s-1.36-nvidia-595/latest/*-amis.json. Gunakan ini di grup node terkelola EKS Anda, KarpenterEC2NodeClass, atau peluncuran template.

Kombinasi lain yang dapat Anda bangun

Panduan ini menukar cabang driver NVIDIA, tetapi Anda dapat menggunakan pendekatan yang sama untuk paket apa pun yang tersedia di kit hulu. Contoh-contoh berikut menunjukkan apa yang dapat Anda rakit tanpa memotong kit:

Apa yang Anda inginkan Apa yang harus diubah dalam varian Cargo.toml

Cabang driver NVIDIA yang berbeda

kmod-6.18-nvidia-r580-tesla → kmod-6.18-nvidia-r595-tesla

Versi kernel yang berbeda

kernel-6.18→ kernel-6.12 (sesuaikan kmod yang sesuai)

Hapus NVIDIA seluruhnya

Hapus tiga nvidia-* baris dari included-packages

Tambahkan dukungan EFA

Tambahkan kmod-6.18-efa ke included-packages

Ganti versi runtime kontainer

containerd-2.2 → containerd-2.1

Untuk informasi tentang paket yang tersedia, lihat kernel-kit di situs GitHub web dan core- kit di situs web. GitHub

penting

Sistem file root Bottlerocket tidak dapat diubah. Anda tidak dapat menginstal paket saat runtime. Setiap paket dalam kit dikompilasi silang khusus untuk Bottlerocket — RPM hulu standar tidak berfungsi. Jika Anda memerlukan perangkat lunak yang belum ada dalam kit, pertimbangkan wadah bootstrap di GitHub situs web atau kon tainer host di GitHub situs web sebagai alternatif runtime.

Membersihkan

Jika Anda tidak lagi memerlukan host build, hentikan instans EC2 untuk menghindari biaya yang sedang berlangsung. AMI tetap ada secara independen di akun Anda; hapus daftarnya dengan konsol EC2 atau CLI jika Anda tidak lagi membutuhkannya.

Ringkasan

Topik ini menunjukkan cara membuat varian Bottlerocket kustom dengan cabang driver NVIDIA yang berbeda. Prosesnya melibatkan menyalin varian yang ada, mengubah satu referensi paket, mendaftarkan varian baru di ruang kerja dan spesifikasi RPM, dan menjalankan build. Pendekatan yang sama berlaku untuk kustomisasi apa pun: menukar versi kernel, menambahkan paket, atau membuat varian untuk rilis Kubernetes baru.