Ejecución de un clúster de Kubernetes en Docker con K3d

K3d es un contenedor de código abierto en torno a la distribución de Kubernetes de Rancher/SUSE K3s que le permite ejecutar el plano de control dentro de Docker. Toda la pila se ejecuta en Docker, lo que le brinda un clúster completamente en contenedores que es liviano y fácil de configurar.

Mientras que K3s está diseñado para una amplia gama de flujos de trabajo, K3d se enfoca más específicamente en situaciones de desarrollo en las que ya usa Docker. Le permite activar un clúster de Kubernetes en su host Docker existente sin ejecutar una máquina virtual ni ningún otro servicio del sistema.

Este artículo le mostrará cómo ponerse en marcha con un clúster K3d simple. Necesitará Kubectl y Docker v20.10.5 o posterior ya instalados en su sistema antes de comenzar. K3d funciona en Linux, Mac (incluso a través de Homebrew) y Windows (a través de Chocolatey). Esta guía se enfoca en el uso con Linux; k3d Las instrucciones de instalación de CLI para otras plataformas están disponibles en la documentación.

Índice de contenidos
  1. Instalación de la CLI de K3d
  2. Creación de un clúster
  3. Usando su clúster
  4. Habilitación de banderas K3s
  5. Acceder a los servicios que se ejecutan en su host
  6. Uso de imágenes de Docker locales
  7. Detener su clúster
  8. Eliminación de su clúster
  9. Resumen

Instalación de la CLI de K3d

los k3d CLI proporciona comandos de administración para crear y administrar sus clústeres. Puede encontrar la CLI más reciente en GitHub o ejecutar el script de instalación para obtener automáticamente la descarga correcta para su sistema.

$ curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash

El guión deposita la k3d binario en tu /usr/local/bin directorio. Intenta ejecutar el k3d version Comando para verificar que su instalación haya tenido éxito:

$ k3d version
k3d version v5.4.6
k3s version v1.24.4-k3s1 (default)

Creación de un clúster

La CLI de K3d proporciona una cluster create Comando para crear e iniciar automáticamente un nuevo clúster:

$ k3d cluster create
INFO[0000] Prep: Network                                
INFO[0000] Created network 'k3d-k3s-default'            
INFO[0000] Created image volume k3d-k3s-default-images  
INFO[0000] Starting new tools node...                   
INFO[0001] Creating node 'k3d-k3s-default-server-0'     
INFO[0001] Pulling image 'ghcr.io/k3d-io/k3d-tools:5.4.6' 
INFO[0002] Pulling image 'docker.io/rancher/k3s:v1.24.4-k3s1' 
INFO[0002] Starting Node 'k3d-k3s-default-tools'        
INFO[0008] Creating LoadBalancer 'k3d-k3s-default-serverlb' 
INFO[0009] Pulling image 'ghcr.io/k3d-io/k3d-proxy:5.4.6' 
INFO[0012] Using the k3d-tools node to gather environment information 
INFO[0012] HostIP: using network gateway 172.25.0.1 address 
INFO[0012] Starting cluster 'k3s-default'               
INFO[0012] Starting servers...                          
INFO[0012] Starting Node 'k3d-k3s-default-server-0'     
INFO[0016] All agents already running.                  
INFO[0016] Starting helpers...                          
INFO[0016] Starting Node 'k3d-k3s-default-serverlb'     
INFO[0022] Injecting records for hostAliases (incl. host.k3d.internal) and for 2 network members into CoreDNS configmap... 
INFO[0025] Cluster 'k3s-default' created successfully!  
INFO[0025] You can now use it like this:                
kubectl cluster-info

El clúster se llamará k3s-default cuando ejecuta el comando sin ningún argumento. Establezca su propio nombre incluyéndolo como primer argumento del comando:

$ k3d cluster create demo
...

K3d modifica automáticamente su archivo de configuración de Kubernetes (.kube/config) para incluir una conexión a su nuevo clúster. Marca la conexión como predeterminada para que kubectl los comandos ahora apuntarán a su entorno K3d.

$ kubectl cluster-info
Kubernetes control plane is running at https://0.0.0.0:42879
CoreDNS is running at https://0.0.0.0:42879/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://0.0.0.0:42879/api/v1/namespaces/kube-system/services/https:metrics-server:https/proxy

Correr docker ps mostrará que se han iniciado dos contenedores, uno para K3s y otro para el proxy de K3d que reenvía el tráfico a su clúster:

$ docker ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS         PORTS                             NAMES
9b6b610ad312   ghcr.io/k3d-io/k3d-proxy:5.4.6     "/bin/sh -c nginx-pr..."   3 minutes ago   Up 3 minutes   80/tcp, 0.0.0.0:42879->6443/tcp   k3d-k3s-default-serverlb
842cc90b78bf   rancher/k3s:v1.24.4-k3s1           "/bin/k3s server --t..."   3 minutes ago   Up 3 minutes                                     k3d-k3s-default-server-0

Usando su clúster

Use los comandos familiares de Kubectl para interactuar con su clúster e implementar sus Pods:

$ kubectl run nginx --image nginx:latest
pod/nginx created

$ kubectl expose pod/nginx --port 80 --type NodePort
service/nginx exposed

Para acceder a su servidor NGINX, primero busque la dirección IP asignada a su nodo Kubernetes:

