⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Pilote Kubernetes

Le pilote Kubernetes vous permet de connecter vos environnements de développement local ou d'intégration continue à des builders dans un cluster Kubernetes pour permettre l'accès à des ressources de calcul plus puissantes, éventuellement sur plusieurs architectures natives.

Synopsis

Exécutez la commande suivante pour créer un nouveau builder, nommé kube, qui utilise le pilote Kubernetes :

$ docker buildx create \
  --bootstrap \
  --name=kube \
  --driver=kubernetes \
  --driver-opt=[key=value,...]

Le tableau suivant décrit les options spécifiques au pilote disponibles que vous pouvez passer à --driver-opt :

Paramètre Type Défaut Description
image Chaîne Définit l'image à utiliser pour exécuter BuildKit.
namespace Chaîne Espace de noms dans le contexte Kubernetes actuel Définit l'espace de noms Kubernetes.
default-load Booléen false Charge automatiquement les images dans le magasin d'images de Docker Engine.
replicas Entier 1 Définit le nombre de répliques de pod à créer. Voir mise à l'échelle de BuildKit
requests.cpu Unités de CPU Définit la valeur de CPU de la requête spécifiée en unités de CPU Kubernetes. Par exemple requests.cpu=100m ou requests.cpu=2
requests.memory Taille de la mémoire Définit la valeur de mémoire de la requête spécifiée en octets ou avec un suffixe valide. Par exemple requests.memory=500Mi ou requests.memory=4G
requests.ephemeral-storage Taille du stockage Définit la valeur de stockage éphémère de la requête spécifiée en octets ou avec un suffixe valide. Par exemple requests.ephemeral-storage=2Gi
limits.cpu Unités de CPU Définit la valeur de limite de CPU spécifiée en unités de CPU Kubernetes. Par exemple requests.cpu=100m ou requests.cpu=2
limits.memory Taille de la mémoire Définit la valeur de limite de mémoire spécifiée en octets ou avec un suffixe valide. Par exemple requests.memory=500Mi ou requests.memory=4G
limits.ephemeral-storage Taille du stockage Définit la valeur de limite de stockage éphémère spécifiée en octets ou avec un suffixe valide. Par exemple requests.ephemeral-storage=100M
nodeselector Chaîne CSV Définit le(s) label(s) nodeSelector du pod. Voir affectation de nœud.
annotations Chaîne CSV Définit des annotations supplémentaires sur les déploiements et les pods.
labels Chaîne CSV Définit des étiquettes supplémentaires sur les déploiements et les pods.
tolerations Chaîne CSV Configure la tolérance aux taints du pod. Voir affectation de nœud.
serviceaccount Chaîne Définit le serviceAccountName du pod.
schedulername Chaîne Définit le planificateur responsable de la planification du pod.
timeout Temps 120s Définit la limite de temps qui détermine combien de temps Buildx attendra que les pods soient provisionnés avant un build.
rootless Booléen false Exécute le conteneur en tant qu'utilisateur non root. Voir mode rootless.
loadbalance Chaîne sticky Stratégie d'équilibrage de charge (sticky ou random). Si la valeur est sticky, le pod est choisi en utilisant le hachage du chemin du contexte.
qemu.install Booléen false Installe l'émulation QEMU pour la prise en charge de plusieurs plates-formes. Voir QEMU.
qemu.image Chaîne tonistiigi/binfmt:latest Définit l'image d'émulation QEMU. Voir QEMU.

Mise à l'échelle de BuildKit

L'un des principaux avantages du pilote Kubernetes est que vous pouvez augmenter et diminuer le nombre de répliques de builder pour gérer une charge de build accrue. La mise à l'échelle est configurable à l'aide des options de pilote suivantes :

  • replicas=N

    Cela met à l'échelle le nombre de pods BuildKit à la taille souhaitée. Par défaut, il ne crée qu'un seul pod. L'augmentation du nombre de répliques vous permet de tirer parti de plusieurs nœuds dans votre cluster.

  • requests.cpu, requests.memory, requests.ephemeral-storage, limits.cpu, limits.memory, limits.ephemeral-storage

    Ces options permettent de demander et de limiter les ressources disponibles pour chaque pod BuildKit conformément à la documentation officielle de Kubernetes ici.

Par exemple, pour créer 4 pods BuildKit répliqués :

$ docker buildx create \
  --bootstrap \
  --name=kube \
  --driver=kubernetes \
  --driver-opt=namespace=buildkit,replicas=4

En listant les pods, vous obtenez ceci :

$ kubectl -n buildkit get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
kube0   4/4     4            4           8s

$ kubectl -n buildkit get pods
NAME                     READY   STATUS    RESTARTS   AGE
kube0-6977cdcb75-48ld2   1/1     Running   0          8s
kube0-6977cdcb75-rkc6b   1/1     Running   0          8s
kube0-6977cdcb75-vb4ks   1/1     Running   0          8s
kube0-6977cdcb75-z4fzs   1/1     Running   0          8s

De plus, vous pouvez utiliser l'option loadbalance=(sticky|random) pour contrôler le comportement d'équilibrage de charge lorsqu'il y a plusieurs répliques. random sélectionne des nœuds aléatoires dans le pool de nœuds, offrant une répartition uniforme de la charge de travail entre les répliques. sticky (la valeur par défaut) tente de connecter le même build effectué plusieurs fois au même nœud à chaque fois, garantissant une meilleure utilisation du cache local.

Pour plus d'informations sur la mise à l'échelle, consultez les options pour docker buildx create.

Affectation de nœud

Le pilote Kubernetes vous permet de contrôler la planification des pods BuildKit en utilisant les options de pilote nodeSelector et tolerations. Vous pouvez également définir l'option schedulername si vous souhaitez utiliser un planificateur personnalisé.

Vous pouvez utiliser les options de pilote annotations et labels pour appliquer des métadonnées supplémentaires aux déploiements et aux pods qui hébergent vos builders.

La valeur du paramètre nodeSelector est une chaîne de paires clé-valeur séparées par des virgules, où la clé est l'étiquette du nœud et la valeur est le texte de l'étiquette. Par exemple : "nodeselector=kubernetes.io/arch=arm64"

Le paramètre tolerations est une liste de taints séparés par des points-virgules. Il accepte les mêmes valeurs que le manifeste Kubernetes. Chaque entrée tolerations spécifie une clé de taint et la valeur, l'opérateur ou l'effet. Par exemple : "tolerations=key=foo,value=bar;key=foo2,operator=exists;key=foo3,effect=NoSchedule"

Ces options acceptent des chaînes délimitées par des virgules comme valeurs. En raison des règles de citation pour les commandes shell, vous devez envelopper les valeurs dans des guillemets simples. Vous pouvez même envelopper l'ensemble de --driver-opt dans des guillemets simples, par exemple :

$ docker buildx create \
  --bootstrap \
  --name=kube \
  --driver=kubernetes \
  '--driver-opt="nodeselector=label1=value1,label2=value2","tolerations=key=key1,value=value1"'

Builds multi-plateformes

Le pilote Kubernetes prend en charge la création d' images multi-plateformes, soit en utilisant QEMU, soit en tirant parti de l'architecture native des nœuds.

QEMU

Comme le pilote docker-container, le pilote Kubernetes prend également en charge l'utilisation de QEMU (mode utilisateur) pour créer des images pour des plates-formes non natives. Incluez l'indicateur --platform et spécifiez les plates-formes vers lesquelles vous souhaitez générer.

Par exemple, pour créer une image Linux pour amd64 et arm64 :

$ docker buildx build \
  --builder=kube \
  --platform=linux/amd64,linux/arm64 \
  -t <user>/<image> \
  --push .
Warning

QEMU effectue une émulation complète du processeur des plates-formes non natives, ce qui est beaucoup plus lent que les builds natifs. Les tâches gourmandes en calcul comme la compilation et la compression/décompression subiront probablement une baisse de performance importante.

L'utilisation d'une image BuildKit personnalisée ou l'invocation de binaires non natifs dans les builds peut nécessiter que vous activiez explicitement QEMU à l'aide de l'option qemu.install lors de la création du builder :

$ docker buildx create \
  --bootstrap \
  --name=kube \
  --driver=kubernetes \
  --driver-opt=namespace=buildkit,qemu.install=true

Natif

Si vous avez accès à des nœuds de cluster d'architectures différentes, le pilote Kubernetes peut en tirer parti pour les builds natifs. Pour ce faire, utilisez l'indicateur --append de docker buildx create.

