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