Búsqueda de sitios web

Instale Harbor Registry en Kubernetes/OpenShift |


Harbor es un registro nativo en la nube de código abierto que almacena, firma y escanea imágenes de contenedores en busca de vulnerabilidades. Esta guía lo guiará a través de la instalación de Harbor Image Registry en Kubernetes/OpenShift con Helm Chart. Algunas de las características interesantes del registro de imágenes de Harbour son:

Características del registro portuario

  • Soporte para múltiples inquilinos
  • Soporte de análisis de seguridad y vulnerabilidad.
  • API extensible y UI web
  • Firma y validación de contenidos.
  • Replicación de imágenes en múltiples instancias de Harbour
  • Integración de identidad y control de acceso basado en roles

Helm es una herramienta de interfaz de línea de comandos (CLI) que se creó para simplificar la implementación de aplicaciones y servicios en clústeres de Kubernetes/OpenShift Container Platform. Helm utiliza un formato de empaquetado llamado gráficos. Un gráfico de Helm es una colección de archivos que describe los recursos de Kubernetes.

En este tutorial veremos cómo instalar y configurar Harbor Registry en un clúster de Kubernetes.

Paso 1: instale Helm 3 en Linux/macOS

Helm se distribuye como una aplicación binaria, lo que significa que no se requiere ninguna dependencia para instalarla en su máquina Linux/macOS:

### Linux ###
sudo curl -L https://mirror.openshift.com/pub/openshift-v4/clients/helm/latest/helm-linux-amd64 -o /usr/local/bin/helm
sudo chmod +x /usr/local/bin/helm

### macOS ###
sudo curl -L https://mirror.openshift.com/pub/openshift-v4/clients/helm/latest/helm-darwin-amd64 -o /usr/local/bin/helm
sudo chmod +x /usr/local/bin/helm

Verifique la versión instalada:

$ helm version
version.BuildInfo{Version:"v3.10.2", GitCommit:"50f003e5ee8704ec937a756c646870227d7c8b58", GitTreeState:"clean", GoVersion:"go1.19.3"}

Paso 2: instale Harbour usando Helm Chart

Necesitaremos almacenamiento persistente en Kubernetes para almacenar los datos de Harbour. Si no tienes nada configurado, consulta nuestros artículos a continuación:

  • Configurar NFS como almacenamiento de volumen persistente de Kubernetes
  • Cómo implementar el almacenamiento Rook Ceph en el clúster de Kubernetes
  • Implementar y utilizar OpenEBS Container Storage en Kubernetes

Para enumerar las clases de almacenamiento, ejecute los comandos:

$ kubectl get sc
NAME               PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-01 (default)   nfs-provisioner-01              Delete          Immediate           true                   242d
rook-ceph-block    rook-ceph.rbd.csi.ceph.com      Delete          Immediate           true                   9d
rook-cephfs        rook-ceph.cephfs.csi.ceph.com   Delete          Immediate           true                   9d

Puede cambiar la clase predeterminada como desee.

Storage_Class=rook-cephfs
kubectl patch storageclass $Storage_Class -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

Valide el cambio usando:

$ kubectl get storageclasses
NAME                    PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-01 (default)        nfs-provisioner-01              Delete          Immediate           true                   242d
rook-ceph-block         rook-ceph.rbd.csi.ceph.com      Delete          Immediate           true                   9d
rook-cephfs (default)   rook-ceph.cephfs.csi.ceph.com   Delete          Immediate           true                   9d

Luego podemos eliminar el indicador predeterminado de la clase de almacenamiento predeterminada inicial.

kubectl patch storageclass nfs-01  -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

Un Gráfico es un paquete Helm. Contiene todas las definiciones de recursos necesarias para ejecutar una aplicación, herramienta o servicio dentro de un clúster de Kubernetes.

Agregar el repositorio de Harbour Helm:

$ helm repo add harbor https://helm.goharbor.io
"harbor" has been added to your repositories

Actualiza el repositorio:

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "harbor" chart repository
Update Complete. ⎈Happy Helming!⎈

Configurar el gráfico

Los elementos de configuración se pueden establecer mediante el indicador –set durante la instalación o configurarse editando values.yaml directamente.

Extraiga el gráfico para obtener el archivo de valores.

helm fetch harbor/harbor --untar
cd harbor

Puede modificar los valores en el archivo para adaptarlos a su instalación:

vim values.yaml

Consulte la página de configuración de Harbor Helm para conocer los valores aceptados en diferentes bloques.

Una vez que haya personalizado el archivo, instale el gráfico de timón de Harbor con configuraciones personalizadas una vez que haya terminado de modificarlo.

