View a markdown version of this page

Crea una variante AMI Bottlerocket personalizzata per Amazon EKS - Amazon EKS

Contribuisci a migliorare questa pagina

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Per contribuire a questa guida per l'utente, scegli il GitHub link Modifica questa pagina su che si trova nel riquadro destro di ogni pagina.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Crea una variante AMI Bottlerocket personalizzata per Amazon EKS

Quando esegui carichi di lavoro GPU su Amazon Elastic Kubernetes Service (Amazon EKS), scegli una variante Bottlerocket. La variante deve corrispondere alla versione di Kubernetes e al tipo di acceleratore. Bottlerocket fornisce varianti convalidate per configurazioni comuni. Tuttavia, la tua organizzazione potrebbe aver bisogno di una variante diversa per uno dei seguenti motivi:

  • Un ramo di driver NVIDIA più recente

  • Una versione con driver bloccata per la conformità normativa

  • Pacchetti aggiuntivi per il monitoraggio

  • Una linea di base consolidata richiesta dal tuo team di sicurezza

Poiché Bottlerocket sul GitHub sito Web è completamente open source, puoi creare una variante personalizzata che soddisfi queste esigenze. Questo argomento mostra come clonare una variante esistente e sostituire il driver NVIDIA dal ramo R580 a R595 (versione 595.71.05). Quindi si crea l'immagine e la si registra come AMI privata.

Importante

Il tipo di g7 istanza richiede il driver NVIDIA 595 o successivo, supportato sull'AMI NVIDIA 1.37 EKS Bottlerocket. Le AMI NVIDIA EKS Bottlerocket 1.36 e precedenti attualmente includono il driver NVIDIA versione 580, che non supporta le istanze. g7

Consulta il repository Bottlerocket sul sito Web per istruzioni su come creare una variante con il GitHub driver NVIDIA versione 595. Questo argomento illustra il processo completo a partire dalla Fase 1. Fase 1: Preparare l'host di compilazione

Come funziona il sistema di compilazione

