Harbor como repositorio privado en Kubernetes

Harbor como repositorio 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. en mi caso estoy usando k3s
  • Kubectl para administrar su clúster
  • Tienes helm instalado
  • 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

Con el repositorio agregado, puede instalar el gráfico de Helm ejecutando lo siguiente:

helm install harbor harbor/harbor

otra opción clonar el repositorio de Harbor

git clone https://github.com/goharbor/harbor-helm.git

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

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

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

Tomará un tiempo para que todos los pods de componentes estén en funcionamiento.

image.png

El valor predeterminado del Harbor Helm Chart del puerto utiliza la configuración del ingress

image.png

Ahora necesita usar esta IP para cambiar su /etc/host . La URL predeterminada para Harbor es core.harbor.domain, pero debe asegurarse de que cuando se escriba en la barra de direcciones de su navegador, se resuelva en su clúster. Hágalo ingresando las siguientes dos nuevas líneas en su /etc/hosts

<ip-of-minikube-or-k3s>    core.harbor.domain
<ip-of-minikube-or-ke3>    notary.harbor.domain

image.png

En cuanto termine la instalación (puede tomar hasta 5 minutes)

Ahora debería poder ir a :

 https://core.harbor.domain

e iniciar sesión con el nombre de usuario y la contraseña predeterminados:

username: admin
password: Harbor12345

image.png

ya puedes ir al dominio usando tu navegador web y hacer login con el usuario admin y el password default o los que definiste en el values.yaml. Tras el login deberías ver algo muy parecido a ésto:

image.png

Configuración de Docker

En este punto, tiene una instalación de Harbor activa que puede comenzar a usar. Sin embargo, eso no significa que esté listo para usarlo como registro. Todavía necesita instalar los certificados Harbor para asegurarse de que la comunicación entre su PC y el registro no se bloquee.

A continuación, debe obtener los certificados de Kubernetes Secrets:

kubectl -n harbor get secrets harbor-ingress -o jsonpath="{.data['ca\.crt']}" | base64 -D > harbor-ca.crt

Tenga en cuenta que esto usa base64 -D, mientras que, en Linux, usaría base64 -d

una vez que se tenga el certificado realizar los siguientes paso:

$ sudo mkdir -p /etc/docker/certs.d/core.harbor.domain
$ sudo cp harbor-ca.crt /etc/docker/certs.d/core.harbor.domain

Finalmente, corre exit para volver a tu terminal. En este punto, los certificados están instalados y ahora puede probar que todo funciona como se espera iniciando sesión y presionando una imagen:

Subiendo tu primera imagen

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

# Log into the registry
$ docker login core.harbor.domain --username=admin --password Harbor12345

# Pull an image from Docker Hub
$ docker pull nginx

# Tag the image, so it's ready to be pushed
$ docker tag nginx core.harbor.domain/library/nginx:latest

# Push the image to the registry
$ docker push core.harbor.domain/library/nginx:latest

*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:

image.png

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:

image.png

Y ahora, ¿qué?

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

y además Incorpora un escaner con el motor de trivy y nos da los resultados

image.png

image.png

Conclusión

Si ha llegado a este punto con éxito, ahora tiene una instalación activa para Harbor y puede comenzar a usarlo como su propio registro privado. Esto le permite tener un control completo sobre su registro y la forma en que se implementa. Además de eso, obtiene todas las funciones disponibles en esta herramienta de código abierto, como el escaneo de vulnerabilidades y la replicación de imágenes. En lugar de leer listas de todas las funciones, puede probar la herramienta usted mismo y tener una idea de cómo puede usarla exactamente.


Espero que hayas disfrutado de este post y te animo a que revises nuestro blog para leer otros posts que puedan ser de tu interés. No dudes en contactarme si deseas que te ayudemos. roxs

¡Nos vemos en la próxima entrada!