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

Interagir avec Kubernetes depuis une extension

Le SDK Extensions ne fournit aucune méthode d'API pour interagir directement avec le cluster Kubernetes géré par Docker Desktop ou tout autre créé avec des outils tels que KinD. Cependant, cette page fournit un moyen d'utiliser d'autres APIs du SDK pour interagir indirectement avec un cluster Kubernetes depuis votre extension.

Pour demander une API qui interagit directement avec Kubernetes géré par Docker Desktop, vous pouvez voter pour ce problème dans le dépôt GitHub du SDK Extensions.

Prérequis

Activer Kubernetes

Vous pouvez utiliser le Kubernetes intégré dans Docker Desktop pour démarrer un cluster Kubernetes à nœud unique. Un fichier kubeconfig est utilisé pour configurer l'accès à Kubernetes lorsqu'il est utilisé en conjonction avec l'outil en ligne de commande kubectl, ou d'autres clients. Docker Desktop fournit facilement à l'utilisateur un fichier kubeconfig local préconfiguré et la commande kubectl dans la zone personnelle de l'utilisateur. C'est un moyen pratique d'accélérer l'accès pour ceux qui cherchent à exploiter Kubernetes depuis Docker Desktop.

Livrer kubectl dans le cadre de l'extension

Si votre extension a besoin d'interagir avec des clusters Kubernetes, il est recommandé d'inclure l'outil en ligne de commande kubectl dans votre extension. En faisant cela, les utilisateurs qui installent votre extension obtiennent kubectl installé sur leur hôte.

Pour savoir comment livrer l'outil en ligne de commande kubectl pour plusieurs plateformes dans le cadre de votre image d'Extension Docker, voir Construire des extensions multi-architecture.

Exemples

Les extraits de code suivants ont été rassemblés dans l'Extension d'Exemple Kubernetes. Elle montre comment interagir avec un cluster Kubernetes en livrant l'outil en ligne de commande kubectl.

Vérifier que le serveur API Kubernetes est accessible

Une fois que l'outil en ligne de commande kubectl est ajouté à l'image d'extension dans le Dockerfile, et défini dans le metadata.json, le framework Extensions déploie kubectl sur l'hôte des utilisateurs lorsque l'extension est installée.

Vous pouvez utiliser l'API JS ddClient.extension.host?.cli.exec pour émettre des commandes kubectl pour, par instance, vérifier si le serveur API Kubernetes est accessible selon un contexte spécifique :

const output = await ddClient.extension.host?.cli.exec("kubectl", [
  "cluster-info",
  "--request-timeout",
  "2s",
  "--context",
  "docker-desktop",
]);

Lister les contextes Kubernetes

const output = await ddClient.extension.host?.cli.exec("kubectl", [
  "config",
  "view",
  "-o",
  "jsonpath='{.contexts}'",
]);

Lister les espaces de noms Kubernetes

const output = await ddClient.extension.host?.cli.exec("kubectl", [
  "get",
  "namespaces",
  "--no-headers",
  "-o",
  'custom-columns=":metadata.name"',
  "--context",
  "docker-desktop",
]);

Persister le fichier kubeconfig

Ci-dessous se trouvent différentes façons de persister et lire le fichier kubeconfig depuis le système de fichiers hôte. Les utilisateurs peuvent ajouter, modifier ou supprimer un contexte Kubernetes du fichier kubeconfig à tout moment.

Avertissement

Le fichier kubeconfig est très sensible et s'il est trouvé, il peut donner à un attaquant un accès administratif au Cluster Kubernetes.

Conteneur backend de l'extension

Si vous avez besoin que votre extension persiste le fichier kubeconfig après qu'il ait été lu, vous pouvez avoir un conteneur backend qui expose un endpoint HTTP POST pour stocker le contenu du fichier soit en mémoire soit quelque part dans le système de fichiers du conteneur. De cette façon, si l'utilisateur navigue hors de l'extension vers une autre partie de Docker Desktop puis revient, vous n'aurez pas besoin de lire le fichier kubeconfig à nouveau.

export const updateKubeconfig = async () => {
  const kubeConfig = await ddClient.extension.host?.cli.exec("kubectl", [
    "config",
    "view",
    "--raw",
    "--minify",
    "--context",
    "docker-desktop",
  ]);
  if (kubeConfig?.stderr) {
    console.log("error", kubeConfig?.stderr);
    return false;
  }

  // appeler le conteneur backend pour stocker le kubeconfig récupéré dans la mémoire ou le système de fichiers du conteneur
  try {
    await ddClient.extension.vm?.service?.post("/store-kube-config", {
      data: kubeConfig?.stdout,
    });
  } catch (err) {
    console.log("error", JSON.stringify(err));
  }
};

Volume Docker

Les volumes sont le mécanisme préféré pour persister les données générées par et utilisées par les conteneurs Docker. Vous pouvez les utiliser pour persister le fichier kubeconfig. En persistant le kubeconfig dans un volume, vous n'aurez pas besoin de lire le fichier kubeconfig à nouveau lorsque le panneau d'extension se ferme. Cela le rend idéal pour persister des données lors de la navigation hors de l'extension vers d'autres parties de Docker Desktop.

const kubeConfig = await ddClient.extension.host?.cli.exec("kubectl", [
  "config",
  "view",
  "--raw",
  "--minify",
  "--context",
  "docker-desktop",
]);
if (kubeConfig?.stderr) {
  console.log("error", kubeConfig?.stderr);
  return false;
}

await ddClient.docker.cli.exec("run", [
  "--rm",
  "-v",
  "my-vol:/tmp",
  "alpine",
  "/bin/sh",
  "-c",
  `"touch /tmp/.kube/config && echo '${kubeConfig?.stdout}' > /tmp/.kube/config"`,
]);

localStorage de l'extension

localStorage est l'un des mécanismes de stockage web d'un navigateur. Il permet aux utilisateurs de sauvegarder des données sous forme de paires clé-valeur dans le navigateur pour une utilisation ultérieure. localStorage n'efface pas les données lorsque le navigateur (le panneau d'extension) se ferme. Cela le rend idéal pour persister des données lors de la navigation hors de l'extension vers d'autres parties de Docker Desktop.

localStorage.setItem("kubeconfig", kubeConfig);
localStorage.getItem("kubeconfig");