$ kubectl get nodes -o wide
NAME                       STATUS   ROLES                  AGE    VERSION        INTERNAL-IP   EXTERNAL-IP   OS-IMAGE   KERNEL-VERSION      CONTAINER-RUNTIME
k3d-k3s-default-server-0   Ready    control-plane,master   102s   v1.24.4+k3s1   172.27.0.2    <none>        K3s dev    5.4.0-125-generic   containerd://1.6.6-k3s1

La IP correcta a usar es 172.27.0.2.

A continuación, busque el NodePort asignado a su nginx Servicio:

$ kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.43.0.1       <none>        443/TCP        5m49s
nginx        NodePort    10.43.235.233   <none>        80:31214/TCP   1s

El número de puerto expuesto es 31214. Hacer una solicitud a 172.17.0.2:31214 debería emitir la página de bienvenida predeterminada de NGINX:

$ curl http://172.17.0.2:31214
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

Puede obtener más orientación sobre la exposición de servicios y la configuración de redes Ingress en la documentación de K3d.

Habilitación de banderas K3s

los cluster create El comando envuelve el proceso estándar de creación de clústeres de K3s. Puede pasar argumentos a través de K3 proporcionando --k3s-arg banderas El valor de la bandera debe ser un argumento que se incluirá cuando K3d llame al binario K3s.

$ k3s cluster create --k3s-arg "--disable=traefik"

Este ejemplo le indica a K3s que deshabilite su componente Traefik incorporado.

Acceder a los servicios que se ejecutan en su host

Es posible que algunas cargas de trabajo que ejecuta en K3d necesiten acceder a servicios que ya se ejecutan en su host Docker. K3d proporciona un nombre de host llamado host.k3d.internal dentro de su configuración DNS predeterminada. Esto se resolverá automáticamente en su máquina host. Puede hacer referencia a este nombre de host especial dentro de sus Pods para acceder a bases de datos existentes, recursos compartidos de archivos y otras API que se ejecutan fuera de Kubernetes.

Uso de imágenes de Docker locales

Su clúster K3d/K3s no puede acceder a sus imágenes locales de Docker. El clúster y todos sus componentes se están ejecutando. en el interior Estibador. Intentar usar una imagen privada que solo existe en el host fallará e informará un error.

Hay dos formas de resolver esto: enviar su imagen a un registro o usar la función de importación de imágenes de K3d para copiar una imagen local en su clúster. En general, se prefiere el primer método, ya que centraliza el almacenamiento de imágenes y le permite acceder a las imágenes desde cualquier entorno. Sin embargo, al probar rápidamente los cambios locales, es posible que desee importar directamente una imagen que acaba de crear:

$ k3d image import demo-image:latest

Este comando hará demo-image:latest disponible dentro de su clúster.

K3d también puede crear y exponer un registro de imágenes para usted. Los registros se crean mejor junto con su clúster, ya que K3d puede configurar automáticamente el acceso al clúster:

$ k3d cluster create --registry-create demo-registry

Esto inicia un nuevo clúster con un registro llamado demo-registry. El registro se ejecutará en su propio contenedor Docker. Puede descubrir el número de puerto en el que está expuesto el registro ejecutando docker ps -f name=<cluster-name>-registrydónde <cluster-name> es el nombre de su clúster. Al enviar imágenes a este registro, los pods de su clúster podrán acceder a ellas.

$ docker tag demo-image:latest k3d-demo-registry.localhost:12345/demo-image:latest
$ docker push k3d-demo-registry.localhost:12345/demo-image:latest

También puede crear registros a pedido, pero deberá reconfigurar manualmente su clúster para proporcionar detalles de conexión.

Detener su clúster

Su clúster K3d se ejecutará continuamente hasta que lo detenga usted mismo. los cluster stop El comando deja de ejecutar contenedores Docker mientras conserva los datos de su clúster:

$ k3d cluster stop k3s-default

Reinicie su clúster en el futuro usando el cluster start dominio:

$ k3d cluster start k3s-default

Eliminación de su clúster

Puede eliminar un clúster en cualquier momento ejecutando el cluster delete comando y proporcionando su nombre. Esto eliminará todo rastro del clúster, eliminando los contenedores y volúmenes de Docker que lo proporcionaron. Eliminar todos sus clústeres hará que su host vuelva a ser un borrón y cuenta nueva con solo la CLI de K3d instalada.

$ k3d cluster delete k3s-default
INFO[0000] Deleting cluster 'k3s-default'               
INFO[0001] Deleting cluster network 'k3d-k3s-default'   
INFO[0001] Deleting 2 attached volumes...               
INFO[0001] Removing cluster details from default kubeconfig... 
INFO[0001] Removing standalone kubeconfig file (if there is one)... 
INFO[0001] Successfully deleted cluster k3s-default!

El proceso de eliminación elimina automáticamente las referencias al clúster de su Kubeconfig.

Resumen

K3d le permite ejecutar un clúster de Kubernetes en contenedores. Proporciona un entorno K3s completo siempre que Docker esté disponible. K3d admite múltiples nodos, tiene soporte integrado para registros de imágenes y se puede usar para crear clústeres de alta disponibilidad con múltiples planos de control.

Los desarrolladores que ya ejecutan Docker pueden usar K3d para agregar rápidamente Kubernetes a su entorno de trabajo. K3d es liviano, fácil de administrar y no agrega otros servicios del sistema a su máquina. Esto lo convierte en una excelente opción para uso local, pero su dependencia de Docker significa que puede no ser adecuado para hosts de producción en los que no desea agregar otra dependencia. Otras distribuciones de Kubernetes como Minikube, Microk8s y K3s simples son alternativas viables.

Descubre más contenido

Subir Change privacy settings