Tout d'abord, créez votre builder avec une prise en charge explicite pour une seule architecture, par exemple amd64 :

$ docker buildx create \
  --bootstrap \
  --name=kube \
  --driver=kubernetes \
  --platform=linux/amd64 \
  --node=builder-amd64 \
  --driver-opt=namespace=buildkit,nodeselector="kubernetes.io/arch=amd64"

This creates a Buildx builder named kube, containing a single builder node named builder-amd64. Assigning a node name using --node is optional. Buildx generates a random node name if you don't provide one.

Note that the Buildx concept of a node isn't the same as the Kubernetes concept of a node. A Buildx node in this case could connect multiple Kubernetes nodes of the same architecture together.

With the kube builder created, you can now introduce another architecture into the mix using --append. For example, to add arm64:

$ docker buildx create \
  --append \
  --bootstrap \
  --name=kube \
  --driver=kubernetes \
  --platform=linux/arm64 \
  --node=builder-arm64 \
  --driver-opt=namespace=buildkit,nodeselector="kubernetes.io/arch=arm64"

Listing your builders shows both nodes for the kube builder:

$ docker buildx ls
NAME/NODE       DRIVER/ENDPOINT                                         STATUS   PLATFORMS
kube            kubernetes
  builder-amd64 kubernetes:///kube?deployment=builder-amd64&kubeconfig= running  linux/amd64*, linux/amd64/v2, linux/amd64/v3, linux/386
  builder-arm64 kubernetes:///kube?deployment=builder-arm64&kubeconfig= running  linux/arm64*

You can now build multi-arch amd64 and arm64 images, by specifying those platforms together in your build command:

$ docker buildx build --builder=kube --platform=linux/amd64,linux/arm64 -t <user>/<image> --push .

You can repeat the buildx create --append command for as many architectures that you want to support.

Rootless mode

The Kubernetes driver supports rootless mode. For more information on how rootless mode works, and its requirements, see here.

To turn it on in your cluster, you can use the rootless=true driver option:

$ docker buildx create \
  --name=kube \
  --driver=kubernetes \
  --driver-opt=namespace=buildkit,rootless=true

This will create your pods without securityContext.privileged.

Requires Kubernetes version 1.19 or later. Using Ubuntu as the host kernel is recommended.

Example: Creating a Buildx builder in Kubernetes

This guide shows you how to:

  • Create a namespace for your Buildx resources
  • Create a Kubernetes builder.
  • List the available builders
  • Build an image using your Kubernetes builders

Prerequisites:

  • You have an existing Kubernetes cluster. If you don't already have one, you can follow along by installing minikube.
  • The cluster you want to connect to is accessible via the kubectl command, with the KUBECONFIG environment variable set appropriately if necessary.
  1. Create a buildkit namespace.

    Creating a separate namespace helps keep your Buildx resources separate from other resources in the cluster.

    $ kubectl create namespace buildkit
    namespace/buildkit created
    
  2. Create a new builder with the Kubernetes driver:

    $ docker buildx create \
      --bootstrap \
      --name=kube \
      --driver=kubernetes \
      --driver-opt=namespace=buildkit
    
    Note

    Remember to specify the namespace in driver options.

  3. List available builders using docker buildx ls

    $ docker buildx ls
    NAME/NODE                DRIVER/ENDPOINT STATUS  PLATFORMS
    kube                     kubernetes
      kube0-6977cdcb75-k9h9m                 running linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386
    default *                docker
      default                default         running linux/amd64, linux/386
    
  4. Inspect the running pods created by the build driver with kubectl.

    $ kubectl -n buildkit get deployments
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    kube0   1/1     1            1           32s
    
    $ kubectl -n buildkit get pods
    NAME                     READY   STATUS    RESTARTS   AGE
    kube0-6977cdcb75-k9h9m   1/1     Running   0          32s
    

    The build driver creates the necessary resources on your cluster in the specified namespace (in this case, buildkit), while keeping your driver configuration locally.

  5. Use your new builder by including the --builder flag when running buildx commands. For example: :

    # Replace <registry> with your Docker username
    # and <image> with the name of the image you want to build
    docker buildx build \
      --builder=kube \
      -t <registry>/<image> \
      --push .
    

That's it: you've now built an image from a Kubernetes pod, using Buildx.

Further reading

For more information on the Kubernetes driver, see the buildx reference.