$ helm install harbor  . -n harbor
NAME: harbor
LAST DEPLOYED: Sat Aug 19 02:27:28 2023
NAMESPACE: harbor
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please wait for several minutes for Harbor deployment to complete.
Then you should be able to visit the Harbor portal at https://harbor.apps.k8s.cloudlabske.io
For more details, please visit https://github.com/goharbor/harbor

También puedes --set para pasar valores durante la instalación de Helm. Ver la página de configuración de Harbour Helm

A continuación se muestra un ejemplo con algunos parámetros pasados con la bandera –set .

helm install harbor . \
--set persistence.persistentVolumeClaim.registry.accessMode=ReadWriteMany \
--set persistence.persistentVolumeClaim.jobservice.accessMode=ReadWriteMany \
--set persistence.persistentVolumeClaim.registry.size=50Gi \
--set persistence.persistentVolumeClaim.chartmuseum.size=5Gi \
--set persistence.persistentVolumeClaim.database.size=5Gi \
--set persistence.persistentVolumeClaim.trivy.size=5Gi \
--set externalURL=https://ocr.example.com \
--set expose.ingress.hosts.core=ocr.example.com \
--set expose.ingress.hosts.notary=notary.example.com \
--set harborAdminPassword=H@rb0rAdm \
-n harbor

Si tiene un controlador Nginx Ingress, especifique su nombre de clase:

--set expose.ingress.className=nginx

Contraseña de administrador del puerto:

--set harborAdminPassword='YourAdminPassword'

Verifique el estado para confirmar que esté implementado:

$ helm status harbor
NAME: harbor
LAST DEPLOYED: Sat Aug 19 02:27:28 2023
NAMESPACE: harbor
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please wait for several minutes for Harbor deployment to complete.
Then you should be able to visit the Harbor portal at https://harbor.apps.k8s.cloudlabske.io
For more details, please visit https://github.com/goharbor/harbor

Actualización de la implementación de Hem

Si actualiza los parámetros envalues.yml o agrega otros nuevos, actualice la implementación de helm con el comando:

$ helm upgrade harbor . -n harbor
Release "harbor" has been upgraded. Happy Helming!
NAME: harbor
LAST DEPLOYED: Thu Apr 30 11:30:06 2021
NAMESPACE: harbor
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
Please wait for several minutes for Harbor deployment to complete.
Then you should be able to visit the Harbor portal at https://ocr.example.com
For more details, please visit https://github.com/goharbor/harbor.

Si alguna vez desea eliminar la implementación, ejecute:

helm uninstall  <name>  -n harbor

Usando su propio certificado SSL

Si firma sus certificados, puede crear un secreto a partir de los certificados y una clave para usar al instalar Harbor.

kubectl -n harbor create secret tls  harbor-tls-certs --key ./harbor.key  --cert ./harbor.crt

Luego, personalice el nombre del secreto de ingreso.

expose.certSource=secret
expose.secret.secretName=harbor-tls-certs
expose.secret.notarySecretName=harbor-tls-certs

Arreglando Init: CrashLoopBackOff en Harbor-Harbor-Database-0 en OpenShift

Algunas imágenes de contenedores como postgres y redis requieren acceso raíz y tienen ciertas expectativas sobre cómo se poseen los volúmenes. Necesitamos relajar la seguridad en el clúster para que las imágenes no se vean obligadas a ejecutarse como un UID preasignado, sin otorgar a todos acceso al SCC privilegiado:

Otorgue a todos los usuarios autenticados del puerto acceso al SCC anyuid:

oc adm policy add-scc-to-user anyuid system:serviceaccount:harbor:default

Verifique el estado de sus implementaciones:

$ kubectl get deployments
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
harbor-harbor-chartmuseum     1/1     1            1           24m
harbor-harbor-clair           1/1     1            1           24m
harbor-harbor-core            1/1     1            1           24m
harbor-harbor-jobservice      1/1     1            1           24m
harbor-harbor-notary-server   1/1     1            1           24m
harbor-harbor-notary-signer   1/1     1            1           24m
harbor-harbor-portal          1/1     1            1           24m
harbor-harbor-registry        1/1     1            1           24m

Verificar el estado del pod:

$ kubectl get pods
NAME                                           READY   STATUS    RESTARTS   AGE
harbor-harbor-chartmuseum-58f8647f95-mtmmf     1/1     Running   0          5m16s
harbor-harbor-clair-654dcfd8bf-77qs6           2/2     Running   0          5m16s
harbor-harbor-core-5cb85989d6-r7s84            1/1     Running   0          5m16s
harbor-harbor-database-0                       1/1     Running   0          5m33s
harbor-harbor-jobservice-fc54cf784-lv864       1/1     Running   0          5m16s
harbor-harbor-notary-server-65d8fb7c77-xgxvg   1/1     Running   0          5m16s
harbor-harbor-notary-signer-66c9db4cf4-5bwvh   1/1     Running   0          5m16s
harbor-harbor-portal-5cbc6d5897-r5wzh          1/1     Running   0          25m
harbor-harbor-redis-0                          1/1     Running   0          5m16s
harbor-harbor-registry-7ff65976f4-sgnnd        2/2     Running   0          5m16s

Por último, confirme que se hayan creado los servicios y el ingreso.

$ kubectl get svc
NAME                          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
harbor-harbor-chartmuseum     ClusterIP   172.30.161.108   <none>        80/TCP              26m
harbor-harbor-clair           ClusterIP   172.30.133.154   <none>        8080/TCP            26m
harbor-harbor-core            ClusterIP   172.30.29.180    <none>        80/TCP              26m
harbor-harbor-database        ClusterIP   172.30.199.219   <none>        5432/TCP            26m
harbor-harbor-jobservice      ClusterIP   172.30.86.18     <none>        80/TCP              26m
harbor-harbor-notary-server   ClusterIP   172.30.188.135   <none>        4443/TCP            26m
harbor-harbor-notary-signer   ClusterIP   172.30.165.7     <none>        7899/TCP            26m
harbor-harbor-portal          ClusterIP   172.30.41.233    <none>        80/TCP              26m
harbor-harbor-redis           ClusterIP   172.30.101.107   <none>        6379/TCP            26m
harbor-harbor-registry        ClusterIP   172.30.112.213   <none>        5000/TCP,8080/TCP   26m

$ kubectl get ing
NAME                    HOSTS                                     ADDRESS   PORTS     AGE
harbor-harbor-ingress   core.harbor.domain,notary.harbor.domain             80, 443   26m

Como en realidad estoy haciendo esta implementación en OpenShift, crearé rutas.

$ kubectl get route
NAME                          HOST/PORT              PATH          SERVICES                      PORT   TERMINATION     WILDCARD
harbor-harbor-ingress-7f9vg   notary.harbor.domain   /             harbor-harbor-notary-server   4443   edge/Redirect   None
harbor-harbor-ingress-9pvvz   core.harbor.domain     /             harbor-harbor-portal          8080   edge/Redirect   None
harbor-harbor-ingress-d7mcn   core.harbor.domain     /c/           harbor-harbor-core            8080   edge/Redirect   None
harbor-harbor-ingress-gn5w6   core.harbor.domain     /chartrepo/   harbor-harbor-core            8080   edge/Redirect   None
harbor-harbor-ingress-jf48l   core.harbor.domain     /service/     harbor-harbor-core            8080   edge/Redirect   None
harbor-harbor-ingress-lhbx4   core.harbor.domain     /api/         harbor-harbor-core            8080   edge/Redirect   None
harbor-harbor-ingress-vtt8v   core.harbor.domain     /v2/          harbor-harbor-core            8080   edge/Redirect   None

También se crean una serie de reclamaciones de volumen persistentes. Coincidiendo con los valores de tamaño que especificó.

$ kubectl  get pvc
NAME                                     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
data-harbor-harbor-redis-0               Bound    pvc-1de4a5b2-d55a-48cc-b8b6-1b258214260c   1Gi        RWO            ocs-storagecluster-cephfs   29m
database-data-harbor-harbor-database-0   Bound    pvc-9754adde-e2bd-40ee-b18b-d72eacfdfc12   1Gi        RWO            ocs-storagecluster-cephfs   29m
harbor-harbor-chartmuseum                Bound    pvc-3944fce8-ecee-4bec-b0f6-cc5da3b30572   5Gi        RWO            ocs-storagecluster-cephfs   29m
harbor-harbor-jobservice                 Bound    pvc-5ecf0be4-002c-4628-8dcc-283e996175bc   1Gi        RWO            ocs-storagecluster-cephfs   29m
harbor-harbor-registry                   Bound    pvc-072358e9-06f2-4384-b7d6-88e97eb29499   5Gi        RWO            ocs-storagecluster-cephfs   29m

Paso 3: Acceda al panel de administración del puerto

Utilice el dominio externo configurado durante la instalación para acceder al panel de registro de contenedores de Harbor.

Los inicios de sesión predeterminados si no cambió la contraseña son:

Username: admin
Password: Harbor12345 # If you did set manually use the password

No olvide cambiar su contraseña después de iniciar sesión por primera vez.

Paso 4: Agregar Pull Secret a Kubernetes/OpenShift

Siga los pasos de la guía siguiente para agregar un secreto de extracción a Kubernetes/OpenShift.

  • Agregue el secreto de extracción del registro de imágenes de Harbor a Kubernetes/OpenShift

Guías similares:

  • Instale el registro de Project Quay en OpenShift con el operador

Artículos relacionados: