¿Estás cansado de tener problemas con el despliegue y pruebas de tus aplicaciones en contenedores? ¿Quieres aprender cómo instalar y configurar Kubernetes de manera fácil y rápida en tu entorno de desarrollo? Entonces, ¡este artículo es para ti! Aquí te mostraré cómo instalar y configurar Kubernetes en WSL (Windows Subsystem for Linux) y Docker Desktop para distribuciones GNU/Linux, lo que te permitirá probar y desplegar tus aplicaciones en contenedores de forma eficiente y escalable. ¡Sigue leyendo y descubre cómo hacerlo!
Instalar y configurar Kubernetes puede ser una tarea desafiante, especialmente si eres nuevo en el mundo de los contenedores y la orquestación. Recuerdo la primera vez que intenté instalar Kubernetes en mi máquina local, me enfrenté a muchos errores y problemas que no tenía idea de cómo resolver. Pasé horas buscando soluciones en línea y probando diferentes configuraciones, solo para terminar frustrado y confundido.
Después de seguir un sinnúmero de artículos, foros y documentación oficial, me toca el momento de compartir algo claro y sencillo de aplicar. Si estás experimentando los mismos problemas que tuve, te animo a que sigas esta guía y aprendas a hacer las cosas correctamente. No hay necesidad de pasar horas buscando soluciones en línea o tratando de descubrir qué salió mal. Con esta guía, tendrás todo lo que necesitas para instalar y configurar Kubernetes de manera eficiente y efectiva, sin los dolores de cabeza que generalmente acompañan a la instalación.
WSL proporciona una forma de ejecutar un sistema operativo GNU/Linux en Windows, lo que lo hace ideal para ejecutar herramientas de línea de comandos y aplicaciones en contenedores. Por otro lado, Docker Desktop para distribuciones GNU/Linux es una aplicación que proporciona una experiencia de Docker nativa en sistemas operativos basados en GNU/Linux. Ambas opciones son ideales para la instalación de Kubernetes, ya que facilitan la configuración de contenedores y la gestión de recursos.
La distribución que se usará en este laboratorio será Debian, pero puedes usar Ubuntu o Kali según sea tu antojo para llevar a cabo la instalación y configuración de Kubernetes (k8s para los amigos). De paso, te dejo como referencia el cómo Habilitar distro WSL con Docker Engine en Windows.
Suele pasar que si ya tienes una distribución con la instalación "fallida" de k8s, quieras hacer que esa distro vuelva a su estado de fábrica y poder hacer la instalación con el OS virgen, sin ningún software que hayas instalado previamente. Para resolver esto, haz lo siguiente en tu terminal Windows Terminal, CMD, PowerShell o el de tu preferencia.
wsl --shutdown
wsl --unregister Debian
Acceder a la Microsoft Store y seleccionar Debian para instalar y configurar.
Luego de descargar Debian, este le dará la opción de abrir la aplicación, lo cual lo hará con WSL en Windows Terminal, solicitando que configure las credenciales de acceso de Root.
Actualizar los repositorios de paquetes y actualizar el sistema operativo.
sudo apt update && sudo apt upgrade -y
De ahora en adelante, llevaremos a cabo paso a paso la instalación y configuración de Kubernetes en un entorno de desarrollo utilizando WSL (Windows Subsystem for Linux) y Docker Desktop en distribuciones GNU/Linux. Se explicará cómo instalar las herramientas necesarias, configurar el cluster de Kubernetes, desplegar un servidor web como nginx en un contenedor y exponerlo a través de un servicio. Además, se abordarán algunos conceptos clave de Kubernetes, como pods, deployments y servicios, para entender mejor el funcionamiento del orquestador de contenedores. Al finalizar esta guía, tendrás un entorno de Kubernetes funcional en tu máquina local para poder experimentar y desarrollar aplicaciones de forma eficiente y escalable.
Añadir clave de autenticación en el sistema
La clave de autenticación es necesaria para asegurarse de que los paquetes de Kubernetes que se instalen provienen de una fuente confiable y no han sido alterados maliciosamente.
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
En el caso de que genere el siguiente problema, es necesario instalar los paquetes que está solicitando.
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation
-bash: curl: command not found
Instalar paquetes necesarios.
sudo apt install apt-transport-https ca-certificates curl gnupg gnupg1 gnupg2 lsb-release -y
Añade la clave GPG oficial de Kubernetes.
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
OK
En este caso que dice deprecado, puede utilizar signed-by
.
$ sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg
$ echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main
Añade el repositorio de Kubernetes a tu lista de repositorios de paquetes.
$ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
Actualiza los repositorios de paquetes nuevamente.
$ sudo apt update
Hit:1 http://deb.debian.org/debian bullseye InRelease
Hit:2 http://security.debian.org/debian-security bullseye-security InRelease
Hit:3 http://ftp.debian.org/debian bullseye-backports InRelease
Hit:4 http://deb.debian.org/debian bullseye-updates InRelease
Get:5 http://packages.cloud.google.com/apt cloud-sdk InRelease [6,361 B]
Get:7 http://packages.cloud.google.com/apt cloud-sdk/main amd64 Packages [404 kB]
Get:6 https://packages.cloud.google.com/apt kubernetes-xenial InRelease [8,993 B]
Get:8 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 Packages [64.1 kB]
Fetched 484 kB in 2s (313 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
sudo apt install -y kubelet kubeadm kubectl
Deshabilitar la administración de versiones de apt para el paquete kubelet.
$ sudo apt-mark hold kubelet
kubelet set on hold.
Verificar que la instalación de kubectl se realizó correctamente.
$ kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.2", GitCommit:"fc04e732bb3e7198d2fa44efa5457c7c6f8c0f5b", GitTreeState:"clean", BuildDate:"2023-02-22T13:39:03Z", GoVersion:"go1.19.6", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7
The connection to the server localhost:8080 was refused - did you specify the right host or port?
Este mensaje indica que no se puede conectar al servidor de Kubernetes. Para ello, se necesita instalar minikube.
Minikube es una herramienta que permite ejecutar un clúster de Kubernetes en un solo nodo, lo que facilita la creación y prueba de aplicaciones en Kubernetes en un entorno local de desarrollo. Minikube proporciona una solución rápida y sencilla para probar y experimentar con características de Kubernetes, sin necesidad de un gran número de recursos o un entorno de producción.
Descarga el archivo ejecutable de Minikube desde la página de GitHub:
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 77.3M 100 77.3M 0 0 6077k 0 0:00:13 0:00:13 --:--:-- 5516k
Dale permisos de ejecución al archivo:
chmod +x minikube
Mueve el archivo a un directorio en tu $PATH, por ejemplo /usr/local/bin/
:
sudo mv minikube /usr/local/bin/
Revisando el estado de minikube:
$ minikube status
???? Profile "minikube" not found. Run "minikube profile list" to view all profiles.
???? To start a cluster, run: "minikube start"
Iniciando minikube:
minikube start
???? minikube v1.29.0 on Debian 11.6 (amd64)
???? Unable to pick a default driver. Here is what was considered, in preference order:
▪ docker: Not healthy: "docker version --format {{.Server.Os}}-{{.Server.Version}}:{{.Server.Platform.Name}}" exit status 1:
▪ docker: Suggestion: <https://minikube.sigs.k8s.io/docs/drivers/docker/>
???? Alternatively you could install one of these drivers:
▪ kvm2: Not installed: exec: "virsh": executable file not found in $PATH
▪ qemu2: Not installed: exec: "qemu-system-x86_64": executable file not found in $PATH
▪ vmware: Not installed: exec: "docker-machine-driver-vmware": executable file not found in $PATH
▪ podman: Not installed: exec: "podman": executable file not found in $PATH
▪ virtualbox: Not installed: unable to find VBoxManage in $PATH
❌ Exiting due to DRV_NOT_HEALTHY: Found driver(s) but none were healthy. See above for suggestions how to fix installed drivers.
Encontramos el primer problema con minikube, y es que necesita conectarse al driver de la máquina virtual. Si no se especifica explícitamente el driver de la máquina virtual, Minikube intentará detectar el mejor driver disponible en el sistema. En este caso, como se indicó anteriormente, es posible que se intente usar Docker como driver predeterminado, lo que puede causar problemas si Docker no está disponible o no funciona correctamente. En este caso, Docker Desktop si está instalado.
Vista principal de Docker Desktop:
Configuración de Docker Desktop para conectar con WSL:
Recursos de Docker Desktop para conectar con una distribución Linux en WSL:
Acceso a Docker desde WSL
Luego de las configuraciones hechas en el Docker Desktop, se intenta acceder a Docker desde la distribución de Debian habilitada en el WSL.
$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
No es aconsejable que docker se ejecute con altos privilegios. Se revisa que con altos privilegios accede correctamente.
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Iniciar minikube nuevamente:
minikube start
???? minikube v1.29.0 on Debian 11.6 (amd64)
???? Unable to pick a default driver. Here is what was considered, in preference order:
▪ docker: Not healthy: "docker version --format {{.Server.Os}}-{{.Server.Version}}:{{.Server.Platform.Name}}" exit status 1: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version": dial unix /var/run/docker.sock: connect: permission denied
▪ docker: Suggestion: Add your user to the 'docker' group: 'sudo usermod -aG docker $USER && newgrp docker' <https://docs.docker.com/engine/install/linux-postinstall/>
???? Alternatively you could install one of these drivers:
▪ kvm2: Not installed: exec: "virsh": executable file not found in $PATH
▪ podman: Not installed: exec: "podman": executable file not found in $PATH
▪ qemu2: Not installed: exec: "qemu-system-x86_64": executable file not found in $PATH
▪ vmware: Not installed: exec: "docker-machine-driver-vmware": executable file not found in $PATH
▪ virtualbox: Not installed: unable to find VBoxManage in $PATH
Sigue apareciendo que no puede usar el Driver de Docker porque no tiene permisos. El mismo minikube hace una recomendación interesante y es de agregar el usuario de la distro dentro del grupo "Docker".
Añadir tu usuario al grupo "docker" usando el siguiente comando:
sudo usermod -aG docker $USER && newgrp docker
La salida muestra que Minikube se está iniciando con el controlador Docker. Descarga una imagen base y el archivo preloaded-images-k8s-v18-v1, que es una versión precargada de imágenes de Kubernetes para acelerar el arranque de Minikube. Luego, crea un contenedor de Docker y comienza a configurar Kubernetes. Finalmente, Minikube se configura con la herramienta de línea de comandos kubectl para usar el cluster "minikube" y el espacio de nombres "default" de forma predeterminada. Además, se activan los addons storage-provisioner y default-storageclass.
minikube start
???? minikube v1.29.0 on Debian 11.6 (amd64)
✨ Automatically selected the docker driver. Other choices: none, ssh
???? Using Docker driver with root privileges
❗ For an improved experience it's recommended to use Docker Engine instead of Docker Desktop.
Docker Engine installation instructions: https://docs.docker.com/engine/install/#server
???? Starting control plane node minikube in cluster minikube
???? Pulling base image ...
???? Downloading Kubernetes v1.26.1 preload ...
> preloaded-images-k8s-v18-v1...: 397.05 MiB / 397.05 MiB 100.00% 3.87 Mi
> gcr.io/k8s-minikube/kicbase...: 407.19 MiB / 407.19 MiB 100.00% 2.99 Mi
???? Creating docker container (CPUs=2, Memory=7900MB) ...
???? Preparing Kubernetes v1.26.1 on Docker 20.10.23 ...
▪ Generating certificates and keys ...
▪ Booting up control plane ...
▪ Configuring RBAC rules ...
???? Configuring bridge CNI (Container Networking Interface) ...
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
???? Verifying Kubernetes components...
???? Enabled addons: storage-provisioner, default-storageclass
???? Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
Así se muestra el contenedor de minikube en el Docker Desktop.
Imagen de minikube en Docker Desktop.
Volumen de minikube en Docker Desktop.
Asociar minikube a kubectl es necesario para poder ejecutar comandos de kubectl contra el clúster de Kubernetes que se está ejecutando en minikube. Al asociar minikube a kubectl, se configura el contexto de kubectl para que apunte al clúster de minikube, lo que permite ejecutar comandos como "kubectl get pods" o "kubectl apply" directamente en el clúster de minikube.
Verificar que el contexto de kubectl sea minikube:
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
docker-desktop docker-desktop docker-desktop
* minikube minikube minikube default
Ya está seleccionado, pero si te tocara seleccionarlo, ejecuta la siguiente instrucción:
kubectl config use-context minikube
NGINX es un servidor web/proxy inverso ligero y de alto rendimiento. Puede servir como un servidor web estático y dinámico, además de ser un servidor proxy inverso para balancear la carga de los servidores web de backend y proporcionar funcionalidades adicionales, como la autenticación, la compresión de datos y el almacenamiento en caché. NGINX es uno de los servidores web más populares y ampliamente utilizados en Internet.
Para levantar un contenedor con nginx, puedes utilizar el siguiente comando en la terminal:
$ kubectl run nginx --image=nginx
pod/nginx created
Este comando creará un nuevo deployment llamado nginx
utilizando la imagen de Docker nginx
. Para crear el deployment de nginx
, podemos utilizar el siguiente comando:
$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
Este comando creará un deployment con una sola réplica y la imagen de nginx
. Luego, podemos exponer el deployment utilizando el siguiente comando:
$ kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
Obteniendo la URL del servicio de nginx:
$ minikube service nginx --url
E0308 16:08:46.423561 7108 service_tunnel.go:66] error starting ssh tunnel: exec: "ssh": executable file not found in $PATH
http://127.0.0.1:46239
❗ Because you are using a Docker driver on linux, the terminal needs to be open to run it.
El error que estás recibiendo indica que el binario ssh
no está disponible en tu $PATH
. Para solucionar esto, debes instalar el cliente SSH
en tu sistema. En Debian y sistemas similares puedes hacerlo con el siguiente comando:
sudo apt-get install openssh-client -y
Una vez que hayas instalado el cliente SSH, intenta de nuevo la instrucción:
$ minikube service nginx --url
http://127.0.0.1:39901
❗ Because you are using a Docker driver on linux, the terminal needs to be open to run it.
Bienvenido al contenedor que corre nginx desde Kubernetes montado en WSL con Docker Desktop.
En Kubernetes, un pod es la unidad básica de implementación y se refiere a uno o más contenedores que se ejecutan en el mismo nodo y comparten el mismo espacio de red y almacenamiento. Los pods son escalables y son la unidad de implementación más pequeña y manejable.
Por otro lado, un servicio es un objeto de Kubernetes que define una política de acceso a un conjunto de pods. Los servicios permiten que los pods se comuniquen entre sí y con otros componentes de la aplicación en el clúster de Kubernetes, incluso si los pods se mueven o se escalan dinámicamente. Un servicio se puede exponer a través de diferentes tipos de protocolos de red, como TCP o UDP, y puede ser expuesto interna o externamente al clúster de Kubernetes.
Para ver los pods que están corriendo, puedes usar el siguiente comando:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 16m
nginx-748c667d99-4gzjp 1/1 Running 0 15m
Para ver los servicios que están corriendo, puedes usar el siguiente comando:
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 32m
nginx NodePort 10.109.69.223 <none> 80:32330/TCP 16m
Para detener la ejecución de un pod
, puedes usar el siguiente comando, reemplazando con el nombre del pod
que deseas detener:
$ kubectl delete pod nginx
pod "nginx" deleted
Para detener la ejecución de un servicio, puedes usar el siguiente comando, reemplazando con el nombre del servicio que deseas detener:
$ kubectl delete service nginx
service "nginx" deleted
Ten en cuenta que al detener un pod
o servicio
, cualquier recurso que dependa de ellos también se detendrá.
Te presento los diferentes estados en lo que podemos encontrar a minikube.
Estado de minikube cuando está running:
$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
Estado de minikube cuando está stopped:
# Se detiene minikube
$ minikube stop
✋ Stopping node "minikube" ...
???? Powering off "minikube" via SSH ...
???? 1 node stopped.
$ minikube status
minikube
type: Control Plane
host: Stopped
kubelet: Stopped
apiserver: Stopped
kubeconfig: Stopped
Estado de minikube cuando Docker Desktop está cerrado:
$ minikube status
E0308 16:32:53.564727 8176 status.go:260] status error: host: state: unknown state "minikube": docker container inspect minikube --format={{.State.Status}}: exit status 1
stdout:
The command 'docker' could not be found in this WSL 2 distro.
We recommend to activate the WSL integration in Docker Desktop settings.
For details about using Docker Desktop with WSL 2, visit:
https://docs.docker.com/go/wsl2/
stderr:
E0308 16:32:53.564775 8176 status.go:263] The "minikube" host does not exist!
minikube
type: Control Plane
host: Nonexistent
kubelet: Nonexistent
apiserver: Nonexistent
kubeconfig: Nonexistent
Con solo levantar el Docker-Desktop y hacer un minikube start, vuelves a la acción.
Para desinstalar Kubernetes, primero debemos desinstalar todos los componentes con Kubernetes. Aquí hay una lista de paquetes que pueden estar instalados en diferentes sistemas operativos.
Ubuntu / Debian
sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube*
sudo apt-get autoremove
CentOS / Fedora / RHEL
sudo yum remove kubeadm kubectl kubelet kubernetes-cni kube*
macOS
brew uninstall kubernetes-cli kubernetes-helm
sudo rm /usr/local/bin/kubectl
Es importante tener en cuenta que desinstalar Kubernetes puede tener implicaciones en las aplicaciones que se están ejecutando en el clúster. Se recomienda hacer una copia de seguridad de los datos y tomar precauciones antes de desinstalar Kubernetes.
En conclusión, la instalación y configuración de Kubernetes en un entorno de desarrollo es una habilidad esencial para cualquier desarrollador que desee probar y desplegar aplicaciones de forma eficiente y escalable en contenedores. En este artículo, hemos cubierto los pasos necesarios para instalar y configurar Kubernetes en WSL (Windows Subsystem for Linux) y Docker Desktop para distribuciones GNU/Linux. También hemos aprendido sobre los conceptos básicos de Kubernetes, como pods y servicios, que son fundamentales para comprender cómo funciona la orquestación de contenedores en Kubernetes. Esperamos que esta guía le haya resultado útil y le haya brindado una buena comprensión de los fundamentos de Kubernetes y su implementación en un entorno de desarrollo. ¡Ahora está listo para comenzar a trabajar con Kubernetes!
Puedes también encontrar más información en el repositorio 30 días de Kubernetes.
With supporting text below as a natural lead-in to additional content.
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled.