# 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](https://cncf.io/). 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](https://k3s.io/) **
- 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](https://cdn.hashnode.com/res/hashnode/image/upload/v1645191861237/qK-FNzaNa.png)

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


![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1645192037765/_vD9Pc7qr.png)

Ahora necesita usar esta IP para cambiar su** /etc/host** . La URL predeterminada para Harbor es https://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](https://cdn.hashnode.com/res/hashnode/image/upload/v1645192159258/wzTElpa2d.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](https://cdn.hashnode.com/res/hashnode/image/upload/v1645192224008/p0k1AVn0J.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](https://cdn.hashnode.com/res/hashnode/image/upload/v1645192491036/bVoF257qN.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](https://cdn.hashnode.com/res/hashnode/image/upload/v1645192666182/aamqISMop.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](https://cdn.hashnode.com/res/hashnode/image/upload/v1645192738171/fc5uVAnKj.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](https://cdn.hashnode.com/res/hashnode/image/upload/v1645193119384/LakSyrWeP.png)

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1645192925376/-BKDcj9wu.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](https://blog.295devops.com) para leer otros posts que puedan ser de tu interés. No dudes en contactarme si deseas que te ayudemos. [roxs](https://roxs.295devops.com)

¡Nos vemos en la próxima entrada!
