Harbor: Instalar un registry privado en Kubernetes

Kubernetes es un orquestador de contenedores y por lo tanto necesitarás algún lugar para almacenar tus imágenes docker de forma que Kubernetes pueda descargarlas y usarlas. Hay una gran variedad de soluciones para elegir: cloud registry, dockerhub, un registry privado en una vm… o un registry privado en Kubernetes.

Hoy vamos a hablar sobre esta última opción; una solución para desplegar un registry dentro del propio Kubernetes: Harbor.

¿Pero qué es Harbor?

Harbor es open-source y es parte de la Cloud Native Computing Foundation. Implementa funcionalidades básicas como por ejemplo autenticación basada en roles (con soporte para LDAP) y también ofrece otras características más avanzadas como la habilidad para subir y gestionar charts de helm, realizar escaneo de vulnerabilidades sobre las imágenes subidas, y mucho más.

Suficiente charla, ¡quiero un hands-on!

Vamos a ver cómo poner en marcha Harbor en nuestro clúster. Asumiremos que cuentas con los siguientes requisitos:

  • Tienes un clúster de k8s con un ingress-controller. Minikube es aceptable.
  • Tienes helm instalado (lee sobre cómo instalar helm)
  • Tienes el cliente de docker instalado localmente
  • Te sobran 10 minutos 😉

IMPORTANTE: Deberías tener cert-manager instalado en el clúster ya que Harbor requiere tener un certificado HTTPS válido para permitir el login desde la terminal.

Instalando Harbor

Vamos a usar el chart de helm oficial para esta parte. Para hacerlo, primero necesitarás añadir el repo de harbor:

helm repo add harbor https://helm.goharbor.io

Para personalizar tu despliegue puedes crear un nuevo fichero values.yaml, reemplaza el contenido con los valores más adecuados para ti:

expose:
  type: ingress
  tls: 
    commonName: "TU_CN"
  ingress:
    hosts:
      core: "harbor.TU_DOMINIO"
persistence:
  enabled: true
externalURL: "https://harbor.TU_DOMINIO"
harborAdminPassword: admin

Ahroa crearemos un nuevo namespace y desplegaremos el chart. Los valores a usar dependerán de tus necesidades:

kubectl create harbor-system
helm install --wait harbor --namespace harbor-system harbor/harbor -f values.yaml

En cuanto termine la instalación (puede tomar hasta 5 minutes) ya puedes ir al dominio usando tu navegador web y hacer login con el usuario admin y el password que definiste en el values.yaml. Tras el login deberías ver algo muy parecido a ésto:

Harbor main screen

Subiendo tu primera imagen

Primero, debes hacer login desde el terminal usando el comando docker login y proporcionando tus credenciales:

docker login https://harbor.YOUR_DOMAIN

*Ten en cuenta de que para poder acceder a harbor a través de este dominio deberás crear una entrada de DNS en tu gestor de DNS y es imprescindible contar con un certificado HTTPS válido

Haz click sobre «NEW PROJECT» y rellena los inputs:

Harbor create new project

Tras hacer click en OK ya deberías poder ver tu nuevo proyecto en la página principal.

Ahora, vamos a probar a subir una nueva imagen a este proyecto. Haremos pull de la imagen oficial de nginx, pondremos un tag con la dirección de tu harbor/proyecto y haremos el push:

docker pull nginx
docker tag nginx harbor.YOUR_DOMAIN/myproject/nginx:latest
docker push harbor.YOUR_DOMAIN/myproject/nginx:latest

Si todo ha ido bien, deberías poder ver la imagen de nginx dentro del proyecto que creaste en harbor:

Harbor new nginx image

Y ahora, ¿qué?

Has desplegado un nuevo Harbor registry privado y ya has subido tu primera imagen.

En la próxima entrada de esta serie veremos cómo crear las credenciales necesarias para que tus pods sean capaces de hacer pull de las imágenes que subas en tu Harbor privado y veremos cómo indicar a Kubernetes cuando y cómo puede usar esas credenciales.


Espero que hayas disfrutado de este post y te animo a que revises nuestro blog para leer otrosposts que puedan ser de tu interés. No dudes en contactarnos si deseas que te ayudemos en tus proyectos.

¡Nos vemos en la próxima entrada!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *