Contenedores
Para entender mejor la tecnología de dockers y kubernetes debemos saber que son los contenedores
La tecnología de contenedores es una forma de virtualización de aplicaciones que permite empaquetar y ejecutar software de manera aislada y portable. Cuando realizas una implementación de software en lugar de tener que realizar la instalación de todos los requerimientos de software (librerías, apps) se empaquetan en un contenedor el cual podrá ser ejecutado fácilmente y desde cualquier plataforma.
Algunas características que poseen los contenedores son:
- Aislamiento: Los contenedores corren de manera aislada del sistema operativo host y entre sí, utilizando características del kernel de Linux como namespaces y cgroups.
- Portabilidad: Las aplicaciones empaquetadas en contenedores pueden ejecutarse de manera consistente en diferentes entornos (desarrollo, pruebas, producción) y plataformas (máquinas físicas, VMs, nubes públicas y privadas).
- Ligereza: Los contenedores comparten el kernel del sistema operativo, evitando la sobrecarga de una instancia completa del OS por aplicación. Esto los hace más livianos y rápidos de arrancar que las máquinas virtuales.
- Modularidad: Los contenedores permiten dividir las aplicaciones en componentes más pequeños e independientes, facilitando el desarrollo, pruebas e implementación.
Algunas de las tecnologías de contenedores más populares son Docker, Podman, Kubernetes y CRI-O.
Los contenedores se han convertido en herramientas clave para el desarrollo de software, Su adopción ha crecido significativamente en los últimos años gracias a las ventajas que ofrecen en términos de portabilidad, eficiencia y agilidad
Docker
Es una tecnología de virtualización que se centra en la creación y gestión de contenedores livianos que ejecutan procesos de manera aislada, utilizando las funcionalidades del kernel de Linux.
Docker permite a los desarrolladores crear, distribuir y ejecutar aplicaciones de manera rápida y eficiente, lo que ha transformado significativamente el desarrollo de aplicaciones en los últimos años.
Docker empaqueta software en unidades estandarizadas llamadas contenedores que incluyen todo lo necesario para que el software se ejecute, incluidas bibliotecas, herramientas de sistema y código.
Componentes de Docker
+————————————————–+
| Docker Host |
| +———————————————-+ |
| | Docker Engine | |
| | +—————————————-+ | |
| | | Containers | | |
| | | +————————————+ | | |
| | | | Application & | | | |
| | | | Dependencies | | | |
| | | +————————————+ | | |
| | +—————————————-+ | |
| +———————————————-+ |
+————————————————–+
Docker Host: Es el sistema operativo físico o virtual donde se ejecuta Docker.
Docker Engine: Es el corazón de Docker, que administra los contenedores y su entorno. Incluye el demonio de Docker y la interfaz de línea de comandos.
Contenedores: Son instancias aisladas y livianas de aplicaciones y sus dependencias, empaquetadas en contenedores, lo que permite ejecutar aplicaciones de manera confiable y reproducible en diferentes entornos.
Aplicación y Dependencias: Son los componentes de software que se empaquetan dentro del contenedor. Esto puede incluir el código de la aplicación, sus bibliotecas y cualquier otra dependencia necesaria para su ejecución.
Ventajas de Docker
Portabilidad: Permite instalar aplicaciones complejas en una máquina y asegurarse de que funcionen en ella.
Automatización: Ayuda a los desarrolladores a automatizar tareas repetitivas y a ahorrar tiempo.
Comunidad: Tiene una gran comunidad de desarrolladores y colaboradores, lo que facilita la resolución de problemas y la creación de contenido de apoyo.
Modularidad: Permite dividir aplicaciones en procesos individuales y aprovechar mejor los recursos.
Capas y control de versiones: Permite crear capas de imágenes y restaurar versiones anteriores.
Implementación rápida: Permite implementar sistemas de hardware nuevos de manera rápida y eficiente.
Kubernetes
Es una plataforma de orquestación de contenedores de código abierto que automatiza procesos de desarrollo de aplicaciones. Fue desarrollado por ingenieros de Google antes de ser de código abierto en 2014. Su nombre proviene del griego antiguo “kybernḗtēs”, que significa “timonel” o “piloto”. Kubernetes es una plataforma que combina sobre 15 años de experiencia de Google en la ejecución de cargas de trabajo de producción a gran escala con las mejores ideas y prácticas de la comunidad.
Mientras que docker te permite administrar un contenedor de forma individual y ejecutarlo , kubernetes va a permitir tomar múltiples contenedores e integrarlos en una implementación a gran escala, ambas tecnologías no son mutuamente excluyentes sino que pueden complementarse , usando docker para la creación de nuevos contenedores y kubernetes para la integración de múltiples contenedores en microservicios
Características y Ventajas
- Portabilidad: Kubernetes permite ejecutar aplicaciones en diferentes entornos, incluyendo máquinas físicas, máquinas virtuales y nubes públicas y privadas
- Automatización: Kubernetes automatiza tareas relacionadas con el despliegue, ajuste de escala y manejo de aplicaciones en contenedores
- Extensibilidad: Kubernetes es diseñado para ser extensible y puede ser personalizado para adaptarse a las necesidades específicas de cada organización
- Escalabilidad: Kubernetes puede escalar sin aumentar su equipo de operaciones, lo que lo hace ideal para cargas de trabajo de producción a gran escala
- Flexibilidad Kubernetes es compatible con diferentes contenedores, incluyendo Docker, y puede ejecutarse en diferentes infraestructuras, incluyendo on-premises, híbrida y nube pública.
- Desarrollo de aplicaciones nativas de nube: Es ideal para el desarrollo de aplicaciones nativas de nube, ya que permite ejecutar contenedores en diferentes infraestructuras y escalable sin aumentar el equipo de operaciones
- Desarrollo de microservicios: Es adecuado para el desarrollo de microservicios, ya que permite escalar y administrar cada servicio de manera independiente
Componentes de kubernetes
+————————————————–+
| Kubernetes Control Plane | |
| +——————————————+ | |
| | API Server | |
| | +—————————————-+ | |
| | | Scheduler | | |
| | +—————————————-+ | |
| | +—————————————-+ | |
| | | Controller Manager | | |
| | +—————————————-+ | |
| | +—————————————-+ | |
| | | etcd | | |
| | +—————————————-+ | |
| +——————————————–+ |
| |
| |
| +——————————————–+ |
| | Worker Nodes | |
| | +—————————————-+ | |
| | | Kubelet | | |
| | +—————————————-+ | |
| | +—————————————-+ | |
| | | Kube-proxy | | |
| | +—————————————-+ | |
| | +—————————————-+ | |
| | | Container Runtime | | |
| | +—————————————-+ | |
| +———————————————-+
+————————————————–+
Aquí tienes una descripción de cada componente:
Kubernetes Control Plane: Este es el cerebro de Kubernetes y contiene varios componentes para administrar el clúster. Incluye:
- API Server: Es el punto de entrada para administrar el clúster de Kubernetes a través de la API de Kubernetes.
- Scheduler: Se encarga de asignar los pods a los nodos del clúster en función de los recursos y las restricciones.
- Controller Manager: Gestiona los controladores que regulan el estado del clúster, como los controladores de replicación, de estado y de servicios.
- etcd: Almacena de manera persistente la configuración del clúster y el estado de los recursos.
Worker Nodes: Son los nodos en los que se ejecutan las cargas de trabajo de la aplicación. Cada nodo tiene varios componentes:
- Kubelet: Es un agente que se ejecuta en cada nodo y se encarga de comunicarse con el API Server del clúster y gestionar los contenedores en el nodo.
- Kube-proxy: Es un proxy de red que implementa el reenvío de puertos y la abstracción de servicios en cada nodo.
- Container Runtime: Es el software responsable de ejecutar los contenedores, como Docker, containerd, etc.
Instalación de docker y kubernetes en windows
Instalación de docker en windows
Para implementar Docker en Windows, sigue estos pasos:
1. Descarga Docker Desktop desde el sitio web oficial de Docker.
2. Ejecuta el archivo de instalación (Docker Desktop Installer.exe) y sigue las instrucciones en pantalla.
3. Si se te pide, elige entre Hyper-V o WSL 2 como método de virtualización. Si solo hay una opción disponible, selecciónala.
4. Reinicia Windows después de la instalación para completar la configuración.
5. Inicia Docker Desktop y espera a que complete la inicialización.
Si no tienes la virtualización activada, Docker te preguntará si quiere activarla automáticamente durante la instalación[3].
Una vez instalado, puedes ejecutar tu primer contenedor Docker, por ejemplo, la imagen oficial de Nginx. Docker Desktop también incluye herramientas como Docker CLI y Docker Compose.
Instalación de kubernetes en windows
Para instalar kubernetes debes tener previamente instalado docker y luego seguir estos pasos:
Instalar Hyper-V:
- Abre PowerShell como administrador.
- Ejecuta el comando
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V para verificar si Hyper-V está disponible. - Si no está disponible, activa el componente de Hyper-V con `Enable-WindowsOptionalFeature -FeatureName Microsoft-Hyper-V -All`.
Instalar Kubernetes:
- Abre PowerShell como administrador.
- Ejecuta el comando `kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml` para instalar el paquete de Kubernetes.
Configurar kubectl:
- Ejecuta el comando `kubectl proxy` para iniciar el proxy de Kubernetes.
- Abre un navegador y accede a `http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/` para acceder al Dashboard de Kubernetes.
- Genera un token para acceder al Dashboard con los comandos:
$TOKEN = ((kubectl -n kube-system describe secret default | Select-String “token:”) -split ” +”)
kubectl config set-credentials docker-for-desktop –token=”${TOKEN}”
- Selecciona el archivo de configuración `.kube/config` en el navegador y pulsa “Sign in” para acceder al Dashboard.
Instalación de docker y kubernetes en linux
Instalación de dockers en linux
Para instalar Docker en Ubuntu 22.04, sigue estos pasos:
1. Actualiza el sistema operativo con los comandos:
sudo apt-get update
sudo apt-get upgrade
2. Elimina cualquier versión beta o previsualización de Docker:
sudo apt remove docker-desktop
rm -r $HOME/.docker/desktop
sudo rm /usr/local/bin/com.docker.cli
sudo apt purge docker-desktop
3. Instalar el motor de Docker:
– Descarga y instala la versión actual de Docker:
apt-cache madison docker-ce | awk ‘{ print $3 }’
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
– O, si deseas instalar una versión específica:
VERSION_STRING=5:20.10.13~3-0~ubuntu-jammy
sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-compose-plugin
4. Comprobar la instalación:
– Inicia un contenedor de “Hello World”:
sudo docker run hello-world
Instalar kubernetes en linux
Para instalar Kubernetes en Linux, sigue estos pasos:
- . Instalar Kubernetes:
- Agrega la clave de repositorio de paquetes de Kubernetes:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
- Configura el repositorio de paquetes de Kubernetes:
echo ‘deb http://apt.kubernetes.io/ kubernetes-xenial main’ > /etc/apt/sources.list.d/kubernetes.list
- Instala Kubeadm:
sudo apt-get install -y kubeadm
- Verifica la versión de Kubeadm:
kubeadm version
- Despliegue de Kubernetes:
- Inicializa el clúster en el nodo maestro:
sudo kubeadm init –pod-network-cidr 10.244.0.0/16
- Ejecuta los siguientes comandos en el nodo esclavo para unirse al clúster:
kubeadm join <master-node-ip>:6443 –token <token> –discovery-token-ca-cert-hash sha256:<hash>
- Configurar kubectl:
- Crea el directorio `.kube`:
mkdir -p $HOME/.kube
- Copia el archivo de configuración del clúster:
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- Cambia los permisos del archivo de configuración:
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Tips para el uso adecuado de Docker y Kubernetes
Docker:
- Utiliza imágenes oficiales o de confianza: Al construir tus contenedores, es importante utilizar imágenes base oficiales o de fuentes confiables para garantizar la seguridad y la calidad del software.
- Optimiza el tamaño de las imágenes: Intenta minimizar el tamaño de tus imágenes Docker eliminando archivos innecesarios y utilizando capas eficientes durante la construcción.
- Utiliza volúmenes para persistencia de datos: En lugar de almacenar datos dentro del contenedor, utiliza volúmenes para persistir datos fuera del ciclo de vida del contenedor, lo que facilita la administración y la escalabilidad.
- Limita los recursos: Utiliza las opciones de Docker para limitar los recursos (CPU, memoria, etc.) asignados a cada contenedor para evitar problemas de rendimiento y asegurar una distribución equitativa de recursos en el host.
- Monitoriza y gestiona los contenedores: Utiliza herramientas de monitorización como Docker Stats o herramientas de gestión como Docker Compose para supervisar y gestionar tus contenedores de manera efectiva.
Kubernetes:
- Entiende los conceptos fundamentales: Antes de utilizar Kubernetes en producción, asegúrate de entender los conceptos básicos como pods, servicios, volúmenes, y la arquitectura general del clúster.
- Practica la automatización: Utiliza características como los controladores de replicación y los sets de replicación para automatizar la escalabilidad y la tolerancia a fallos de tus aplicaciones.
- Implementa buenas prácticas de seguridad: Aplica políticas de seguridad para controlar el acceso al clúster, utiliza el cifrado en reposo y en tránsito, y asegúrate de aplicar parches de seguridad regularmente.
- Monitoriza y registra eventos: Utiliza herramientas de monitorización como Prometheus y Grafana para monitorizar el rendimiento y la salud del clúster, y utiliza registros centralizados para el análisis de registros y la resolución de problemas.
- Prueba y valida en entornos de preproducción: Antes de implementar cambios en producción, realiza pruebas exhaustivas en entornos de preproducción para asegurarte de que tus aplicaciones funcionen correctamente en el clúster de Kubernetes.
Al seguir estos consejos, podrás aprovechar al máximo Docker y Kubernetes mientras mantienes tus aplicaciones seguras, eficientes y escalables.