sábado, 1 de febrero de 2025

Instalando DeepSeek con interfaz web en docker y soporte nvidia


En este post vamos a instalar DeepSeek usando docker y aprovechando la gráfica nvidia.

¿Por qué usando contenedores? Por que no soy cochino instalando cosas que no sé qué haran en mi sistema y no tengo tiempo de ponerme a leer el script de instalación.

Aquí te dejo el video para que veas cómo lo realizo:


## Pre requisitos

Instala los pre-requisitos para usar tu tarjeta gríafica:

libnvidia-container nvidia-container-toolkit

## Configuración de Pre requisitos

Para que el contenedor pueda acceder al GPU tenemos que configurar nvidia-container-toolkit y docker:

editamos el archivo /etc/nvidia-container-runtime/config.toml y agregamos la siguiente línea:

```bash
    no-cgroups = true
```

Ejecutamos los siguientes comandos:

```bash
    $ sudo nvidia-ctk runtime configure --runtime=docker
    $ sudo systemctl restart docker
```

Nota: a open-webui lo llamaré solamente webui

Vamos a crear dos carpetas en nuestro directorio de trabajo:

```bash
    $ mkdir ollama
    $ mkdir webui
```

Dentro de estas carpetas guardaremos los datos de ollama y webui respectivamente.

Ahora iniciamos el contenedor de ollama:

```bash
    $ docker network create net-ollama

    $ docker run -d --network net-ollama --gpus=all  -p 11434:11434 -v ./ollama:/root/.ollama --name=ollama ollama/ollama

    $ docker run -d --network net-ollama --name webui -p 3000:8080 -v ./webui:/app/backend/data -e OLLAMA_BASE_URL=http://ollama:11434 --add-host=host.docker.internal:host-gateway  ghcr.io/open-webui/open-webui:cuda
```

Lo que hacemos es crear una red para que los contenedores puedan comunicarse entre ellos y aislarlos del resto de contenedores que tengamos en nuestra máquina.

Si bien puedes instalar open-webui y desde ahí instalar los modelos, prefiero trabajarlos de forma independiente.

## Instalación de DeepSeek

Para instalar DeepSeek en el contenedor de ollama:

```bash
    $ docker exec -it ollama ollama run deepseek-r1:7b
```

Esto tomará un tiempo dependiendo del ancho de banda que tengas, ya que descargará el modelo DeepSeek de 7b.
Nota: Si tu computadora cuenta con recursos limitados puedes elegir modelos más pequeños:

    1.5b: Uso mínimo de recursos.
    7b: Rendimiento y requisitos de recursos equilibrados.
    8b, 14b, 32b: Opciones intermedias para un rendimiento más alto.

El tamaño de descarga para estos modelos varía:

    1.5b: ~2.3GB
    7b: ~4.7GB
    70b: ~40GB+