Quando corricargo make -e BUILDSYS_VARIANT=aws-k8s-1.36-nvidia, succedono tre cose:

  • Recupera le dipendenze. Twoliter (l'orchestrator di build di Bottlerocket) legge Twoliter.toml ed estrae tre artefatti della Open Container Initiative (OCI) da: public.ecr.aws/bottlerocket

    • bottlerocket-sdk: un'immagine del contenitore con la toolchain completa di cross-compilation (macro GCC, Rust, Go, RPM).

    • bottlerocket-kernel-kit: RPM predefiniti per kernel, moduli kernel (inclusi i pacchetti NVIDIA kmod) e firmware.

    • bottlerocket-core-kit — RPM predefiniti per lo spazio utente: kubelet, containerd, il plug-in per dispositivi NVIDIA e il toolkit per contenitori, plug-in per le impostazioni e servizi di sistema.

      Twoliter.tomlblocca le versioni e Twoliter.lock ne blocca i riassunti. Per modificare entrambi, corri ./tools/twoliter/twoliter update per risolverli nuovamente.

  • Crea la variante. Twoliter lancia una build Docker all'interno del contenitore SDK. Compila la cassa delle impostazioni predefinite della tua variante, risolve l'albero delle dipendenze RPM dai kit e assembla tutto in un'immagine del disco.

  • Uscita. Twoliter scrive il .img.lz4 file finale su. build/images/ La build produce un output deterministico: gli stessi Twoliter.toml pin e la stessa variante generano Cargo.toml sempre la stessa immagine, indipendentemente dall'host.

Layout del repository

Le seguenti directory sono rilevanti per le varianti di lavoro:

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

Consulta le seguenti note sulla struttura del repository:

  • Una variante è costituita principalmente da metadati. I kit esterni forniscono il kernel, i driver e lo spazio utente.

  • Settings-defaults i file sono collegamenti simbolici, non copie. Utilizzali cp -R (non cp -r su macOS) per conservarli.

  • L'aggiunta di una variante richiede modifiche in cinque punti: due file dell'area di lavoro, due Cargo.toml .spec file e. README.md

Prerequisiti

Per completare la procedura dettagliata, è necessario:

  • Un AWS account con le autorizzazioni per avviare istanze EC2 e registrare le AMI

  • Un'istanza EC2 (o host Linux x86_64 equivalente) con almeno 8 core, 16 GiB di memoria e 150 GB di disco

  • Ubuntu 24.04 LTS (o Fedora; macOS non è supportato come host di compilazione)

  • Docker 20.10 o successivo

  • Rust (toolchain stabile, installata tramite rustup)

  • cargo-make (ultima versione)

  • Familiarità con i concetti di packaging Git, Rust's Cargo e RPM

Nota

Una volta completata questa procedura dettagliata, chiudi l'istanza EC2 e annulla la registrazione di tutte le AMI non più necessarie per evitare addebiti continui. Per istruzioni sulla pulizia, consulta. Pulizia

Fase 1: Preparare l'host di compilazione

Avvia un'istanza EC2, ad esempio una c7i.8xlarge (32 vCPU, 64 GiB di memoria). Utilizza un volume root gp3 da 150 GB e allega la policy AmazonSSMManagedInstanceCore gestita per l'accesso SSM.

Connettiti all'istanza utilizzando AWS Systems Manager (SSM) Session Manager:

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

Installa i pacchetti del sistema operativo richiesti:

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

I BUILDING.md riferimenti ufficialiliblz4-tool. Nelle versioni recenti di Ubuntu, il pacchetto è denominatolz4.

Installa Docker usando i seguenti comandi:

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

Installa Rust e cargo-make usando i seguenti comandi:

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

Passaggio 2: clona il repository

Clona il repository Bottlerocket sul sito Web e accedi alla GitHub directory:

cd ~/bottlerocket

Per creare una build riproducibile, dai un'occhiata a una release con tag (ad esempio,). git checkout v1.62.1 Per utilizzare i pacchetti più recenti, resta in filiale. develop

Fase 3: Verifica le versioni del kit

Apri Twoliter.toml e conferma le versioni del kit. Per il supporto R595, è necessaria la bottlerocket-kernel-kit versione 6.2.2 o successiva:

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

Se la versione è precedente, aggiornala e rigenera il blocco:

./tools/twoliter/twoliter update

Fase 4: Risolvi il problema del percorso di fabbricazione del carico

Twoliter si imposta CARGO_HOME su~/bottlerocket/.cargo, il che impedisce al processo interno di Cargo di trovare la marca di carico installata a livello globale. Crea un symlink:

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

Senza questo passaggio, la compilazione fallisce con. error: no such command: make

Fase 5: Trova le filiali di autisti disponibili

I pacchetti NVIDIA kmod vengono spediti all'interno. bottlerocket-kernel-kit Per informazioni sui pacchetti driver disponibili, consulta la directory dei pacchetti del kernel-kit sul sito Web o le note di rilascio sul GitHub sito Web. GitHub

Per il kernel 6.18 (usato dalle varianti): aws-k8s-1.36

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

Per il kernel 6.12 (usato daaws-k8s-1.33,,): 1.34 1.35

kmod-6.12-nvidia-r580 kmod-6.12-nvidia-r595
Nota

Ogni pacchetto kmod contiene dei sottopacchetti (-tesla,,,-open-gpu,-grid). -fabricmanager -imex Il riferimento ufficiale alle varianti di NVIDIA di Bottlerocket-tesla, che raccoglie tutti i sottopacchetti richiesti tramite le dipendenze RPM. All'avvio, Bottlerocket seleziona automaticamente il tipo di driver appropriato in base al tipo di istanza.

Fase 6: Creare la nuova variante

Copia la variante esistente. Usa cp -R per preservare i collegamenti simbolici:

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

Modificavariants/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",

Modificasources/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"

Fase 7: Registrare la variante

Registra la nuova variante in cinque file:

1. Cargo.toml— aggiungere il membro dell'area di lavoro:

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

2. sources/Cargo.toml— aggiungere il membro settings-defaults:

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

3. packages/settings-defaults/settings-defaults.spec— aggiungere un %package blocco, delle voci in entrambi i loop di compilazione e una %files sezione:

%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}.

Aggiungi a entrambi i for defaults in loop:

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

Aggiungi la %files sezione:

%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— aggiungere una Provides: riga sotto%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)

Passaggio 8: aggiorna il file di blocco

L'aggiunta di un membro dello spazio di lavoro invalida. sources/Cargo.lock Aggiornalo:

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

Non usarecargo generate-lockfile. Riscrive l'intero lockfile ed elimina le dipendenze transitive, causando errori di versione duplicata. cargo-deny

Passaggio 9: creare il file di licenza NVIDIA

NVIDIA limita la ridistribuzione delle sorgenti dei driver. È necessario aggiungere un riconoscimento esplicito della licenza prima di creare:

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

Fase 10: Creare e pubblicare l'AMI

Crea un messaggio Infra.toml con le tue regioni target:

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

Costruisci l'immagine:

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

La prima build utilizza l'SDK e le immagini del kit (~2 GB in totale). Le build successive richiedono 3-5 minuti su un host a 32 core.

Pubblica l'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

La build scrive gli ID AMI inbuild/images/x86_64-aws-k8s-1.36-nvidia-595/latest/*-amis.json. Usali nei tuoi gruppi di nodi gestiti da EKS, in Karpenter o nei EC2NodeClass modelli di avvio.

Altre combinazioni che puoi creare

Questa procedura dettagliata sostituisce il ramo dei driver NVIDIA, ma puoi utilizzare lo stesso approccio per qualsiasi pacchetto disponibile nei kit upstream. Gli esempi seguenti mostrano cosa è possibile assemblare senza forcare un kit:

Cosa vuoi Cosa modificare nella variante Cargo.toml

Ramo di driver NVIDIA diverso

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

Versione del kernel diversa

kernel-6.18→ kernel-6.12 (regola kmod di conseguenza)

Rimuovi completamente NVIDIA

Elimina le tre nvidia-* righe da included-packages

Aggiungi il supporto EFA

Aggiungi kmod-6.18-efa a included-packages

Cambia la versione di runtime del contenitore

containerd-2.2 → containerd-2.1

Per informazioni sui pacchetti disponibili, consultate il kernel-kit sul GitHub sito Web e il https://github.com/bottlerocket-os/bottlerocket-core-kit core-kit sul sito Web. GitHub

Importante

Il filesystem root Bottlerocket è immutabile. Non è possibile installare i pacchetti in fase di esecuzione. Ogni pacchetto dei kit è compilato in modo incrociato specificamente per Bottlerocket: gli RPM upstream standard non funzionano. Se hai bisogno di software che non è già incluso in un kit, considera i contenitori bootstrap sul GitHub sito Web o i contenitori host sul sito Web come alternativa di runtime. GitHub

Pulizia

Se non hai più bisogno dell'host di compilazione, interrompi l'istanza EC2 per evitare addebiti continui. Le AMI rimangono indipendenti nel tuo account; annulla la registrazione con la console EC2 o la CLI se non ti servono più.

Riepilogo

Questo argomento ha mostrato come creare una variante personalizzata di Bottlerocket con un ramo di driver NVIDIA diverso. Il processo prevede la copia di una variante esistente, la modifica di un riferimento al pacchetto, la registrazione della nuova variante nello spazio di lavoro e nelle specifiche RPM e l'esecuzione della build. Lo stesso approccio si applica a qualsiasi personalizzazione: scambio di versioni del kernel, aggiunta di pacchetti o creazione di varianti per nuove versioni di Kubernetes.