La lista completa está [aquí](https://ollama.com/library/deepseek-r1)

Listo tenemos instalado DeepSeek en nuestro contenedor de ollama, puedes empezar a hacer las preguntas que quieras.

# Interacción con DeepSeek

Ahora con tu navegador entra a la ruta http://localhost:3000 rellena los campos que se te solicitan, con esto podrás empezar a hacer preguntas a DeepSeek.

Así se verá la interfaz y arriba estará seleccionado el modelo de deepseek que instalaste:
## Bonus

Aquí te dejo un docker-compose.yaml por si quieres hacer todo de una sola vez:

```yaml
services:
  webui:
    image: ghcr.io/open-webui/open-webui:cuda
    container_name: webui
    ports:
      - 3000:8080
    volumes:
      - ./webui:/app/backend/data
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    extra_hosts:
      - "host.docker.internal:host-gateway"
    depends_on:
      - ollama

  ollama:
    image: ollama/ollama
    container_name: ollama
    expose:
      - 11434/tcp
    ports:
      - 11434:11434/tcp
    healthcheck:
      test: ollama --version || exit 1
    volumes:
      - ./ollama:/root/.ollama
```

Nota: Solo recuerda que después de ejecutar el docker-compose.yaml tienes que ejecutar el comando para instalar DeepSeek:

```bash
    $ docker exec -it ollama ollama run deepseek-r1:7b
```

jueves, 12 de diciembre de 2024

Pipeline CD en Jenkins para terraform AWS EKS segunda parte (plugin AWS Credentials)


En el [post anterior](https://www.ahioros.info/2024/12/pipeline-cd-en-jenkins-para-terraform.html) te mostré como usar Jenkis como CD para desplegar tu infraestructura EKS con terraform en AWS. El "detalle" es que usamos el secret de Jenkins de texto cifrado.

Ahora lo que usaremos es el plugin de [AWS Credentials](https://plugins.jenkins.io/aws-credentials/), lo puedes instalar desde el administrador de plugins de Jenkins con un par de clicks.

Aquí abajo te dejo el video para que veas la configuración en caso que tengas dudas:

lunes, 9 de diciembre de 2024

Pipeline CD en Jenkins para terraform AWS EKS



En el [post anterior](https://www.ahioros.info/2024/12/creacion-de-un-cluster-aws-eks-con.html) hicimos un cluster AWS EKS con terraform. Como lo que nos gusta aquí es el tema de automatización, vamos a crear el pipeline de CD con Jenkins, les motraré 2 maneras de hacerlo, en este primer post vamos a hacerlo usando Secrets de Jenkins.

## Explicación del Pipeline

El Pipeline -> repositorio github (puede ser cualquier repositorio de git) -> Terraform (init, plan, apply/destroy) -> kubectl test

## Requisitos

Para Jenkins estoy usando el contenedor de Jenkins.
Los Plugins que tengo para este ejemplo son:

    * Pipeline: GitHub Groovy Libraries
    * Pipeline: Stage view
    * Terraform Plugin (opcional)

**Nota:** En mi caso yo tengo los binarios de terraform y kubectl en el directorio jenkins_home/terraform-bin y jenkins_home/kubectl-bin/.

Aquí abajo te dejo el video para que veas la configuración en caso que tengas dudas:

miércoles, 4 de diciembre de 2024

AWS Creación de un cluster EKS con terraform


## Introducción

Ya hace un tiempo enseñé [cómo instalar localstack para que puedas probar terraform](https://www.ahioros.info/2024/05/how-to-install-localstack-with-docker.html). Bueno ahora voy a enseñarte una de las maneras de como crear un cluster de kubernetes (EKS) en AWS.
 
¿Cuántas maneras de crear un cluster de kubernetes (EKS) en AWS hay?

1. Con terraform escribiendo desde 0.
2. Con terraform haciendo uso del module.
3. Con cloudformation.
4. Crear un cluster de kubernetes (EKS) en AWS con eksctl (esta al final es un wrapper y hace uso de cloudformation).

Nosotros vamos a realizar la primera configuración.


Puedes ver el video aquí:

No te voy a decir todas las ventajas que tiene hacerlo con terraform (que para eso ya debes de saberlas) solo diré que no me gusta tanto hacerlos con cloudformation por que "tarda" bastante tiempo.

**Nota:** más adelante vamos a hacer el pipeline CI/CD para automatizar el deploy e ir agregándo más características, así como ir poniéndo "presentable" el proyecto.

lunes, 25 de noviembre de 2024

Hablemos de: Seguridad en Kubernetes


Vamos a dividir en antes del despliegue y en Kubernetes.

## Antes del Despliegue

1. Escaneo de las imágenes de contenedores

  - Durante CI.
  - Escaneo constante del registry de imagenes.

	Herramientas:

  - snyk.
  - sysdig.
  - Sonarqube.
  - Trivy.

2. Que el servicio de la imgen lo ejecute un usuario de servicio (non-root)

	**Nota:** Esto lo podemos sobreescribir en kubernetes usando **spec.securityContext.runAsUser: 1000** o **spec.allowPrivilegeEscalation: false**

## En Kubernetes

1. Manejo usuarios y permisos

	Usa RBAC, ClusterRole, ServiceAccount y siempre usa la regla de menor privilegio.

2. Políticas de red

	Aplica NetworkPolicy para limitar la comunicación entre pods, no quieres que un pod de front se comunique con un pod de database, se debe comunicar con el backend solamente, por mencionar un ejemplo.
  **Nota:** Usa la regla del mínimo acceso permitido.

	Herramientas:

  - calico
  - weave Net

	También puedes usar herramientas a nivel de aplicación, usando un service mesh ya hemos hablado de dos, [Linkerd](https://www.ahioros.info/2024/10/service-mesh-linkerd.html) e [Istio](https://www.ahioros.info/2024/10/service-mesh-istio.html).

	Herramientas:

  - Istio
  - Linkerd

3. Cifrado de tráfico, mTLS entre Servicios

	Esto se resuelve usando un service mesh, solo tienes que habilitarlo.

4. Seguridad y cifrado de Secrets

	Habilita el cifrado usando el recurso EncryptionConfiguration. Pero todavía necesitamos algo para manejar las llaves cifradas, aquí nos apoyamos de herramientas de terceros como AWS KMS, Google KMS, Vault de HashiCorp,etc. o incluso te puede funcionar algo como pass si estás on-premise.

5. Seguridad en etcd

	Si estas administrando etcd ponlo detrás de un firewall, cifra toda la informacion en etcd.

6. Backup y Restore

	En este caso me refiero a la data de tu(s) aplicacion(es) que están corriendo en kubernetes.

  - Realiza backups de tus aplicaciones regularmente.
  - Guarda los backups en un lugar seguro.
  - Hagan pruebas de sus backups para ver que estén funcionando correctamente en un ambiente controlado, incluso pueden automatizar estos tests para que se ejecuten cada cierto tiempo.

7. Define y Aplica Políticas de seguridad

	Por ejemplo:

  - No permitas ejecutar contenedores como root.
  - Cada pod debe tener su política de red.
  - Los backups se realizan cada día a X hora.

	Algunas herramientas que te pueden ayudar son:

  - Open Policy Agent.
  - Kyverno.

8. Disaster Recovery

  Define estrategias y mecanismos para una recuperación ante un desastre y sobre todo automatiza.
  Define también hacer pruebas para que todo el equipo sepa qué hacer en caso de uno y poder ajustar la estrategia de recuperación, entre mayor conocimiento tengan menor tiempo les tomará en ejecutar la recuperación y menor tiempo afectaran la experiencia del usuario.

lunes, 18 de noviembre de 2024

Kubernetes: Controla tus recursos

Ya todos sabemos que la cultura DevOps parte de cederle responsabilidades al área de desarrollo para liberar sus servicios más ágil, esto no quiere decir que debamos darles las llaves del cielo y que hagan lo que quieran, por lo que es responsabilidad de nosotros tomar precauciones para que no tumben los servicios y tengamos que correr como pollos sin cabeza a solucionar.

Como ya sabemos tener el servicio indisponible se traduce en pérdida de dinero, pero te cuento que tener el servicio consumiendo recursos sin control también se traduce en pérdida de dinero.

Ya en posts anteriores cuando hablé de [HPA](https://www.ahioros.info/2024/09/kubernetes-horizontal-pod-autoscaling.html) mencioné unas buenas prácticas para aplicar a nuestros deployments, para ser más específicos resources.requests y resources.limits.

Puedes seguir el video aquí:
 

## LimitRanges


lunes, 11 de noviembre de 2024

Hablemos de: Pod Disruption Budgets


El escenario "normal" cuando tienes que hacer un mantenimiento en tu cluster de k8s, es que marcas un nodo como cordon esto hace que no acepte más pods y de ahí empiezas a "drenar" los pods el nodo. Lo que hará k8s es que "sacará" los pods del nodo y después empezará a crearlos en el nodo activo. Si nuestra aplicación tiene la mayoría de los pods en el nodo que vamos a hacer el mantenimiento, nos trae inconvenientes como:

- Indisponibilidad de nuestra aplicación.
- Perder dinero.

Aquí te dejo el video para que veas el funcionamiento:


El Pod Disruption Budget (para los compas "PDB" de ahora en adelante) sirve para drenar un nodo, con la diferencia que va a recrear primero en el (los) otro(s) nodo(s) los pods y cuando estén listos (RUNNING), va a matar los pods del nodo que quieres hacer el mantenimiento. Suena bien ¿no? Así, evitamos la indisponibilidad de nuestra aplicación.


viernes, 25 de octubre de 2024

Service Mesh Linkerd



En el post anterior se habló de lo que es un Service Mesh e instalamos Istio.

Hoy toca hablar sobre Linkerd, es un Service Mesh que no cuenta con tantas cosas como Istio, ¿esto es malo?, no es malo por que lo que hace, lo hace bien.

En comparación con Istio no es necesario crear los Istio ingress o gateways, solo se encarga del Service Mesh. Linkerd tiene mejor performance que Istio (según la documentación de Linkerd claro está). Como Linkerd es más pequeño puedes tener un ahorro en el costo de tu cluster de Kubernetes en tu proveedor de la nube.

Al igual que Istio cuenta con mTLS entre los microservicios cuando se inyecta el sidecar (proxy) de Linkerd, esta de más decir que esto te agregará un poco de latencia en tu aplicación.

Acá esta el video para que vayas conmigo haciendo el tutorial: